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.isTableHeaderInFirstRowOrColumn(ruleContext);
+ 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;
+var IEngine_1 = __webpack_require__(/*! ../v2/api/IEngine */ "./src/v2/api/IEngine.ts");
+// 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 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.1": "In content implemented using markup languages, elements have complete start and end tags, elements are nested according to their specifications, elements do not contain duplicate attributes, and any IDs are unique, except where the specifications allow these features.",
+ "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.",
+};
+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: IEngine_1.eRuleCategory.ACCESSIBILITY,
+ description: "Rules for enabling the browser extensions",
+ type: IEngine_1.eRulesetType.EXTENSION,
+ checkpoints: [{
+ num: "1",
+ name: "Extension CP 1",
+ wcagLevel: "A",
+ summary: "Rules for Extension"
+ }]
+ },
+ {
+ id: "IBM_Accessibility",
+ name: "IBM Accessibility",
+ category: IEngine_1.eRuleCategory.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.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_1",
+ name: "WCAG 2.1 (A, AA)",
+ category: IEngine_1.eRuleCategory.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: IEngine_1.eRuleCategory.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"}}');
+
+/***/ })
+
+/******/ });
+/************************************************************************/
+/******/ // 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.DOMWalker = exports.Config = exports.checkDemo = exports.ARIAMapper = exports.Context = exports.Checker = 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 simDemo(timeout?: number) {
+ if (!timeout) timeout = 0;
+ setTimeout(function() {
+ let sim = new Simulator();
+ let s = sim.renderItem(document.documentElement);
+ console.group("--- Item View ---");
+ console.log(s);
+ console.groupEnd();
+ console.group("--- Link View ---");
+ s = sim.renderLink(document.documentElement);
+ console.log(s);
+ console.groupEnd();
+ }, timeout);
+}
+*/
+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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QUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1lBQ2xELGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsV0FBVyxFQUFFO1lBQ1QsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsV0FBVztZQUNyQixRQUFRLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDeEIsZUFBZSxFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1lBQ2xELGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsWUFBWSxFQUFFO1lBQ1YsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsV0FBVztZQUNyQixRQUFRLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDeEIsZUFBZSxFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1lBQ2xELGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsYUFBYSxFQUFFO1lBQ1gsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsV0FBVztZQUNyQixRQUFRLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDeEIsZUFBZSxFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1lBQ2xELGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIs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QUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzdtRyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeDFILENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUM3aUUsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUM1ekQsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDenhCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDM2pCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeGtFLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ25xQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ2xsQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeDFCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzNUgsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDempFLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN2MUgsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzK0YsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQy9pQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQy9uRSxDQUFFLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDblcsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzOUIsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDN3BHLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN4cUcsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN4eUIsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDbmpCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ2gzQyxDQUFFLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDbjVELENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzE4QyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0NBQzdtQyxDQUFDO0FBR0Y7SUFBQTtJQXFDQSxDQUFDO0lBbkNHLHdEQUF3RDtJQUMxQyxnQkFBTyxHQUFyQixVQUFz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QUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtvQkFDN0UsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUk7b0JBQ3pGLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJO29CQUN0RixLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSztvQkFDMUYsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSTtvQkFDN0YsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSztvQkFDL0YsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUs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RUFBRTtnQkFBaEMsSUFBTSxNQUFNO2dCQUNiLElBQUksUUFBUSxLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUU7b0JBQzlCLElBQUksUUFBUSxLQUFLLElBQUksRUFBRTt3QkFDbkIsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUNuQixPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ25CLFFBQVEsR0FBRyxJQUFJLENBQUM7cUJBQ25CO29CQUNELFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO29CQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7aUJBQ2pDO2dCQUNELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLEVBQUU7b0JBQ2pDLElBQUksUUFBUSxLQUFLLElBQUksRUFBRTt3QkFDbkIsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO3FCQUN0QjtvQkFDRCxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDL0IsSUFBSSxRQUFRLEtBQUssRUFBRSxFQUFFO3dCQUNqQixPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO3FCQUN6Qjt5QkFBTTt3QkFDSCxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3FCQUMzQjtpQkFDSjtnQkFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzdDO1lBQ0QsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNoQixDQUFDO0FBRXNDLDhCQUFTIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2FwaS9JRW5naW5lLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9hcmlhL0FSSUFEZWZpbml0aW9ucy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvYXJpYS9BUklBTWFwcGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9hcmlhL0FSSUFXYWxrZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2FuY2VzdG9yLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGFuZy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jb21tb24vQ29tbW9uTWFwcGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jb21tb24vQ29udGV4dC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY29tbW9uL0VuZ2luZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY29uZmlnL0NvbmZpZy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvZG9tL0NvbG9yVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvZG9tL0RPTU1hcHBlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvZG9tL0RPTVV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2RvbS9ET01XYWxrZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2RvbS9WaXNVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9zdHlsZS9TdHlsZU1hcHBlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvYXBpL0lSdWxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9jaGVja2VyL0NoZWNrZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FfdGFyZ2V0X3dhcm5pbmcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FfdGV4dF9wdXJwb3NlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcHBsZXRfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmVhX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXBwbGljYXRpb25fbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX2FsbG93ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX2NvbmZsaWN0LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2F0dHJpYnV0ZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX3JlZHVuZGFudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYmFubmVyX3NpbmdsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jaGlsZF90YWJiYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jaGlsZF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb250ZW50X2luX2xhbmRtYXJrLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb250ZW50aW5mb19taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfY29udGVudGluZm9fc2luZ2xlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2Rlc2NlbmRhbnRfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2Zvcm1fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2dyYXBoaWNfbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfaGlkZGVuX25vbnRhYmJhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2lkX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9pbWdfbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfbWFpbl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfbWFpbl9sYWJlbF92aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3BhcmVudF9yZXF1aXJlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3JlZ2lvbl9sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9yb2xlX2FsbG93ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfcm9sZV9yZWR1bmRhbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9zZW1hbnRpY3MudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfd2lkZ2V0X2xhYmVsbGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hc2NpaWFydF9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9ibGlua19jc3NfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9ibGlua19lbGVtX2RlcHJlY2F0ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Jsb2NrcXVvdGVfY2l0ZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NhbnZhc19jb250ZW50X2Rlc2NyaWJlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY2FwdGlvbl90cmFja19leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NvbWJvYm94X2Rlc2lnbl92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jb21ib2JveF9oYXNwb3B1cF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9kZWJ1Z19wYXRocy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZGV0ZWN0b3JfdGFiYmFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Rpcl9hdHRyaWJ1dGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Rvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9hY2Nlc3NrZXlfbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9pZF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfbGFuZ192YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF90YWJiYWJsZV92aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbWJlZF9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbWJlZF9ub2VtYmVkX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZW1vdGljb25zX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Vycm9yX21lc3NhZ2VfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9maWVsZHNldF9sYWJlbF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZmllbGRzZXRfbGVnZW5kX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9maWd1cmVfbGFiZWxfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mb3JtX2ZvbnRfY29sb3IudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Zvcm1faW50ZXJhY3Rpb25fcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mb3JtX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZm9ybV9zdWJtaXRfYnV0dG9uX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZm9ybV9zdWJtaXRfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mcmFtZV9zcmNfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ZyYW1lX3RpdGxlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaGVhZGluZ19jb250ZW50X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaGVhZGluZ19tYXJrdXBfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9odG1sX2xhbmdfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9odG1sX3NraXBuYXZfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pZnJhbWVfaW50ZXJhY3RpdmVfdGFiYmFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltYWdlYnV0dG9uX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltYWdlbWFwX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19hbHRfYmFja2dyb3VuZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF9kZWNvcmF0aXZlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfYWx0X21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF9udWxsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfYWx0X3JlZHVuZGFudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2lzbWFwX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2xvbmdkZXNjX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2F1dG9jb21wbGV0ZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9maWVsZHNfZ3JvdXBlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfaGFzcG9wdXBfY29uZmxpY3QudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2xhYmVsX2FmdGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9sYWJlbF9iZWZvcmUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2xhYmVsX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfbGFiZWxfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfb25jaGFuZ2VfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9sYWJlbF9jb250ZW50X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbGFiZWxfbmFtZV92aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9sYWJlbF9yZWZfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2xpc3RfY2hpbGRyZW5fdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2xpc3RfbWFya3VwX3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbGlzdF9zdHJ1Y3R1cmVfcHJvcGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tYXJxdWVlX2VsZW1fYXZvaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2FsdF9icmllZi50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfYXVkaW9fdHJhbnNjcmliZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfbGl2ZV9jYXB0aW9uZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX3RyYWNrX2F2YWlsYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWV0YV9yZWRpcmVjdF9vcHRpb25hbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWV0YV9yZWZyZXNoX2RlbGF5LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZXRhX3ZpZXdwb3J0X3pvb21hYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9ub2VtYmVkX2NvbnRlbnRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9vYmplY3RfdGV4dF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3BhZ2VfdGl0bGVfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9wYWdlX3RpdGxlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NjcmlwdF9vbmNsaWNrX2F2b2lkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zY3JpcHRfb25jbGlja19taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NjcmlwdF9zZWxlY3RfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zZWxlY3Rfb3B0aW9uc19ncm91cGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9za2lwX21haW5fZGVzY3JpYmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9za2lwX21haW5fZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2JlZm9yZV9hZnRlcl9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2NvbG9yX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfZm9jdXNfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2hvdmVyX3BlcnNpc3RlbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfYXJpYV9kZXNjZW5kYW50cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfY2FwdGlvbl9lbXB0eS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfY2FwdGlvbl9uZXN0ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX2hlYWRlcnNfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9oZWFkZXJzX3JlZl92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfaGVhZGVyc19yZWxhdGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9sYXlvdXRfbGluZWFyaXplZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfc2NvcGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX3N0cnVjdHVyZV9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX3N1bW1hcnlfcmVkdW5kYW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90ZXh0X2Jsb2NrX2hlYWRpbmcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfY29udHJhc3Rfc3VmZmljaWVudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGV4dF9xdW90ZWRfY29ycmVjdGx5LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90ZXh0X3NlbnNvcnlfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90ZXh0X3NwYWNpbmdfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfd2hpdGVzcGFjZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvd2lkZ2V0X3RhYmJhYmxlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvd2lkZ2V0X3RhYmJhYmxlX3NpbmdsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXNldHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3V0aWwvQ1NTVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9DYWNoZVV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3V0aWwvQ29tbW9uVXRpbC50cyIsIndlYnBhY2s6Ly9hY2Uvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgSU1hcFJlc3VsdCB9IGZyb20gXCIuL0lNYXBwZXJcIjtcblxuZXhwb3J0IGVudW0gZVJ1bGVDb25maWRlbmNlIHtcbiAgICBQQVNTID0gXCJQQVNTXCIsXG4gICAgRkFJTCA9IFwiRkFJTFwiLFxuICAgIFBPVEVOVElBTCA9IFwiUE9URU5USUFMXCIsXG4gICAgTUFOVUFMID0gXCJNQU5VQUxcIlxufVxuXG5leHBvcnQgZW51bSBlUnVsZVBvbGljeSB7XG4gICAgVklPTEFUSU9OID0gXCJWSU9MQVRJT05cIixcbiAgICBSRUNPTU1FTkRBVElPTiA9IFwiUkVDT01NRU5EQVRJT05cIixcbiAgICBJTkZPUk1BVElPTiA9IFwiSU5GT1JNQVRJT05cIlxufVxuXG5leHBvcnQgZW51bSBlVG9vbGtpdExldmVsIHtcbiAgICBMRVZFTF9PTkUgPSBcIjFcIixcbiAgICBMRVZFTF9UV08gPSBcIjJcIixcbiAgICBMRVZFTF9USFJFRSA9IFwiM1wiLFxuICAgIExFVkVMX0ZPVVIgPSBcIjRcIlxufVxuXG5leHBvcnQgZW51bSBlUnVsZUNhdGVnb3J5IHtcbiAgICBBQ0NFU1NJQklMSVRZID0gXCJBY2Nlc3NpYmlsaXR5XCIsXG4gICAgREVTSUdOID0gXCJEZXNpZ25cIixcbiAgICBPVEhFUiA9IFwiT3RoZXJcIlxufVxuXG5leHBvcnQgZW51bSBlUnVsZXNldFR5cGUge1xuICAgIERFRkFVTFQgPSBcImRlZmF1bHRcIixcbiAgICBFWFRFTlNJT04gPSBcImV4dGVuc2lvblwiXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSdWxlUGFzcyhyZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBtZXNzYWdlQXJncz8gOiBzdHJpbmdbXSwgYXBpQXJncz8gOiBhbnlbXSkgOiBSdWxlUmVzdWx0IHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbklkID09PSBcInVuZGVmaW5lZFwiIHx8IHJlYXNvbklkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWFzb24gSUQgbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sIGVSdWxlQ29uZmlkZW5jZS5QQVNTXSxcbiAgICAgICAgcmVhc29uSWQ6IHJlYXNvbklkLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSdWxlUmVuZGVyKHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIG1lc3NhZ2VBcmdzPyA6IHN0cmluZ1tdLCBhcGlBcmdzPyA6IGFueVtdKSA6IFJ1bGVSZXN1bHQge1xuICAgIGlmICh0eXBlb2YgcmVhc29uSWQgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVhc29uSWQgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIlJlYXNvbiBJRCBtdXN0IGJlIGRlZmluZWRcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IFtlUnVsZVBvbGljeS5JTkZPUk1BVElPTiwgZVJ1bGVDb25maWRlbmNlLlBBU1NdLFxuICAgICAgICByZWFzb25JZDogMCxcbiAgICAgICAgbWVzc2FnZUFyZ3M6IG1lc3NhZ2VBcmdzIHx8IFtdLFxuICAgICAgICBhcGlBcmdzOiBhcGlBcmdzIHx8IFtdXG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVGYWlsKHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIG1lc3NhZ2VBcmdzPyA6IHN0cmluZ1tdLCBhcGlBcmdzPyA6IGFueVtdKSA6IFJ1bGVSZXN1bHQge1xuICAgIGlmICh0eXBlb2YgcmVhc29uSWQgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVhc29uSWQgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIlJlYXNvbiBJRCBtdXN0IGJlIGRlZmluZWRcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IFtlUnVsZVBvbGljeS5JTkZPUk1BVElPTiwgZVJ1bGVDb25maWRlbmNlLkZBSUxdLFxuICAgICAgICByZWFzb25JZDogcmVhc29uSWQsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVQb3RlbnRpYWwocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuUE9URU5USUFMXSxcbiAgICAgICAgcmVhc29uSWQ6IHJlYXNvbklkLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSdWxlTWFudWFsKHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIG1lc3NhZ2VBcmdzPyA6IHN0cmluZ1tdLCBhcGlBcmdzPyA6IGFueVtdKSA6IFJ1bGVSZXN1bHQge1xuICAgIGlmICh0eXBlb2YgcmVhc29uSWQgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVhc29uSWQgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIlJlYXNvbiBJRCBtdXN0IGJlIGRlZmluZWRcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IFtlUnVsZVBvbGljeS5JTkZPUk1BVElPTiwgZVJ1bGVDb25maWRlbmNlLk1BTlVBTF0sXG4gICAgICAgIHJlYXNvbklkOiByZWFzb25JZCxcbiAgICAgICAgbWVzc2FnZUFyZ3M6IG1lc3NhZ2VBcmdzIHx8IFtdLFxuICAgICAgICBhcGlBcmdzOiBhcGlBcmdzIHx8IFtdXG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBSdWxlUmVzdWx0ID0ge1xuICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3ksIGVSdWxlQ29uZmlkZW5jZV0sXG4gICAgcmVhc29uSWQ/OiBudW1iZXIgfCBzdHJpbmcsXG4gICAgbWVzc2FnZUFyZ3M/OiBzdHJpbmdbXSxcbiAgICBhcGlBcmdzPzogYW55W11cbn1cblxuZXhwb3J0IHR5cGUgUnVsZURldGFpbHMgPSBSdWxlUmVzdWx0ICYge1xuICAgIHJ1bGVJZDogc3RyaW5nLFxuXG4gICAgbm9kZTogTm9kZSxcbiAgICAvLyBuYW1lc3BhY2U6IHN0cmluZyxcbiAgICBjYXRlZ29yeT86IGVSdWxlQ2F0ZWdvcnksXG4gICAgcGF0aDogeyBbbnM6IHN0cmluZ10gOiBzdHJpbmcgfSxcblxuICAgIHJ1bGVUaW1lOiBudW1iZXIsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGJvdW5kcz86IHtcbiAgICAgICAgdG9wOiBudW1iZXIsXG4gICAgICAgIGxlZnQ6IG51bWJlcixcbiAgICAgICAgd2lkdGg6IG51bWJlcixcbiAgICAgICAgaGVpZ2h0OiBudW1iZXJcbiAgICB9LFxuICAgIHNuaXBwZXQ6IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBSdWxlQ29udGV4dEhpZXJhcmNoeSA9IHsgW25hbWVzcGFjZTogc3RyaW5nXSA6IElNYXBSZXN1bHRbXSB9O1xuXG5leHBvcnQgdHlwZSBSdWxlQ29udGV4dCA9IHtcbiAgICBbbmFtZXNwYWNlOiBzdHJpbmddIDogSU1hcFJlc3VsdFxufVxuXG5leHBvcnQgdHlwZSBSdWxlID0ge1xuICAgIC8vIFVuaXF1ZSBzdHJpbmcgaWRlbnRpZmllciBmb3IgdGhpcyBydWxlIChzaG91bGQgYmUgaHVtYW4gdW5kZXJzdGFuZGFibGUpXG4gICAgLy8gTkxTIGNvZGVzIGFuZCBoZWxwIHNvdXJjZXMgd2lsbCBiZSBiYXNlZCBvZmYgb2YgdGhpcyBpZFxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICAvLyBTZWUgc3JjL3YyL2NvbW1vbi9Db250ZXh0LnRzIGZvciB2YWxpZCBjb250ZXh0c1xuICAgIGNvbnRleHQ6IHN0cmluZztcblxuICAgIC8vIEFycmF5IG9mIHJ1bGVzIHRoYXQgbXVzdCBwYXNzIHRvIGFsbG93IHRoaXMgdmFsaWRhdGUgdG8gcnVuIC0gdGhleSBtdXN0IGhhdmUgdGhlIHNhbWUgY29udGV4dCBwcm9wZXJ0eVxuICAgIGRlcGVuZGVuY2llcz86IHN0cmluZ1tdXG4gICAgcHJlcmVxcz86IHN0cmluZ1tdXG5cbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgPT4gUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXVxuXG4gICAgZW5hYmxlZD86IGJvb2xlYW5cbn1cblxuXG5leHBvcnQgdHlwZSBSZXBvcnQgPSB7XG4gICAgcmVzdWx0czogUnVsZURldGFpbHNbXSxcbiAgICBudW1FeGVjdXRlZDogbnVtYmVyLFxuICAgIHJ1bGVUaW1lOiBudW1iZXIsXG4gICAgLy8gVGhpcyBtYXkgYmUgdW5kZWZpbmVkIGZvciBhIGZpbHRlcmVkIHJlcG9ydFxuICAgIHRvdGFsVGltZT86IG51bWJlcixcbiAgICBubHM/OiB7XG4gICAgICAgIFtydWxlSWQ6IHN0cmluZ106IHtcbiAgICAgICAgICAgIFtyZWFzb25JZDogc3RyaW5nXTogc3RyaW5nXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIE5sc01hcCA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdbXVxufVxuXG5leHBvcnQgdHlwZSBIZWxwTWFwID0ge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUVuZ2luZSB7XG4gICAgLyoqXG4gICAgICogUGVyZm9ybSBhIHNjYW4gb24gYSBkb2N1bWVudCBvciBzdWJ0cmVlXG4gICAgICogQHBhcmFtIHJ1bGVzZXRJZHMgQXJyYXkgb2YgcnVsZXNldCBpZHMgb2YgcnVsZXNldHMgdG8gdXNlIGZvciB0aGlzIHNjYW5cbiAgICAgKiBAcGFyYW0gcm9vdCBEb2N1bWVudCBvciBzdWJ0cmVlIHRvIHNjYW5cbiAgICAgKi9cbiAgICBydW4ocm9vdDogRG9jdW1lbnQgfCBOb2RlLCBvcHRpb25zPzoge30pIDogUHJvbWlzZTxSZXBvcnQ+O1xuXG4gICAgZW5hYmxlUnVsZXMocnVsZUlkczogc3RyaW5nW10pO1xuXG4gICAgZ2V0UnVsZShydWxlSWQ6IHN0cmluZyk6IFJ1bGU7XG5cbiAgICBnZXRSdWxlc0lkcygpIDogc3RyaW5nW107XG5cbiAgICBnZXRNZXNzYWdlKHJ1bGVJZDogc3RyaW5nLCBydWxlSWR4OiBudW1iZXIgfCBzdHJpbmcsIG1zZ0FyZ3M/OiBzdHJpbmdbXSk6IHN0cmluZztcblxuICAgIGdldEhlbHAocnVsZUlkOiBzdHJpbmcsIHJ1bGVJZHg6IG51bWJlciB8IHN0cmluZyk6IHN0cmluZztcblxuICAgIGFkZFJ1bGVzKHJ1bGU6IFJ1bGVbXSk7XG5cbiAgICBhZGRSdWxlKHJ1bGU6IFJ1bGUpO1xuXG4gICAgYWRkTmxzTWFwKG1hcDogTmxzTWFwKTtcblxuICAgIGFkZEhlbHBNYXAobWFwOiBObHNNYXApO1xufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLypnbG9iYWwgT3BlbkFqYXgqL1xuLy8gYWxsIHJlZmVyZW5jZXMgdG8gV0FJLUFSSUEgc3BlY2lmaWNhdGlvbiBpcyB0aGUgV0FJLUFSSUEgMS4yXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEtMS4yL1xuXG5leHBvcnQgaW50ZXJmYWNlIElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQge1xuICAgIGltcGxpY2l0Um9sZTogc3RyaW5nW10sXG4gICAgdmFsaWRSb2xlczogc3RyaW5nW10sXG4gICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogYm9vbGVhbixcbiAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcz86IHN0cmluZ1tdLCBcbiAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlcz86IHN0cmluZ1tdLFxuICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzPzogc3RyaW5nW10sIC8vcm9sZXMsIG90aGVyIHRoYW4gaW1wbGljaXQgYW5kIHZhbGlkIHJvbGVzLCB3aG9zZSBhdHRyaWJ1dGVzIGFyZSBhbHNvIGFsbG93ZWRcbiAgICAvLyBhIGZldyBlbGVtZW50cyAoc3VjaCBhcyBkYXRhbGlzdCwgaHRtbCwgY2FwdGlvbikgdGhhdCBoYXZlIGFuIGltcGxpY2l0IHJvbGUgYnV0IGRpc2FsbG93IHNvbWUgb3IgYWxsIGF0dHJpYnV0ZXMgYWxsb3dlZCBmb3IgdGhlIHJvbGUuXG4gICAgYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZT86IGJvb2xlYW4sXG4gICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlPzogc3RyaW5nW10gIC8vc29tZSBlbGVtZW50cyAodmFyLGFiYnIgZXRjLikgaGF2ZSBubyBpbXBsaWNpdCByb2xlIGJ1dCBuYW1pbmcgcHJvaGliaXRlZCAgIFxufVxuXG5leHBvcnQgY2xhc3MgQVJJQURlZmluaXRpb25zIHtcbiAgICBzdGF0aWMgbmFtZUZyb21Db250ZW50KHJvbGU6IHN0cmluZykgOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChyb2xlIGluIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucykgXG4gICAgICAgICAgICAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ubmFtZUZyb20gXG4gICAgICAgICAgICAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ubmFtZUZyb20uaW5jbHVkZXMoXCJjb250ZW50c1wiKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIGFycmF5IG9mIFdBSS1BUklBIGdsb2JhbCBzdGF0ZXMgYW5kIHByb3BlcnRpZXNcbiAgICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjIvI2dsb2JhbF9zdGF0ZXNcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2xvYmFsUHJvcGVydGllcyA6IHN0cmluZ1tdID0gW1wiYXJpYS1hdG9taWNcIiwgXCJhcmlhLWJ1c3lcIiwgXCJhcmlhLWNvbnRyb2xzXCIsIFwiYXJpYS1jdXJyZW50XCIsIFwiYXJpYS1kZXNjcmliZWRieVwiLCBcbiAgICAgICAgXCJhcmlhLWRldGFpbHNcIiwgXCJhcmlhLWZsb3d0b1wiLCBcImFyaWEtaGlkZGVuXCIsIFwiYXJpYS1rZXlzaG9ydGN1dHNcIixcbiAgICAgICAgXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCIsIFwiYXJpYS1saXZlXCIsIFwiYXJpYS1vd25zXCIsIFwiYXJpYS1yZWxldmFudFwiLCBcImFyaWEtcm9sZWRlc2NyaXB0aW9uXCJcbiAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBhcmUgZGVwcmVjYXRlZCBpbiBBUklBIDEuMiwgd2lsbCBpbmRpY2F0ZSBkZXByZWNhdGlvbiBpbiBpbmRpdmlkdWFsIHJvbGVcbiAgICAgICAgLCAnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCdcbiAgICBdO1xuXG4gICAgLy9wcm9wZXJ0aWVzIGNvbnRhaW5zIGlkKHMpIHRoYXQgcmVmZXIgdG8gb3RoZXIgZWxlbWVudChzKVxuICAgIHN0YXRpYyByZWZlcmVuY2VQcm9wZXJ0aWVzIDogc3RyaW5nW10gPSBbXCJhcmlhLW93bnNcIiwgXCJhcmlhLWNvbnRyb2xzXCIsIFwiYXJpYS1kZXNjcmliZWRieVwiLCBcImFyaWEtbGFiZWxsZWRieVwiLCBcImFyaWEtZmxvd3RvXCIsIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCJdO1xuXG4gICAgLy8gZGVwcmVjYXRlZCByb2xlc1xuICAgIHN0YXRpYyBnbG9iYWxEZXByZWNhdGVkUm9sZXMgOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ2RpcmVjdG9yeScsICdkb2MtYmlibGlvZW50cnknLCAnZG9jLWVuZG5vdGUnXG4gICAgXTtcblxuICAgIC8vIHRoZSBmb2xsb3dpbmcgYXJlIGRlcHJlY2F0ZWQgaW4gQVJJQSAxLjEgZm9yIGFsbCB0aGUgcm9sZXNcbiAgICBzdGF0aWMgZ2xvYmFsRGVwcmVjYXRlZFByb3BlcnRpZXMgOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ2FyaWEtZ3JhYmJlZCcsICdhcmlhLWRyb3BlZmZlY3QnXG4gICAgXTtcbiAgICBcbiAgICAvKlxuICAgICAqIFhTRCBkYXRhIHR5cGVzIGZvciBhbGwgV0FJLUFSSUEgcHJvcGVydGllc1xuICAgICAqIGFsb25nIHdpdGggdmFsaWQgdmFsdWVzIHdoZW4gdGhlIGRhdGEgdHlwZSBpcyBOTVRPS0VOXG4gICAgICogV0FJLUFSSUEgcHJvcGVydGllcyBkYXRhIHR5cGVzIGV4cGxhbmVkOlxuICAgICAqICB0eXBlOiBVc2VkIHRvIGlkZW50aWZ5IHRoZSB0eXBlIG9mIHZhbHVlcyBhbGxvd2VkIGZvciB0aGUgV0FJLUFSSUEgcHJvcGVydHlcbiAgICAgKiAgdmFsdWVzOiBVc2VkIHRvIGlkZW50aWZ5IHNwZWNpZmljIHZhbHVlcyBvZiBhbiBXQUktQVJJQSBwcm9wZXJ0eSB3aGVuIHR5cGUgaXMgbm10b2tlblxuICAgICAqICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogVXNlZCB0byBpZGVudGlmeSBpZiB0aGUgV0FJLUFSSUEgcHJvcGVydHkgc3VwcG9ydHMgcmVmZXJlbmNpbmcgaGlkZGVuIElEXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRydWU6IHJlZmVycyB0byBXQUktQVJJQSBwcm9wZXJ0eSBzdXBwb3J0cyBoaWRkZW4gSUQgcmVmZXJlbmNlc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZTogcmVmZXJzIHRvIFdBSS1BUklBIHByb3BlcnR5IGRvZXMgbm90IHN1cHBvcnQgaGlkZGVuIElEIHJlZmVyZW5jZXNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgdmFsdWUgd2lsbCBiZSBzZXQgdG8gZmFsc2UsIGlmIG5vdCBzcGVjaWZpZWQuXG4gICAgICovXG4gICAgc3RhdGljIHByb3BlcnR5RGF0YVR5cGVzIDogeyBcbiAgICAgICAgW3Byb3A6IHN0cmluZ10gOiB7IFxuICAgICAgICAgICAgdHlwZTogc3RyaW5nLCBcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkPzogYm9vbGVhbixcbiAgICAgICAgICAgIHZhbHVlcz86IHN0cmluZ1tdIFxuICAgICAgICB9XG4gICAgfSA9IHtcbiAgICAgICAgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZlwiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWF0b21pY1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJpbmxpbmVcIiwgXCJsaXN0XCIsIFwiYm90aFwiLCBcIm5vbmVcIiwgXCJ1bmRlZmluZWRcIl0gLy9hZGQgdW5kZWZpbmVkIHRvIGhhbmRsZSB2YWx1ZSBlbXB0eVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtYnVzeVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwibWl4ZWRcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWNvbGNvdW50XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWNvbGluZGV4XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWNvbHNwYW5cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY29udHJvbHNcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jdXJyZW50XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJwYWdlXCIsIFwic3RlcFwiLCBcImxvY2F0aW9uXCIsIFwiZGF0ZVwiLCBcInRpbWVcIiwgXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJ1bmRlZmluZWRcIl0gLy9hZGQgdW5kZWZpbmVkIGZvciBlbXB0eSB2YWx1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZGVzY3JpYmVkYnlcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1kZXRhaWxzXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1kcm9wZWZmZWN0XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlbnNcIixcbiAgICAgICAgICAgIHZhbHVlczogW1wiY29weVwiLCBcIm1vdmVcIiwgXCJsaW5rXCIsIFwiZXhlY3V0ZVwiLCBcInBvcHVwXCIsIFwibm9uZVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZXJyb3JtZXNzYWdlXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1mbG93dG9cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZ3JhYmJlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1oYXNwb3B1cFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwibWVudVwiLCBcImxpc3Rib3hcIiwgXCJ0cmVlXCIsIFwiZ3JpZFwiLCBcImRpYWxvZ1wiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWludmFsaWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcInNwZWxsaW5nXCIsIFwiZ3JhbW1hclwiLCBcInVuZGVmaW5lZFwiXSAvL2FkZCB1bmRlZmluZWQgZm9yIGVtcHR5IHZhbHVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1rZXlzaG9ydGN1dHNcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbGFiZWxcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbGFiZWxsZWRieVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWxldmVsXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWxpdmVcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcIm9mZlwiLCBcInBvbGl0ZVwiLCBcImFzc2VydGl2ZVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbW9kYWxcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLW11bHRpbGluZVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1wiaG9yaXpvbnRhbFwiLCBcInZlcnRpY2FsXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1vd25zXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcGxhY2Vob2xkZXJcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcG9zaW5zZXRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcHJlc3NlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwibWl4ZWRcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJlYWRvbmx5XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yZWxldmFudFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5zXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcImFkZGl0aW9uc1wiLCBcInJlbW92YWxzXCIsIFwidGV4dFwiLCBcImFsbFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcmVxdWlyZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJvbGVkZXNjcmlwdGlvblwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yb3djb3VudFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yb3dpbmRleFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yb3dzcGFuXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXNldHNpemVcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtc29ydFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1wiYXNjZW5kaW5nXCIsIFwiZGVzY2VuZGluZ1wiLCBcIm90aGVyXCIsIFwibm9uZVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkZWNpbWFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZGVjaW1hbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS12YWx1ZW5vd1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RlY2ltYWxcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtdmFsdWV0ZXh0XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjc3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qXG4gICAgICogZGVzaWduIHBhdHRlcm5zIGZvciBjb25jcmV0ZSBXQUktQVJJQSByb2xlc1xuICAgICAqIGxlZ2l0aW1hdGUga2V5cyBmb3IgZWFjaCByb2xlIGluY2x1ZGU6XG4gICAgICpcbiAgICAgKiAtIGNvbnRhaW5lcjogYXBwcm9wcmlhdGUgY29udGFpbmVyKHMpIGZvciB0aGF0IHJvbGVcbiAgICAgKiAtIHByb3BzOiBzdGF0ZXMgYW5kIHByb3BlcnRpZXMgdGhhdCBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm9sZSAoaW4gYWRkaXRpb24gdG8gdGhlIGdsb2JhbCBzdGF0ZXMgYW5kIHByb3BlcnRpZXMgbGlzdGVkIGFib3ZlKVxuICAgICAqIC0gcmVxUHJvcHM6IHJlcXVpcmVkIHN0YXRlcyBvciBwcm9wZXJ0aWVzIGZvciB0aGlzIHJvbGVcbiAgICAgKiAtIHJlcUNoaWxkcmVuOiByZXF1aXJlZCBjaGlsZHJlbiBmb3IgdGhpcyByb2xlXG4gICAgICogLSBodG1sRXF1aXY6IEhUTUwgZXF1aXZhbGVudCBmb3IgdGhpcyByb2xlXG4gICAgICogLSByb2xlVHlwZTogb25lIG9mIHdpZGdldCwgc3RydWN0dXJlLCBsYW5kbWFyaywgbGl2ZVJlZ2lvbiwgd2luZG93IChhcyBzZWVuIGluIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjIvI3JvbGVzX2NhdGVnb3JpemF0aW9uKVxuICAgICAqIC0gbmFtZVJlcXVpcmVkOiBkZXRlcm1pbmVzIHdoZXRoZXIgYW4gYWNjZXNzaWJsZSBuYW1lIGlzIHJlcXVpcmVkIGZvciBhIHdpZGdldCAoc2VlIEFSSUEgc3BlYy4pXG4gICAgICogLSBuYW1lRnJvbTogZGV0ZXJtaW5lcyBob3cgYW4gYWNjZXNzaWJsZSBuYW1lIGlzIHN1cHBsaWVkIChhdXRob3Igb3IgY29udGVudCAtIHNlZSBBUklBIHNwZWMuKVxuICAgICAqIC0gZGVwcmVjYXRlZDogaWYgcHJlc2VudCwgaW5kaWNhdGVzIHRoYXQgdGhlIHJvbGUgaXMgZGVwcmVjYXRlZCwgYW5kIHByb3ZpZGVzIGEgbGlzdCBvZiBhbHRlcm5hdGl2ZSByb2xlKHMpXG4gICAgICovXG4gICAgc3RhdGljIGRlc2lnblBhdHRlcm5zIDoge1xuICAgICAgICBbcm9sZTogc3RyaW5nXToge1xuICAgICAgICAgICAgY29udGFpbmVyOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIHByb3BzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogc3RyaW5nLFxuICAgICAgICAgICAgcm9sZVR5cGU/OiBzdHJpbmcsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ/OiBib29sZWFuLFxuICAgICAgICAgICAgbmFtZUZyb20/OiBzdHJpbmdbXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW4/OiBib29sZWFuLFxuICAgICAgICAgICAgZGVwcmVjYXRlZD86IGJvb2xlYW4sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM/OiBzdHJpbmdbXVxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzPzogc3RyaW5nW11cbiAgICAgICAgfVxuICAgIH0gPSB7XG4gICAgICAgIFwiYWxlcnRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGl2ZVJlZ2lvblwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYWxlcnRkaWFsb2dcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtbW9kYWxcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2luZG93XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImFwcGxpY2F0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWV4cGFuZGVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLCAvLyBvciBjYW4gYmUgXCJ3aWRnZXRcIlxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImFydGljbGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImJhbm5lclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJibG9ja3F1b3RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJidXR0b25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXByZXNzZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImJ1dHRvbiB8IGlucHV0W0B0eXBlPSdidXR0b24nXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY2FwdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImZpZ3VyZVwiLCBcImdyaWRcIiwgXCJ0YWJsZVwiLCBcInRyZWVncmlkXCJdLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjZWxsXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wicm93XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29saW5kZXhcIiwgXCJhcmlhLWNvbHNwYW5cIiwgXCJhcmlhLXJvd2luZGV4XCIsIFwiYXJpYS1yb3dzcGFuXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0ZFwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY2hlY2tib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbnB1dFtAdHlwZT0nY2hlY2tib3gnXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNvZGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb2x1bW5oZWFkZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb2xpbmRleFwiLCBcImFyaWEtY29sc3BhblwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcm93aW5kZXhcIiwgXCJhcmlhLXJvd3NwYW5cIiwgXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1zb3J0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0aFtAc2NvcGU9J2NvbCddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNvbWJvYm94XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNvbnRyb2xzXCIsIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1hdXRvY29tcGxldGVcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCJdLCAvLyBhcmlhLWNvbnRyb2xzIGlzbid0IGFjdHVhbGx5IHJlcXVpcmVkIHdoZW4gYXJpYS1leHBhbmRlZD1cImZhbHNlXCJcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNvbXBsZW1lbnRhcnlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29tbWVudFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29udGVudGluZm9cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZGVmaW5pdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImRlbGV0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZGlhbG9nXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLW1vZGFsXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpbmRvd1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGlyZWN0b3J5XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddICBcbiAgICAgICAgfSwgXG4gICAgICAgIFwiZG9jLWFic3RyYWN0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1hY2tub3dsZWRnbWVudHNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWFmdGVyd29yZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtYXBwZW5kaXhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWJhY2tsaW5rXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtaGFzcG9wdXBcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImEgfCBsaW5rXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1iaWJsaW9lbnRyeVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImxpXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtYmlibGlvZ3JhcGh5XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1iaWJsaW9yZWZcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZGlzYWJsZWRcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiYSB8IGxpbmtcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWNoYXB0ZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWNvbG9waG9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWNvbmNsdXNpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWNvdmVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbWdcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWNyZWRpdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY3JlZGl0c1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZGVkaWNhdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZW5kbm90ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImxpXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWVuZG5vdGVzXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWVwaWdyYXBoXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1lcGlsb2d1ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZXJyYXRhXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1leGFtcGxlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1mb290bm90ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZm9yZXdvcmRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWdsb3NzYXJ5XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1nbG9zc3JlZlwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWhhc3BvcHVwXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJhIHwgbGlua1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtaW5kZXhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWludHJvZHVjdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2Mtbm90ZXJlZlwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWhhc3BvcHVwXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJhIHwgbGlua1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2Mtbm90aWNlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcGFnZWJyZWFrXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLW9yaWVudGF0aW9uXCJdLCAvLyBhcmlhLWRpc2FibGVkLCBhcmlhLXZhbHVlbWF4LCBhcmlhLXZhbHVlbWluLCBhcmlhLXZhbHVldGV4dCBhcmUgdmFsaWQgaWYgZm9jdXNhYmxlLiBUaGlzIGlzIGhhbmRsZWQgaW4gdGhlIGNvZGUuXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCwgLy8gYXJpYS12YWx1ZW5vdyBpcyByZXF1aXJlZCBpZiBmb2N1c2FibGUuIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUgY29kZS5cbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsIC8vIG9yIHdpZGdldCBpZiBmb2N1c2FibGVcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcGFnZWxpc3RcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXBhZ2Vmb290ZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYWdlaGVhZGVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcGFydFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcHJlZmFjZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcHJvbG9ndWVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXB1bGxxdW90ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXFuYVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2Mtc3VidGl0bGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXRpcFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXRvY1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2N1bWVudFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImVtcGhhc2lzXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZmVlZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImFydGljbGVcIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZmlndXJlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJmb3JtXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJmb3JtXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJnZW5lcmljXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJkaXYgfCBzcGFuXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCIsIFwiYXJpYS1yb2xlZGVzY3JpcHRpb25cIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZ3JhcGhpY3MtZG9jdW1lbnRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgXCJncmFwaGljcy1vYmplY3RcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIFwiZ3JhcGhpY3Mtc3ltYm9sXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICBcImdyaWRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtY29sY291bnRcIiwgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJvd2NvdW50XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wicm93XCIsIFwicm93Z3JvdXBcIl0sIC8vIHJvd2dyb3VwIGlzIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0YWJsZVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJncmlkY2VsbFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcInJvd1wiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNvbGluZGV4XCIsIFwiYXJpYS1jb2xzcGFuXCIsIFwiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtZXJyb3JtZXNzYWdlXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtaGFzcG9wdXBcIiwgXCJhcmlhLWludmFsaWRcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcm93aW5kZXhcIiwgXCJhcmlhLXJvd3NwYW5cIiwgXCJhcmlhLXNlbGVjdGVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0ZFwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcblxuICAgICAgICBcImdyb3VwXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJoZWFkaW5nXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtbGV2ZWxcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJoMSB8IGgyIHwgaDMgfCBoNCB8IGg1IHwgaDZcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImltZ1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiaW1nXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImluc2VydGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImxpbmtcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImEgfCBsaW5rXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImxpc3RcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJsaXN0aXRlbVwiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJvbCB8IHVsXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibGlzdGJveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCIsIFwiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiZ3JvdXBcIiwgXCJvcHRpb25cIl0sIC8vIGdyb3VwIGlzIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJsaXN0aXRlbVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImxpXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibG9nXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxpdmVSZWdpb25cIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWFpblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtYXJrXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJtYXJrXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1hcnF1ZWVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGl2ZVJlZ2lvblwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtYXRoXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IGZhbHNlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1lbnVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtb3JpZW50YXRpb25cIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJncm91cFwiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIl0sIC8vIGdyb3VwIGlzIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1lbnViYXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtb3JpZW50YXRpb25cIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJncm91cFwiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIl0sIC8vIGdyb3VwIGlzIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSwgXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtZW51aXRlbVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyb3VwXCIsIFwibWVudVwiLCBcIm1lbnViYXJcIl0sIC8vIGdyb3VwIG9ubHkgY291bnRzIGFzIGEgdmFsaWQgY29udGFpbmVyIGlmIGl0IGlzIGNvbnRhaW5lZCBpbiBhIG1lbnUgb3IgbWVudWJhclxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgXCJtZW51aXRlbWNoZWNrYm94XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZ3JvdXBcIiwgXCJtZW51XCIsIFwibWVudWJhclwiXSwgLy8gZ3JvdXAgb25seSBjb3VudHMgYXMgYSB2YWxpZCBjb250YWluZXIgaWYgaXQgaXMgY29udGFpbmVkIGluIGEgbWVudSBvciBtZW51YmFyXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1jaGVja2VkXCJdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtZW51aXRlbXJhZGlvXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZ3JvdXBcIiwgXCJtZW51XCIsIFwibWVudWJhclwiXSwgLy8gZ3JvdXAgb25seSBjb3VudHMgYXMgYSB2YWxpZCBjb250YWluZXIgaWYgaXQgaXMgY29udGFpbmVkIGluIGEgbWVudSBvciBtZW51YmFyXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1jaGVja2VkXCJdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtZXRlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVldGV4dFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLXZhbHVlbm93XCJdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm5hdmlnYXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibm9uZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW10sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJub3RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJvcHRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncm91cFwiLCBcImxpc3Rib3hcIl0sIC8vIGdyb3VwIG9ubHkgY291bnRzIGFzIGEgdmFsaWQgY29udGFpbmVyIGlmIGl0IGlzIGNvbnRhaW5lZCBpbiBhIGxpc3Rib3hcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1jaGVja2VkXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLCAvLyBcImFyaWEtc2VsZWN0ZWRcIiBoYXMgYSBkZWZhdWx0XG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJvcHRpb25cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicGFyYWdyYXBoXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicHJlc2VudGF0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInByb2dyZXNzYmFyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiLCBcImFyaWEtdmFsdWVub3dcIiwgXCJhcmlhLXZhbHVldGV4dFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInJhZGlvXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImlucHV0W0B0eXBlPSdyYWRpbyddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInJhZGlvZ3JvdXBcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtb3JpZW50YXRpb25cIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInJhZGlvXCJdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInJlZ2lvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJyb3dcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncmlkXCIsIFwicm93Z3JvdXBcIiwgXCJ0YWJsZVwiLCBcInRyZWVncmlkXCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtY29saW5kZXhcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXJvd2luZGV4XCIsIFwiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcImNlbGxcIiwgXCJjb2x1bW5oZWFkZXJcIiwgXCJncmlkY2VsbFwiLCBcInJvd2hlYWRlclwiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0clwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInJvd2dyb3VwXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZ3JpZFwiLCBcInRhYmxlXCIsIFwidHJlZWdyaWRcIl0sXG4gICAgICAgICAgICBwcm9wczogW10sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGJvZHkgfCB0Zm9vdCB8IHRoZWFkXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicm93aGVhZGVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wicm93XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29saW5kZXhcIiwgXCJhcmlhLWNvbHNwYW5cIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJvd2luZGV4XCIsIFwiYXJpYS1yb3dzcGFuXCIsIFwiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtc29ydFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGhbQHNjb3BlPSdyb3cnXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcblxuICAgICAgICBcInNjcm9sbGJhclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1jb250cm9sc1wiLCBcImFyaWEtdmFsdWVub3dcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzZWFyY2hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwic2VhcmNoYm94XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWF1dG9jb21wbGV0ZVwiLCBcImFyaWEtbXVsdGlsaW5lXCIsIFwiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbnB1dFtAdHlwZT0nc2VhcmNoJ11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuXG4gICAgICAgIFwic2VwYXJhdG9yXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLW9yaWVudGF0aW9uXCJdLCAvLyBhcmlhLWRpc2FibGVkLCBhcmlhLXZhbHVlbWF4LCBhcmlhLXZhbHVlbWluLCBhcmlhLXZhbHVldGV4dCBhcmUgdmFsaWQgaWYgZm9jdXNhYmxlLiBUaGlzIGlzIGhhbmRsZWQgaW4gdGhlIGNvZGUuXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCwgLy8gYXJpYS12YWx1ZW5vdyBpcyByZXF1aXJlZCBpZiBmb2N1c2FibGUuIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUgY29kZS5cbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsIC8vIG9yIHdpZGdldCBpZiBmb2N1c2FibGVcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzbGlkZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtb3JpZW50YXRpb25cIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVldGV4dFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLXZhbHVlbm93XCJdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzcGluYnV0dG9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZW5vd1wiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdGF0dXNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGl2ZVJlZ2lvblwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdHJvbmdcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdWJzY3JpcHRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdWdnZXN0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwic3VwZXJzY3JpcHRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzd2l0Y2hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0YWJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJ0YWJsaXN0XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0YWJsZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb2xjb3VudFwiLCBcImFyaWEtcm93Y291bnRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJyb3dcIiwgXCJyb3dncm91cFwiLCBcImNhcHRpb25cIl0sIC8vIHJvd2dyb3VwIGFuZCBjYXB0aW9uIGFyZSBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGFibGVcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0YWJsaXN0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLCBcImFyaWEtb3JpZW50YXRpb25cIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJ0YWJcIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsIFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGFicGFuZWxcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRlcm1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImRmblwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0ZXh0Ym94XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWF1dG9jb21wbGV0ZVwiLCBcImFyaWEtbXVsdGlsaW5lXCIsIFwiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbnB1dFtAdHlwZT0ndGV4dCddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcblxuICAgICAgICBcInRpbWVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0aW1lclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsaXZlUmVnaW9uXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRvb2xiYXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtb3JpZW50YXRpb25cIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0b29sdGlwXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSwgLy8gQVJJQSAxLjIgaGFzIHRoaXMgYXMgbmFtZVJlcXVpcmVkOiB0cnVlLCBidXQgQVJJQSAxLjMgcmVtb3ZlZCBpdCBiZWNhdXNlIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHJlcXVpcmUgYSBuYW1lIG9uIGEgdG9vbHRpcC5cbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0cmVlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLCBcImFyaWEtb3JpZW50YXRpb25cIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiZ3JvdXBcIiwgXCJ0cmVlaXRlbVwiXSwgLy8gZ3JvdXAgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRyZWVncmlkXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWNvbGNvdW50XCIsIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJvd2NvdW50XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wicm93XCIsIFwicm93Z3JvdXBcIl0sIC8vIHJvd2dyb3VwIGlzIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0cmVlaXRlbVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyb3VwXCIsIFwidHJlZVwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuICAgIH0gLy8gZW5kIGRlc2lnblBhdHRlcm5zXG5cbiAgICAvLyBjb3BpZWQgZnJvbSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zZW1hbnRpY3Mtb3RoZXIuaHRtbCNkaXNhYmxlZC1lbGVtZW50c1xuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2lucHV0Lmh0bWwjaW5wdXQtdHlwZS1hdHRyLXN1bW1hcnlcbiAgICBzdGF0aWMgZWxlbWVudHNBbGxvd2VkRGlzYWJsZWQgPSBbXCJidXR0b25cIiwgXCJpbnB1dFwiLCBcInNlbGVjdFwiLCBcInRleHRhcmVhXCIsIFwib3B0Z3JvdXBcIiwgXCJvcHRpb25cIiwgXCJmaWVsZHNldFwiXTsgLy8gYWxzbyBmb3JtLWFzc29jaWF0ZWQgY3VzdG9tIGVsZW1lbnRcbiAgICBzdGF0aWMgZWxlbWVudHNBbGxvd2VkUmVxdWlyZWQgPSBbXCJzZWxlY3RcIiwgXCJ0ZXh0YXJlYVwiXTsgLy8gcmVtb3ZlICdpbnB1dCcgYW5kIGFkZCB0byB0aGUgaW5kaXZpZHVhbCBlbGVtZW50LCBiZWN1YXNlIHJlcXVpcmVkIGlzIG5vdCBzdXBwb3J0ZWQgb24gaW5wdXRAdHlwZT1cInJhbmdlXCIsIFwiY29sb3JcIiwgXCJoaWRkZW5cIiBvciBhbnkgYnV0dG9uIHR5cGVzXG4gICAgc3RhdGljIGVsZW1lbnRzQWxsb3dlZFJlYWRPbmx5ID0gW1widGV4dGFyZWFcIl07IC8vIHJlbW92ZSAnaW5wdXQnIGFuZCBhZGQgdG8gdGhlIGluZGl2aWR1YWwgZWxlbWVudCwgYmVjYXVzZSByZWFkb25seSBpcyBub3Qgc3VwcG9ydGVkIG9uIGlucHV0QHR5cGU9XCJjaGVja2JveFwiLCBcInJhZGlvXCIsIFwicmFuZ2VcIiwgXCJjb2xvclwiLCBcImZpbGVcIiwgaGlkZGVuXCIgb3IgYW55IGJ1dHRvbiB0eXBlc1xuXG5cbiAgICAvKiBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbC1hcmlhLyNkb2Njb25mb3JtYW5jZVxuICAgICAgICAqIGRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudCBjb250YWlucyBwcm9wZXJ0aWVzIG9mIHRoZSB0YWdzIHJlbGF0ZWQgdG8gcm9sZSB3aXRob3V0IGFueSBhZGRpdGlvbmFsIGF0dHJpYnV0ZSB2YWx1ZVxuICAgICAgICAqIGRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzIGNvbnRhaW5zIHRob3NlIHRhZ3MgdGhhdCByZXF1aXJlIHNwZWNpYWwgY29uc2lkZXJhdGlvbnNcbiAgICAgICAgKi9cbiAgICBzdGF0aWMgZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50OiB7XG4gICAgICAgIFtyb2xlOiBzdHJpbmddOiBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50XG4gICAgfSA9IHtcbiAgICAgICAgXCJhYmJyXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhZGRyZXNzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJ0aWNsZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImFydGljbGVcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhcHBsaWNhdGlvblwiLCBcImRvY3VtZW50XCIsIFwiZmVlZFwiLCBcIm1haW5cIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwicmVnaW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFzaWRlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tcGxlbWVudGFyeVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1kZWRpY2F0aW9uXCIsIFwiZG9jLWV4YW1wbGVcIiwgXCJkb2MtZm9vdG5vdGVcIiwgXCJkb2MtcHVsbHF1b3RlXCIsIFwiZG9jLXRpcFwiLCBcImZlZWRcIiwgXCJub25lXCIsIFwibm90ZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJlZ2lvblwiLCBcInNlYXJjaFwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhdWRpb1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhcHBsaWNhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJiXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJiYXNlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImJkaVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYmRvXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJibG9ja3F1b3RlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYmxvY2txdW90ZVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJib2R5XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogWydhcmlhLWhpZGRlbiddLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJyXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWhpZGRlblwiXVxuICAgICAgICB9LFxuICAgICAgICBcImJ1dHRvblwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImJ1dHRvblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImNoZWNrYm94XCIsIFwiY29tYm9ib3hcIiwgXCJncmlkY2VsbFwiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJjYW52YXNcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImNhcHRpb25cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbJ2NhcHRpb24nXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZTogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJjaXRlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJjb2RlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29kZVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb2xcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29sZ3JvdXBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF0YWxpc3RcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJsaXN0Ym94XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZTogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRlbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImRlbGV0aW9uXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRldGFpbHNcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGZuXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGVybVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkaWFsb2dcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJkaWFsb2dcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbGVydGRpYWxvZ1wiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICBcImRsXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibGlzdFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZHRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXJtXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibGlzdGl0ZW1cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZW1cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImVtYmVkXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCIsIFwiZG9jdW1lbnRcIiwgXCJpbWdcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImZpZWxkc2V0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwicmFkaW9ncm91cFwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWdjYXB0aW9uXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJmb3JtXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZm9ybVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJzZWFyY2hcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaGVhZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJoZ3JvdXBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImgxXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1zdWJ0aXRsZVwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJ0YWJcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaDJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXN1YnRpdGxlXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInRhYlwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoM1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2Mtc3VidGl0bGVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwidGFiXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImg0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1zdWJ0aXRsZVwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJ0YWJcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaDVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXN1YnRpdGxlXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInRhYlwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoNlwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2Mtc3VidGl0bGVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwidGFiXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImhyXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wic2VwYXJhdG9yXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXBhZ2VicmVha1wiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaHRtbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImRvY3VtZW50XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZTogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJpXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJpZnJhbWVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYXBwbGljYXRpb25cIiwgXCJkb2N1bWVudFwiLCBcImltZ1wiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaW5zXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaW5zZXJ0aW9uXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImtiZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwibGFiZWxcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJsZWdlbmRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJsaW5rXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm1haW5cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJtYWluXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJtYXBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWFya1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwibWF0aFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIm1hdGhcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm1lbnVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJsaXN0XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZ3JvdXBcIiwgXCJsaXN0Ym94XCIsIFwibWVudVwiLCBcIm1lbnViYXJcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwicmFkaW9ncm91cFwiLCBcInRhYmxpc3RcIiwgXCJ0b29sYmFyXCIsIFwidHJlZVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZXRhXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm1ldGVyXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibWV0ZXJcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbJ2FyaWEtdmFsdWVtYXgnLCAnYXJpYS12YWx1ZW1pbiddLFxuICAgICAgICAgICAgYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZTogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJuYXZcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJuYXZpZ2F0aW9uXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLWluZGV4XCIsIFwiZG9jLXBhZ2VsaXN0XCIsIFwiZG9jLXRvY1wiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwidGFibGlzdFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwibm9zY3JpcHRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwib2JqZWN0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCIsIFwiZG9jdW1lbnRcIiwgXCJpbWdcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwib2xcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJsaXN0XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZ3JvdXBcIiwgXCJsaXN0Ym94XCIsIFwibWVudVwiLCBcIm1lbnViYXJcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwicmFkaW9ncm91cFwiLCBcInRhYmxpc3RcIiwgXCJ0b29sYmFyXCIsIFwidHJlZVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJvcHRncm91cFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyb3VwXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJvcHRpb25cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJvcHRpb25cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXNlbGVjdGVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwib3V0cHV0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wic3RhdHVzXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJwYXJhZ3JhcGhcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwicGFyYW1cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwicGljdHVyZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1oaWRkZW5cIl0gXG4gICAgICAgIH0sXG4gICAgICAgIFwicHJlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJwcm9ncmVzc1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInByb2dyZXNzYmFyXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS12YWx1ZW1heFwiXSBcbiAgICAgICAgfSxcbiAgICAgICAgXCJxXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJycFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwicnRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcInJ1YnlcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInNcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcInNhbXBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInNjcmlwdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZWFyY2hcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbJ3NlYXJjaCddLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogWydzZWFyY2gnLCAnZm9ybScsICdncm91cCcsICdub25lJywgJ3ByZXNlbnRhdGlvbicsICdyZWdpb24nXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzbG90XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInNtYWxsXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzb3VyY2VcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwic3BhblwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic3Ryb25nXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wic3Ryb25nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInN0eWxlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInN1YlwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInN1YnNjcmlwdFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdXBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzdXBlcnNjcmlwdFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdmdcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncmFwaGljcy1kb2N1bWVudFwiXSwgLy8gYXMgZGVmaW5lZCBieSBTVkcgQUFNXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGFibGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0YWJsZVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0ZW1wbGF0ZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0ZXh0YXJlYVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRleHRib3hcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRmb290XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93Z3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGhlYWRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0aW1lXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGltZVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0aXRsZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0cmFja1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJ1XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ1bFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcImxpc3Rib3hcIiwgXCJtZW51XCIsIFwibWVudWJhclwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyYWRpb2dyb3VwXCIsIFwidGFibGlzdFwiLCBcInRvb2xiYXJcIiwgXCJ0cmVlXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInZhclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwidmlkZW9cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYXBwbGljYXRpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwid2JyXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWhpZGRlblwiXVxuICAgICAgICB9XG4gICAgfSAvLyBlbmQgZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50XG5cbiAgICBzdGF0aWMgZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3M6IHtcbiAgICAgICAgW3JvbGU6IHN0cmluZ106IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ10gOiBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50XG4gICAgICAgIH0gfCBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50XG4gICAgfSA9IHtcbiAgICAgICAgXCJhXCI6IHtcbiAgICAgICAgICAgIFwid2l0aC1ocmVmXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImxpbmtcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIG5vbi1lbXB0eSBocmVmIGF0dHJpYnV0ZSBpcyBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYnV0dG9uXCIsIFwiY2hlY2tib3hcIiwgXCJkb2MtYmFja2xpbmtcIiwgXCJkb2MtYmlibGlvcmVmXCIsIFwiZG9jLWdsb3NzcmVmXCIsIFwiZG9jLW5vdGVyZWZcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWRpc2FibGVkPXRydWVcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIndpdGhvdXQtaHJlZlwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBocmVmIGF0dHJpYnV0ZSBpcyBub3QgcHJlc2VudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJlYVwiOiB7XG4gICAgICAgICAgICBcIndpdGgtaHJlZlwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJsaW5rXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBub24tZW1wdHkgaHJlZiBhdHRyaWJ1dGUgaXMgcHJlc2VudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwid2l0aG91dC1ocmVmXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIGhyZWYgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYnV0dG9uXCIsIFwibGlua1wiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4vLyBUT0RPXG4vLyAgICAgICAgXCJhdXRvbm9tb3VzIGN1c3RvbSBlbGVtZW50XCI6IHtcbi8vICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJSb2xlIGV4cG9zZWQgZnJvbSBhdXRob3IgZGVmaW5lZCBFbGVtZW50SW50ZXJuYWxzLiBPdGhlcndpc2Ugbm8gY29ycmVzcG9uZGluZyByb2xlLlwiXSxcbi8vICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiSWYgcm9sZSBkZWZpbmVkIGJ5IEVsZW1lbnRJbnRlcm5hbHNcIiwgXCJhbnkgcm9sZVwiLCBcIm5vIHJvbGUgT3RoZXJ3aXNlXCJdLFxuLy8gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4vLyAgICAgICAgfSxcbiAgICAgICAgXCJkaXZcIjoge1xuICAgICAgICAgICAgXCJjaGlsZC1kbFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcInByZXNlbnRhdGlvblwiLCBcIm5vbmVcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibm8tY2hpbGQtZGxcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImZpZ3VyZVwiOiB7XG4gICAgICAgICAgICBcImNoaWxkLWZpZ2NhcHRpb25cIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZmlndXJlXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFsnZG9jLWV4YW1wbGUnXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuby1jaGlsZC1maWdjYXB0aW9uXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImZpZ3VyZVwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImZvb3RlclwiOiB7XG4gICAgICAgICAgICBcImRlcy1zZWN0aW9uLWFydGljbGUtYXNpZGUtbWFpbi1uYXZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gZGVzY2VuZGFudCBvZiBhbiBhcnRpY2xlLCBhc2lkZSwgbWFpbiwgbmF2IG9yIHNlY3Rpb24gZWxlbWVudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1mb290bm90ZVwiLCBcImdyb3VwXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJvdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb250ZW50aW5mb1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gbm90IGEgZGVzY2VuZGFudCBvZiBhbiBhcnRpY2xlLCBhc2lkZSwgbWFpbiwgbmF2IG9yIHNlY3Rpb24gZWxlbWVudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1mb290bm90ZVwiLCBcImdyb3VwXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4vLyBUT0RPXG4vLyAgICAgICAgXCJmb3JtLWFzc29jaWF0ZWQgY3VzdG9tIGVsZW1lbnRcIjoge1xuLy8gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIlJvbGUgZXhwb3NlZCBmcm9tIGF1dGhvciBkZWZpbmVkIEVsZW1lbnRJbnRlcm5hbHMuIE90aGVyd2lzZSAnZ2VuZXJpYycuXCJdLFxuLy8gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJJZiByb2xlIGRlZmluZWQgYnkgRWxlbWVudEludGVybmFsc1wiLCBcImZvcm0tcmVsYXRlZCByb2xlczogYnV0dG9uXCIsIFwiY2hlY2tib3hcIiwgXCJjb21ib2JveFwiLCBcImdyb3VwXCIsIFwibGlzdGJveFwiLCBcInByb2dyZXNzYmFyXCIsIFwicmFkaW9cIiwgXCJyYWRpb2dyb3VwXCIsIFwic2VhcmNoYm94XCIsIFwic2xpZGVyXCIsIFwic3BpbmJ1dHRvblwiLCBcInN3aXRjaFwiLCBcInRleHRib3hcIiwgXCJubyByb2xlIE90aGVyd2lzZVwiXSxcbi8vICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuLy8gICAgICAgIH0sXG5cbiAgICAgICAgXCJoZWFkZXJcIjoge1xuICAgICAgICAgICAgXCJkZXMtc2VjdGlvbi1hcnRpY2xlLWFzaWRlLW1haW4tbmF2XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIGRlc2NlbmRhbnQgb2YgYW4gYXJ0aWNsZSwgYXNpZGUsIG1haW4sIG5hdiBvciBzZWN0aW9uIGVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJncm91cFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwib3RoZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYmFubmVyXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBub3QgYSBkZXNjZW5kYW50IG9mIGFuIGFydGljbGUsIGFzaWRlLCBtYWluLCBuYXYgb3Igc2VjdGlvbiBlbGVtZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZ3JvdXBcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LFxuICAgICAgICBcImltZ1wiOiB7XG4gICAgICAgICAgICBcImltZy13aXRoLWFsdC10ZXh0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImltZ1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gYWx0IGF0dHJpYnV0ZSBoYXMgdGV4dCAoaXMgbm90IGVtcHR5KVwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImJ1dHRvblwiLCBcImNoZWNrYm94XCIsIFwiZG9jLWNvdmVyXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJwcm9ncmVzc2JhclwiLCBcInJhZGlvXCIsIFwic2Nyb2xsYmFyXCIsIFwic2VwYXJhdG9yXCIsIFwic2xpZGVyXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaW1nLXdpdGgtZW1wdHktYWx0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gYWx0IGF0dHJpYnV0ZSBpcyBlbXB0eVwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsIFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWhpZGRlbj10cnVlXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbWctd2l0aG91dC1hbHRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaW1nXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBhbHQgYXR0cmlidXRlLCBhcmlhLWxhYmVsLCBvciBhcmlhLWxhYmVsbGVkYnkgYXJlIG5vdCBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSwgXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuPXRydWVcIl1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJpbnB1dFwiOiB7XG4gICAgICAgICAgICBcImJ1dHRvblwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJidXR0b25cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY2hlY2tib3hcIiwgXCJjb21ib2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNoZWNrYm94LXdpdGgtYXJpYS1wcmVzc2VkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNoZWNrYm94XCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2l0aCB0eXBlPWNoZWNrYm94IGFuZCBhcmlhLXByZXNzZWQgYXR0cmlidXRlIGlzIHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJidXR0b25cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1jaGVja2VkXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjaGVja2JveC13aXRob3V0LWFyaWEtcHJlc3NlZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjaGVja2JveFwiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdpdGggdHlwZT1jaGVja2JveCBhbmQgYXJpYS1wcmVzc2VkIGF0dHJpYnV0ZSBpcyBub3QgcHJlc2VudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJvcHRpb25cIiwgXCJzd2l0Y2hcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZXF1aXJlZFwiXSxcbiAgICAgICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1jaGVja2VkXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJjb2xvclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGF0ZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRhdGV0aW1lLWxvY2FsXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZW1haWwtbm8tbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2l0aCB0eXBlPWVtYWlsIGFuZCBubyBsaXN0IGF0dHJpYnV0ZSBpcyBwcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVtYWlsLXdpdGgtbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImZpbGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJoaWRkZW5cIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbWFnZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJidXR0b25cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY2hlY2tib3hcIiwgXCJncmlkY2VsbFwiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJtb250aFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibnVtYmVyXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInNwaW5idXR0b25cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJwYXNzd29yZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJyYWRpb1wiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyYWRpb1wiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJtZW51aXRlbXJhZGlvXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtY2hlY2tlZFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmFuZ2VcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wic2xpZGVyXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInJlc2V0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJjaGVja2JveFwiLCBcImNvbWJvYm94XCIsIFwiZ3JpZGNlbGxcIiwgXCJsaW5rXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInJhZGlvXCIsIFwic2xpZGVyXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic2VhcmNoLW5vLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wic2VhcmNoYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWFyY2gtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic3VibWl0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJjaGVja2JveFwiLCBcImNvbWJvYm94XCIsIFwiZ3JpZGNlbGxcIiwgXCJsaW5rXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInJhZGlvXCIsIFwic2xpZGVyXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGVsLW5vLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGVsLXdpdGgtbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRleHQtbm8tbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImNvbWJvYm94XCIsIFwic2VhcmNoYm94XCIsIFwic3BpbmJ1dHRvblwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRleHQtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgICAgIC8vIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWhhc3BvcHVwXCJdICAvLyBjb3ZlcmVkIGluIGEgZGlmZmVyZW50IHJ1bGVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRpbWVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInVybC1uby1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRleHRib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInVybC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ3ZWVrXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZWZhdWx0LXdpdGgtbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgLy8gaW5wdXQgd2l0aCBhIG1pc3Npbmcgb3IgaW52YWxpZCB0eXBlLCB3aXRoIGEgbGlzdCBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVmYXVsdC1uby1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICAvLyBpbnB1dCB3aXRoIGEgbWlzc2luZyBvciBpbnZhbGlkIHR5cGUsIHdpdGggYSBsaXN0IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJsaVwiOiB7XG4gICAgICAgICAgICBcImNoaWxkLW9mLWxpc3Qtcm9sZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbJ2xpc3RpdGVtJ10sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuby1jaGlsZC1vZi1saXN0LXJvbGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogWydnZW5lcmljJ10sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzZWN0aW9uXCI6IHtcbiAgICAgICAgICAgIFwid2l0aC1uYW1lXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJlZ2lvblwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbGVydFwiLCBcImFsZXJ0ZGlhbG9nXCIsIFwiYXBwbGljYXRpb25cIiwgXCJiYW5uZXJcIiwgXCJjb21wbGVtZW50YXJ5XCIsIFwiY29udGVudGluZm9cIiwgXCJkaWFsb2dcIiwgXCJkb2MtYWJzdHJhY3RcIiwgXCJkb2MtYWNrbm93bGVkZ21lbnRzXCIsIFwiZG9jLWFmdGVyd29yZFwiLCBcImRvYy1hcHBlbmRpeFwiLCBcImRvYy1iaWJsaW9ncmFwaHlcIiwgXCJkb2MtY2hhcHRlclwiLCBcImRvYy1jb2xvcGhvblwiLCBcImRvYy1jb25jbHVzaW9uXCIsIFwiZG9jLWNyZWRpdFwiLCBcImRvYy1jcmVkaXRzXCIsIFwiZG9jLWRlZGljYXRpb25cIiwgXCJkb2MtZW5kbm90ZXNcIiwgXCJkb2MtZXBpZ3JhcGhcIiwgXCJkb2MtZXBpbG9ndWVcIiwgXCJkb2MtZXJyYXRhXCIsIFwiZG9jLWV4YW1wbGVcIiwgXCJkb2MtZm9yZXdvcmRcIiwgXCJkb2MtZ2xvc3NhcnlcIiwgXCJkb2MtaW5kZXhcIiwgXCJkb2MtaW50cm9kdWN0aW9uXCIsIFwiZG9jLW5vdGljZVwiLCBcImRvYy1wYWdlbGlzdFwiLCBcImRvYy1wYXJ0XCIsIFwiZG9jLXByZWZhY2VcIiwgXCJkb2MtcHJvbG9ndWVcIiwgXCJkb2MtcHVsbHF1b3RlXCIsIFwiZG9jLXFuYVwiLCBcImRvYy10b2NcIiwgXCJkb2N1bWVudFwiLCBcImZlZWRcIiwgXCJncm91cFwiLCBcImxvZ1wiLCBcIm1haW5cIiwgXCJtYXJxdWVlXCIsIFwibmF2aWdhdGlvblwiLCBcIm5vbmVcIiwgXCJub3RlXCIsIFwicHJlc2VudGF0aW9uXCIsIFwic2VhcmNoXCIsIFwic3RhdHVzXCIsIFwidGFicGFuZWxcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwid2l0aG91dC1uYW1lXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYWxlcnRcIiwgXCJhbGVydGRpYWxvZ1wiLCBcImFwcGxpY2F0aW9uXCIsIFwiYmFubmVyXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsIFwiZGlhbG9nXCIsIFwiZG9jLWFic3RyYWN0XCIsIFwiZG9jLWFja25vd2xlZGdtZW50c1wiLCBcImRvYy1hZnRlcndvcmRcIiwgXCJkb2MtYXBwZW5kaXhcIiwgXCJkb2MtYmlibGlvZ3JhcGh5XCIsIFwiZG9jLWNoYXB0ZXJcIiwgXCJkb2MtY29sb3Bob25cIiwgXCJkb2MtY29uY2x1c2lvblwiLCBcImRvYy1jcmVkaXRcIiwgXCJkb2MtY3JlZGl0c1wiLCBcImRvYy1kZWRpY2F0aW9uXCIsIFwiZG9jLWVuZG5vdGVzXCIsIFwiZG9jLWVwaWdyYXBoXCIsIFwiZG9jLWVwaWxvZ3VlXCIsIFwiZG9jLWVycmF0YVwiLCBcImRvYy1leGFtcGxlXCIsIFwiZG9jLWZvcmV3b3JkXCIsIFwiZG9jLWdsb3NzYXJ5XCIsIFwiZG9jLWluZGV4XCIsIFwiZG9jLWludHJvZHVjdGlvblwiLCBcImRvYy1ub3RpY2VcIiwgXCJkb2MtcGFnZWxpc3RcIiwgXCJkb2MtcGFydFwiLCBcImRvYy1wcmVmYWNlXCIsIFwiZG9jLXByb2xvZ3VlXCIsIFwiZG9jLXB1bGxxdW90ZVwiLCBcImRvYy1xbmFcIiwgXCJkb2MtdG9jXCIsIFwiZG9jdW1lbnRcIiwgXCJmZWVkXCIsIFwiZ3JvdXBcIiwgXCJsb2dcIiwgXCJtYWluXCIsIFwibWFycXVlZVwiLCBcIm5hdmlnYXRpb25cIiwgXCJub25lXCIsIFwibm90ZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInNlYXJjaFwiLCBcInN0YXR1c1wiLCBcInRhYnBhbmVsXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzZWxlY3RcIjoge1xuICAgICAgICAgICAgXCJuby1tdWx0aXBsZS1hdHRyLXNpemUtZ3QxXCI6IHtcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdpdGggYSBtdWx0aXBsZSBhdHRyaWJ1dGUgb3IgYSBzaXplIGF0dHJpYnV0ZSBoYXZpbmcgdmFsdWUgZ3JlYXRlciB0aGFuIDFcIlxuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibWVudVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibXVsdGlwbGUtYXR0ci1zaXplLWd0MVwiOiB7XG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aXRoIG5vIG11bHRpcGxlIGF0dHJpYnV0ZSBhbmQgbm8gc2l6ZSBhdHRyaWJ1dGUgaGF2aW5nIHZhbHVlIGdyZWF0ZXIgdGhhbiAxXCJcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImxpc3Rib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiXVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInN1bW1hcnlcIjoge1xuICAgICAgICAgICAgXCJmaXJzdC1zdW1tYXJ5LW9mLWRldGFpbFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtaGFzcG9wdXBcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5vLWZpcnN0LXN1bW1hcnktb2YtZGV0YWlsXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJ0Ym9keVwiOiB7XG4gICAgICAgICAgICBcImRlcy10YWJsZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dncm91cFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLWdyaWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93Z3JvdXBcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy10cmVlZ3JpZFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3dncm91cFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLW90aGVyXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJ0ZFwiOiB7XG4gICAgICAgICAgICBcImRlcy10YWJsZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjZWxsXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLWdyaWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JpZGNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtdHJlZWdyaWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JpZGNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtb3RoZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInRoXCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXRhYmxlLWdyaWQtdHJlZWdyaWQtcm93LXNjb3BlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2hlYWRlclwiLCBcImNlbGxcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtdGFibGUtZ3JpZC10cmVlZ3JpZC1jb2x1bW4tc2NvcGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29sdW1uaGVhZGVyXCIsIFwiY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1vdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwidHJcIjoge1xuICAgICAgICAgICAgXCJkZXMtdGFibGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLWdyaWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLXRyZWVncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd1wiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1vdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICBcImRlZmF1bHRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIlwiLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9XG4gICAgfSAvLyBlbmQgb2YgZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3NcblxuICAgIC8vIG1hcCBhcmlhIGF0dHJpYnV0ZSB0byB0aGUgY29ycmVzcG9uZGluZyBuYXRpdmUgYXR0cmlidXRlLCBhcHBseSB0byBhbnkgZWxlbWVudCBhcHBsaWNhYmxlXG4gICAgLy8gbm90ZSB0aGlzIG1hcHBpbmcgaXMgZm9yIHRoZSByZWxhdGVkIGF0dHJpYnV0ZXMgaW4gdGhlIHNhbWUgZWxlbWVudCB3aXRob3V0IGNoZWNraW5nIHRoZSBwYXJlbnQgdHJlZS5cbiAgICAvLyByZWZlciB0byBodHRwczovL3czYy5naXRodWIuaW8vaHRtbC1hcmlhL1xuICAgIHN0YXRpYyByZWxhdGVkQXJpYUh0bWxBdHRyaWJ1dGVzOiB7XG4gICAgICAgIFthcmlhQXR0cjogc3RyaW5nXSA6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogc3RyaW5nW10gfCBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc/OiB7ICAgIFxuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IHN0cmluZ1tdIHwgbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9IFxuICAgIH0gPSAge1xuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDoge1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJmYWxzZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiY2hlY2tlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IHsgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImNoZWNrZWRcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcImZhbHNlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJkaXNhYmxlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IHsgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImRpc2FibGVkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDoge1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJmYWxzZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiaGlkZGVuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiaGlkZGVuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgICAgXG4gICAgICAgIFwiYXJpYS1wbGFjZWhvbGRlclwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDoge1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInBsYWNlaG9sZGVyXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgICAgXG4gICAgICAgIFwiYXJpYS12YWx1ZW1heFwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDoge1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcIm1heFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL292ZXJsYXAgY2FzZSBjb3ZlcmVkIGluIHRoZSByb2xlIGRlZmluaXRpb246IEF1dGhvcnMgU0hPVUxEIE5PVCB1c2UgYXJpYS12YWx1ZW1heCBvbiBhbnkgZWxlbWVudCB3aGljaCBhbGxvd3MgdGhlIG1heCBhdHRyaWJ1dGUuIFVzZSB0aGUgbWF4IGF0dHJpYnV0ZSBpbnN0ZWFkLiBcbiAgICAgICAgfSwgICAgXG4gICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDoge1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcIm1pblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLy8vb3ZlcmxhcCBjYXNlIGNvdmVyZWQgaW4gdGhlIHJvbGUgZGVmaW5pdGlvbjpBdXRob3JzIFNIT1VMRCBOT1QgdXNlIGFyaWEtdmFsdWVtaW4gb24gYW55IGVsZW1lbnQgd2hpY2ggYWxsb3dzIHRoZSBtaW4gYXR0cmlidXRlLiBVc2UgdGhlIG1pbiBhdHRyaWJ1dGUgaW5zdGVhZC5cbiAgICAgICAgfSwgICAgXG4gICAgICAgIFwiYXJpYS1yZWFkb25seVwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDoge1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJmYWxzZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicmVhZG9ubHlcIiwgXCJjb250ZW50ZWRpdGFibGVcIiwgXCJpc2NvbnRlbnRlZGl0YWJsZVwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbbnVsbCwgXCJmYWxzZVwiLCBcImZhbHNlXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IHsgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJlYWRvbmx5XCIsIFwiY29udGVudGVkaXRhYmxlXCIsIFwiaXNjb250ZW50ZWRpdGFibGVcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW251bGwsIFwidHJ1ZVwiLCBcInRydWVcIl1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJlcXVpcmVkXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcImZhbHNlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJyZXF1aXJlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IHsgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgICAgICAgIFxuICAgICAgICBcImFyaWEtY29sc3BhblwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDoge1xuICAgICAgICAgICAgICAgIC8vIGNvbmZsaWN0IG9jY3VycyBpZiBib3RoIHZhbHVlcyBhcmUgZGlmZmVyZW50XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcIlZBTFVFXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJjb2xzcGFuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IFtcIlZBTFVFXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IHsgICAgXG4gICAgICAgICAgICAgICAgLy8gb3ZlcmxhcCBvY2N1cnMgaWYgYm90aCBleGlzdHNcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJjb2xzcGFuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJvd3NwYW5cIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IHtcbiAgICAgICAgICAgICAgICAvLyBjb25mbGljdCBvY2N1cnMgaWYgYm90aCB2YWx1ZXMgYXJlIGRpZmZlcmVudFxuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJWQUxVRVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicm93c3BhblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbXCJWQUxVRVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG92ZXJsYXBwaW5nOiB7ICAgXG4gICAgICAgICAgICAgICAgLy8gb3ZlcmxhcCBvY2N1cnMgaWYgYm90aCBleGlzdHMgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicm93c3BhblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1hdXRvY29tcGxldGVcIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IHtcbiAgICAgICAgICAgICAgICAvLyBjb25mbGljdCBvY2N1cnMgaWYgYm90aCB2YWx1ZXMgYXJlIGNvbmZsaWN0XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcIm5vbmVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImF1dG9jb21wbGV0ZVwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbXCJvblwiXVxuICAgICAgICAgICAgfVxuICAgICAgICB9ICBcbiAgICB9XG5cbiAgICBzdGF0aWMgY29udGFpbmVycyA9IFtdXG59O1xuXG5sZXQgY29udGFpbmVyQXJyYXkgPSBbXTtcblxuZm9yIChjb25zdCByb2xlRGVzaWduIGluIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucykge1xuICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZURlc2lnbl0uY29udGFpbmVyO1xuICAgIGlmIChjb250YWluZXJzICE9PSBudWxsKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIGNvbnRhaW5lcnMpIHtcbiAgICAgICAgICAgIGlmIChjb250YWluZXJBcnJheS5pbmRleE9mKGNvbnRhaW5lcikgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb250YWluZXJBcnJheS5wdXNoKGNvbnRhaW5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5BUklBRGVmaW5pdGlvbnMuY29udGFpbmVycyA9IGNvbnRhaW5lckFycmF5O1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IENvbW1vbk1hcHBlciB9IGZyb20gXCIuLi9jb21tb24vQ29tbW9uTWFwcGVyXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiXG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IElNYXBSZXN1bHQgfSBmcm9tIFwiLi4vLi4vdjQvYXBpL0lNYXBwZXJcIjtcbmltcG9ydCB7IEFSSUFXYWxrZXIgfSBmcm9tIFwiLi9BUklBV2Fsa2VyXCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vLi4vdjQvdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi9kb20vRE9NV2Fsa2VyXCI7XG50eXBlIEVsZW1DYWxjID0gKGVsZW06IEVsZW1lbnQpID0+IHN0cmluZztcbnR5cGUgTm9kZUNhbGMgPSAobm9kZTogTm9kZSkgPT4gc3RyaW5nO1xuXG5leHBvcnQgY2xhc3MgQVJJQU1hcHBlciBleHRlbmRzIENvbW1vbk1hcHBlciB7XG4gICAgY2hpbGRyZW5DYW5IYXZlUm9sZShub2RlOiBOb2RlLCByb2xlOiBzdHJpbmcpIDogYm9vbGVhbiB7XG4gICAgICAgIC8vIGlmIChub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgIC8vICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyAgICAgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgICAgIHJldHVybiAhKHJvbGUgaW4gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5wcmVzZW50YXRpb25hbENoaWxkcmVuKTtcbiAgICB9XG4gICAgZ2V0Um9sZShub2RlOiBOb2RlKSA6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUobm9kZSk7XG4gICAgICAgIHJldHVybiByb2xlO1xuICAgIH1cbiAgICBnZXROYW1lc3BhY2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiYXJpYVwiXG4gICAgfVxuICAgIGdldEF0dHJpYnV0ZXMobm9kZTogTm9kZSkgOiB7IFtrZXk6c3RyaW5nXTogc3RyaW5nIH0ge1xuICAgICAgICBsZXQgcmV0VmFsID0ge307XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxlbGVtLmF0dHJpYnV0ZXMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJJbmZvID0gZWxlbS5hdHRyaWJ1dGVzW2lkeF07XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGF0dHJJbmZvLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKFwiYXJpYS1cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsW25hbWUuc3Vic3RyaW5nKDUpXSA9IGF0dHJJbmZvLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBhcHBseUF0dHJSb2xlPSBmdW5jdGlvbihub2RlTmFtZTpzdHJpbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAoIShub2RlTmFtZSBpbiBBUklBTWFwcGVyLmVsZW1BdHRyVmFsdWVDYWxjdWxhdG9ycykpIHJldHVybjtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF0dHIgaW4gQVJJQU1hcHBlci5lbGVtQXR0clZhbHVlQ2FsY3VsYXRvcnNbbm9kZU5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGF0dHIgaW4gcmV0VmFsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gQVJJQU1hcHBlci5lbGVtQXR0clZhbHVlQ2FsY3VsYXRvcnNbbm9kZU5hbWVdW2F0dHJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPSBcInVuZGVmaW5lZFwiICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gdHlwZW9mIFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgYXMgTm9kZUNhbGMpKGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWxbYXR0cl0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhcHBseUF0dHJSb2xlKFwiZ2xvYmFsXCIpO1xuICAgICAgICAgICAgYXBwbHlBdHRyUm9sZShub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMgLyogTm9kZS5URVhUX05PREUgKi8pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXR0ciBpbiBBUklBTWFwcGVyLnRleHRBdHRyVmFsdWVDYWxjdWxhdG9ycykge1xuICAgICAgICAgICAgICAgIGxldCB2YWwgPSBBUklBTWFwcGVyLnRleHRBdHRyVmFsdWVDYWxjdWxhdG9yc1thdHRyXShub2RlKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbCAhPSBcInVuZGVmaW5lZFwiICYmIHZhbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWxbYXR0cl0gPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEFyaWFPd25lZEJ5KGVsZW06IEhUTUxFbGVtZW50KSA6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGRvYyA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KGVsZW0pO1xuICAgICAgICBpZiAoIWdldENhY2hlKGRvYywgXCJBUklBTWFwcGVyOjpwcmVjYWxjT3duZWRcIiwgZmFsc2UpKSB7XG4gICAgICAgICAgICBjb25zdCBvd25lcnMgPSBkb2MucXVlcnlTZWxlY3RvckFsbChcIlthcmlhLW93bnNdXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaU93bmVyID0gMDsgaU93bmVyIDwgb3duZXJzLmxlbmd0aDsgKytpT3duZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvd25lciA9IG93bmVyc1tpT3duZXJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG93bklkcyA9IG93bmVyLmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKS5zcGxpdCgvICsvZyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaUlkPTA7IGlJZCA8IG93bklkcy5sZW5ndGg7ICsraUlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG93bmVkID0gZG9jLmdldEVsZW1lbnRCeUlkKG93bklkc1tpSWRdKTtcbiAgICAgICAgICAgICAgICAgICAgLy9pZ25vcmUgaWYgdGhlIGFyaWEtb3ducyBwb2ludCB0byB0aGUgZWxlbWVudCBpdHNlbGZcbiAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkICYmICFET01VdGlsLnNhbWVOb2RlKG93bmVyLCBvd25lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldENhY2hlKG93bmVkLCBcImFyaWEtb3duZWRcIiwgb3duZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0Q2FjaGUoZG9jLCBcIkFSSUFNYXBwZXI6OnByZWNhbGNPd25lZFwiLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0Q2FjaGUoZWxlbSwgXCJhcmlhLW93bmVkXCIsIG51bGwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Tm9kZUhpZXJhcmNoeShub2RlOiBOb2RlKSB7XG4gICAgICAgIGlmICghbm9kZSkgcmV0dXJuIFtdO1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSkge1xuICAgICAgICAgICAgbGV0IHBhcmVudEhpZXJhcmNoeSA9IHRoaXMuZ2V0Tm9kZUhpZXJhcmNoeShET01XYWxrZXIucGFyZW50RWxlbWVudChub2RlKSk7XG4gICAgICAgICAgICBsZXQgcGFyZW50SW5mbyA9IHBhcmVudEhpZXJhcmNoeS5sZW5ndGggPiAwID8gcGFyZW50SGllcmFyY2h5W3BhcmVudEhpZXJhcmNoeS5sZW5ndGgtMV0gOiB7XG4gICAgICAgICAgICAgICAgcm9sZTogXCJcIixcbiAgICAgICAgICAgICAgICByb2xlUGF0aDogXCJcIixcbiAgICAgICAgICAgICAgICByb2xlQ291bnQ6IHt9LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IHRydWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgbm9kZUhpZXJhcmNoeSA9IFtdO1xuICAgICAgICAgICAgLy8gU2V0IGhpZXJhcmNoeVxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBhcmVudEhpZXJhcmNoeSkge1xuICAgICAgICAgICAgICAgIG5vZGVIaWVyYXJjaHkucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGVIaWVyYXJjaHkucHVzaCh7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICAgICAgICAgICAgYm91bmRzOiB0aGlzLmdldEJvdW5kcyhub2RlKSxcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IHRoaXMuZ2V0TmFtZXNwYWNlKCksXG4gICAgICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgICAgICByb2xlOiB0aGlzLmdldFJvbGUobm9kZSkgfHwgXCJub25lXCIsXG4gICAgICAgICAgICAgICAgcm9sZVBhdGg6IHBhcmVudEluZm8ucm9sZVBhdGgrXCIvXCIrKHRoaXMuZ2V0Um9sZShub2RlKSB8fCBcIm5vbmVcIiksXG4gICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7fSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbkNhbkhhdmVSb2xlOiBwYXJlbnRJbmZvLmNoaWxkcmVuQ2FuSGF2ZVJvbGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVIaWVyYXJjaHk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgZWxlbSA9IG5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBsZXQgbm9kZUhpZXJhcmNoeSA6IEFycmF5PHtcbiAgICAgICAgICAgICAgICByb2xlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcm9sZVBhdGg6IHN0cmluZyxcbiAgICAgICAgICAgICAgICByb2xlQ291bnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgW3JvbGU6IHN0cmluZ106IG51bWJlclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGlsZHJlbkNhbkhhdmVSb2xlOiBib29sZWFuXG4gICAgICAgICAgICB9PiA9IGdldENhY2hlKGVsZW0sIFwiQVJJQU1hcHBlcjo6Z2V0Tm9kZUhpZXJhcmNoeVwiLCBudWxsKTtcbiAgICAgICAgICAgIGlmICghbm9kZUhpZXJhcmNoeSkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgZWxlbWVudCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0IC0gYnV0IDo6cmVzZXQgcHJvY2Vzc2VzIHRoZW0gYWxsIGluIHRoZSByaWdodCBvcmRlclxuXG4gICAgICAgICAgICAgICAgLy8gR2V0IGRldGFpbHMgYWJvdXQgdGhlIGNvcnJlY3QgcGFyZW50IGZpcnN0XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IEFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQoZWxlbSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KGVsZW0pIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50SGllcmFyY2h5ID0gcGFyZW50ID8gdGhpcy5nZXROb2RlSGllcmFyY2h5KHBhcmVudCkgOiBbXTtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50SW5mbyA9IHBhcmVudEhpZXJhcmNoeS5sZW5ndGggPiAwID8gcGFyZW50SGllcmFyY2h5W3BhcmVudEhpZXJhcmNoeS5sZW5ndGgtMV0gOiB7XG4gICAgICAgICAgICAgICAgICAgIHJvbGU6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIHJvbGVQYXRoOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICByb2xlQ291bnQ6IHt9LFxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbkNhbkhhdmVSb2xlOiB0cnVlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50SW5mby5yb2xlID09PSBcIm5vbmVcIiB8fCBwYXJlbnRJbmZvLnJvbGUgPT09IFwiL25vbmVcIikge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBBUklBTWFwcGVyLmdldEFyaWFPd25lZEJ5KHBhcmVudCkgfHwgRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocGFyZW50KSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50SGllcmFyY2h5ID0gcGFyZW50ID8gdGhpcy5nZXROb2RlSGllcmFyY2h5KHBhcmVudCkgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50SW5mbyA9IHBhcmVudEhpZXJhcmNoeVtwYXJlbnRIaWVyYXJjaHkubGVuZ3RoLTFdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIG5vZGUgaW5mb1xuICAgICAgICAgICAgICAgIGxldCBub2RlSW5mbyA6IHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgW3JvbGU6IHN0cmluZ106IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJvdW5kczogYW55LFxuICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgbm9kZTogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHJvbGU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgcm9sZVBhdGg6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBbcm9sZTogc3RyaW5nXTogbnVtYmVyXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogYm9vbGVhblxuICAgICAgICAgICAgICAgIH0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGVsZW0ubm9kZVR5cGUgPT09IDEgPyB0aGlzLmdldEF0dHJpYnV0ZXMoZWxlbSk6IHt9LCAgIFxuICAgICAgICAgICAgICAgICAgICBib3VuZHM6IHRoaXMuZ2V0Qm91bmRzKGVsZW0pLFxuICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IHRoaXMuZ2V0TmFtZXNwYWNlKCksXG4gICAgICAgICAgICAgICAgICAgIG5vZGU6IGVsZW0sXG4gICAgICAgICAgICAgICAgICAgIHJvbGU6IHRoaXMuZ2V0Um9sZShlbGVtKSB8fCBcIm5vbmVcIixcbiAgICAgICAgICAgICAgICAgICAgcm9sZVBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge30sXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IHRydWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBZGp1c3Qgcm9sZSBpZiB3ZSdyZSB3aXRoaW4gYSBwcmVzZW50YXRpb25hbCBjb250YWluZXJcbiAgICAgICAgICAgICAgICBsZXQgcHJlc2VudGF0aW9uYWxDb250YWluZXIgPSAhcGFyZW50SW5mby5jaGlsZHJlbkNhbkhhdmVSb2xlO1xuICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25hbENvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICBub2RlSW5mby5yb2xlID0gXCJub25lXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZUluZm8uY2hpbGRyZW5DYW5IYXZlUm9sZSA9IHBhcmVudEluZm8uY2hpbGRyZW5DYW5IYXZlUm9sZSBcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuY2hpbGRyZW5DYW5IYXZlUm9sZShlbGVtLCBub2RlSW5mby5yb2xlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHBhdGhzXG4gICAgICAgICAgICAgICAgaWYgKG5vZGVJbmZvLnJvbGUgIT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEluZm8ucm9sZUNvdW50W25vZGVJbmZvLnJvbGVdID0gKHBhcmVudEluZm8ucm9sZUNvdW50W25vZGVJbmZvLnJvbGVdIHx8IDApICsgMTsgXG4gICAgICAgICAgICAgICAgICAgIG5vZGVJbmZvLnJvbGVQYXRoID0gcGFyZW50SW5mby5yb2xlUGF0aCtcIi9cIitub2RlSW5mby5yb2xlK1wiW1wiK3BhcmVudEluZm8ucm9sZUNvdW50W25vZGVJbmZvLnJvbGVdK1wiXVwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVJbmZvLnJvbGVQYXRoID0gcGFyZW50SW5mby5yb2xlUGF0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFNldCBoaWVyYXJjaHlcbiAgICAgICAgICAgICAgICBub2RlSGllcmFyY2h5ID0gW11cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGFyZW50SGllcmFyY2h5KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVIaWVyYXJjaHkucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZUhpZXJhcmNoeS5wdXNoKG5vZGVJbmZvKTtcbiAgICAgICAgICAgICAgICBzZXRDYWNoZShlbGVtLCBcIkFSSUFNYXBwZXI6OmdldE5vZGVIaWVyYXJjaHlcIiwgbm9kZUhpZXJhcmNoeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm9kZUhpZXJhcmNoeTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgQVJJQU1hcHBlci5uYW1lQ29tcHV0YXRpb25JZCA9IDA7XG4gICAgICAgIHRoaXMuaGllcmFyY2h5Um9sZSA9IFtdO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJlc3VsdHMgPSBbXTtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlQYXRoID0gW3tcbiAgICAgICAgICAgIHJvbGVQYXRoOiBcIlwiLFxuICAgICAgICAgICAgcm9sZUNvdW50OiB7fVxuICAgICAgICB9XTtcbiAgICAgICAgLy8gR2V0IHRvIHRoZSB0b3Btb3N0IG5vZGVcbiAgICAgICAgbGV0IGdvb2ROb2RlID0gbm9kZTtcbiAgICAgICAgbGV0IG5leHQ7XG4gICAgICAgIHdoaWxlIChuZXh0ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoZ29vZE5vZGUpKSB7XG4gICAgICAgICAgICBnb29kTm9kZSA9IG5leHQ7XG4gICAgICAgIH07XG4gICAgICAgIC8vIFdhbGsgdGhlIHRyZWUgYW5kIHNldCB0aGUgaGllcmFyY2hpZXMgaW4gdGhlIHJpZ2h0IG9yZGVyXG4gICAgICAgIGxldCBhcmlhV2Fsa2VyID0gbmV3IEFSSUFXYWxrZXIoZ29vZE5vZGUsIGZhbHNlLCBnb29kTm9kZSk7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmIChhcmlhV2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdldE5vZGVIaWVyYXJjaHkoYXJpYVdhbGtlci5ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoYXJpYVdhbGtlci5uZXh0Tm9kZSgpKTtcbiAgICB9XG5cbiAgICBvcGVuU2NvcGUobm9kZTogTm9kZSk6IElNYXBSZXN1bHRbXSB7XG4gICAgICAgIGlmICh0aGlzLmhpZXJhcmNoeVJvbGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wdXNoSGllcmFyY2h5KG5vZGUpXG4gICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8dGhpcy5oaWVyYXJjaHlSZXN1bHRzLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhpZXJhcmNoeVJlc3VsdHNbaWR4XS5yb2xlWzBdID09PSBcIi9cIikge1xuICAgICAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0c1tpZHhdLnJvbGUgPSB0aGlzLmhpZXJhcmNoeVJlc3VsdHNbaWR4XS5yb2xlLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5oaWVyYXJjaHlSZXN1bHRzO1xuICAgIH1cblxuICAgIHB1c2hIaWVyYXJjaHkobm9kZTogTm9kZSkge1xuICAgICAgICAvLyBJZiB3ZSdyZSBub3QgYW4gZWxlbWVudCwgbm8gc3BlY2lhbCBoYW5kbGluZ1xuICAgICAgICBsZXQgbm9kZUhpZXJhcmNoeSA9IFtdXG4gICAgICAgIC8vIERldGVybWluZSBvdXIgbm9kZSBpbmZvXG4gICAgICAgIG5vZGVIaWVyYXJjaHkgPSB0aGlzLmdldE5vZGVIaWVyYXJjaHkobm9kZSk7XG4gICAgICAgIGxldCBub2RlSW5mbyA9IG5vZGVIaWVyYXJjaHlbbm9kZUhpZXJhcmNoeS5sZW5ndGgtMV07XG4gICAgICAgIHRoaXMuaGllcmFyY2h5Um9sZS5wdXNoKG5vZGVJbmZvLnJvbGUpO1xuICAgICAgICBpZiAobm9kZUluZm8ucm9sZSAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UGF0aC5wdXNoKG5vZGVJbmZvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0cyA9IG5vZGVIaWVyYXJjaHk7XG4gICAgfVxuXG4gICAgY2xvc2VTY29wZShub2RlOiBOb2RlKTogSU1hcFJlc3VsdFtdIHtcbiAgICAgICAgbGV0IHJldFZhbCA6IElNYXBSZXN1bHRbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJlcyBvZiB0aGlzLmhpZXJhcmNoeVJlc3VsdHMpIHtcbiAgICAgICAgICAgIC8vIGNvbnN0IHRlbXAgPSByZXMubm9kZTtcbiAgICAgICAgICAgIC8vIHJlcy5ub2RlID0gbnVsbDtcbiAgICAgICAgICAgIC8vIGxldCBjbG9uZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlcykpO1xuICAgICAgICAgICAgLy8gY2xvbmVkLm5vZGUgPSByZXMubm9kZSA9IHRlbXA7IFxuICAgICAgICAgICAgLy8gcmV0VmFsLnB1c2goY2xvbmVkKTtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJldFZhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXRWYWxbcmV0VmFsLmxlbmd0aC0xXS5yb2xlID0gXCIvXCIrcmV0VmFsW3JldFZhbC5sZW5ndGgtMV0ucm9sZVxuICAgICAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KG5vZGUpO1xuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzID0gcGFyZW50ID8gZ2V0Q2FjaGUocGFyZW50IGFzIEhUTUxFbGVtZW50LCBcIkFSSUFNYXBwZXI6OmdldE5vZGVJbmZvXCIsIFtdKSA6IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIEhlbHBlciBmdW5jdGlvbnNcbiAgICAvLy8vXG5cbiAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbC1hYW0tMS4wLyNtYXBwaW5nLWh0bWwtdG8tYWNjZXNzaWJpbGl0eS1hcGlzXG4gICAgcHVibGljIHN0YXRpYyBlbGVtQXR0clZhbHVlQ2FsY3VsYXRvcnM6IHsgW25vZGVOYW1lOnN0cmluZ106IHsgW2F0dHI6c3RyaW5nXTogc3RyaW5nIHwgRWxlbUNhbGMgfX0gPSB7XG4gICAgICAgIFwiZ2xvYmFsXCI6IHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBBUklBTWFwcGVyLmNvbXB1dGVOYW1lXG4gICAgICAgIH1cbiAgICAgICAgLCBcImRhdGFsaXN0XCI6IHtcbiAgICAgICAgICAgIC8vIHNldCB0byBcInRydWVcIiBpZiB0aGUgZGF0YWxpc3QncyBzZWxlY3Rpb24gbW9kZWwgYWxsb3dzIG11bHRpcGxlIG9wdGlvbiBlbGVtZW50cyB0byBiZVxuICAgICAgICAgICAgLy8gc2VsZWN0ZWQgYXQgYSB0aW1lLCBhbmQgXCJmYWxzZVwiIG90aGVyd2lzZVxuICAgICAgICAgICAgXCJtdWx0aXNlbGVjdGFibGVcIjogZWxlbSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSBlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpO1xuICAgICAgICAgICAgICAgIGlmIChpZCAmJiBpZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbnB1dCA9IGVsZW0ub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiaW5wdXRbbGlzdD0nXCIraWQrXCInXVwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCIrKGVsZW0uZ2V0QXR0cmlidXRlKFwibXVsdGlwbGVcIikgXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKT09XCJ0cnVlXCIgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKT09XCJcIikpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICwgXCJoMVwiOiB7XG4gICAgICAgICAgICBcImxldmVsXCI6IFwiMVwiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImgyXCI6IHtcbiAgICAgICAgICAgIFwibGV2ZWxcIjogXCIyXCJcbiAgICAgICAgfVxuICAgICAgICAsIFwiaDNcIjoge1xuICAgICAgICAgICAgXCJsZXZlbFwiOiBcIjNcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJoNFwiOiB7XG4gICAgICAgICAgICBcImxldmVsXCI6IFwiNFwiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImg1XCI6IHtcbiAgICAgICAgICAgIFwibGV2ZWxcIjogXCI1XCJcbiAgICAgICAgfVxuICAgICAgICAsIFwiaDZcIjoge1xuICAgICAgICAgICAgXCJsZXZlbFwiOiBcIjZcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJpbnB1dFwiOiB7XG4gICAgICAgICAgICAvLyAtIHR5cGU9XCJjaGVja2JveFwiIHN0YXRlIHNldCB0byBcIm1peGVkXCIgaWYgdGhlIGVsZW1lbnQncyBpbmRldGVybWluYXRlIElETCBhdHRyaWJ1dGUgXG4gICAgICAgICAgICAvLyBpcyB0cnVlLCBvciBcInRydWVcIiBpZiB0aGUgZWxlbWVudCdzIGNoZWNrZWRuZXNzIGlzIHRydWUsIG9yIFwiZmFsc2VcIiBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vIC0gdHlwZT1cInJhZGlvXCIgc3RhdGUgc2V0IHRvIFwidHJ1ZVwiIGlmIHRoZSBlbGVtZW50J3MgY2hlY2tlZG5lc3MgaXMgdHJ1ZSwgb3IgXCJmYWxzZVwiIFxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLiBcbiAgICAgICAgICAgIFwiY2hlY2tlZFwiOiBlbGVtID0+IHsgXG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJjaGVja2JveFwiIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJyYWRpb1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiKyhlbGVtIGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gLSB0eXBlPVwicmFkaW9cIiBhbmQgbm90IGluIG1lbnUgcmVmbGVjdGluZyBudW1iZXIgb2YgdHlwZT1yYWRpbyBpbnB1dCBlbGVtZW50cyBcbiAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgcmFkaW8gYnV0dG9uIGdyb3VwXG4gICAgICAgICAgICAsIFwic2V0c2l6ZVwiOiBlbGVtID0+IHsgcmV0dXJuIG51bGw7IHRocm93IG5ldyBFcnJvcihcIk5PVCBJTVBMRU1FTlRFRFwiKTsgfVxuICAgICAgICAgICAgLy8gLSB0eXBlPVwicmFkaW9cIiBhbmQgbm90IGluIG1lbnUgdmFsdWUgcmVmbGVjdGluZyB0aGUgZWxlbWVudHMgcG9zaXRpb24gXG4gICAgICAgICAgICAvLyB3aXRoaW4gdGhlIHJhZGlvIGJ1dHRvbiBncm91cC5cIlxuICAgICAgICAgICAgLCBcInBvc2luc2V0XCI6IGVsZW0gPT4geyByZXR1cm4gbnVsbDsgdGhyb3cgbmV3IEVycm9yKFwiTk9UIElNUExFTUVOVEVEXCIpOyB9XG4gICAgICAgICAgICAvLyBpbnB1dCAodHlwZSBhdHRyaWJ1dGUgaW4gdGhlIFRleHQsIFNlYXJjaCwgVGVsZXBob25lLCBVUkwsIG9yIEUtbWFpbCBzdGF0ZXMgd2l0aCBhIFxuICAgICAgICAgICAgLy8gc3VnZ2VzdGlvbnMgc291cmNlIGVsZW1lbnQpIGNvbWJvYm94IHJvbGUsIHdpdGggdGhlIGFyaWEtb3ducyBwcm9wZXJ0eSBzZXQgdG8gdGhlIHNhbWVcbiAgICAgICAgICAgIC8vIHZhbHVlIGFzIHRoZSBsaXN0IGF0dHJpYnV0ZVxuICAgICAgICAgICAgLCBcIm93bnNcIjogZWxlbSA9PiB7IHJldHVybiBudWxsOyB0aHJvdyBuZXcgRXJyb3IoXCJOT1QgSU1QTEVNRU5URURcIik7IH1cbiAgICAgICAgfVxuICAgICAgICAsIFwia2V5Z2VuXCI6IHtcbiAgICAgICAgICAgIFwibXVsdGlzZWxlY3RhYmxlXCI6IFwiZmFsc2VcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJsaVwiOiB7XG4gICAgICAgICAgICAvLyBOdW1iZXIgb2YgbGkgZWxlbWVudHMgd2l0aGluIHRoZSBvbCwgdWwsIG1lbnVcbiAgICAgICAgICAgIFwic2V0c2l6ZVwiOiBlbGVtID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gRE9NVXRpbC5nZXRBbmNlc3RvcihlbGVtLCBbXCJvbFwiLCBcInVsXCIsIFwibWVudVwiXSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBsaXMgPSBwYXJlbnQucXVlcnlTZWxlY3RvckFsbChcImxpXCIpO1xuICAgICAgICAgICAgICAgIGxldCBvdGhlcmxpcyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKFwib2wgbGksIHVsIGxpLCBtZW51IGxpXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiKyhsaXMubGVuZ3RoLW90aGVybGlzLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBQb3NpdGlvbiBvZiBsaSBlbGVtZW50IHdpdGhpbiB0aGUgb2wsIHVsLCBtZW51XG4gICAgICAgICAgICAsIFwicG9zaW5zZXRcIjogZWxlbSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IERPTVV0aWwuZ2V0QW5jZXN0b3IoZWxlbSwgW1wib2xcIiwgXCJ1bFwiLCBcIm1lbnVcIl0pXG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBsaXMgPSBwYXJlbnQucXVlcnlTZWxlY3RvckFsbChcImxpXCIpO1xuICAgICAgICAgICAgICAgIGxldCBudW0gPSAwO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8bGlzLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGkgPSBsaXNbaWR4XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKERPTVV0aWwuc2FtZU5vZGUocGFyZW50LCBET01VdGlsLmdldEFuY2VzdG9yKGxpLCBbXCJvbFwiLCBcInVsXCIsIFwibWVudVwiXSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIitudW07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKytudW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICwgXCJtZW51aXRlbVwiOiB7XG4gICAgICAgICAgICAvLyB0eXBlID0gY2hlY2tib3ggb3IgcmFkaW8sIHNldCB0byBcInRydWVcIiBpZiB0aGUgY2hlY2tlZCBhdHRyaWJ1dGUgXG4gICAgICAgICAgICAvLyBpcyBwcmVzZW50LCBhbmQgXCJmYWxzZVwiIG90aGVyd2lzZVxuICAgICAgICAgICAgXCJjaGVja2VkXCI6IGVsZW0gPT4gXCJcIishIShlbGVtLmdldEF0dHJpYnV0ZShcImNoZWNrZWRcIikgXG4gICAgICAgICAgICAgICAgJiYgKGVsZW0uZ2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiKT09XCJ0cnVlXCIgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIpPT1cIlwiKSlcbiAgICAgICAgfVxuICAgICAgICAsIFwib3B0aW9uXCI6IHtcbiAgICAgICAgICAgIC8vIHNldCB0byBcInRydWVcIiBpZiB0aGUgZWxlbWVudCdzIHNlbGVjdGVkbmVzcyBpcyB0cnVlLCBvciBcImZhbHNlXCIgb3RoZXJ3aXNlLlxuICAgICAgICAgICAgXCJzZWxlY3RlZFwiOiBlbGVtID0+IFwiXCIrISEoZWxlbS5nZXRBdHRyaWJ1dGUoXCJzZWxlY3RlZFwiKSBcbiAgICAgICAgICAgICAgICAmJiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJzZWxlY3RlZFwiKT09XCJ0cnVlXCIgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJzZWxlY3RlZFwiKT09XCJcIikpXG4gICAgICAgIH1cbiAgICAgICAgLCBcInByb2dyZXNzXCI6IHtcbiAgICAgICAgICAgIFwidmFsdWVtYXhcIjogZWxlbSA9PiBlbGVtLmdldEF0dHJpYnV0ZShcIm1heFwiKSB8fCBcIjFcIlxuICAgICAgICAgICAgLCBcInZhbHVlbWluXCI6IGVsZW0gPT4gXCIwXCJcbiAgICAgICAgICAgICwgXCJ2YWx1ZW5vd1wiOiBlbGVtID0+IGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIilcbiAgICAgICAgfVxuICAgICAgICBcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyB0ZXh0QXR0clZhbHVlQ2FsY3VsYXRvcnM6IHsgW2F0dHI6c3RyaW5nXTogTm9kZUNhbGMgfSA9IHtcbiAgICAgICAgXCJuYW1lXCI6IG5vZGUgPT4gbm9kZS5ub2RlVmFsdWVcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBuYW1lQ29tcHV0YXRpb25JZCA9IDA7XG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlTmFtZShjdXI6IE5vZGUpIDogc3RyaW5nIHtcbiAgICAgICAgKytBUklBTWFwcGVyLm5hbWVDb21wdXRhdGlvbklkO1xuICAgICAgICByZXR1cm4gQVJJQU1hcHBlci5jb21wdXRlTmFtZUhlbHAoQVJJQU1hcHBlci5uYW1lQ29tcHV0YXRpb25JZCwgY3VyLCBmYWxzZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY29tcHV0ZU5hbWVIZWxwKHdhbGtJZDogbnVtYmVyLCBjdXI6IE5vZGUsIGxhYmVsbGVkYnlUcmF2ZXJzZTogYm9vbGVhbiwgd2Fsa1RyYXZlcnNlOiBib29sZWFuKSA6IHN0cmluZyB7XG4gICAgICAgIC8vIDJnLiBOb25lIG9mIHRoZSBvdGhlciBjb250ZW50IGFwcGxpZXMgdG8gdGV4dCBub2Rlcywgc28ganVzdCBkbyB0aGlzIGZpcnN0XG4gICAgICAgIGlmIChjdXIubm9kZVR5cGUgPT09IDMgLyogTm9kZS5URVhUX05PREUgKi8pIHJldHVybiBjdXIubm9kZVZhbHVlO1xuICAgICAgICBpZiAoY3VyLm5vZGVUeXBlID09PSAxMSkgcmV0dXJuIFwiXCI7XG4gICAgICAgIGlmIChjdXIubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgIGlmICh3YWxrVHJhdmVyc2UgfHwgbGFiZWxsZWRieVRyYXZlcnNlKSByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvciAoXCJDYW4gb25seSBjb21wdXRlIG5hbWUgb24gRWxlbWVudCBhbmQgVGV4dCBcIiArIGN1ci5ub2RlVHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbGVtID0gY3VyIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIFdlJ3ZlIGJlZW4gaGVyZSBiZWZvcmUgLSBwcmV2ZW50IHJlY3Vyc2lvblxuICAgICAgICBpZiAoZ2V0Q2FjaGUoZWxlbSwgXCJkYXRhLW5hbWV3YWxrXCIsIG51bGwpID09PSBcIlwiK3dhbGtJZCkgcmV0dXJuIFwiXCI7XG4gICAgICAgIHNldENhY2hlKGVsZW0sIFwiZGF0YS1uYW1ld2Fsa1wiLCBcIlwiK3dhbGtJZCk7XG4gICAgICAgIC8vIFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbC1hYW0tMS4wLyNpbnB1dC10eXBlLXRleHQtaW5wdXQtdHlwZS1wYXNzd29yZC1pbnB1dC10eXBlLXNlYXJjaC1pbnB1dC10eXBlLXRlbC1pbnB1dC10eXBlLXVybC1hbmQtdGV4dGFyZWEtZWxlbWVudFxuXG4gICAgICAgIC8vIDJhLiBPbmx5IHNob3cgaGlkZGVuIGNvbnRlbnQgaWYgaXQncyByZWZlcmVuY2VkIGJ5IGEgbGFiZWxsZWRieVxuICAgICAgICBpZiAoIWxhYmVsbGVkYnlUcmF2ZXJzZSAmJiAhRE9NV2Fsa2VyLmlzTm9kZVZpc2libGUoY3VyKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyYi4gY29sbGVjdCB2YWxpZCBpZCByZWZlcmVuY2VzXG4gICAgICAgIGlmICghbGFiZWxsZWRieVRyYXZlcnNlICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG4gICAgICAgICAgICBsZXQgbGFiZWxsZWRieSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGxldCB2YWxpZEVsZW1zID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlZiBvZiBsYWJlbGxlZGJ5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmRWxlbSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGN1ciwgcmVmKTtcbiAgICAgICAgICAgICAgICBpZiAocmVmRWxlbSAmJiAhRE9NVXRpbC5zYW1lTm9kZShlbGVtLCByZWZFbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZEVsZW1zLnB1c2gocmVmRWxlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbGlkRWxlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBhY2N1bXVsYXRlZCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtIG9mIHZhbGlkRWxlbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWQgKz0gXCIgXCIgKyB0aGlzLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIGVsZW0sIHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGVkLnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNpbmNlIG5vZGVUb1JvbGUgY2FsbHMgYmFjayBoZXJlIGZvciBmb3JtIGFuZCBzZWN0aW9uLCB3ZSBuZWVkIHNwZWNpYWwgY2FzaW5nIGhlcmUgdG8gaGFuZGxlIHRob3NlIHR3byBjYXNlc1xuICAgICAgICBpZiAoW1wic2VjdGlvblwiLCBcImZvcm1cIl0uaW5jbHVkZXMoY3VyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIElmIEknbSBub3QgYW4gZW1iZWRkZWQgY29udHJvbCBvciBJJ20gbm90IHJlY3Vyc2luZywgcmV0dXJuIHRoZSBhcmlhLWxhYmVsXG4gICAgICAgICAgICAgICAgaWYgKCFsYWJlbGxlZGJ5VHJhdmVyc2UgJiYgIXdhbGtUcmF2ZXJzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyYy4gSWYgbGFiZWwgb3Igd2FsaywgYW5kIHRoaXMgaXMgYSBjb250cm9sLCBza2lwIHRvIHRoZSB2YWx1ZSwgb3RoZXJ3aXNlIHByb3ZpZGUgdGhlIGxhYmVsXG4gICAgICAgIGNvbnN0IHJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUoY3VyKTtcbiAgICAgICAgbGV0IGlzRW1iZWRkZWRDb250cm9sID0gW1xuICAgICAgICAgICAgXCJ0ZXh0Ym94XCIsIFwiYnV0dG9uXCIsIFwiY29tYm9ib3hcIiwgXCJsaXN0Ym94XCIsIFxuICAgICAgICAgICAgXCJwcm9ncmVzc2JhclwiLCBcInNjcm9sbGJhclwiLCBcInNsaWRlclwiLCBcInNwaW5idXR0b25cIlxuICAgICAgICBdLmluY2x1ZGVzKHJvbGUpO1xuICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gSWYgSSdtIG5vdCBhbiBlbWJlZGRlZCBjb250cm9sIG9yIEknbSBub3QgcmVjdXJzaW5nLCByZXR1cm4gdGhlIGFyaWEtbGFiZWxcbiAgICAgICAgICAgIGlmICghbGFiZWxsZWRieVRyYXZlcnNlICYmICF3YWxrVHJhdmVyc2UgfHwgIWlzRW1iZWRkZWRDb250cm9sKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKS50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyZC4gXG4gICAgICAgIGlmIChyb2xlICE9PSBcInByZXNlbnRhdGlvblwiICYmIHJvbGUgIT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICBpZiAoKGN1ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiIHx8IGN1ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFyZWFcIikgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRE9NVXRpbC5jbGVhbldoaXRlc3BhY2UoZWxlbS5nZXRBdHRyaWJ1dGUoXCJhbHRcIikpLnRyaW0oKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGN1ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJpZFwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBlbGVtLm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihcImxhYmVsW2Zvcj0nXCIrZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKStcIiddXCIpO1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWwuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSB8fCAobGFiZWwuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpICYmICFSUFRVdGlsLmlzSWRSZWZlclRvU2VsZihjdXIsIGxhYmVsLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCBsYWJlbCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbC50ZXh0Q29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJmaWVsZHNldFwiKSB7XG4gICAgICAgICAgICAgICAgaWYoICg8RWxlbWVudD5jdXIpLnF1ZXJ5U2VsZWN0b3IoXCJsZWdlbmRcIikpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGVnZW5kID0gKDxFbGVtZW50PmN1cikucXVlcnlTZWxlY3RvcihcImxlZ2VuZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZ2VuZC5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIGN1ciwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDJlLlxuICAgICAgICBpZiAoKHdhbGtUcmF2ZXJzZSB8fCBsYWJlbGxlZGJ5VHJhdmVyc2UpICYmIGlzRW1iZWRkZWRDb250cm9sKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZW1iZWRkZWQgY29udHJvbCBoYXMgcm9sZSB0ZXh0Ym94LCByZXR1cm4gaXRzIHZhbHVlLlxuICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwidGV4dGJveFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpKSByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3YWxrVHJhdmVyc2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBlbWJlZGRlZCBjb250cm9sIGhhcyByb2xlIGJ1dHRvbiwgcmV0dXJuIHRoZSB0ZXh0IGFsdGVybmF0aXZlIG9mIHRoZSBidXR0b24uXG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJidXR0b25cIikge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoW1wiYnV0dG9uXCIsIFwic3VibWl0XCIsIFwicmVzZXRcIl0uaW5jbHVkZXModHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpKSByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBcInN1Ym1pdFwiKSByZXR1cm4gXCJTdWJtaXRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBcInJlc2V0XCIpIHJldHVybiBcIlJlc2V0XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3YWxrVHJhdmVyc2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRPRE86IElmIHRoZSBlbWJlZGRlZCBjb250cm9sIGhhcyByb2xlIGNvbWJvYm94IG9yIGxpc3Rib3gsIHJldHVybiB0aGUgdGV4dCBhbHRlcm5hdGl2ZSBvZiB0aGUgY2hvc2VuIG9wdGlvbi5cbiAgICAgICAgICAgIGlmIChyb2xlID09PSBcImNvbWJvYm94XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlbSwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZCAmJiAhRE9NVXRpbC5zYW1lTm9kZShlbGVtLCBzZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBUklBTWFwcGVyLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIHNlbGVjdGVkLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB0aGUgZW1iZWRkZWQgY29udHJvbCBoYXMgcm9sZSByYW5nZSAoZS5nLiwgYSBzcGluYnV0dG9uIG9yIHNsaWRlcik6XG4gICAgICAgICAgICBpZiAoW1wicHJvZ3Jlc3NiYXJcIiwgXCJzY3JvbGxiYXJcIiwgXCJzbGlkZXJcIiwgXCJzcGluYnV0dG9uXCJdLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGFyaWEtdmFsdWV0ZXh0IHByb3BlcnR5IGlzIHByZXNlbnQsIHJldHVybiBpdHMgdmFsdWUsXG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS12YWx1ZXRleHRcIikpIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtdmFsdWV0ZXh0XCIpO1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgaWYgdGhlIGFyaWEtdmFsdWVub3cgcHJvcGVydHkgaXMgcHJlc2VudCwgcmV0dXJuIGl0cyB2YWx1ZSxcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIpKSByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IE90aGVyd2lzZSwgdXNlIHRoZSB2YWx1ZSBhcyBzcGVjaWZpZWQgYnkgYSBob3N0IGxhbmd1YWdlIGF0dHJpYnV0ZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDJmLiAyaC5cbiAgICAgICAgaWYgKHdhbGtUcmF2ZXJzZSB8fCBBUklBRGVmaW5pdGlvbnMubmFtZUZyb21Db250ZW50KHJvbGUpIHx8IGxhYmVsbGVkYnlUcmF2ZXJzZSkge1xuICAgICAgICAgICAgLy8gMmZpLiBTZXQgdGhlIGFjY3VtdWxhdGVkIHRleHQgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAgICAgICAgICAgIGxldCBhY2N1bXVsYXRlZCA9IFwiXCI7XG4gICAgICAgICAgICAvLyAyZmlpLiBDaGVjayBmb3IgQ1NTIGdlbmVyYXRlZCB0ZXh0dWFsIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IG5vZGUgYW5kIFxuICAgICAgICAgICAgLy8gaW5jbHVkZSBpdCBpbiB0aGUgYWNjdW11bGF0ZWQgdGV4dC4gVGhlIENTUyA6YmVmb3JlIGFuZCA6YWZ0ZXIgcHNldWRvIGVsZW1lbnRzIFtDU1MyXSBcbiAgICAgICAgICAgIC8vIGNhbiBwcm92aWRlIHRleHR1YWwgY29udGVudCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIGEgY29udGVudCBtb2RlbC5cbiAgICAgICAgICAgIC8vICAgRm9yIDpiZWZvcmUgcHNldWRvIGVsZW1lbnRzLCBVc2VyIGFnZW50cyBNVVNUIHByZXBlbmQgQ1NTIHRleHR1YWwgY29udGVudCwgd2l0aG91dCBcbiAgICAgICAgICAgIC8vICAgICBhIHNwYWNlLCB0byB0aGUgdGV4dHVhbCBjb250ZW50IG9mIHRoZSBjdXJyZW50IG5vZGUuXG4gICAgICAgICAgICAvLyAgIEZvciA6YWZ0ZXIgcHNldWRvIGVsZW1lbnRzLCBVc2VyIGFnZW50cyBNVVNUIGFwcGVuZCBDU1MgdGV4dHVhbCBjb250ZW50LCB3aXRob3V0IGEgXG4gICAgICAgICAgICAvLyAgICAgc3BhY2UsIHRvIHRoZSB0ZXh0dWFsIGNvbnRlbnQgb2YgdGhlIGN1cnJlbnQgbm9kZS5cbiAgICAgICAgICAgIGxldCBiZWZvcmUgPSBudWxsO1xuICAgICAgICAgICAgYmVmb3JlID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSxcImJlZm9yZVwiKS5jb250ZW50O1xuXG4gICAgICAgICAgICBpZiAoYmVmb3JlICYmIGJlZm9yZSAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICBiZWZvcmUgPSBiZWZvcmUucmVwbGFjZSgvXlwiLyxcIlwiKS5yZXBsYWNlKC9cIiQvLFwiXCIpO1xuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IGJlZm9yZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDJmaWlpLiBGb3IgZWFjaCBjaGlsZCBub2RlIG9mIHRoZSBjdXJyZW50IG5vZGU6XG4gICAgICAgICAgICAvLyAgIFNldCB0aGUgY3VycmVudCBub2RlIHRvIHRoZSBjaGlsZCBub2RlLlxuICAgICAgICAgICAgLy8gICBDb21wdXRlIHRoZSB0ZXh0IGFsdGVybmF0aXZlIG9mIHRoZSBjdXJyZW50IG5vZGUgYmVnaW5uaW5nIHdpdGggc3RlcCAyLiBTZXQgdGhlIHJlc3VsdCBcbiAgICAgICAgICAgIC8vICAgICB0byB0aGF0IHRleHQgYWx0ZXJuYXRpdmUuXG4gICAgICAgICAgICAvLyAgIEFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZSBhY2N1bXVsYXRlZCB0ZXh0LlxuICAgICAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJTTE9UXCIpIHtcbiAgICAgICAgICAgICAgICAvL2lmIG5vIGFzc2lnbmVkTm9kZSwgY2hlY2sgaXRzIG93biB0ZXh0IFxuICAgICAgICAgICAgICAgIGlmICghKGVsZW0gYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCkgfHwgKGVsZW0gYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbm5lclRleHQgPSBSUFRVdGlsLmdldElubmVyVGV4dChlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyVGV4dCAmJiBpbm5lclRleHQgIT09IG51bGwgJiYgaW5uZXJUZXh0LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWQgKz0gIFwiIFwiICsgaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0ZXh0IGZyb20gYWxsIGFzc2lnbmVkIG5vZGVzXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2xvdENoaWxkIG9mIChlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dENoaWxkQ29udGVudCA9IEFSSUFNYXBwZXIuY29tcHV0ZU5hbWVIZWxwKHdhbGtJZCwgc2xvdENoaWxkLCBsYWJlbGxlZGJ5VHJhdmVyc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWQgKz0gXCIgXCIgKyBuZXh0Q2hpbGRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgd2Fsa0NoaWxkID0gZWxlbS5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIHdoaWxlICh3YWxrQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRDaGlsZENvbnRlbnQgPSBBUklBTWFwcGVyLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIHdhbGtDaGlsZCwgbGFiZWxsZWRieVRyYXZlcnNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWQgKz0gXCIgXCIgKyBuZXh0Q2hpbGRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICB3YWxrQ2hpbGQgPSB3YWxrQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgYWZ0ZXIgPSBudWxsO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhZnRlciA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sXCJhZnRlclwiKS5jb250ZW50O1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cblxuICAgICAgICAgICAgaWYgKGFmdGVyICYmIGFmdGVyICE9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgIGFmdGVyID0gYWZ0ZXIucmVwbGFjZSgvXlwiLyxcIlwiKS5yZXBsYWNlKC9cIiQvLFwiXCIpO1xuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IGFmdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMmZpdi4gUmV0dXJuIHRoZSBhY2N1bXVsYXRlZCB0ZXh0LlxuICAgICAgICAgICAgYWNjdW11bGF0ZWQgPSBhY2N1bXVsYXRlZC5yZXBsYWNlKC9cXHMrL2csXCIgXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGlmIChhY2N1bXVsYXRlZC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDJpLiBPdGhlcndpc2UsIGlmIHRoZSBjdXJyZW50IG5vZGUgaGFzIGEgVG9vbHRpcCBhdHRyaWJ1dGUsIHJldHVybiBpdHMgdmFsdWUuXG4gICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3ZnXCIpIHtcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IGVsZW0ucXVlcnlTZWxlY3RvcihcInRpdGxlXCIpO1xuICAgICAgICAgICAgaWYgKHRpdGxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRpdGxlLnRleHRDb250ZW50IHx8IHRpdGxlLmlubmVyVGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuLyogICAgICAgIGlmIChyb2xlIGluIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1xuICAgICAgICAgICAgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLm5hbWVGcm9tIFxuICAgICAgICAgICAgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLm5hbWVGcm9tLmluY2x1ZGVzKFwiY29udGVudHNcIikpIFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lID0gZWxlbS50ZXh0Q29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJpZFwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBuYW1lID0gZWxlbS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJsYWJlbFtmb3I9J1wiK2VsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikudHJpbSgpK1wiJ11cIikudGV4dENvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkge1xuICAgICAgICAgICAgbmFtZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcbiAgICAgICAgICAgIG5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgY29uc3QgaWRzID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgICAgICBuYW1lICs9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW0sIGlkKS50ZXh0Q29udGVudCArIFwiIFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgIH0qL1xuXG4gICAgcHVibGljIHN0YXRpYyBub2RlVG9Sb2xlKG5vZGUgOiBOb2RlKSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAzIC8qIE5vZGUuVEVYVF9OT0RFICovKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJ0ZXh0XCI7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKCFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInJvbGVcIikgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcm9sZVN0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCk7XG4gICAgICAgICAgICBsZXQgcm9sZXMgPSByb2xlU3RyLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlcykge1xuICAgICAgICAgICAgICAgIGlmIChyb2xlID09PSBcInByZXNlbnRhdGlvblwiIHx8IHJvbGUgPT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGVsZW1lbnQgaXMgZm9jdXNhYmxlLCB0aGVuIHByZXNlbnRhdGlvbiByb2xlcyBhcmUgdG8gYmUgaWdub3JlZFxuICAgICAgICAgICAgICAgICAgICBpZiAoIVJQVFV0aWwuaXNGb2N1c2FibGUoZWxlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb2xlIGluIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm9sZTtcbiAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vcmV0dXJuIHRoaXMuZWxlbVRvSW1wbGljaXRSb2xlKGVsZW0pO1xuICAgICAgICBjb25zdCByb2xlcyA9IFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKGVsZW0pO1xuICAgICAgICByZXR1cm4gIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0wID8gbnVsbCA6IHJvbGVzWzBdO1xuICAgIH1cbiAgICAvKipcbiAgICBwdWJsaWMgc3RhdGljIGVsZW1Ub0ltcGxpY2l0Um9sZShlbGVtIDogRWxlbWVudCkge1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKCEobm9kZU5hbWUgaW4gQVJJQU1hcHBlci5lbGVtVG9Sb2xlTWFwKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJvbGUgPSBBUklBTWFwcGVyLmVsZW1Ub1JvbGVNYXBbbm9kZU5hbWVdO1xuICAgICAgICBpZiAodHlwZW9mIHJvbGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiByb2xlO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByb2xlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHJldHVybiByb2xlKGVsZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcHVibGljIHN0YXRpYyBoYXNQYXJlbnRSb2xlKGVsZW1lbnQsIHJvbGUpIDogYm9vbGVhbiB7XG4gICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtZW50KTtcbiAgICAgICAgLy8gSWYgbGluayBpcyBpbiBhIG1lbnUsIGl0J3MgYSBtZW51aXRlbVxuICAgICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgICAgICBpZiAoQVJJQU1hcHBlci5ub2RlVG9Sb2xlKHBhcmVudCkgPT09IHJvbGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShwYXJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5wdXRUb1JvbGVNYXAgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgIGxldCBoYXNMaXN0ID0gZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFwibGlzdFwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwibGlzdFwiKTtcbiAgICAgICAgICAgICAgICBsZXQgaWRSZWYgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChlbGVtZW50LCBpZCk7XG4gICAgICAgICAgICAgICAgaWYgKGlkUmVmICYmIGlkUmVmLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiZGF0YWxpc3RcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICAgIGxldCB0ZXh0U3VnZ2VzdGlvbnMgPSBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gaGFzTGlzdChlbGVtZW50KSA/IFwiY29tYm9ib3hcIiA6IFwidGV4dGJveFwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBcImJ1dHRvblwiOiBcImJ1dHRvblwiLFxuICAgICAgICAgICAgXCJpbWFnZVwiOiBcImJ1dHRvblwiLFxuICAgICAgICAgICAgXCJjaGVja2JveFwiOiBcImNoZWNrYm94XCIsXG4gICAgICAgICAgICBcInJhZGlvXCI6IFwicmFkaW9cIixcbiAgICAgICAgICAgIFwiZW1haWxcIjogdGV4dFN1Z2dlc3Rpb25zLFxuICAgICAgICAgICAgXCJzZWFyY2hcIjogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBoYXNMaXN0KGVsZW1lbnQpID8gXCJjb21ib2JveFwiIDogXCJzZWFyY2hib3hcIjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRlbFwiOiB0ZXh0U3VnZ2VzdGlvbnMsXG4gICAgICAgICAgICBcInRleHRcIjogdGV4dFN1Z2dlc3Rpb25zLFxuICAgICAgICAgICAgXCJ1cmxcIjogdGV4dFN1Z2dlc3Rpb25zLFxuICAgICAgICAgICAgXCJudW1iZXJcIjogXCJzcGluYnV0dG9uXCIsXG4gICAgICAgICAgICBcInJhbmdlXCI6IFwic2xpZGVyXCIsXG4gICAgICAgICAgICBcInJlc2V0XCI6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgICBcInN1Ym1pdFwiOiBcImJ1dHRvblwiXG4gICAgICAgIH1cbiAgICB9KSgpO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5wdXRUb1JvbGUoZWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVUeXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCkudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGVUeXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCEoZVR5cGUgaW4gQVJJQU1hcHBlci5pbnB1dFRvUm9sZU1hcCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCByb2xlID0gQVJJQU1hcHBlci5pbnB1dFRvUm9sZU1hcFtlVHlwZV07XG4gICAgICAgIGlmICh0eXBlb2Ygcm9sZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHJvbGU7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJvbGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIHJvbGUoZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgIFxuICAgIHByaXZhdGUgc3RhdGljIGVsZW1Ub1JvbGVNYXAgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgIGxldCBzZWN0aW9uaW5nUm9vdHMgPSB7XG4gICAgICAgICAgICBcImJsb2NrcXVvdGVcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwiYm9keVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJkZXRhaWxzXCI6IHRydWUsXG4gICAgICAgICAgICBcImRpYWxvZ1wiOiB0cnVlLFxuICAgICAgICAgICAgXCJmaWVsZHNldFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJmaWd1cmVcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwidGRcIjogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICBsZXQgc2VjdGlvbmluZ0NvbnRlbnQgPSB7XG4gICAgICAgICAgICBcImFydGljbGVcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwiYXNpZGVcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwibmF2XCI6IHRydWUsXG4gICAgICAgICAgICBcInNlY3Rpb25cIjogdHJ1ZSxcbiAgICAgICAgICAgIFwibWFpblwiOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIGxldCBzZWN0aW9uaW5nUm9sZSA9IHtcbiAgICAgICAgICAgIFwiYXJ0aWNsZVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJjb21wbGVtZW50YXJ5XCI6IHRydWUsXG4gICAgICAgICAgICBcIm5hdmlnYXRpb25cIjogdHJ1ZSxcbiAgICAgICAgICAgIFwicmVnaW9uXCI6IHRydWUsXG4gICAgICAgICAgICBcIm1haW5cIjogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICBsZXQgaW5wdXRUb1JvbGUgPSBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gQVJJQU1hcHBlci5pbnB1dFRvUm9sZShlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgXCJhXCI6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBpdCBkb2Vzbid0IHJlcHJlc2VudCBhIGh5cGVybGluaywgJ2dlbmVyaWMnIHJvbGVcbiAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwibGlua1wiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiYXJlYVwiOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgaXQgZG9lc24ndCByZXByZXNlbnQgYSBoeXBlcmxpbmssIG5vIGNvcnJlc3BvbmRpbmcgcm9sZVxuICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJsaW5rXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJhcnRpY2xlXCI6IFwiYXJ0aWNsZVwiLFxuICAgICAgICAgICAgXCJhc2lkZVwiOiBcImNvbXBsZW1lbnRhcnlcIixcbiAgICAgICAgICAgIFwiYnV0dG9uXCI6IFwiYnV0dG9uXCIsXG4gICAgICAgICAgICBcImRhdGFsaXN0XCI6IFwibGlzdGJveFwiLFxuICAgICAgICAgICAgXCJkZFwiOiBcImRlZmluaXRpb25cIixcbiAgICAgICAgICAgIFwiZGV0YWlsc1wiOiBcImdyb3VwXCIsXG4gICAgICAgICAgICBcImRmblwiOiBcInRlcm1cIixcbiAgICAgICAgICAgIFwiZGlhbG9nXCI6IFwiZGlhbG9nXCIsXG4gICAgICAgICAgICBcImR0XCI6IFwidGVybVwiLFxuICAgICAgICAgICAgXCJmaWVsZHNldFwiOiBcImdyb3VwXCIsXG4gICAgICAgICAgICBcImZpZ3VyZVwiOiBcImZpZ3VyZVwiLFxuICAgICAgICAgICAgXCJmb290ZXJcIjogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAvLyBJZiBuZWFyZXN0IHNlY3Rpb25pbmdSb290IG9yIHNlY3Rpb25pbmdDb250ZW50IGlzIGJvZHlcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZSA9IChwYXJlbnQubm9kZVR5cGUgPT09IDEgJiYgKHBhcmVudCBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwicm9sZVwiKSkgfHwgXCJcIlxuICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBwYXJlbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlY3Rpb25pbmdSb290c1tub2RlTmFtZV0gfHwgc2VjdGlvbmluZ0NvbnRlbnRbbm9kZU5hbWVdIHx8IHNlY3Rpb25pbmdSb2xlW3JvbGVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5vZGVOYW1lID09PSBcImJvZHlcIikgPyBcImNvbnRlbnRpbmZvXCIgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZm9ybVwiOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBBUklBTWFwcGVyLmNvbXB1dGVOYW1lKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiAobmFtZSAmJiBuYW1lLnRyaW0oKS5sZW5ndGggPiAwKSA/IFwiZm9ybVwiIDogbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBUT0RPIFwiZm9ybS1hc3NvY2lhdGVkIGN1c3RvbSBlbGVtZW50XCJcbiAgICAgICAgICAgIFwiaDFcIjogXCJoZWFkaW5nXCIsXG4gICAgICAgICAgICBcImgyXCI6IFwiaGVhZGluZ1wiLFxuICAgICAgICAgICAgXCJoM1wiOiBcImhlYWRpbmdcIixcbiAgICAgICAgICAgIFwiaDRcIjogXCJoZWFkaW5nXCIsXG4gICAgICAgICAgICBcImg1XCI6IFwiaGVhZGluZ1wiLFxuICAgICAgICAgICAgXCJoNlwiOiBcImhlYWRpbmdcIixcbiAgICAgICAgICAgIFwiaGVhZGVyXCI6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgLy8gSWYgbmVhcmVzdCBzZWN0aW9uaW5nUm9vdCBvciBzZWN0aW9uaW5nQ29udGVudCBpcyBib2R5XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gcGFyZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlID0gKHBhcmVudC5ub2RlVHlwZSA9PT0gMSAmJiAocGFyZW50IGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpKSB8fCBcIlwiXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWN0aW9uaW5nUm9vdHNbbm9kZU5hbWVdIHx8IHNlY3Rpb25pbmdDb250ZW50W25vZGVOYW1lXSB8fCBzZWN0aW9uaW5nUm9sZVtyb2xlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChub2RlTmFtZSA9PT0gXCJib2R5XCIpID8gXCJiYW5uZXJcIiA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocGFyZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJoclwiOiBcInNlcGFyYXRvclwiLFxuICAgICAgICAgICAgXCJodG1sXCI6IFwiZG9jdW1lbnRcIixcbiAgICAgICAgICAgIFwiaW1nXCI6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJhbHRcIikgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcInByZXNlbnRhdGlvblwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImltZ1wiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImlucHV0XCI6IGlucHV0VG9Sb2xlLFxuICAgICAgICAgICAgXCJrZXlnZW5cIjogXCJsaXN0Ym94XCIsIC8vIGRlcHJlY2F0ZWQsIGJ1dCBrZWVwIGZvciBiYWNrd2FyZCBjb21wYXRcbiAgICAgICAgICAgIFwibGlcIjogXCJsaXN0aXRlbVwiLFxuICAgICAgICAgICAgXCJtYWluXCI6IFwibWFpblwiLFxuICAgICAgICAgICAgXCJtYXRoXCI6IFwibWF0aFwiLFxuICAgICAgICAgICAgXCJtZW51XCI6IFwibGlzdFwiLFxuICAgICAgICAgICAgXCJuYXZcIjogXCJuYXZpZ2F0aW9uXCIsXG4gICAgICAgICAgICBcIm9sXCI6IFwibGlzdFwiLFxuICAgICAgICAgICAgXCJvcHRncm91cFwiOiBcImdyb3VwXCIsXG4gICAgICAgICAgICBcIm9wdGlvblwiOiBcIm9wdGlvblwiLFxuICAgICAgICAgICAgXCJvdXRwdXRcIjogXCJzdGF0dXNcIixcbiAgICAgICAgICAgIFwicHJvZ3Jlc3NcIjogXCJwcm9ncmVzc2JhclwiLFxuICAgICAgICAgICAgXCJzZWN0aW9uXCI6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IEFSSUFNYXBwZXIuY29tcHV0ZU5hbWUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChuYW1lICYmIG5hbWUudHJpbSgpLmxlbmd0aCA+IDApID8gXCJyZWdpb25cIiA6IG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcIm11bHRpcGxlXCIpIHx8IChSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGVsZW1lbnQsIFwic2l6ZVwiKSAmJiBwYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZShcInNpemVcIikpID4gMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwibGlzdGJveFwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImNvbWJvYm94XCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic3VtbWFyeVwiOiBcImJ1dHRvblwiLFxuICAgICAgICAgICAgXCJzdmdcIjogXCJncmFwaGljcy1kb2N1bWVudFwiLFxuICAgICAgICAgICAgXCJ0YWJsZVwiOiBcInRhYmxlXCIsXG4gICAgICAgICAgICBcInRib2R5XCI6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJ0YWJsZVwiIHx8IHJvbGUgPT09IFwiZ3JpZFwiIHx8IHJvbGUgPT09IFwidHJlZWdyaWRcIikgcmV0dXJuIFwicm93Z3JvdXBcIjtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocGFyZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZXh0YXJlYVwiOiBcInRleHRib3hcIixcbiAgICAgICAgICAgIFwidGRcIjogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyb2xlID09PSBcInRhYmxlXCIpIHJldHVybiBcImNlbGxcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwiZ3JpZFwiIHx8IHJvbGUgPT09IFwidHJlZWdyaWRcIikgcmV0dXJuIFwiZ3JpZGNlbGxcIjtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocGFyZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0aFwiOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUocGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChyb2xlICE9PSBcInRhYmxlXCIgJiYgcm9sZSAhPT0gXCJncmlkXCIgJiYgcm9sZSAhPT0gXCJ0cmVlZ3JpZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgXG4gICAgICAgICAgICAgICAgICAgIH0gICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBFYXNpZXN0IGFuc3dlciBpcyBpZiBzY29wZSBpcyBzcGVjaWZpZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFwic2NvcGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzY29wZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic2NvcGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY29wZSA9PT0gXCJyb3dcIiB8fCBzY29wZSA9PT0gJ3Jvd2dyb3VwJykgcmV0dXJuIFwicm93aGVhZGVyXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUgPT09IFwiY29sXCIgfHwgc2NvcGUgPT09ICdjb2xncm91cCcpIHJldHVybiBcImNvbHVtbmhlYWRlclwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBzY29wZSBpcyBhdXRvLCBkZWZhdWx0ICh3aXRob3V0IGEgc2NvcGUpIG9yIGludmFsaWQgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIGFsbCB0aGUgc2libGluZyBlbGVtZW50cyBhcmUgdGgsIHRoZW4gcmV0dXJuIFwiY29sdW1uaGVhZGVyXCIgXG4gICAgICAgICAgICAgICAgICAgIHZhciBzaWJsaW5ncyA9IGVsZW1lbnQgPT4gWy4uLmVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbl0uZmlsdGVyKG5vZGU9Pm5vZGUubm9kZVR5cGUgPT09IDEgJiYgbm9kZS50YWdOYW1lICE9IFwiVEhcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaWJsaW5ncyA9PT0gbnVsbCB8fCBzaWJsaW5ncy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJjb2x1bW5oZWFkZXJcIjsgXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIFwicm93aGVhZGVyXCI7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRmb290XCI6IFwicm93Z3JvdXBcIixcbiAgICAgICAgICAgIFwidGhlYWRcIjogXCJyb3dncm91cFwiLFxuICAgICAgICAgICAgXCJ0clwiOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUocGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwidGFibGVcIiB8fCByb2xlID09PSBcImdyaWRcIiB8fCByb2xlID09PSBcInRyZWVncmlkXCIpIHJldHVybiBcInJvd1wiO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInVsXCI6IFwibGlzdFwiXG4gICAgICAgIH1cbiAgICB9KSgpXG4gICAqL1xufSBcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuL0FSSUFNYXBwZXJcIjtcblxuLyoqXG4gKiBXYWxrcyBpbiBhbiBBUklBIG9yZGVyXG4gKiBcbiAqIFNlZSBhbHNvIC4uL2RvbS9ET01XYWxrZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEFSSUFXYWxrZXIge1xuICAgIHJvb3QgOiBOb2RlO1xuICAgIG5vZGUgOiBOb2RlO1xuICAgIGJFbmRUYWc6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50IDogTm9kZSwgYkVuZD8gOiBib29sZWFuLCByb290PyA6IE5vZGUpIHtcbiAgICAgICAgdGhpcy5yb290ID0gcm9vdCB8fCBlbGVtZW50O1xuICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLmJFbmRUYWcgPSAoYkVuZCA9PSB1bmRlZmluZWQgPyBmYWxzZSA6IGJFbmQgPT0gdHJ1ZSk7XG4gICAgfVxuXG4gICAgYXRSb290KCkgOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCh0aGlzIGFzIGFueSkub3duZXJFbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT09IHRoaXMubm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yb290LmlzU2FtZU5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QuaXNTYW1lTm9kZSh0aGlzLm5vZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm9vdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzLm5vZGUpID09PSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50IC0gdHJ5IG91ciBiZXN0XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlLnBhcmVudE5vZGUgPT09IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZXh0Tm9kZSgpIDogYm9vbGVhbiB7XG4gICAgICAgIGxldCBza2lwT3duZWQgPSBmYWxzZTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgc2tpcE93bmVkID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLm5vZGUubm9kZU5hbWUsIHRoaXMuYkVuZFRhZz9cIkVORFwiOlwiU1RBUlRcIiwgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgYW55KS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgIGxldCBpZnJhbWVOb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MSUZyYW1lRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnROb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IHNsb3RFbGVtZW50ID0gKHRoaXMubm9kZSBhcyBIVE1MU2xvdEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyBcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5ub2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiSUZSQU1FXCJcbiAgICAgICAgICAgICAgICAgICAgJiYgRE9NV2Fsa2VyLmlzTm9kZVZpc2libGUoaWZyYW1lTm9kZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnRcbiAgICAgICAgICAgICAgICAgICAgJiYgaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiBET01XYWxrZXIuaXNOb2RlVmlzaWJsZShlbGVtZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290LmZpcnN0Q2hpbGQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50Tm9kZS5zaGFkb3dSb290O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNsb3RcIlxuICAgICAgICAgICAgICAgICAgICAmJiBzbG90RWxlbWVudC5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE86IG5lZWQgdG8gY29uc2lkZSBpdHMgb3duIGNvbnRlbnQsIGEgc2xvdCBtYXkgaGF2ZSBpdHMgb3duIGNvbnRlbnQgb3IgYXNzaWduZWQgY29udGVudFxuICAgICAgICAgICAgICAgICAgICBsZXQgc2xvdE93bmVyID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90RWxlbWVudC5hc3NpZ25lZE5vZGVzKClbMF07XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXIgPSBzbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyB8fCB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDExKSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyAmJiB0aGlzLm5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXRSb290KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2xvdE93bmVyID0gKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRTbG90SW5kZXggPSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4KzE7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRTbG90SW5kZXggPCBzbG90T3duZXIuYXNzaWduZWROb2RlcygpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdE93bmVyLmFzc2lnbmVkTm9kZXMoKVtuZXh0U2xvdEluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXIgPSBzbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4ID0gbmV4dFNsb3RJbmRleDsgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5uZXh0U2libGluZykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBza2lwT3duZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCkuaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duSWRzID0gKHRoaXMubm9kZS5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikuc3BsaXQoLyArL2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSB8fCAhKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCkuaGFzQXR0cmlidXRlKFwiaWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudCh0aGlzLm5vZGUpLmdldEVsZW1lbnRCeUlkKG93bklkc1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZHggPSBvd25JZHMuaW5kZXhPZigodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA9PT0gb3duSWRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCBvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7ICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ3JhYiBuZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHRoaXMubm9kZSkuZ2V0RWxlbWVudEJ5SWQob3duSWRzW2lkeCsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChcbiAgICAgICAgICAgICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxMSAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDMgLyogTm9kZS5URVhUX05PREUgKi8pXG4gICAgICAgICAgICB8fCAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYUNoZWNrZXJcIikgPT09IFwiQUNFXCIpXG4gICAgICAgICAgICB8fCAoc2tpcE93bmVkICYmIHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAhIUFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJldk5vZGUoKSA6IGJvb2xlYW4ge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAodGhpcy5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlmcmFtZU5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxJRnJhbWVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudE5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJRlJBTUVcIlxuICAgICAgICAgICAgICAgICAgICAmJiBET01XYWxrZXIuaXNOb2RlVmlzaWJsZShpZnJhbWVOb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiBET01XYWxrZXIuaXNOb2RlVmlzaWJsZShlbGVtZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290Lmxhc3RDaGlsZCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50Tm9kZS5zaGFkb3dSb290O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyB8fCB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDExKSAmJiB0aGlzLm5vZGUubGFzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdFJvb3QoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUucHJldmlvdXNTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKFxuICAgICAgICAgICAgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDExKVxuICAgICAgICAgICAgfHwgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFDaGVja2VyXCIpID09PSBcIkFDRVwiKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi8uLi8uLi9hcGkvSUVuZ2luZVwiO1xuXG5leHBvcnQgY2xhc3MgQW5jZXN0b3JVdGlsIHtcbiAgICBwdWJsaWMgc3RhdGljIGlzUHJlc2VudGF0aW9uRnJhbWUoY29udGV4dEhpZXJhcmNoeTogUnVsZUNvbnRleHRIaWVyYXJjaHkpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmIChjb250ZXh0SGllcmFyY2h5ICYmIGNvbnRleHRIaWVyYXJjaHkuZG9tKSB7XG4gICAgICAgICAgICAvLyBTa2lwIGN1cnJlbnQgbm9kZSBiZWNhdXNlIHdlIHdhbnQgYW5jZXN0cnlcbiAgICAgICAgICAgIGZvciAobGV0IGlkeD1jb250ZXh0SGllcmFyY2h5LmRvbS5sZW5ndGgtMjsgaWR4ID49IDA7IC0taWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IChjb250ZXh0SGllcmFyY2h5LmRvbVtpZHhdLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLm5vZGVUeXBlID09PSAxIFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaWZyYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgJiYgKGVsZW0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKSA9PT0gXCJwcmVzZW50YXRpb25cIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpID09PSBcInRydWVcIikpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzRnJhbWUoY29udGV4dEhpZXJhcmNoeTogUnVsZUNvbnRleHRIaWVyYXJjaHkpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmIChjb250ZXh0SGllcmFyY2h5ICYmIGNvbnRleHRIaWVyYXJjaHkuZG9tKSB7XG4gICAgICAgICAgICAvLyBTa2lwIGN1cnJlbnQgbm9kZSBiZWNhdXNlIHdlIHdhbnQgYW5jZXN0cnlcbiAgICAgICAgICAgIGZvciAobGV0IGlkeD1jb250ZXh0SGllcmFyY2h5LmRvbS5sZW5ndGgtMjsgaWR4ID49IDA7IC0taWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IChjb250ZXh0SGllcmFyY2h5LmRvbVtpZHhdLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLm5vZGVUeXBlID09PSAxICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpZnJhbWVcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uLy4uLy4uL2FwaS9JRW5naW5lXCI7XG5cbmV4cG9ydCBjbGFzcyBGcmFnbWVudFV0aWwge1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0T3duZXJGcmFnbWVudChub2RlOiBOb2RlKSA6IERvY3VtZW50IHwgRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgICAgIGxldCBuIDogTm9kZSA9IG5vZGU7XG4gICAgICAgIHdoaWxlKG4ucGFyZW50Tm9kZSAmJiAobiA9IG4ucGFyZW50Tm9kZSkpe1xuICAgICAgICAgICAgaWYgKG4ubm9kZVR5cGUgPT09IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG4gYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QnlJZChub2RlOiBOb2RlLCBpZDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE93bmVyRnJhZ21lbnQobm9kZSkuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QW5jZXN0b3IoaGllcmFyY2hpZXM6IFJ1bGVDb250ZXh0SGllcmFyY2h5LCBlbGVtTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGxldCBtYXRjaGVzID0gaGllcmFyY2hpZXNbXCJkb21cIl0uZmlsdGVyKGluZm8gPT4gaW5mby5yb2xlID09PSBlbGVtTmFtZSk7XG4gICAgICAgIHJldHVybiBtYXRjaGVzLmxlbmd0aCA+IDAgJiYgbWF0Y2hlc1swXS5ub2RlIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmNlc3RvcldpdGhSb2xlKGhpZXJhcmNoaWVzOiBSdWxlQ29udGV4dEhpZXJhcmNoeSwgcm9sZTogc3RyaW5nKSB7XG4gICAgICAgIGxldCBtYXRjaGVzID0gaGllcmFyY2hpZXNbXCJhcmlhXCJdLmZpbHRlcihpbmZvID0+IGluZm8ucm9sZSA9PT0gcm9sZSk7XG4gICAgICAgIHJldHVybiBtYXRjaGVzLmxlbmd0aCA+IDAgJiYgbWF0Y2hlc1swXS5ub2RlIHx8IG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMS0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLy8gRnJvbSBodHRwczovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9sYW5ndWFnZS1zdWJ0YWctcmVnaXN0cnkvbGFuZ3VhZ2Utc3VidGFnLXJlZ2lzdHJ5XG5jb25zdCB2YWxpZFByaW1hcnlMYW5ncyA9IFsgLy8gXCJxYWEuLnF0elwiLFxuWyBcImFhXCIsXCJhYlwiLFwiYWVcIixcImFmXCIsXCJha1wiLFwiYW1cIixcImFuXCIsXCJhclwiLFwiYXNcIixcImF2XCIsXCJheVwiLFwiYXpcIixcImFhYVwiLFwiYWFiXCIsXCJhYWNcIixcImFhZFwiLFwiYWFlXCIsXCJhYWZcIixcImFhZ1wiLFwiYWFoXCIsXCJhYWlcIixcImFha1wiLFwiYWFsXCIsXCJhYW1cIixcImFhblwiLFwiYWFvXCIsXCJhYXBcIixcImFhcVwiLFwiYWFzXCIsXCJhYXRcIixcImFhdVwiLFwiYWF2XCIsXCJhYXdcIixcImFheFwiLFwiYWF6XCIsXCJhYmFcIixcImFiYlwiLFwiYWJjXCIsXCJhYmRcIixcImFiZVwiLFwiYWJmXCIsXCJhYmdcIixcImFiaFwiLFwiYWJpXCIsXCJhYmpcIixcImFibFwiLFwiYWJtXCIsXCJhYm5cIixcImFib1wiLFwiYWJwXCIsXCJhYnFcIixcImFiclwiLFwiYWJzXCIsXCJhYnRcIixcImFidVwiLFwiYWJ2XCIsXCJhYndcIixcImFieFwiLFwiYWJ5XCIsXCJhYnpcIixcImFjYVwiLFwiYWNiXCIsXCJhY2RcIixcImFjZVwiLFwiYWNmXCIsXCJhY2hcIixcImFjaVwiLFwiYWNrXCIsXCJhY2xcIixcImFjbVwiLFwiYWNuXCIsXCJhY3BcIixcImFjcVwiLFwiYWNyXCIsXCJhY3NcIixcImFjdFwiLFwiYWN1XCIsXCJhY3ZcIixcImFjd1wiLFwiYWN4XCIsXCJhY3lcIixcImFjelwiLFwiYWRhXCIsXCJhZGJcIixcImFkZFwiLFwiYWRlXCIsXCJhZGZcIixcImFkZ1wiLFwiYWRoXCIsXCJhZGlcIixcImFkalwiLFwiYWRsXCIsXCJhZG5cIixcImFkb1wiLFwiYWRwXCIsXCJhZHFcIixcImFkclwiLFwiYWRzXCIsXCJhZHRcIixcImFkdVwiLFwiYWR3XCIsXCJhZHhcIixcImFkeVwiLFwiYWR6XCIsXCJhZWFcIixcImFlYlwiLFwiYWVjXCIsXCJhZWRcIixcImFlZVwiLFwiYWVrXCIsXCJhZWxcIixcImFlbVwiLFwiYWVuXCIsXCJhZXFcIixcImFlclwiLFwiYWVzXCIsXCJhZXVcIixcImFld1wiLFwiYWV5XCIsXCJhZXpcIixcImFmYVwiLFwiYWZiXCIsXCJhZmRcIixcImFmZVwiLFwiYWZnXCIsXCJhZmhcIixcImFmaVwiLFwiYWZrXCIsXCJhZm5cIixcImFmb1wiLFwiYWZwXCIsXCJhZnNcIixcImFmdFwiLFwiYWZ1XCIsXCJhZnpcIixcImFnYVwiLFwiYWdiXCIsXCJhZ2NcIixcImFnZFwiLFwiYWdlXCIsXCJhZ2ZcIixcImFnZ1wiLFwiYWdoXCIsXCJhZ2lcIixcImFnalwiLFwiYWdrXCIsXCJhZ2xcIixcImFnbVwiLFwiYWduXCIsXCJhZ29cIixcImFncFwiLFwiYWdxXCIsXCJhZ3JcIixcImFnc1wiLFwiYWd0XCIsXCJhZ3VcIixcImFndlwiLFwiYWd3XCIsXCJhZ3hcIixcImFneVwiLFwiYWd6XCIsXCJhaGFcIixcImFoYlwiLFwiYWhnXCIsXCJhaGhcIixcImFoaVwiLFwiYWhrXCIsXCJhaGxcIixcImFobVwiLFwiYWhuXCIsXCJhaG9cIixcImFocFwiLFwiYWhyXCIsXCJhaHNcIixcImFodFwiLFwiYWlhXCIsXCJhaWJcIixcImFpY1wiLFwiYWlkXCIsXCJhaWVcIixcImFpZlwiLFwiYWlnXCIsXCJhaWhcIixcImFpaVwiLFwiYWlqXCIsXCJhaWtcIixcImFpbFwiLFwiYWltXCIsXCJhaW5cIixcImFpb1wiLFwiYWlwXCIsXCJhaXFcIixcImFpclwiLFwiYWlzXCIsXCJhaXRcIixcImFpd1wiLFwiYWl4XCIsXCJhaXlcIixcImFqYVwiLFwiYWpnXCIsXCJhamlcIixcImFqblwiLFwiYWpwXCIsXCJhanRcIixcImFqdVwiLFwiYWp3XCIsXCJhanpcIixcImFrYlwiLFwiYWtjXCIsXCJha2RcIixcImFrZVwiLFwiYWtmXCIsXCJha2dcIixcImFraFwiLFwiYWtpXCIsXCJha2pcIixcImFra1wiLFwiYWtsXCIsXCJha21cIixcImFrb1wiLFwiYWtwXCIsXCJha3FcIixcImFrclwiLFwiYWtzXCIsXCJha3RcIixcImFrdVwiLFwiYWt2XCIsXCJha3dcIixcImFreFwiLFwiYWt5XCIsXCJha3pcIixcImFsYVwiLFwiYWxjXCIsXCJhbGRcIixcImFsZVwiLFwiYWxmXCIsXCJhbGdcIixcImFsaFwiLFwiYWxpXCIsXCJhbGpcIixcImFsa1wiLFwiYWxsXCIsXCJhbG1cIixcImFsblwiLFwiYWxvXCIsXCJhbHBcIixcImFscVwiLFwiYWxyXCIsXCJhbHNcIixcImFsdFwiLFwiYWx1XCIsXCJhbHZcIixcImFsd1wiLFwiYWx4XCIsXCJhbHlcIixcImFselwiLFwiYW1hXCIsXCJhbWJcIixcImFtY1wiLFwiYW1lXCIsXCJhbWZcIixcImFtZ1wiLFwiYW1pXCIsXCJhbWpcIixcImFta1wiLFwiYW1sXCIsXCJhbW1cIixcImFtblwiLFwiYW1vXCIsXCJhbXBcIixcImFtcVwiLFwiYW1yXCIsXCJhbXNcIixcImFtdFwiLFwiYW11XCIsXCJhbXZcIixcImFtd1wiLFwiYW14XCIsXCJhbXlcIixcImFtelwiLFwiYW5hXCIsXCJhbmJcIixcImFuY1wiLFwiYW5kXCIsXCJhbmVcIixcImFuZlwiLFwiYW5nXCIsXCJhbmhcIixcImFuaVwiLFwiYW5qXCIsXCJhbmtcIixcImFubFwiLFwiYW5tXCIsXCJhbm5cIixcImFub1wiLFwiYW5wXCIsXCJhbnFcIixcImFuclwiLFwiYW5zXCIsXCJhbnRcIixcImFudVwiLFwiYW52XCIsXCJhbndcIixcImFueFwiLFwiYW55XCIsXCJhbnpcIixcImFvYVwiLFwiYW9iXCIsXCJhb2NcIixcImFvZFwiLFwiYW9lXCIsXCJhb2ZcIixcImFvZ1wiLFwiYW9oXCIsXCJhb2lcIixcImFvalwiLFwiYW9rXCIsXCJhb2xcIixcImFvbVwiLFwiYW9uXCIsXCJhb3JcIixcImFvc1wiLFwiYW90XCIsXCJhb3VcIixcImFveFwiLFwiYW96XCIsXCJhcGFcIixcImFwYlwiLFwiYXBjXCIsXCJhcGRcIixcImFwZVwiLFwiYXBmXCIsXCJhcGdcIixcImFwaFwiLFwiYXBpXCIsXCJhcGpcIixcImFwa1wiLFwiYXBsXCIsXCJhcG1cIixcImFwblwiLFwiYXBvXCIsXCJhcHBcIixcImFwcVwiLFwiYXByXCIsXCJhcHNcIixcImFwdFwiLFwiYXB1XCIsXCJhcHZcIixcImFwd1wiLFwiYXB4XCIsXCJhcHlcIixcImFwelwiLFwiYXFhXCIsXCJhcWNcIixcImFxZFwiLFwiYXFnXCIsXCJhcWtcIixcImFxbFwiLFwiYXFtXCIsXCJhcW5cIixcImFxcFwiLFwiYXFyXCIsXCJhcXRcIixcImFxelwiLFwiYXJiXCIsXCJhcmNcIixcImFyZFwiLFwiYXJlXCIsXCJhcmhcIixcImFyaVwiLFwiYXJqXCIsXCJhcmtcIixcImFybFwiLFwiYXJuXCIsXCJhcm9cIixcImFycFwiLFwiYXJxXCIsXCJhcnJcIixcImFyc1wiLFwiYXJ0XCIsXCJhcnVcIixcImFydlwiLFwiYXJ3XCIsXCJhcnhcIixcImFyeVwiLFwiYXJ6XCIsXCJhc2FcIixcImFzYlwiLFwiYXNjXCIsXCJhc2RcIixcImFzZVwiLFwiYXNmXCIsXCJhc2dcIixcImFzaFwiLFwiYXNpXCIsXCJhc2pcIixcImFza1wiLFwiYXNsXCIsXCJhc25cIixcImFzb1wiLFwiYXNwXCIsXCJhc3FcIixcImFzclwiLFwiYXNzXCIsXCJhc3RcIixcImFzdVwiLFwiYXN2XCIsXCJhc3dcIixcImFzeFwiLFwiYXN5XCIsXCJhc3pcIixcImF0YVwiLFwiYXRiXCIsXCJhdGNcIixcImF0ZFwiLFwiYXRlXCIsXCJhdGdcIixcImF0aFwiLFwiYXRpXCIsXCJhdGpcIixcImF0a1wiLFwiYXRsXCIsXCJhdG1cIixcImF0blwiLFwiYXRvXCIsXCJhdHBcIixcImF0cVwiLFwiYXRyXCIsXCJhdHNcIixcImF0dFwiLFwiYXR1XCIsXCJhdHZcIixcImF0d1wiLFwiYXR4XCIsXCJhdHlcIixcImF0elwiLFwiYXVhXCIsXCJhdWJcIixcImF1Y1wiLFwiYXVkXCIsXCJhdWVcIixcImF1ZlwiLFwiYXVnXCIsXCJhdWhcIixcImF1aVwiLFwiYXVqXCIsXCJhdWtcIixcImF1bFwiLFwiYXVtXCIsXCJhdW5cIixcImF1b1wiLFwiYXVwXCIsXCJhdXFcIixcImF1clwiLFwiYXVzXCIsXCJhdXRcIixcImF1dVwiLFwiYXV3XCIsXCJhdXhcIixcImF1eVwiLFwiYXV6XCIsXCJhdmJcIixcImF2ZFwiLFwiYXZpXCIsXCJhdmtcIixcImF2bFwiLFwiYXZtXCIsXCJhdm5cIixcImF2b1wiLFwiYXZzXCIsXCJhdnRcIixcImF2dVwiLFwiYXZ2XCIsXCJhd2FcIixcImF3YlwiLFwiYXdjXCIsXCJhd2RcIixcImF3ZVwiLFwiYXdnXCIsXCJhd2hcIixcImF3aVwiLFwiYXdrXCIsXCJhd21cIixcImF3blwiLFwiYXdvXCIsXCJhd3JcIixcImF3c1wiLFwiYXd0XCIsXCJhd3VcIixcImF3dlwiLFwiYXd3XCIsXCJhd3hcIixcImF3eVwiLFwiYXhiXCIsXCJheGVcIixcImF4Z1wiLFwiYXhrXCIsXCJheGxcIixcImF4bVwiLFwiYXh4XCIsXCJheWFcIixcImF5YlwiLFwiYXljXCIsXCJheWRcIixcImF5ZVwiLFwiYXlnXCIsXCJheWhcIixcImF5aVwiLFwiYXlrXCIsXCJheWxcIixcImF5blwiLFwiYXlvXCIsXCJheXBcIixcImF5cVwiLFwiYXlyXCIsXCJheXNcIixcImF5dFwiLFwiYXl1XCIsXCJheXhcIixcImF5eVwiLFwiYXl6XCIsXCJhemFcIixcImF6YlwiLFwiYXpjXCIsXCJhemRcIixcImF6Z1wiLFwiYXpqXCIsXCJhem1cIixcImF6blwiLFwiYXpvXCIsXCJhenRcIixcImF6elwiXVxuLFsgXCJiYVwiLFwiYmVcIixcImJnXCIsXCJiaFwiLFwiYmlcIixcImJtXCIsXCJiblwiLFwiYm9cIixcImJyXCIsXCJic1wiLFwiYmFhXCIsXCJiYWJcIixcImJhY1wiLFwiYmFkXCIsXCJiYWVcIixcImJhZlwiLFwiYmFnXCIsXCJiYWhcIixcImJhaVwiLFwiYmFqXCIsXCJiYWxcIixcImJhblwiLFwiYmFvXCIsXCJiYXBcIixcImJhclwiLFwiYmFzXCIsXCJiYXRcIixcImJhdVwiLFwiYmF2XCIsXCJiYXdcIixcImJheFwiLFwiYmF5XCIsXCJiYXpcIixcImJiYVwiLFwiYmJiXCIsXCJiYmNcIixcImJiZFwiLFwiYmJlXCIsXCJiYmZcIixcImJiZ1wiLFwiYmJoXCIsXCJiYmlcIixcImJialwiLFwiYmJrXCIsXCJiYmxcIixcImJibVwiLFwiYmJuXCIsXCJiYm9cIixcImJicFwiLFwiYmJxXCIsXCJiYnJcIixcImJic1wiLFwiYmJ0XCIsXCJiYnVcIixcImJidlwiLFwiYmJ3XCIsXCJiYnhcIixcImJieVwiLFwiYmJ6XCIsXCJiY2FcIixcImJjYlwiLFwiYmNjXCIsXCJiY2RcIixcImJjZVwiLFwiYmNmXCIsXCJiY2dcIixcImJjaFwiLFwiYmNpXCIsXCJiY2pcIixcImJja1wiLFwiYmNsXCIsXCJiY21cIixcImJjblwiLFwiYmNvXCIsXCJiY3BcIixcImJjcVwiLFwiYmNyXCIsXCJiY3NcIixcImJjdFwiLFwiYmN1XCIsXCJiY3ZcIixcImJjd1wiLFwiYmN5XCIsXCJiY3pcIixcImJkYVwiLFwiYmRiXCIsXCJiZGNcIixcImJkZFwiLFwiYmRlXCIsXCJiZGZcIixcImJkZ1wiLFwiYmRoXCIsXCJiZGlcIixcImJkalwiLFwiYmRrXCIsXCJiZGxcIixcImJkbVwiLFwiYmRuXCIsXCJiZG9cIixcImJkcFwiLFwiYmRxXCIsXCJiZHJcIixcImJkc1wiLFwiYmR0XCIsXCJiZHVcIixcImJkdlwiLFwiYmR3XCIsXCJiZHhcIixcImJkeVwiLFwiYmR6XCIsXCJiZWFcIixcImJlYlwiLFwiYmVjXCIsXCJiZWRcIixcImJlZVwiLFwiYmVmXCIsXCJiZWdcIixcImJlaFwiLFwiYmVpXCIsXCJiZWpcIixcImJla1wiLFwiYmVtXCIsXCJiZW9cIixcImJlcFwiLFwiYmVxXCIsXCJiZXJcIixcImJlc1wiLFwiYmV0XCIsXCJiZXVcIixcImJldlwiLFwiYmV3XCIsXCJiZXhcIixcImJleVwiLFwiYmV6XCIsXCJiZmFcIixcImJmYlwiLFwiYmZjXCIsXCJiZmRcIixcImJmZVwiLFwiYmZmXCIsXCJiZmdcIixcImJmaFwiLFwiYmZpXCIsXCJiZmpcIixcImJma1wiLFwiYmZsXCIsXCJiZm1cIixcImJmblwiLFwiYmZvXCIsXCJiZnBcIixcImJmcVwiLFwiYmZyXCIsXCJiZnNcIixcImJmdFwiLFwiYmZ1XCIsXCJiZndcIixcImJmeFwiLFwiYmZ5XCIsXCJiZnpcIixcImJnYVwiLFwiYmdiXCIsXCJiZ2NcIixcImJnZFwiLFwiYmdlXCIsXCJiZ2ZcIixcImJnZ1wiLFwiYmdpXCIsXCJiZ2pcIixcImJna1wiLFwiYmdsXCIsXCJiZ21cIixcImJnblwiLFwiYmdvXCIsXCJiZ3BcIixcImJncVwiLFwiYmdyXCIsXCJiZ3NcIixcImJndFwiLFwiYmd1XCIsXCJiZ3ZcIixcImJnd1wiLFwiYmd4XCIsXCJiZ3lcIixcImJnelwiLFwiYmhhXCIsXCJiaGJcIixcImJoY1wiLFwiYmhkXCIsXCJiaGVcIixcImJoZlwiLFwiYmhnXCIsXCJiaGhcIixcImJoaVwiLFwiYmhqXCIsXCJiaGtcIixcImJobFwiLFwiYmhtXCIsXCJiaG5cIixcImJob1wiLFwiYmhwXCIsXCJiaHFcIixcImJoclwiLFwiYmhzXCIsXCJiaHRcIixcImJodVwiLFwiYmh2XCIsXCJiaHdcIixcImJoeFwiLFwiYmh5XCIsXCJiaHpcIixcImJpYVwiLFwiYmliXCIsXCJiaWNcIixcImJpZFwiLFwiYmllXCIsXCJiaWZcIixcImJpZ1wiLFwiYmlqXCIsXCJiaWtcIixcImJpbFwiLFwiYmltXCIsXCJiaW5cIixcImJpb1wiLFwiYmlwXCIsXCJiaXFcIixcImJpclwiLFwiYml0XCIsXCJiaXVcIixcImJpdlwiLFwiYml3XCIsXCJiaXhcIixcImJpeVwiLFwiYml6XCIsXCJiamFcIixcImJqYlwiLFwiYmpjXCIsXCJiamRcIixcImJqZVwiLFwiYmpmXCIsXCJiamdcIixcImJqaFwiLFwiYmppXCIsXCJiampcIixcImJqa1wiLFwiYmpsXCIsXCJiam1cIixcImJqblwiLFwiYmpvXCIsXCJianBcIixcImJqcVwiLFwiYmpyXCIsXCJianNcIixcImJqdFwiLFwiYmp1XCIsXCJianZcIixcImJqd1wiLFwiYmp4XCIsXCJianlcIixcImJqelwiLFwiYmthXCIsXCJia2JcIixcImJrY1wiLFwiYmtkXCIsXCJia2ZcIixcImJrZ1wiLFwiYmtoXCIsXCJia2lcIixcImJralwiLFwiYmtrXCIsXCJia2xcIixcImJrbVwiLFwiYmtuXCIsXCJia29cIixcImJrcFwiLFwiYmtxXCIsXCJia3JcIixcImJrc1wiLFwiYmt0XCIsXCJia3VcIixcImJrdlwiLFwiYmt3XCIsXCJia3hcIixcImJreVwiLFwiYmt6XCIsXCJibGFcIixcImJsYlwiLFwiYmxjXCIsXCJibGRcIixcImJsZVwiLFwiYmxmXCIsXCJibGdcIixcImJsaFwiLFwiYmxpXCIsXCJibGpcIixcImJsa1wiLFwiYmxsXCIsXCJibG1cIixcImJsblwiLFwiYmxvXCIsXCJibHBcIixcImJscVwiLFwiYmxyXCIsXCJibHNcIixcImJsdFwiLFwiYmx2XCIsXCJibHdcIixcImJseFwiLFwiYmx5XCIsXCJibHpcIixcImJtYVwiLFwiYm1iXCIsXCJibWNcIixcImJtZFwiLFwiYm1lXCIsXCJibWZcIixcImJtZ1wiLFwiYm1oXCIsXCJibWlcIixcImJtalwiLFwiYm1rXCIsXCJibWxcIixcImJtbVwiLFwiYm1uXCIsXCJibW9cIixcImJtcFwiLFwiYm1xXCIsXCJibXJcIixcImJtc1wiLFwiYm10XCIsXCJibXVcIixcImJtdlwiLFwiYm13XCIsXCJibXhcIixcImJteVwiLFwiYm16XCIsXCJibmFcIixcImJuYlwiLFwiYm5jXCIsXCJibmRcIixcImJuZVwiLFwiYm5mXCIsXCJibmdcIixcImJuaVwiLFwiYm5qXCIsXCJibmtcIixcImJubFwiLFwiYm5tXCIsXCJibm5cIixcImJub1wiLFwiYm5wXCIsXCJibnFcIixcImJuclwiLFwiYm5zXCIsXCJibnRcIixcImJudVwiLFwiYm52XCIsXCJibndcIixcImJueFwiLFwiYm55XCIsXCJibnpcIixcImJvYVwiLFwiYm9iXCIsXCJib2VcIixcImJvZlwiLFwiYm9nXCIsXCJib2hcIixcImJvaVwiLFwiYm9qXCIsXCJib2tcIixcImJvbFwiLFwiYm9tXCIsXCJib25cIixcImJvb1wiLFwiYm9wXCIsXCJib3FcIixcImJvclwiLFwiYm90XCIsXCJib3VcIixcImJvdlwiLFwiYm93XCIsXCJib3hcIixcImJveVwiLFwiYm96XCIsXCJicGFcIixcImJwYlwiLFwiYnBkXCIsXCJicGVcIixcImJwZ1wiLFwiYnBoXCIsXCJicGlcIixcImJwalwiLFwiYnBrXCIsXCJicGxcIixcImJwbVwiLFwiYnBuXCIsXCJicG9cIixcImJwcFwiLFwiYnBxXCIsXCJicHJcIixcImJwc1wiLFwiYnB0XCIsXCJicHVcIixcImJwdlwiLFwiYnB3XCIsXCJicHhcIixcImJweVwiLFwiYnB6XCIsXCJicWFcIixcImJxYlwiLFwiYnFjXCIsXCJicWRcIixcImJxZlwiLFwiYnFnXCIsXCJicWhcIixcImJxaVwiLFwiYnFqXCIsXCJicWtcIixcImJxbFwiLFwiYnFtXCIsXCJicW5cIixcImJxb1wiLFwiYnFwXCIsXCJicXFcIixcImJxclwiLFwiYnFzXCIsXCJicXRcIixcImJxdVwiLFwiYnF2XCIsXCJicXdcIixcImJxeFwiLFwiYnF5XCIsXCJicXpcIixcImJyYVwiLFwiYnJiXCIsXCJicmNcIixcImJyZFwiLFwiYnJmXCIsXCJicmdcIixcImJyaFwiLFwiYnJpXCIsXCJicmpcIixcImJya1wiLFwiYnJsXCIsXCJicm1cIixcImJyblwiLFwiYnJvXCIsXCJicnBcIixcImJycVwiLFwiYnJyXCIsXCJicnNcIixcImJydFwiLFwiYnJ1XCIsXCJicnZcIixcImJyd1wiLFwiYnJ4XCIsXCJicnlcIixcImJyelwiLFwiYnNhXCIsXCJic2JcIixcImJzY1wiLFwiYnNlXCIsXCJic2ZcIixcImJzZ1wiLFwiYnNoXCIsXCJic2lcIixcImJzalwiLFwiYnNrXCIsXCJic2xcIixcImJzbVwiLFwiYnNuXCIsXCJic29cIixcImJzcFwiLFwiYnNxXCIsXCJic3JcIixcImJzc1wiLFwiYnN0XCIsXCJic3VcIixcImJzdlwiLFwiYnN3XCIsXCJic3hcIixcImJzeVwiLFwiYnRhXCIsXCJidGJcIixcImJ0Y1wiLFwiYnRkXCIsXCJidGVcIixcImJ0ZlwiLFwiYnRnXCIsXCJidGhcIixcImJ0aVwiLFwiYnRqXCIsXCJidGtcIixcImJ0bFwiLFwiYnRtXCIsXCJidG5cIixcImJ0b1wiLFwiYnRwXCIsXCJidHFcIixcImJ0clwiLFwiYnRzXCIsXCJidHRcIixcImJ0dVwiLFwiYnR2XCIsXCJidHdcIixcImJ0eFwiLFwiYnR5XCIsXCJidHpcIixcImJ1YVwiLFwiYnViXCIsXCJidWNcIixcImJ1ZFwiLFwiYnVlXCIsXCJidWZcIixcImJ1Z1wiLFwiYnVoXCIsXCJidWlcIixcImJ1alwiLFwiYnVrXCIsXCJidW1cIixcImJ1blwiLFwiYnVvXCIsXCJidXBcIixcImJ1cVwiLFwiYnVzXCIsXCJidXRcIixcImJ1dVwiLFwiYnV2XCIsXCJidXdcIixcImJ1eFwiLFwiYnV5XCIsXCJidXpcIixcImJ2YVwiLFwiYnZiXCIsXCJidmNcIixcImJ2ZFwiLFwiYnZlXCIsXCJidmZcIixcImJ2Z1wiLFwiYnZoXCIsXCJidmlcIixcImJ2alwiLFwiYnZrXCIsXCJidmxcIixcImJ2bVwiLFwiYnZuXCIsXCJidm9cIixcImJ2cFwiLFwiYnZxXCIsXCJidnJcIixcImJ2dFwiLFwiYnZ1XCIsXCJidnZcIixcImJ2d1wiLFwiYnZ4XCIsXCJidnlcIixcImJ2elwiLFwiYndhXCIsXCJid2JcIixcImJ3Y1wiLFwiYndkXCIsXCJid2VcIixcImJ3ZlwiLFwiYndnXCIsXCJid2hcIixcImJ3aVwiLFwiYndqXCIsXCJid2tcIixcImJ3bFwiLFwiYndtXCIsXCJid25cIixcImJ3b1wiLFwiYndwXCIsXCJid3FcIixcImJ3clwiLFwiYndzXCIsXCJid3RcIixcImJ3dVwiLFwiYnd3XCIsXCJid3hcIixcImJ3eVwiLFwiYnd6XCIsXCJieGFcIixcImJ4YlwiLFwiYnhjXCIsXCJieGRcIixcImJ4ZVwiLFwiYnhmXCIsXCJieGdcIixcImJ4aFwiLFwiYnhpXCIsXCJieGpcIixcImJ4a1wiLFwiYnhsXCIsXCJieG1cIixcImJ4blwiLFwiYnhvXCIsXCJieHBcIixcImJ4cVwiLFwiYnhyXCIsXCJieHNcIixcImJ4dVwiLFwiYnh2XCIsXCJieHdcIixcImJ4eFwiLFwiYnh6XCIsXCJieWFcIixcImJ5YlwiLFwiYnljXCIsXCJieWRcIixcImJ5ZVwiLFwiYnlmXCIsXCJieWdcIixcImJ5aFwiLFwiYnlpXCIsXCJieWpcIixcImJ5a1wiLFwiYnlsXCIsXCJieW1cIixcImJ5blwiLFwiYnlvXCIsXCJieXBcIixcImJ5cVwiLFwiYnlyXCIsXCJieXNcIixcImJ5dFwiLFwiYnl2XCIsXCJieXdcIixcImJ5eFwiLFwiYnl5XCIsXCJieXpcIixcImJ6YVwiLFwiYnpiXCIsXCJiemNcIixcImJ6ZFwiLFwiYnplXCIsXCJiemZcIixcImJ6Z1wiLFwiYnpoXCIsXCJiemlcIixcImJ6alwiLFwiYnprXCIsXCJiemxcIixcImJ6bVwiLFwiYnpuXCIsXCJiem9cIixcImJ6cFwiLFwiYnpxXCIsXCJienJcIixcImJ6c1wiLFwiYnp0XCIsXCJienVcIixcImJ6dlwiLFwiYnp3XCIsXCJienhcIixcImJ6eVwiLFwiYnp6XCJdXG4sWyBcImNhXCIsXCJjZVwiLFwiY2hcIixcImNvXCIsXCJjclwiLFwiY3NcIixcImN1XCIsXCJjdlwiLFwiY3lcIixcImNhYVwiLFwiY2FiXCIsXCJjYWNcIixcImNhZFwiLFwiY2FlXCIsXCJjYWZcIixcImNhZ1wiLFwiY2FoXCIsXCJjYWlcIixcImNhalwiLFwiY2FrXCIsXCJjYWxcIixcImNhbVwiLFwiY2FuXCIsXCJjYW9cIixcImNhcFwiLFwiY2FxXCIsXCJjYXJcIixcImNhc1wiLFwiY2F1XCIsXCJjYXZcIixcImNhd1wiLFwiY2F4XCIsXCJjYXlcIixcImNhelwiLFwiY2JhXCIsXCJjYmJcIixcImNiY1wiLFwiY2JkXCIsXCJjYmVcIixcImNiZ1wiLFwiY2JoXCIsXCJjYmlcIixcImNialwiLFwiY2JrXCIsXCJjYmxcIixcImNiblwiLFwiY2JvXCIsXCJjYnFcIixcImNiclwiLFwiY2JzXCIsXCJjYnRcIixcImNidVwiLFwiY2J2XCIsXCJjYndcIixcImNieVwiLFwiY2NhXCIsXCJjY2NcIixcImNjZFwiLFwiY2NlXCIsXCJjY2dcIixcImNjaFwiLFwiY2NqXCIsXCJjY2xcIixcImNjbVwiLFwiY2NuXCIsXCJjY29cIixcImNjcFwiLFwiY2NxXCIsXCJjY3JcIixcImNjc1wiLFwiY2RhXCIsXCJjZGNcIixcImNkZFwiLFwiY2RlXCIsXCJjZGZcIixcImNkZ1wiLFwiY2RoXCIsXCJjZGlcIixcImNkalwiLFwiY2RtXCIsXCJjZG5cIixcImNkb1wiLFwiY2RyXCIsXCJjZHNcIixcImNkeVwiLFwiY2R6XCIsXCJjZWFcIixcImNlYlwiLFwiY2VnXCIsXCJjZWtcIixcImNlbFwiLFwiY2VuXCIsXCJjZXRcIixcImNleVwiLFwiY2ZhXCIsXCJjZmRcIixcImNmZ1wiLFwiY2ZtXCIsXCJjZ2FcIixcImNnY1wiLFwiY2dnXCIsXCJjZ2tcIixcImNoYlwiLFwiY2hjXCIsXCJjaGRcIixcImNoZlwiLFwiY2hnXCIsXCJjaGhcIixcImNoalwiLFwiY2hrXCIsXCJjaGxcIixcImNobVwiLFwiY2huXCIsXCJjaG9cIixcImNocFwiLFwiY2hxXCIsXCJjaHJcIixcImNodFwiLFwiY2h3XCIsXCJjaHhcIixcImNoeVwiLFwiY2h6XCIsXCJjaWFcIixcImNpYlwiLFwiY2ljXCIsXCJjaWRcIixcImNpZVwiLFwiY2loXCIsXCJjaWtcIixcImNpbVwiLFwiY2luXCIsXCJjaXBcIixcImNpclwiLFwiY2l3XCIsXCJjaXlcIixcImNqYVwiLFwiY2plXCIsXCJjamhcIixcImNqaVwiLFwiY2prXCIsXCJjam1cIixcImNqblwiLFwiY2pvXCIsXCJjanBcIixcImNqclwiLFwiY2pzXCIsXCJjanZcIixcImNqeVwiLFwiY2thXCIsXCJja2JcIixcImNraFwiLFwiY2tsXCIsXCJja21cIixcImNrblwiLFwiY2tvXCIsXCJja3FcIixcImNrclwiLFwiY2tzXCIsXCJja3RcIixcImNrdVwiLFwiY2t2XCIsXCJja3hcIixcImNreVwiLFwiY2t6XCIsXCJjbGFcIixcImNsY1wiLFwiY2xkXCIsXCJjbGVcIixcImNsaFwiLFwiY2xpXCIsXCJjbGpcIixcImNsa1wiLFwiY2xsXCIsXCJjbG1cIixcImNsb1wiLFwiY2x0XCIsXCJjbHVcIixcImNsd1wiLFwiY2x5XCIsXCJjbWFcIixcImNtY1wiLFwiY21lXCIsXCJjbWdcIixcImNtaVwiLFwiY21rXCIsXCJjbWxcIixcImNtbVwiLFwiY21uXCIsXCJjbW9cIixcImNtclwiLFwiY21zXCIsXCJjbXRcIixcImNuYVwiLFwiY25iXCIsXCJjbmNcIixcImNuZ1wiLFwiY25oXCIsXCJjbmlcIixcImNua1wiLFwiY25sXCIsXCJjbm9cIixcImNucFwiLFwiY25yXCIsXCJjbnNcIixcImNudFwiLFwiY251XCIsXCJjbndcIixcImNueFwiLFwiY29hXCIsXCJjb2JcIixcImNvY1wiLFwiY29kXCIsXCJjb2VcIixcImNvZlwiLFwiY29nXCIsXCJjb2hcIixcImNvalwiLFwiY29rXCIsXCJjb2xcIixcImNvbVwiLFwiY29uXCIsXCJjb29cIixcImNvcFwiLFwiY29xXCIsXCJjb3RcIixcImNvdVwiLFwiY292XCIsXCJjb3dcIixcImNveFwiLFwiY295XCIsXCJjb3pcIixcImNwYVwiLFwiY3BiXCIsXCJjcGNcIixcImNwZVwiLFwiY3BmXCIsXCJjcGdcIixcImNwaVwiLFwiY3BuXCIsXCJjcG9cIixcImNwcFwiLFwiY3BzXCIsXCJjcHVcIixcImNweFwiLFwiY3B5XCIsXCJjcWRcIixcImNxdVwiLFwiY3JhXCIsXCJjcmJcIixcImNyY1wiLFwiY3JkXCIsXCJjcmZcIixcImNyZ1wiLFwiY3JoXCIsXCJjcmlcIixcImNyalwiLFwiY3JrXCIsXCJjcmxcIixcImNybVwiLFwiY3JuXCIsXCJjcm9cIixcImNycFwiLFwiY3JxXCIsXCJjcnJcIixcImNyc1wiLFwiY3J0XCIsXCJjcnZcIixcImNyd1wiLFwiY3J4XCIsXCJjcnlcIixcImNyelwiLFwiY3NhXCIsXCJjc2JcIixcImNzY1wiLFwiY3NkXCIsXCJjc2VcIixcImNzZlwiLFwiY3NnXCIsXCJjc2hcIixcImNzaVwiLFwiY3NqXCIsXCJjc2tcIixcImNzbFwiLFwiY3NtXCIsXCJjc25cIixcImNzb1wiLFwiY3NwXCIsXCJjc3FcIixcImNzclwiLFwiY3NzXCIsXCJjc3RcIixcImNzdVwiLFwiY3N2XCIsXCJjc3dcIixcImNzeFwiLFwiY3N5XCIsXCJjc3pcIixcImN0YVwiLFwiY3RjXCIsXCJjdGRcIixcImN0ZVwiLFwiY3RnXCIsXCJjdGhcIixcImN0bFwiLFwiY3RtXCIsXCJjdG5cIixcImN0b1wiLFwiY3RwXCIsXCJjdHNcIixcImN0dFwiLFwiY3R1XCIsXCJjdHlcIixcImN0elwiLFwiY3VhXCIsXCJjdWJcIixcImN1Y1wiLFwiY3VnXCIsXCJjdWhcIixcImN1aVwiLFwiY3VqXCIsXCJjdWtcIixcImN1bFwiLFwiY3VtXCIsXCJjdW9cIixcImN1cFwiLFwiY3VxXCIsXCJjdXJcIixcImN1c1wiLFwiY3V0XCIsXCJjdXVcIixcImN1dlwiLFwiY3V3XCIsXCJjdXhcIixcImN1eVwiLFwiY3ZnXCIsXCJjdm5cIixcImN3YVwiLFwiY3diXCIsXCJjd2RcIixcImN3ZVwiLFwiY3dnXCIsXCJjd3RcIixcImN5YVwiLFwiY3liXCIsXCJjeW9cIixcImN6aFwiLFwiY3prXCIsXCJjem5cIixcImN6b1wiLFwiY3p0XCJdXG4sWyBcImRhXCIsXCJkZVwiLFwiZHZcIixcImR6XCIsXCJkYWFcIixcImRhY1wiLFwiZGFkXCIsXCJkYWVcIixcImRhZlwiLFwiZGFnXCIsXCJkYWhcIixcImRhaVwiLFwiZGFqXCIsXCJkYWtcIixcImRhbFwiLFwiZGFtXCIsXCJkYW9cIixcImRhcFwiLFwiZGFxXCIsXCJkYXJcIixcImRhc1wiLFwiZGF1XCIsXCJkYXZcIixcImRhd1wiLFwiZGF4XCIsXCJkYXlcIixcImRhelwiLFwiZGJhXCIsXCJkYmJcIixcImRiZFwiLFwiZGJlXCIsXCJkYmZcIixcImRiZ1wiLFwiZGJpXCIsXCJkYmpcIixcImRibFwiLFwiZGJtXCIsXCJkYm5cIixcImRib1wiLFwiZGJwXCIsXCJkYnFcIixcImRiclwiLFwiZGJ0XCIsXCJkYnVcIixcImRidlwiLFwiZGJ3XCIsXCJkYnlcIixcImRjY1wiLFwiZGNyXCIsXCJkZGFcIixcImRkZFwiLFwiZGRlXCIsXCJkZGdcIixcImRkaVwiLFwiZGRqXCIsXCJkZG5cIixcImRkb1wiLFwiZGRyXCIsXCJkZHNcIixcImRkd1wiLFwiZGVjXCIsXCJkZWRcIixcImRlZVwiLFwiZGVmXCIsXCJkZWdcIixcImRlaFwiLFwiZGVpXCIsXCJkZWtcIixcImRlbFwiLFwiZGVtXCIsXCJkZW5cIixcImRlcFwiLFwiZGVxXCIsXCJkZXJcIixcImRlc1wiLFwiZGV2XCIsXCJkZXpcIixcImRnYVwiLFwiZGdiXCIsXCJkZ2NcIixcImRnZFwiLFwiZGdlXCIsXCJkZ2dcIixcImRnaFwiLFwiZGdpXCIsXCJkZ2tcIixcImRnbFwiLFwiZGduXCIsXCJkZ29cIixcImRnclwiLFwiZGdzXCIsXCJkZ3RcIixcImRndVwiLFwiZGd3XCIsXCJkZ3hcIixcImRnelwiLFwiZGhhXCIsXCJkaGRcIixcImRoZ1wiLFwiZGhpXCIsXCJkaGxcIixcImRobVwiLFwiZGhuXCIsXCJkaG9cIixcImRoclwiLFwiZGhzXCIsXCJkaHVcIixcImRodlwiLFwiZGh3XCIsXCJkaHhcIixcImRpYVwiLFwiZGliXCIsXCJkaWNcIixcImRpZFwiLFwiZGlmXCIsXCJkaWdcIixcImRpaFwiLFwiZGlpXCIsXCJkaWpcIixcImRpa1wiLFwiZGlsXCIsXCJkaW1cIixcImRpblwiLFwiZGlvXCIsXCJkaXBcIixcImRpcVwiLFwiZGlyXCIsXCJkaXNcIixcImRpdFwiLFwiZGl1XCIsXCJkaXdcIixcImRpeFwiLFwiZGl5XCIsXCJkaXpcIixcImRqYVwiLFwiZGpiXCIsXCJkamNcIixcImRqZFwiLFwiZGplXCIsXCJkamZcIixcImRqaVwiLFwiZGpqXCIsXCJkamtcIixcImRqbFwiLFwiZGptXCIsXCJkam5cIixcImRqb1wiLFwiZGpyXCIsXCJkanVcIixcImRqd1wiLFwiZGthXCIsXCJka2dcIixcImRra1wiLFwiZGtsXCIsXCJka3JcIixcImRrc1wiLFwiZGt4XCIsXCJkbGdcIixcImRsa1wiLFwiZGxtXCIsXCJkbG5cIixcImRtYVwiLFwiZG1iXCIsXCJkbWNcIixcImRtZFwiLFwiZG1lXCIsXCJkbWZcIixcImRtZ1wiLFwiZG1rXCIsXCJkbWxcIixcImRtbVwiLFwiZG1uXCIsXCJkbW9cIixcImRtclwiLFwiZG1zXCIsXCJkbXVcIixcImRtdlwiLFwiZG13XCIsXCJkbXhcIixcImRteVwiLFwiZG5hXCIsXCJkbmRcIixcImRuZVwiLFwiZG5nXCIsXCJkbmlcIixcImRualwiLFwiZG5rXCIsXCJkbm5cIixcImRub1wiLFwiZG5yXCIsXCJkbnRcIixcImRudVwiLFwiZG52XCIsXCJkbndcIixcImRueVwiLFwiZG9hXCIsXCJkb2JcIixcImRvY1wiLFwiZG9lXCIsXCJkb2ZcIixcImRvaFwiLFwiZG9pXCIsXCJkb2tcIixcImRvbFwiLFwiZG9uXCIsXCJkb29cIixcImRvcFwiLFwiZG9xXCIsXCJkb3JcIixcImRvc1wiLFwiZG90XCIsXCJkb3ZcIixcImRvd1wiLFwiZG94XCIsXCJkb3lcIixcImRvelwiLFwiZHBwXCIsXCJkcmFcIixcImRyYlwiLFwiZHJjXCIsXCJkcmRcIixcImRyZVwiLFwiZHJnXCIsXCJkcmhcIixcImRyaVwiLFwiZHJsXCIsXCJkcm5cIixcImRyb1wiLFwiZHJxXCIsXCJkcnJcIixcImRyc1wiLFwiZHJ0XCIsXCJkcnVcIixcImRyd1wiLFwiZHJ5XCIsXCJkc2JcIixcImRzZVwiLFwiZHNoXCIsXCJkc2lcIixcImRzbFwiLFwiZHNuXCIsXCJkc29cIixcImRzcVwiLFwiZHRhXCIsXCJkdGJcIixcImR0ZFwiLFwiZHRoXCIsXCJkdGlcIixcImR0a1wiLFwiZHRtXCIsXCJkdG5cIixcImR0b1wiLFwiZHRwXCIsXCJkdHJcIixcImR0c1wiLFwiZHR0XCIsXCJkdHVcIixcImR0eVwiLFwiZHVhXCIsXCJkdWJcIixcImR1Y1wiLFwiZHVkXCIsXCJkdWVcIixcImR1ZlwiLFwiZHVnXCIsXCJkdWhcIixcImR1aVwiLFwiZHVqXCIsXCJkdWtcIixcImR1bFwiLFwiZHVtXCIsXCJkdW5cIixcImR1b1wiLFwiZHVwXCIsXCJkdXFcIixcImR1clwiLFwiZHVzXCIsXCJkdXVcIixcImR1dlwiLFwiZHV3XCIsXCJkdXhcIixcImR1eVwiLFwiZHV6XCIsXCJkdmFcIixcImR3YVwiLFwiZHdrXCIsXCJkd2xcIixcImR3clwiLFwiZHdzXCIsXCJkd3VcIixcImR3d1wiLFwiZHd5XCIsXCJkd3pcIixcImR5YVwiLFwiZHliXCIsXCJkeWRcIixcImR5Z1wiLFwiZHlpXCIsXCJkeW1cIixcImR5blwiLFwiZHlvXCIsXCJkeXVcIixcImR5eVwiLFwiZHphXCIsXCJkemRcIixcImR6ZVwiLFwiZHpnXCIsXCJkemxcIixcImR6blwiXVxuLFsgXCJlZVwiLFwiZWxcIixcImVuXCIsXCJlb1wiLFwiZXNcIixcImV0XCIsXCJldVwiLFwiZWFhXCIsXCJlYmNcIixcImViZ1wiLFwiZWJrXCIsXCJlYm9cIixcImViclwiLFwiZWJ1XCIsXCJlY3JcIixcImVjc1wiLFwiZWN5XCIsXCJlZWVcIixcImVmYVwiLFwiZWZlXCIsXCJlZmlcIixcImVnYVwiLFwiZWdsXCIsXCJlZ29cIixcImVneFwiLFwiZWd5XCIsXCJlaHNcIixcImVodVwiLFwiZWlwXCIsXCJlaXRcIixcImVpdlwiLFwiZWphXCIsXCJla2FcIixcImVrY1wiLFwiZWtlXCIsXCJla2dcIixcImVraVwiLFwiZWtrXCIsXCJla2xcIixcImVrbVwiLFwiZWtvXCIsXCJla3BcIixcImVrclwiLFwiZWt5XCIsXCJlbGVcIixcImVsaFwiLFwiZWxpXCIsXCJlbGtcIixcImVsbVwiLFwiZWxvXCIsXCJlbHBcIixcImVsdVwiLFwiZWx4XCIsXCJlbWFcIixcImVtYlwiLFwiZW1lXCIsXCJlbWdcIixcImVtaVwiLFwiZW1rXCIsXCJlbW1cIixcImVtblwiLFwiZW1vXCIsXCJlbXBcIixcImVtcVwiLFwiZW1zXCIsXCJlbXVcIixcImVtd1wiLFwiZW14XCIsXCJlbXlcIixcImVtelwiLFwiZW5hXCIsXCJlbmJcIixcImVuY1wiLFwiZW5kXCIsXCJlbmZcIixcImVuaFwiLFwiZW5sXCIsXCJlbm1cIixcImVublwiLFwiZW5vXCIsXCJlbnFcIixcImVuclwiLFwiZW51XCIsXCJlbnZcIixcImVud1wiLFwiZW54XCIsXCJlb3RcIixcImVwaVwiLFwiZXJhXCIsXCJlcmdcIixcImVyaFwiLFwiZXJpXCIsXCJlcmtcIixcImVyb1wiLFwiZXJyXCIsXCJlcnNcIixcImVydFwiLFwiZXJ3XCIsXCJlc2VcIixcImVzZ1wiLFwiZXNoXCIsXCJlc2lcIixcImVza1wiLFwiZXNsXCIsXCJlc21cIixcImVzblwiLFwiZXNvXCIsXCJlc3FcIixcImVzc1wiLFwiZXN1XCIsXCJlc3hcIixcImVzeVwiLFwiZXRiXCIsXCJldGNcIixcImV0aFwiLFwiZXRuXCIsXCJldG9cIixcImV0clwiLFwiZXRzXCIsXCJldHRcIixcImV0dVwiLFwiZXR4XCIsXCJldHpcIixcImV1cVwiLFwiZXZlXCIsXCJldmhcIixcImV2blwiLFwiZXdvXCIsXCJleHRcIixcImV5YVwiLFwiZXlvXCIsXCJlemFcIixcImV6ZVwiXVxuLFsgXCJmYVwiLFwiZmZcIixcImZpXCIsXCJmalwiLFwiZm9cIixcImZyXCIsXCJmeVwiLFwiZmFhXCIsXCJmYWJcIixcImZhZFwiLFwiZmFmXCIsXCJmYWdcIixcImZhaFwiLFwiZmFpXCIsXCJmYWpcIixcImZha1wiLFwiZmFsXCIsXCJmYW1cIixcImZhblwiLFwiZmFwXCIsXCJmYXJcIixcImZhdFwiLFwiZmF1XCIsXCJmYXhcIixcImZheVwiLFwiZmF6XCIsXCJmYmxcIixcImZjc1wiLFwiZmVyXCIsXCJmZmlcIixcImZmbVwiLFwiZmdyXCIsXCJmaWFcIixcImZpZVwiLFwiZmlmXCIsXCJmaWxcIixcImZpcFwiLFwiZmlyXCIsXCJmaXRcIixcImZpdVwiLFwiZml3XCIsXCJma2tcIixcImZrdlwiLFwiZmxhXCIsXCJmbGhcIixcImZsaVwiLFwiZmxsXCIsXCJmbG5cIixcImZsclwiLFwiZmx5XCIsXCJmbXBcIixcImZtdVwiLFwiZm5iXCIsXCJmbmdcIixcImZuaVwiLFwiZm9kXCIsXCJmb2lcIixcImZvbVwiLFwiZm9uXCIsXCJmb3JcIixcImZvc1wiLFwiZm94XCIsXCJmcGVcIixcImZxc1wiLFwiZnJjXCIsXCJmcmRcIixcImZya1wiLFwiZnJtXCIsXCJmcm9cIixcImZycFwiLFwiZnJxXCIsXCJmcnJcIixcImZyc1wiLFwiZnJ0XCIsXCJmc2VcIixcImZzbFwiLFwiZnNzXCIsXCJmdWJcIixcImZ1Y1wiLFwiZnVkXCIsXCJmdWVcIixcImZ1ZlwiLFwiZnVoXCIsXCJmdWlcIixcImZ1alwiLFwiZnVtXCIsXCJmdW5cIixcImZ1cVwiLFwiZnVyXCIsXCJmdXRcIixcImZ1dVwiLFwiZnV2XCIsXCJmdXlcIixcImZ2clwiLFwiZndhXCIsXCJmd2VcIl1cbixbIFwiZ2FcIixcImdkXCIsXCJnbFwiLFwiZ25cIixcImd1XCIsXCJndlwiLFwiZ2FhXCIsXCJnYWJcIixcImdhY1wiLFwiZ2FkXCIsXCJnYWVcIixcImdhZlwiLFwiZ2FnXCIsXCJnYWhcIixcImdhaVwiLFwiZ2FqXCIsXCJnYWtcIixcImdhbFwiLFwiZ2FtXCIsXCJnYW5cIixcImdhb1wiLFwiZ2FwXCIsXCJnYXFcIixcImdhclwiLFwiZ2FzXCIsXCJnYXRcIixcImdhdVwiLFwiZ2F2XCIsXCJnYXdcIixcImdheFwiLFwiZ2F5XCIsXCJnYXpcIixcImdiYVwiLFwiZ2JiXCIsXCJnYmNcIixcImdiZFwiLFwiZ2JlXCIsXCJnYmZcIixcImdiZ1wiLFwiZ2JoXCIsXCJnYmlcIixcImdialwiLFwiZ2JrXCIsXCJnYmxcIixcImdibVwiLFwiZ2JuXCIsXCJnYm9cIixcImdicFwiLFwiZ2JxXCIsXCJnYnJcIixcImdic1wiLFwiZ2J1XCIsXCJnYnZcIixcImdid1wiLFwiZ2J4XCIsXCJnYnlcIixcImdielwiLFwiZ2NjXCIsXCJnY2RcIixcImdjZVwiLFwiZ2NmXCIsXCJnY2xcIixcImdjblwiLFwiZ2NyXCIsXCJnY3RcIixcImdkYVwiLFwiZ2RiXCIsXCJnZGNcIixcImdkZFwiLFwiZ2RlXCIsXCJnZGZcIixcImdkZ1wiLFwiZ2RoXCIsXCJnZGlcIixcImdkalwiLFwiZ2RrXCIsXCJnZGxcIixcImdkbVwiLFwiZ2RuXCIsXCJnZG9cIixcImdkcVwiLFwiZ2RyXCIsXCJnZHNcIixcImdkdFwiLFwiZ2R1XCIsXCJnZHhcIixcImdlYVwiLFwiZ2ViXCIsXCJnZWNcIixcImdlZFwiLFwiZ2VmXCIsXCJnZWdcIixcImdlaFwiLFwiZ2VpXCIsXCJnZWpcIixcImdla1wiLFwiZ2VsXCIsXCJnZW1cIixcImdlcVwiLFwiZ2VzXCIsXCJnZXZcIixcImdld1wiLFwiZ2V4XCIsXCJnZXlcIixcImdlelwiLFwiZ2ZrXCIsXCJnZnRcIixcImdmeFwiLFwiZ2dhXCIsXCJnZ2JcIixcImdnZFwiLFwiZ2dlXCIsXCJnZ2dcIixcImdna1wiLFwiZ2dsXCIsXCJnZ25cIixcImdnb1wiLFwiZ2dyXCIsXCJnZ3RcIixcImdndVwiLFwiZ2d3XCIsXCJnaGFcIixcImdoY1wiLFwiZ2hlXCIsXCJnaGhcIixcImdoa1wiLFwiZ2hsXCIsXCJnaG5cIixcImdob1wiLFwiZ2hyXCIsXCJnaHNcIixcImdodFwiLFwiZ2lhXCIsXCJnaWJcIixcImdpY1wiLFwiZ2lkXCIsXCJnaWVcIixcImdpZ1wiLFwiZ2loXCIsXCJnaWlcIixcImdpbFwiLFwiZ2ltXCIsXCJnaW5cIixcImdpb1wiLFwiZ2lwXCIsXCJnaXFcIixcImdpclwiLFwiZ2lzXCIsXCJnaXRcIixcImdpdVwiLFwiZ2l3XCIsXCJnaXhcIixcImdpeVwiLFwiZ2l6XCIsXCJnamlcIixcImdqa1wiLFwiZ2ptXCIsXCJnam5cIixcImdqclwiLFwiZ2p1XCIsXCJna2FcIixcImdrZFwiLFwiZ2tlXCIsXCJna25cIixcImdrb1wiLFwiZ2twXCIsXCJna3VcIixcImdsYlwiLFwiZ2xjXCIsXCJnbGRcIixcImdsaFwiLFwiZ2xpXCIsXCJnbGpcIixcImdsa1wiLFwiZ2xsXCIsXCJnbG9cIixcImdsclwiLFwiZ2x1XCIsXCJnbHdcIixcImdseVwiLFwiZ21hXCIsXCJnbWJcIixcImdtZFwiLFwiZ21lXCIsXCJnbWdcIixcImdtaFwiLFwiZ21sXCIsXCJnbW1cIixcImdtblwiLFwiZ21xXCIsXCJnbXJcIixcImdtdVwiLFwiZ212XCIsXCJnbXdcIixcImdteFwiLFwiZ215XCIsXCJnbXpcIixcImduYVwiLFwiZ25iXCIsXCJnbmNcIixcImduZFwiLFwiZ25lXCIsXCJnbmdcIixcImduaFwiLFwiZ25pXCIsXCJnbmpcIixcImdua1wiLFwiZ25sXCIsXCJnbm1cIixcImdublwiLFwiZ25vXCIsXCJnbnFcIixcImduclwiLFwiZ250XCIsXCJnbnVcIixcImdud1wiLFwiZ256XCIsXCJnb2FcIixcImdvYlwiLFwiZ29jXCIsXCJnb2RcIixcImdvZVwiLFwiZ29mXCIsXCJnb2dcIixcImdvaFwiLFwiZ29pXCIsXCJnb2pcIixcImdva1wiLFwiZ29sXCIsXCJnb21cIixcImdvblwiLFwiZ29vXCIsXCJnb3BcIixcImdvcVwiLFwiZ29yXCIsXCJnb3NcIixcImdvdFwiLFwiZ291XCIsXCJnb3dcIixcImdveFwiLFwiZ295XCIsXCJnb3pcIixcImdwYVwiLFwiZ3BlXCIsXCJncG5cIixcImdxYVwiLFwiZ3FpXCIsXCJncW5cIixcImdxclwiLFwiZ3F1XCIsXCJncmFcIixcImdyYlwiLFwiZ3JjXCIsXCJncmRcIixcImdyZ1wiLFwiZ3JoXCIsXCJncmlcIixcImdyalwiLFwiZ3JrXCIsXCJncm1cIixcImdyb1wiLFwiZ3JxXCIsXCJncnJcIixcImdyc1wiLFwiZ3J0XCIsXCJncnVcIixcImdydlwiLFwiZ3J3XCIsXCJncnhcIixcImdyeVwiLFwiZ3J6XCIsXCJnc2VcIixcImdzZ1wiLFwiZ3NsXCIsXCJnc21cIixcImdzblwiLFwiZ3NvXCIsXCJnc3BcIixcImdzc1wiLFwiZ3N3XCIsXCJndGFcIixcImd0aVwiLFwiZ3R1XCIsXCJndWFcIixcImd1YlwiLFwiZ3VjXCIsXCJndWRcIixcImd1ZVwiLFwiZ3VmXCIsXCJndWdcIixcImd1aFwiLFwiZ3VpXCIsXCJndWtcIixcImd1bFwiLFwiZ3VtXCIsXCJndW5cIixcImd1b1wiLFwiZ3VwXCIsXCJndXFcIixcImd1clwiLFwiZ3VzXCIsXCJndXRcIixcImd1dVwiLFwiZ3V2XCIsXCJndXdcIixcImd1eFwiLFwiZ3V6XCIsXCJndmFcIixcImd2Y1wiLFwiZ3ZlXCIsXCJndmZcIixcImd2alwiLFwiZ3ZsXCIsXCJndm1cIixcImd2blwiLFwiZ3ZvXCIsXCJndnBcIixcImd2clwiLFwiZ3ZzXCIsXCJndnlcIixcImd3YVwiLFwiZ3diXCIsXCJnd2NcIixcImd3ZFwiLFwiZ3dlXCIsXCJnd2ZcIixcImd3Z1wiLFwiZ3dpXCIsXCJnd2pcIixcImd3bVwiLFwiZ3duXCIsXCJnd3JcIixcImd3dFwiLFwiZ3d1XCIsXCJnd3dcIixcImd3eFwiLFwiZ3h4XCIsXCJneWFcIixcImd5YlwiLFwiZ3lkXCIsXCJneWVcIixcImd5ZlwiLFwiZ3lnXCIsXCJneWlcIixcImd5bFwiLFwiZ3ltXCIsXCJneW5cIixcImd5b1wiLFwiZ3lyXCIsXCJneXlcIixcImd5elwiLFwiZ3phXCIsXCJnemlcIixcImd6blwiXVxuLFsgXCJoYVwiLFwiaGVcIixcImhpXCIsXCJob1wiLFwiaHJcIixcImh0XCIsXCJodVwiLFwiaHlcIixcImh6XCIsXCJoYWFcIixcImhhYlwiLFwiaGFjXCIsXCJoYWRcIixcImhhZVwiLFwiaGFmXCIsXCJoYWdcIixcImhhaFwiLFwiaGFpXCIsXCJoYWpcIixcImhha1wiLFwiaGFsXCIsXCJoYW1cIixcImhhblwiLFwiaGFvXCIsXCJoYXBcIixcImhhcVwiLFwiaGFyXCIsXCJoYXNcIixcImhhdlwiLFwiaGF3XCIsXCJoYXhcIixcImhheVwiLFwiaGF6XCIsXCJoYmFcIixcImhiYlwiLFwiaGJuXCIsXCJoYm9cIixcImhidVwiLFwiaGNhXCIsXCJoY2hcIixcImhkblwiLFwiaGRzXCIsXCJoZHlcIixcImhlYVwiLFwiaGVkXCIsXCJoZWdcIixcImhlaFwiLFwiaGVpXCIsXCJoZW1cIixcImhnbVwiLFwiaGd3XCIsXCJoaGlcIixcImhoclwiLFwiaGh5XCIsXCJoaWFcIixcImhpYlwiLFwiaGlkXCIsXCJoaWZcIixcImhpZ1wiLFwiaGloXCIsXCJoaWlcIixcImhpalwiLFwiaGlrXCIsXCJoaWxcIixcImhpbVwiLFwiaGlvXCIsXCJoaXJcIixcImhpdFwiLFwiaGl3XCIsXCJoaXhcIixcImhqaVwiLFwiaGthXCIsXCJoa2VcIixcImhraFwiLFwiaGtrXCIsXCJoa25cIixcImhrc1wiLFwiaGxhXCIsXCJobGJcIixcImhsZFwiLFwiaGxlXCIsXCJobHRcIixcImhsdVwiLFwiaG1hXCIsXCJobWJcIixcImhtY1wiLFwiaG1kXCIsXCJobWVcIixcImhtZlwiLFwiaG1nXCIsXCJobWhcIixcImhtaVwiLFwiaG1qXCIsXCJobWtcIixcImhtbFwiLFwiaG1tXCIsXCJobW5cIixcImhtcFwiLFwiaG1xXCIsXCJobXJcIixcImhtc1wiLFwiaG10XCIsXCJobXVcIixcImhtdlwiLFwiaG13XCIsXCJobXhcIixcImhteVwiLFwiaG16XCIsXCJobmFcIixcImhuZFwiLFwiaG5lXCIsXCJobmdcIixcImhuaFwiLFwiaG5pXCIsXCJobmpcIixcImhublwiLFwiaG5vXCIsXCJobnNcIixcImhudVwiLFwiaG9hXCIsXCJob2JcIixcImhvY1wiLFwiaG9kXCIsXCJob2VcIixcImhvaFwiLFwiaG9pXCIsXCJob2pcIixcImhva1wiLFwiaG9sXCIsXCJob21cIixcImhvb1wiLFwiaG9wXCIsXCJob3JcIixcImhvc1wiLFwiaG90XCIsXCJob3ZcIixcImhvd1wiLFwiaG95XCIsXCJob3pcIixcImhwb1wiLFwiaHBzXCIsXCJocmFcIixcImhyY1wiLFwiaHJlXCIsXCJocmtcIixcImhybVwiLFwiaHJvXCIsXCJocnBcIixcImhyclwiLFwiaHJ0XCIsXCJocnVcIixcImhyd1wiLFwiaHJ4XCIsXCJocnpcIixcImhzYlwiLFwiaHNoXCIsXCJoc2xcIixcImhzblwiLFwiaHNzXCIsXCJodGlcIixcImh0b1wiLFwiaHRzXCIsXCJodHVcIixcImh0eFwiLFwiaHViXCIsXCJodWNcIixcImh1ZFwiLFwiaHVlXCIsXCJodWZcIixcImh1Z1wiLFwiaHVoXCIsXCJodWlcIixcImh1alwiLFwiaHVrXCIsXCJodWxcIixcImh1bVwiLFwiaHVvXCIsXCJodXBcIixcImh1cVwiLFwiaHVyXCIsXCJodXNcIixcImh1dFwiLFwiaHV1XCIsXCJodXZcIixcImh1d1wiLFwiaHV4XCIsXCJodXlcIixcImh1elwiLFwiaHZjXCIsXCJodmVcIixcImh2a1wiLFwiaHZuXCIsXCJodnZcIixcImh3YVwiLFwiaHdjXCIsXCJod29cIixcImh5YVwiLFwiaHl3XCIsXCJoeXhcIl1cbixbIFwiaWFcIixcImlkXCIsXCJpZVwiLFwiaWdcIixcImlpXCIsXCJpa1wiLFwiaW5cIixcImlvXCIsXCJpc1wiLFwiaXRcIixcIml1XCIsXCJpd1wiLFwiaWFpXCIsXCJpYW5cIixcImlhcFwiLFwiaWFyXCIsXCJpYmFcIixcImliYlwiLFwiaWJkXCIsXCJpYmVcIixcImliZ1wiLFwiaWJoXCIsXCJpYmlcIixcImlibFwiLFwiaWJtXCIsXCJpYm5cIixcImliclwiLFwiaWJ1XCIsXCJpYnlcIixcImljYVwiLFwiaWNoXCIsXCJpY2xcIixcImljclwiLFwiaWRhXCIsXCJpZGJcIixcImlkY1wiLFwiaWRkXCIsXCJpZGVcIixcImlkaVwiLFwiaWRyXCIsXCJpZHNcIixcImlkdFwiLFwiaWR1XCIsXCJpZmFcIixcImlmYlwiLFwiaWZlXCIsXCJpZmZcIixcImlma1wiLFwiaWZtXCIsXCJpZnVcIixcImlmeVwiLFwiaWdiXCIsXCJpZ2VcIixcImlnZ1wiLFwiaWdsXCIsXCJpZ21cIixcImlnblwiLFwiaWdvXCIsXCJpZ3NcIixcImlnd1wiLFwiaWhiXCIsXCJpaGlcIixcImlocFwiLFwiaWh3XCIsXCJpaW5cIixcImlpclwiLFwiaWpjXCIsXCJpamVcIixcImlqalwiLFwiaWpuXCIsXCJpam9cIixcImlqc1wiLFwiaWtlXCIsXCJpa2lcIixcImlra1wiLFwiaWtsXCIsXCJpa29cIixcImlrcFwiLFwiaWtyXCIsXCJpa3NcIixcImlrdFwiLFwiaWt2XCIsXCJpa3dcIixcImlreFwiLFwiaWt6XCIsXCJpbGFcIixcImlsYlwiLFwiaWxnXCIsXCJpbGlcIixcImlsa1wiLFwiaWxsXCIsXCJpbG1cIixcImlsb1wiLFwiaWxwXCIsXCJpbHNcIixcImlsdVwiLFwiaWx2XCIsXCJpbHdcIixcImltYVwiLFwiaW1lXCIsXCJpbWlcIixcImltbFwiLFwiaW1uXCIsXCJpbW9cIixcImltclwiLFwiaW1zXCIsXCJpbXlcIixcImluYlwiLFwiaW5jXCIsXCJpbmVcIixcImluZ1wiLFwiaW5oXCIsXCJpbmpcIixcImlubFwiLFwiaW5tXCIsXCJpbm5cIixcImlub1wiLFwiaW5wXCIsXCJpbnNcIixcImludFwiLFwiaW56XCIsXCJpb3JcIixcImlvdVwiLFwiaW93XCIsXCJpcGlcIixcImlwb1wiLFwiaXF1XCIsXCJpcXdcIixcImlyYVwiLFwiaXJlXCIsXCJpcmhcIixcImlyaVwiLFwiaXJrXCIsXCJpcm5cIixcImlyb1wiLFwiaXJyXCIsXCJpcnVcIixcImlyeFwiLFwiaXJ5XCIsXCJpc2FcIixcImlzY1wiLFwiaXNkXCIsXCJpc2VcIixcImlzZ1wiLFwiaXNoXCIsXCJpc2lcIixcImlza1wiLFwiaXNtXCIsXCJpc25cIixcImlzb1wiLFwiaXNyXCIsXCJpc3RcIixcImlzdVwiLFwiaXRiXCIsXCJpdGNcIixcIml0ZFwiLFwiaXRlXCIsXCJpdGlcIixcIml0a1wiLFwiaXRsXCIsXCJpdG1cIixcIml0b1wiLFwiaXRyXCIsXCJpdHNcIixcIml0dFwiLFwiaXR2XCIsXCJpdHdcIixcIml0eFwiLFwiaXR5XCIsXCJpdHpcIixcIml1bVwiLFwiaXZiXCIsXCJpdnZcIixcIml3a1wiLFwiaXdtXCIsXCJpd29cIixcIml3c1wiLFwiaXhjXCIsXCJpeGxcIixcIml5YVwiLFwiaXlvXCIsXCJpeXhcIixcIml6aFwiLFwiaXppXCIsXCJpenJcIixcIml6elwiXVxuLFsgXCJqYVwiLFwiamlcIixcImp2XCIsXCJqd1wiLFwiamFhXCIsXCJqYWJcIixcImphY1wiLFwiamFkXCIsXCJqYWVcIixcImphZlwiLFwiamFoXCIsXCJqYWpcIixcImpha1wiLFwiamFsXCIsXCJqYW1cIixcImphblwiLFwiamFvXCIsXCJqYXFcIixcImphclwiLFwiamFzXCIsXCJqYXRcIixcImphdVwiLFwiamF4XCIsXCJqYXlcIixcImphelwiLFwiamJlXCIsXCJqYmlcIixcImpialwiLFwiamJrXCIsXCJqYm1cIixcImpiblwiLFwiamJvXCIsXCJqYnJcIixcImpidFwiLFwiamJ1XCIsXCJqYndcIixcImpjc1wiLFwiamN0XCIsXCJqZGFcIixcImpkZ1wiLFwiamR0XCIsXCJqZWJcIixcImplZVwiLFwiamVnXCIsXCJqZWhcIixcImplaVwiLFwiamVrXCIsXCJqZWxcIixcImplblwiLFwiamVyXCIsXCJqZXRcIixcImpldVwiLFwiamdiXCIsXCJqZ2VcIixcImpna1wiLFwiamdvXCIsXCJqaGlcIixcImpoc1wiLFwiamlhXCIsXCJqaWJcIixcImppY1wiLFwiamlkXCIsXCJqaWVcIixcImppZ1wiLFwiamloXCIsXCJqaWlcIixcImppbFwiLFwiamltXCIsXCJqaW9cIixcImppcVwiLFwiaml0XCIsXCJqaXVcIixcImppdlwiLFwiaml5XCIsXCJqamVcIixcImpqclwiLFwiamthXCIsXCJqa21cIixcImprb1wiLFwiamtwXCIsXCJqa3JcIixcImprc1wiLFwiamt1XCIsXCJqbGVcIixcImpsc1wiLFwiam1hXCIsXCJqbWJcIixcImptY1wiLFwiam1kXCIsXCJqbWlcIixcImptbFwiLFwiam1uXCIsXCJqbXJcIixcImptc1wiLFwiam13XCIsXCJqbXhcIixcImpuYVwiLFwiam5kXCIsXCJqbmdcIixcImpuaVwiLFwiam5qXCIsXCJqbmxcIixcImpuc1wiLFwiam9iXCIsXCJqb2RcIixcImpvZ1wiLFwiam9yXCIsXCJqb3NcIixcImpvd1wiLFwianBhXCIsXCJqcHJcIixcImpweFwiLFwianFyXCIsXCJqcmFcIixcImpyYlwiLFwianJyXCIsXCJqcnRcIixcImpydVwiLFwianNsXCIsXCJqdWFcIixcImp1YlwiLFwianVjXCIsXCJqdWRcIixcImp1aFwiLFwianVpXCIsXCJqdWtcIixcImp1bFwiLFwianVtXCIsXCJqdW5cIixcImp1b1wiLFwianVwXCIsXCJqdXJcIixcImp1c1wiLFwianV0XCIsXCJqdXVcIixcImp1d1wiLFwianV5XCIsXCJqdmRcIixcImp2blwiLFwiandpXCIsXCJqeWFcIixcImp5ZVwiLFwianl5XCJdXG4sWyBcImthXCIsXCJrZ1wiLFwia2lcIixcImtqXCIsXCJra1wiLFwia2xcIixcImttXCIsXCJrblwiLFwia29cIixcImtyXCIsXCJrc1wiLFwia3VcIixcImt2XCIsXCJrd1wiLFwia3lcIixcImthYVwiLFwia2FiXCIsXCJrYWNcIixcImthZFwiLFwia2FlXCIsXCJrYWZcIixcImthZ1wiLFwia2FoXCIsXCJrYWlcIixcImthalwiLFwia2FrXCIsXCJrYW1cIixcImthb1wiLFwia2FwXCIsXCJrYXFcIixcImthclwiLFwia2F2XCIsXCJrYXdcIixcImtheFwiLFwia2F5XCIsXCJrYmFcIixcImtiYlwiLFwia2JjXCIsXCJrYmRcIixcImtiZVwiLFwia2JmXCIsXCJrYmdcIixcImtiaFwiLFwia2JpXCIsXCJrYmpcIixcImtia1wiLFwia2JsXCIsXCJrYm1cIixcImtiblwiLFwia2JvXCIsXCJrYnBcIixcImticVwiLFwia2JyXCIsXCJrYnNcIixcImtidFwiLFwia2J1XCIsXCJrYnZcIixcImtid1wiLFwia2J4XCIsXCJrYnlcIixcImtielwiLFwia2NhXCIsXCJrY2JcIixcImtjY1wiLFwia2NkXCIsXCJrY2VcIixcImtjZlwiLFwia2NnXCIsXCJrY2hcIixcImtjaVwiLFwia2NqXCIsXCJrY2tcIixcImtjbFwiLFwia2NtXCIsXCJrY25cIixcImtjb1wiLFwia2NwXCIsXCJrY3FcIixcImtjclwiLFwia2NzXCIsXCJrY3RcIixcImtjdVwiLFwia2N2XCIsXCJrY3dcIixcImtjeFwiLFwia2N5XCIsXCJrY3pcIixcImtkYVwiLFwia2RjXCIsXCJrZGRcIixcImtkZVwiLFwia2RmXCIsXCJrZGdcIixcImtkaFwiLFwia2RpXCIsXCJrZGpcIixcImtka1wiLFwia2RsXCIsXCJrZG1cIixcImtkblwiLFwia2RvXCIsXCJrZHBcIixcImtkcVwiLFwia2RyXCIsXCJrZHRcIixcImtkdVwiLFwia2R2XCIsXCJrZHdcIixcImtkeFwiLFwia2R5XCIsXCJrZHpcIixcImtlYVwiLFwia2ViXCIsXCJrZWNcIixcImtlZFwiLFwia2VlXCIsXCJrZWZcIixcImtlZ1wiLFwia2VoXCIsXCJrZWlcIixcImtlalwiLFwia2VrXCIsXCJrZWxcIixcImtlbVwiLFwia2VuXCIsXCJrZW9cIixcImtlcFwiLFwia2VxXCIsXCJrZXJcIixcImtlc1wiLFwia2V0XCIsXCJrZXVcIixcImtldlwiLFwia2V3XCIsXCJrZXhcIixcImtleVwiLFwia2V6XCIsXCJrZmFcIixcImtmYlwiLFwia2ZjXCIsXCJrZmRcIixcImtmZVwiLFwia2ZmXCIsXCJrZmdcIixcImtmaFwiLFwia2ZpXCIsXCJrZmpcIixcImtma1wiLFwia2ZsXCIsXCJrZm1cIixcImtmblwiLFwia2ZvXCIsXCJrZnBcIixcImtmcVwiLFwia2ZyXCIsXCJrZnNcIixcImtmdFwiLFwia2Z1XCIsXCJrZnZcIixcImtmd1wiLFwia2Z4XCIsXCJrZnlcIixcImtmelwiLFwia2dhXCIsXCJrZ2JcIixcImtnY1wiLFwia2dkXCIsXCJrZ2VcIixcImtnZlwiLFwia2dnXCIsXCJrZ2hcIixcImtnaVwiLFwia2dqXCIsXCJrZ2tcIixcImtnbFwiLFwia2dtXCIsXCJrZ25cIixcImtnb1wiLFwia2dwXCIsXCJrZ3FcIixcImtnclwiLFwia2dzXCIsXCJrZ3RcIixcImtndVwiLFwia2d2XCIsXCJrZ3dcIixcImtneFwiLFwia2d5XCIsXCJraGFcIixcImx5Z1wiLFwia2hiXCIsXCJraGNcIixcImtoZFwiLFwia2hlXCIsXCJraGZcIixcImtoZ1wiLFwia2hoXCIsXCJraGlcIixcImtoalwiLFwia2hrXCIsXCJraGxcIixcImtoblwiLFwia2hvXCIsXCJraHBcIixcImtocVwiLFwia2hyXCIsXCJraHNcIixcImtodFwiLFwia2h1XCIsXCJraHZcIixcImtod1wiLFwia2h4XCIsXCJraHlcIixcImtoelwiLFwia2lhXCIsXCJraWJcIixcImtpY1wiLFwia2lkXCIsXCJraWVcIixcImtpZlwiLFwia2lnXCIsXCJraWhcIixcImtpaVwiLFwia2lqXCIsXCJraWxcIixcImtpbVwiLFwia2lvXCIsXCJraXBcIixcImtpcVwiLFwia2lzXCIsXCJraXRcIixcImtpdVwiLFwia2l2XCIsXCJraXdcIixcImtpeFwiLFwia2l5XCIsXCJraXpcIixcImtqYVwiLFwia2piXCIsXCJramNcIixcImtqZFwiLFwia2plXCIsXCJramZcIixcImtqZ1wiLFwia2poXCIsXCJramlcIixcImtqalwiLFwia2prXCIsXCJramxcIixcImtqbVwiLFwia2puXCIsXCJram9cIixcImtqcFwiLFwia2pxXCIsXCJranJcIixcImtqc1wiLFwia2p0XCIsXCJranVcIixcImtqdlwiLFwia2p4XCIsXCJranlcIixcImtqelwiLFwia2thXCIsXCJra2JcIixcImtrY1wiLFwia2tkXCIsXCJra2VcIixcImtrZlwiLFwia2tnXCIsXCJra2hcIixcImtraVwiLFwia2tqXCIsXCJra2tcIixcImtrbFwiLFwia2ttXCIsXCJra25cIixcImtrb1wiLFwia2twXCIsXCJra3FcIixcImtrclwiLFwia2tzXCIsXCJra3RcIixcImtrdVwiLFwia2t2XCIsXCJra3dcIixcImtreFwiLFwia2t5XCIsXCJra3pcIixcImtsYVwiLFwia2xiXCIsXCJrbGNcIixcImtsZFwiLFwia2xlXCIsXCJrbGZcIixcImtsZ1wiLFwia2xoXCIsXCJrbGlcIixcImtsalwiLFwia2xrXCIsXCJrbGxcIixcImtsbVwiLFwia2xuXCIsXCJrbG9cIixcImtscFwiLFwia2xxXCIsXCJrbHJcIixcImtsc1wiLFwia2x0XCIsXCJrbHVcIixcImtsdlwiLFwia2x3XCIsXCJrbHhcIixcImtseVwiLFwia2x6XCIsXCJrbWFcIixcImttYlwiLFwia21jXCIsXCJrbWRcIixcImttZVwiLFwia21mXCIsXCJrbWdcIixcImttaFwiLFwia21pXCIsXCJrbWpcIixcImtta1wiLFwia21sXCIsXCJrbW1cIixcImttblwiLFwia21vXCIsXCJrbXBcIixcImttcVwiLFwia21yXCIsXCJrbXNcIixcImttdFwiLFwia211XCIsXCJrbXZcIixcImttd1wiLFwia214XCIsXCJrbXlcIixcImttelwiLFwia25hXCIsXCJrbmJcIixcImtuY1wiLFwia25kXCIsXCJrbmVcIixcImtuZlwiLFwia25nXCIsXCJrbmlcIixcImtualwiLFwia25rXCIsXCJrbmxcIixcImtubVwiLFwia25uXCIsXCJrbm9cIixcImtucFwiLFwia25xXCIsXCJrbnJcIixcImtuc1wiLFwia250XCIsXCJrbnVcIixcImtudlwiLFwia253XCIsXCJrbnhcIixcImtueVwiLFwia256XCIsXCJrb2FcIixcImtvY1wiLFwia29kXCIsXCJrb2VcIixcImtvZlwiLFwia29nXCIsXCJrb2hcIixcImtvaVwiLFwia29qXCIsXCJrb2tcIixcImtvbFwiLFwia29vXCIsXCJrb3BcIixcImtvcVwiLFwia29zXCIsXCJrb3RcIixcImtvdVwiLFwia292XCIsXCJrb3dcIixcImtveFwiLFwia295XCIsXCJrb3pcIixcImtwYVwiLFwia3BiXCIsXCJrcGNcIixcImtwZFwiLFwia3BlXCIsXCJrcGZcIixcImtwZ1wiLFwia3BoXCIsXCJrcGlcIixcImtwalwiLFwia3BrXCIsXCJrcGxcIixcImtwbVwiLFwia3BuXCIsXCJrcG9cIixcImtwcFwiLFwia3BxXCIsXCJrcHJcIixcImtwc1wiLFwia3B0XCIsXCJrcHVcIixcImtwdlwiLFwia3B3XCIsXCJrcHhcIixcImtweVwiLFwia3B6XCIsXCJrcWFcIixcImtxYlwiLFwia3FjXCIsXCJrcWRcIixcImtxZVwiLFwia3FmXCIsXCJrcWdcIixcImtxaFwiLFwia3FpXCIsXCJrcWpcIixcImtxa1wiLFwia3FsXCIsXCJrcW1cIixcImtxblwiLFwia3FvXCIsXCJrcXBcIixcImtxcVwiLFwia3FyXCIsXCJrcXNcIixcImtxdFwiLFwia3F1XCIsXCJrcXZcIixcImtxd1wiLFwia3F4XCIsXCJrcXlcIixcImtxelwiLFwia3JhXCIsXCJrcmJcIixcImtyY1wiLFwia3JkXCIsXCJrcmVcIixcImtyZlwiLFwia3JoXCIsXCJrcmlcIixcImtyalwiLFwia3JrXCIsXCJrcmxcIixcImtybVwiLFwia3JuXCIsXCJrcm9cIixcImtycFwiLFwia3JyXCIsXCJrcnNcIixcImtydFwiLFwia3J1XCIsXCJrcnZcIixcImtyd1wiLFwia3J4XCIsXCJrcnlcIixcImtyelwiLFwia3NhXCIsXCJrc2JcIixcImtzY1wiLFwia3NkXCIsXCJrc2VcIixcImtzZlwiLFwia3NnXCIsXCJrc2hcIixcImtzaVwiLFwia3NqXCIsXCJrc2tcIixcImtzbFwiLFwia3NtXCIsXCJrc25cIixcImtzb1wiLFwia3NwXCIsXCJrc3FcIixcImtzclwiLFwia3NzXCIsXCJrc3RcIixcImtzdVwiLFwia3N2XCIsXCJrc3dcIixcImtzeFwiLFwia3N5XCIsXCJrc3pcIixcImt0YVwiLFwia3RiXCIsXCJrdGNcIixcImt0ZFwiLFwia3RlXCIsXCJrdGZcIixcImt0Z1wiLFwia3RoXCIsXCJrdGlcIixcImt0alwiLFwia3RrXCIsXCJrdGxcIixcImt0bVwiLFwia3RuXCIsXCJrdG9cIixcImt0cFwiLFwia3RxXCIsXCJrdHJcIixcImt0c1wiLFwia3R0XCIsXCJrdHVcIixcImt0dlwiLFwia3R3XCIsXCJrdHhcIixcImt0eVwiLFwia3R6XCIsXCJrdWJcIixcImt1Y1wiLFwia3VkXCIsXCJrdWVcIixcImt1ZlwiLFwia3VnXCIsXCJrdWhcIixcImt1aVwiLFwia3VqXCIsXCJrdWtcIixcImt1bFwiLFwia3VtXCIsXCJrdW5cIixcImt1b1wiLFwia3VwXCIsXCJrdXFcIixcImt1c1wiLFwia3V0XCIsXCJrdXVcIixcImt1dlwiLFwia3V3XCIsXCJrdXhcIixcImt1eVwiLFwia3V6XCIsXCJrdmFcIixcImt2YlwiLFwia3ZjXCIsXCJrdmRcIixcImt2ZVwiLFwia3ZmXCIsXCJrdmdcIixcImt2aFwiLFwia3ZpXCIsXCJrdmpcIixcImt2a1wiLFwia3ZsXCIsXCJrdm1cIixcImt2blwiLFwia3ZvXCIsXCJrdnBcIixcImt2cVwiLFwia3ZyXCIsXCJrdnNcIixcImt2dFwiLFwia3Z1XCIsXCJrdnZcIixcImt2d1wiLFwia3Z4XCIsXCJrdnlcIixcImt2elwiLFwia3dhXCIsXCJrd2JcIixcImt3Y1wiLFwia3dkXCIsXCJrd2VcIixcImt3ZlwiLFwia3dnXCIsXCJrd2hcIixcImt3aVwiLFwia3dqXCIsXCJrd2tcIixcImt3bFwiLFwia3dtXCIsXCJrd25cIixcImt3b1wiLFwia3dwXCIsXCJrd3FcIixcImt3clwiLFwia3dzXCIsXCJrd3RcIixcImt3dVwiLFwia3d2XCIsXCJrd3dcIixcImt3eFwiLFwia3d5XCIsXCJrd3pcIixcImt4YVwiLFwia3hiXCIsXCJreGNcIixcImt4ZFwiLFwia3hlXCIsXCJreGZcIixcImt4aFwiLFwia3hpXCIsXCJreGpcIixcImt4a1wiLFwia3hsXCIsXCJreG1cIixcImt4blwiLFwia3hvXCIsXCJreHBcIixcImt4cVwiLFwia3hyXCIsXCJreHNcIixcImt4dFwiLFwia3h1XCIsXCJreHZcIixcImt4d1wiLFwia3h4XCIsXCJreHlcIixcImt4elwiLFwia3lhXCIsXCJreWJcIixcImt5Y1wiLFwia3lkXCIsXCJreWVcIixcImt5ZlwiLFwia3lnXCIsXCJreWhcIixcImt5aVwiLFwia3lqXCIsXCJreWtcIixcImt5bFwiLFwia3ltXCIsXCJreW5cIixcImt5b1wiLFwia3lwXCIsXCJreXFcIixcImt5clwiLFwia3lzXCIsXCJreXRcIixcImt5dVwiLFwia3l2XCIsXCJreXdcIixcImt5eFwiLFwia3l5XCIsXCJreXpcIixcImt6YVwiLFwia3piXCIsXCJremNcIixcImt6ZFwiLFwia3plXCIsXCJremZcIixcImt6Z1wiLFwia3poXCIsXCJremlcIixcImt6alwiLFwia3prXCIsXCJremxcIixcImt6bVwiLFwia3puXCIsXCJrem9cIixcImt6cFwiLFwia3pxXCIsXCJrenJcIixcImt6c1wiLFwia3p0XCIsXCJrenVcIixcImt6dlwiLFwia3p3XCIsXCJrenhcIixcImt6eVwiLFwia3p6XCJdXG4sWyBcImxhXCIsXCJsYlwiLFwibGdcIixcImxpXCIsXCJsblwiLFwibG9cIixcImx0XCIsXCJsdVwiLFwibHZcIixcImxhYVwiLFwibGFiXCIsXCJsYWNcIixcImxhZFwiLFwibGFlXCIsXCJsYWZcIixcImxhZ1wiLFwibGFoXCIsXCJsYWlcIixcImxhalwiLFwibGFrXCIsXCJsYWxcIixcImxhbVwiLFwibGFuXCIsXCJsYXBcIixcImxhcVwiLFwibGFyXCIsXCJsYXNcIixcImxhdVwiLFwibGF3XCIsXCJsYXhcIixcImxheVwiLFwibGF6XCIsXCJsYmFcIixcImxiYlwiLFwibGJjXCIsXCJsYmVcIixcImxiZlwiLFwibGJnXCIsXCJsYmlcIixcImxialwiLFwibGJrXCIsXCJsYmxcIixcImxibVwiLFwibGJuXCIsXCJsYm9cIixcImxicVwiLFwibGJyXCIsXCJsYnNcIixcImxidFwiLFwibGJ1XCIsXCJsYnZcIixcImxid1wiLFwibGJ4XCIsXCJsYnlcIixcImxielwiLFwibGNjXCIsXCJsY2RcIixcImxjZVwiLFwibGNmXCIsXCJsY2hcIixcImxjbFwiLFwibGNtXCIsXCJsY3BcIixcImxjcVwiLFwibGNzXCIsXCJsZGFcIixcImxkYlwiLFwibGRkXCIsXCJsZGdcIixcImxkaFwiLFwibGRpXCIsXCJsZGpcIixcImxka1wiLFwibGRsXCIsXCJsZG1cIixcImxkblwiLFwibGRvXCIsXCJsZHBcIixcImxkcVwiLFwibGVhXCIsXCJsZWJcIixcImxlY1wiLFwibGVkXCIsXCJsZWVcIixcImxlZlwiLFwibGVnXCIsXCJsZWhcIixcImxlaVwiLFwibGVqXCIsXCJsZWtcIixcImxlbFwiLFwibGVtXCIsXCJsZW5cIixcImxlb1wiLFwibGVwXCIsXCJsZXFcIixcImxlclwiLFwibGVzXCIsXCJsZXRcIixcImxldVwiLFwibGV2XCIsXCJsZXdcIixcImxleFwiLFwibGV5XCIsXCJsZXpcIixcImxmYVwiLFwibGZuXCIsXCJsZ2FcIixcImxnYlwiLFwibGdnXCIsXCJsZ2hcIixcImxnaVwiLFwibGdrXCIsXCJsZ2xcIixcImxnbVwiLFwibGduXCIsXCJsZ3FcIixcImxnclwiLFwibGd0XCIsXCJsZ3VcIixcImxnelwiLFwibGhhXCIsXCJsaGhcIixcImxoaVwiLFwibGhsXCIsXCJsaG1cIixcImxoblwiLFwibGhwXCIsXCJsaHNcIixcImxodFwiLFwibGh1XCIsXCJsaWFcIixcImxpYlwiLFwibGljXCIsXCJsaWRcIixcImxpZVwiLFwibGlmXCIsXCJsaWdcIixcImxpaFwiLFwibGlpXCIsXCJsaWpcIixcImxpa1wiLFwibGlsXCIsXCJsaW9cIixcImxpcFwiLFwibGlxXCIsXCJsaXJcIixcImxpc1wiLFwibGl1XCIsXCJsaXZcIixcImxpd1wiLFwibGl4XCIsXCJsaXlcIixcImxpelwiLFwibGphXCIsXCJsamVcIixcImxqaVwiLFwibGpsXCIsXCJsanBcIixcImxqd1wiLFwibGp4XCIsXCJsa2FcIixcImxrYlwiLFwibGtjXCIsXCJsa2RcIixcImxrZVwiLFwibGtoXCIsXCJsa2lcIixcImxralwiLFwibGtsXCIsXCJsa21cIixcImxrblwiLFwibGtvXCIsXCJsa3JcIixcImxrc1wiLFwibGt0XCIsXCJsa3VcIixcImxreVwiLFwibGxhXCIsXCJsbGJcIixcImxsY1wiLFwibGxkXCIsXCJsbGVcIixcImxsZlwiLFwibGxnXCIsXCJsbGhcIixcImxsaVwiLFwibGxqXCIsXCJsbGtcIixcImxsbFwiLFwibGxtXCIsXCJsbG5cIixcImxsb1wiLFwibGxwXCIsXCJsbHFcIixcImxsc1wiLFwibGx1XCIsXCJsbHhcIixcImxtYVwiLFwibG1iXCIsXCJsbWNcIixcImxtZFwiLFwibG1lXCIsXCJsbWZcIixcImxtZ1wiLFwibG1oXCIsXCJsbWlcIixcImxtalwiLFwibG1rXCIsXCJsbWxcIixcImxtbVwiLFwibG1uXCIsXCJsbW9cIixcImxtcFwiLFwibG1xXCIsXCJsbXJcIixcImxtdVwiLFwibG12XCIsXCJsbXdcIixcImxteFwiLFwibG15XCIsXCJsbXpcIixcImxuYVwiLFwibG5iXCIsXCJsbmRcIixcImxuZ1wiLFwibG5oXCIsXCJsbmlcIixcImxualwiLFwibG5sXCIsXCJsbm1cIixcImxublwiLFwibG5vXCIsXCJsbnNcIixcImxudVwiLFwibG53XCIsXCJsbnpcIixcImxvYVwiLFwibG9iXCIsXCJsb2NcIixcImxvZVwiLFwibG9mXCIsXCJsb2dcIixcImxvaFwiLFwibG9pXCIsXCJsb2pcIixcImxva1wiLFwibG9sXCIsXCJsb21cIixcImxvblwiLFwibG9vXCIsXCJsb3BcIixcImxvcVwiLFwibG9yXCIsXCJsb3NcIixcImxvdFwiLFwibG91XCIsXCJsb3ZcIixcImxvd1wiLFwibG94XCIsXCJsb3lcIixcImxvelwiLFwibHBhXCIsXCJscGVcIixcImxwblwiLFwibHBvXCIsXCJscHhcIixcImxyYVwiLFwibHJjXCIsXCJscmVcIixcImxyZ1wiLFwibHJpXCIsXCJscmtcIixcImxybFwiLFwibHJtXCIsXCJscm5cIixcImxyb1wiLFwibHJyXCIsXCJscnRcIixcImxydlwiLFwibHJ6XCIsXCJsc2FcIixcImxzYlwiLFwibHNkXCIsXCJsc2VcIixcImxzZ1wiLFwibHNoXCIsXCJsc2lcIixcImxzbFwiLFwibHNtXCIsXCJsc25cIixcImxzb1wiLFwibHNwXCIsXCJsc3JcIixcImxzc1wiLFwibHN0XCIsXCJsc3ZcIixcImxzeVwiLFwibHRjXCIsXCJsdGdcIixcImx0aFwiLFwibHRpXCIsXCJsdG5cIixcImx0b1wiLFwibHRzXCIsXCJsdHVcIixcImx1YVwiLFwibHVjXCIsXCJsdWRcIixcImx1ZVwiLFwibHVmXCIsXCJsdWlcIixcImx1alwiLFwibHVrXCIsXCJsdWxcIixcImx1bVwiLFwibHVuXCIsXCJsdW9cIixcImx1cFwiLFwibHVxXCIsXCJsdXJcIixcImx1c1wiLFwibHV0XCIsXCJsdXVcIixcImx1dlwiLFwibHV3XCIsXCJsdXlcIixcImx1elwiLFwibHZhXCIsXCJsdmlcIixcImx2a1wiLFwibHZzXCIsXCJsdnVcIixcImx3YVwiLFwibHdlXCIsXCJsd2dcIixcImx3aFwiLFwibHdsXCIsXCJsd21cIixcImx3b1wiLFwibHdzXCIsXCJsd3RcIixcImx3dVwiLFwibHd3XCIsXCJseG1cIixcImx5YVwiLFwibHlnXCIsXCJseW5cIixcImx6aFwiLFwibHpsXCIsXCJsem5cIixcImx6elwiXVxuLFsgXCJtZ1wiLFwibWhcIixcIm1pXCIsXCJta1wiLFwibWxcIixcIm1uXCIsXCJtb1wiLFwibXJcIixcIm1zXCIsXCJtdFwiLFwibXlcIixcIm1hYVwiLFwibWFiXCIsXCJtYWRcIixcIm1hZVwiLFwibWFmXCIsXCJtYWdcIixcIm1haVwiLFwibWFqXCIsXCJtYWtcIixcIm1hbVwiLFwibWFuXCIsXCJtYXBcIixcIm1hcVwiLFwibWFzXCIsXCJtYXRcIixcIm1hdVwiLFwibWF2XCIsXCJtYXdcIixcIm1heFwiLFwibWF6XCIsXCJtYmFcIixcIm1iYlwiLFwibWJjXCIsXCJtYmRcIixcIm1iZVwiLFwibWJmXCIsXCJtYmhcIixcIm1iaVwiLFwibWJqXCIsXCJtYmtcIixcIm1ibFwiLFwibWJtXCIsXCJtYm5cIixcIm1ib1wiLFwibWJwXCIsXCJtYnFcIixcIm1iclwiLFwibWJzXCIsXCJtYnRcIixcIm1idVwiLFwibWJ2XCIsXCJtYndcIixcIm1ieFwiLFwibWJ5XCIsXCJtYnpcIixcIm1jYVwiLFwibWNiXCIsXCJtY2NcIixcIm1jZFwiLFwibWNlXCIsXCJtY2ZcIixcIm1jZ1wiLFwibWNoXCIsXCJtY2lcIixcIm1jalwiLFwibWNrXCIsXCJtY2xcIixcIm1jbVwiLFwibWNuXCIsXCJtY29cIixcIm1jcFwiLFwibWNxXCIsXCJtY3JcIixcIm1jc1wiLFwibWN0XCIsXCJtY3VcIixcIm1jdlwiLFwibWN3XCIsXCJtY3hcIixcIm1jeVwiLFwibWN6XCIsXCJtZGFcIixcIm1kYlwiLFwibWRjXCIsXCJtZGRcIixcIm1kZVwiLFwibWRmXCIsXCJtZGdcIixcIm1kaFwiLFwibWRpXCIsXCJtZGpcIixcIm1ka1wiLFwibWRsXCIsXCJtZG1cIixcIm1kblwiLFwibWRwXCIsXCJtZHFcIixcIm1kclwiLFwibWRzXCIsXCJtZHRcIixcIm1kdVwiLFwibWR2XCIsXCJtZHdcIixcIm1keFwiLFwibWR5XCIsXCJtZHpcIixcIm1lYVwiLFwibWViXCIsXCJtZWNcIixcIm1lZFwiLFwibWVlXCIsXCJtZWZcIixcIm1lZ1wiLFwibWVoXCIsXCJtZWlcIixcIm1lalwiLFwibWVrXCIsXCJtZWxcIixcIm1lbVwiLFwibWVuXCIsXCJtZW9cIixcIm1lcFwiLFwibWVxXCIsXCJtZXJcIixcIm1lc1wiLFwibWV0XCIsXCJtZXVcIixcIm1ldlwiLFwibWV3XCIsXCJtZXlcIixcIm1lelwiLFwibWZhXCIsXCJtZmJcIixcIm1mY1wiLFwibWZkXCIsXCJtZmVcIixcIm1mZlwiLFwibWZnXCIsXCJtZmhcIixcIm1maVwiLFwibWZqXCIsXCJtZmtcIixcIm1mbFwiLFwibWZtXCIsXCJtZm5cIixcIm1mb1wiLFwibWZwXCIsXCJtZnFcIixcIm1mclwiLFwibWZzXCIsXCJtZnRcIixcIm1mdVwiLFwibWZ2XCIsXCJtZndcIixcIm1meFwiLFwibWZ5XCIsXCJtZnpcIixcIm1nYVwiLFwibWdiXCIsXCJtZ2NcIixcIm1nZFwiLFwibWdlXCIsXCJtZ2ZcIixcIm1nZ1wiLFwibWdoXCIsXCJtZ2lcIixcIm1nalwiLFwibWdrXCIsXCJtZ2xcIixcIm1nbVwiLFwibWduXCIsXCJtZ29cIixcIm1ncFwiLFwibWdxXCIsXCJtZ3JcIixcIm1nc1wiLFwibWd0XCIsXCJtZ3VcIixcIm1ndlwiLFwibWd3XCIsXCJtZ3hcIixcIm1neVwiLFwibWd6XCIsXCJtaGFcIixcIm1oYlwiLFwibWhjXCIsXCJtaGRcIixcIm1oZVwiLFwibWhmXCIsXCJtaGdcIixcIm1oaFwiLFwibWhpXCIsXCJtaGpcIixcIm1oa1wiLFwibWhsXCIsXCJtaG1cIixcIm1oblwiLFwibWhvXCIsXCJtaHBcIixcIm1ocVwiLFwibWhyXCIsXCJtaHNcIixcIm1odFwiLFwibWh1XCIsXCJtaHdcIixcIm1oeFwiLFwibWh5XCIsXCJtaHpcIixcIm1pYVwiLFwibWliXCIsXCJtaWNcIixcIm1pZFwiLFwibWllXCIsXCJtaWZcIixcIm1pZ1wiLFwibWloXCIsXCJtaWlcIixcIm1palwiLFwibWlrXCIsXCJtaWxcIixcIm1pbVwiLFwibWluXCIsXCJtaW9cIixcIm1pcFwiLFwibWlxXCIsXCJtaXJcIixcIm1pc1wiLFwibWl0XCIsXCJtaXVcIixcIm1pd1wiLFwibWl4XCIsXCJtaXlcIixcIm1pelwiLFwibWphXCIsXCJtamJcIixcIm1qY1wiLFwibWpkXCIsXCJtamVcIixcIm1qZ1wiLFwibWpoXCIsXCJtamlcIixcIm1qalwiLFwibWprXCIsXCJtamxcIixcIm1qbVwiLFwibWpuXCIsXCJtam9cIixcIm1qcFwiLFwibWpxXCIsXCJtanJcIixcIm1qc1wiLFwibWp0XCIsXCJtanVcIixcIm1qdlwiLFwibWp3XCIsXCJtanhcIixcIm1qeVwiLFwibWp6XCIsXCJta2FcIixcIm1rYlwiLFwibWtjXCIsXCJta2VcIixcIm1rZlwiLFwibWtnXCIsXCJta2hcIixcIm1raVwiLFwibWtqXCIsXCJta2tcIixcIm1rbFwiLFwibWttXCIsXCJta25cIixcIm1rb1wiLFwibWtwXCIsXCJta3FcIixcIm1rclwiLFwibWtzXCIsXCJta3RcIixcIm1rdVwiLFwibWt2XCIsXCJta3dcIixcIm1reFwiLFwibWt5XCIsXCJta3pcIixcIm1sYVwiLFwibWxiXCIsXCJtbGNcIixcIm1sZFwiLFwibWxlXCIsXCJtbGZcIixcIm1saFwiLFwibWxpXCIsXCJtbGpcIixcIm1sa1wiLFwibWxsXCIsXCJtbG1cIixcIm1sblwiLFwibWxvXCIsXCJtbHBcIixcIm1scVwiLFwibWxyXCIsXCJtbHNcIixcIm1sdVwiLFwibWx2XCIsXCJtbHdcIixcIm1seFwiLFwibWx6XCIsXCJtbWFcIixcIm1tYlwiLFwibW1jXCIsXCJtbWRcIixcIm1tZVwiLFwibW1mXCIsXCJtbWdcIixcIm1taFwiLFwibW1pXCIsXCJtbWpcIixcIm1ta1wiLFwibW1sXCIsXCJtbW1cIixcIm1tblwiLFwibW1vXCIsXCJtbXBcIixcIm1tcVwiLFwibW1yXCIsXCJtbXRcIixcIm1tdVwiLFwibW12XCIsXCJtbXdcIixcIm1teFwiLFwibW15XCIsXCJtbXpcIixcIm1uYVwiLFwibW5iXCIsXCJtbmNcIixcIm1uZFwiLFwibW5lXCIsXCJtbmZcIixcIm1uZ1wiLFwibW5oXCIsXCJtbmlcIixcIm1ualwiLFwibW5rXCIsXCJtbmxcIixcIm1ubVwiLFwibW5uXCIsXCJtbm9cIixcIm1ucFwiLFwibW5xXCIsXCJtbnJcIixcIm1uc1wiLFwibW50XCIsXCJtbnVcIixcIm1udlwiLFwibW53XCIsXCJtbnhcIixcIm1ueVwiLFwibW56XCIsXCJtb2FcIixcIm1vY1wiLFwibW9kXCIsXCJtb2VcIixcIm1vZlwiLFwibW9nXCIsXCJtb2hcIixcIm1vaVwiLFwibW9qXCIsXCJtb2tcIixcIm1vbVwiLFwibW9vXCIsXCJtb3BcIixcIm1vcVwiLFwibW9yXCIsXCJtb3NcIixcIm1vdFwiLFwibW91XCIsXCJtb3ZcIixcIm1vd1wiLFwibW94XCIsXCJtb3lcIixcIm1velwiLFwibXBhXCIsXCJtcGJcIixcIm1wY1wiLFwibXBkXCIsXCJtcGVcIixcIm1wZ1wiLFwibXBoXCIsXCJtcGlcIixcIm1walwiLFwibXBrXCIsXCJtcGxcIixcIm1wbVwiLFwibXBuXCIsXCJtcG9cIixcIm1wcFwiLFwibXBxXCIsXCJtcHJcIixcIm1wc1wiLFwibXB0XCIsXCJtcHVcIixcIm1wdlwiLFwibXB3XCIsXCJtcHhcIixcIm1weVwiLFwibXB6XCIsXCJtcWFcIixcIm1xYlwiLFwibXFjXCIsXCJtcWVcIixcIm1xZlwiLFwibXFnXCIsXCJtcWhcIixcIm1xaVwiLFwibXFqXCIsXCJtcWtcIixcIm1xbFwiLFwibXFtXCIsXCJtcW5cIixcIm1xb1wiLFwibXFwXCIsXCJtcXFcIixcIm1xclwiLFwibXFzXCIsXCJtcXRcIixcIm1xdVwiLFwibXF2XCIsXCJtcXdcIixcIm1xeFwiLFwibXF5XCIsXCJtcXpcIixcIm1yYVwiLFwibXJiXCIsXCJtcmNcIixcIm1yZFwiLFwibXJlXCIsXCJtcmZcIixcIm1yZ1wiLFwibXJoXCIsXCJtcmpcIixcIm1ya1wiLFwibXJsXCIsXCJtcm1cIixcIm1yblwiLFwibXJvXCIsXCJtcnBcIixcIm1ycVwiLFwibXJyXCIsXCJtcnNcIixcIm1ydFwiLFwibXJ1XCIsXCJtcnZcIixcIm1yd1wiLFwibXJ4XCIsXCJtcnlcIixcIm1yelwiLFwibXNiXCIsXCJtc2NcIixcIm1zZFwiLFwibXNlXCIsXCJtc2ZcIixcIm1zZ1wiLFwibXNoXCIsXCJtc2lcIixcIm1zalwiLFwibXNrXCIsXCJtc2xcIixcIm1zbVwiLFwibXNuXCIsXCJtc29cIixcIm1zcFwiLFwibXNxXCIsXCJtc3JcIixcIm1zc1wiLFwibXN0XCIsXCJtc3VcIixcIm1zdlwiLFwibXN3XCIsXCJtc3hcIixcIm1zeVwiLFwibXN6XCIsXCJtdGFcIixcIm10YlwiLFwibXRjXCIsXCJtdGRcIixcIm10ZVwiLFwibXRmXCIsXCJtdGdcIixcIm10aFwiLFwibXRpXCIsXCJtdGpcIixcIm10a1wiLFwibXRsXCIsXCJtdG1cIixcIm10blwiLFwibXRvXCIsXCJtdHBcIixcIm10cVwiLFwibXRyXCIsXCJtdHNcIixcIm10dFwiLFwibXR1XCIsXCJtdHZcIixcIm10d1wiLFwibXR4XCIsXCJtdHlcIixcIm11YVwiLFwibXViXCIsXCJtdWNcIixcIm11ZFwiLFwibXVlXCIsXCJtdWdcIixcIm11aFwiLFwibXVpXCIsXCJtdWpcIixcIm11a1wiLFwibXVsXCIsXCJtdW1cIixcIm11blwiLFwibXVvXCIsXCJtdXBcIixcIm11cVwiLFwibXVyXCIsXCJtdXNcIixcIm11dFwiLFwibXV1XCIsXCJtdXZcIixcIm11eFwiLFwibXV5XCIsXCJtdXpcIixcIm12YVwiLFwibXZiXCIsXCJtdmRcIixcIm12ZVwiLFwibXZmXCIsXCJtdmdcIixcIm12aFwiLFwibXZpXCIsXCJtdmtcIixcIm12bFwiLFwibXZtXCIsXCJtdm5cIixcIm12b1wiLFwibXZwXCIsXCJtdnFcIixcIm12clwiLFwibXZzXCIsXCJtdnRcIixcIm12dVwiLFwibXZ2XCIsXCJtdndcIixcIm12eFwiLFwibXZ5XCIsXCJtdnpcIixcIm13YVwiLFwibXdiXCIsXCJtd2NcIixcIm13ZFwiLFwibXdlXCIsXCJtd2ZcIixcIm13Z1wiLFwibXdoXCIsXCJtd2lcIixcIm13alwiLFwibXdrXCIsXCJtd2xcIixcIm13bVwiLFwibXduXCIsXCJtd29cIixcIm13cFwiLFwibXdxXCIsXCJtd3JcIixcIm13c1wiLFwibXd0XCIsXCJtd3VcIixcIm13dlwiLFwibXd3XCIsXCJtd3hcIixcIm13eVwiLFwibXd6XCIsXCJteGFcIixcIm14YlwiLFwibXhjXCIsXCJteGRcIixcIm14ZVwiLFwibXhmXCIsXCJteGdcIixcIm14aFwiLFwibXhpXCIsXCJteGpcIixcIm14a1wiLFwibXhsXCIsXCJteG1cIixcIm14blwiLFwibXhvXCIsXCJteHBcIixcIm14cVwiLFwibXhyXCIsXCJteHNcIixcIm14dFwiLFwibXh1XCIsXCJteHZcIixcIm14d1wiLFwibXh4XCIsXCJteHlcIixcIm14elwiLFwibXliXCIsXCJteWNcIixcIm15ZFwiLFwibXllXCIsXCJteWZcIixcIm15Z1wiLFwibXloXCIsXCJteWlcIixcIm15alwiLFwibXlrXCIsXCJteWxcIixcIm15bVwiLFwibXluXCIsXCJteW9cIixcIm15cFwiLFwibXlxXCIsXCJteXJcIixcIm15c1wiLFwibXl0XCIsXCJteXVcIixcIm15dlwiLFwibXl3XCIsXCJteXhcIixcIm15eVwiLFwibXl6XCIsXCJtemFcIixcIm16YlwiLFwibXpjXCIsXCJtemRcIixcIm16ZVwiLFwibXpnXCIsXCJtemhcIixcIm16aVwiLFwibXpqXCIsXCJtemtcIixcIm16bFwiLFwibXptXCIsXCJtem5cIixcIm16b1wiLFwibXpwXCIsXCJtenFcIixcIm16clwiLFwibXpzXCIsXCJtenRcIixcIm16dVwiLFwibXp2XCIsXCJtendcIixcIm16eFwiLFwibXp5XCIsXCJtenpcIl1cbixbIFwibmFcIixcIm5iXCIsXCJuZFwiLFwibmVcIixcIm5nXCIsXCJubFwiLFwibm5cIixcIm5vXCIsXCJuclwiLFwibnZcIixcIm55XCIsXCJuYWFcIixcIm5hYlwiLFwibmFjXCIsXCJuYWRcIixcIm5hZVwiLFwibmFmXCIsXCJuYWdcIixcIm5haFwiLFwibmFpXCIsXCJuYWpcIixcIm5ha1wiLFwibmFsXCIsXCJuYW1cIixcIm5hblwiLFwibmFvXCIsXCJuYXBcIixcIm5hcVwiLFwibmFyXCIsXCJuYXNcIixcIm5hdFwiLFwibmF3XCIsXCJuYXhcIixcIm5heVwiLFwibmF6XCIsXCJuYmFcIixcIm5iYlwiLFwibmJjXCIsXCJuYmRcIixcIm5iZVwiLFwibmJmXCIsXCJuYmdcIixcIm5iaFwiLFwibmJpXCIsXCJuYmpcIixcIm5ia1wiLFwibmJtXCIsXCJuYm5cIixcIm5ib1wiLFwibmJwXCIsXCJuYnFcIixcIm5iclwiLFwibmJzXCIsXCJuYnRcIixcIm5idVwiLFwibmJ2XCIsXCJuYndcIixcIm5ieFwiLFwibmJ5XCIsXCJuY2FcIixcIm5jYlwiLFwibmNjXCIsXCJuY2RcIixcIm5jZVwiLFwibmNmXCIsXCJuY2dcIixcIm5jaFwiLFwibmNpXCIsXCJuY2pcIixcIm5ja1wiLFwibmNsXCIsXCJuY21cIixcIm5jblwiLFwibmNvXCIsXCJuY3BcIixcIm5jcVwiLFwibmNyXCIsXCJuY3NcIixcIm5jdFwiLFwibmN1XCIsXCJuY3hcIixcIm5jelwiLFwibmRhXCIsXCJuZGJcIixcIm5kY1wiLFwibmRkXCIsXCJuZGZcIixcIm5kZ1wiLFwibmRoXCIsXCJuZGlcIixcIm5kalwiLFwibmRrXCIsXCJuZGxcIixcIm5kbVwiLFwibmRuXCIsXCJuZHBcIixcIm5kcVwiLFwibmRyXCIsXCJuZHNcIixcIm5kdFwiLFwibmR1XCIsXCJuZHZcIixcIm5kd1wiLFwibmR4XCIsXCJuZHlcIixcIm5kelwiLFwibmVhXCIsXCJuZWJcIixcIm5lY1wiLFwibmVkXCIsXCJuZWVcIixcIm5lZlwiLFwibmVnXCIsXCJuZWhcIixcIm5laVwiLFwibmVqXCIsXCJuZWtcIixcIm5lbVwiLFwibmVuXCIsXCJuZW9cIixcIm5lcVwiLFwibmVyXCIsXCJuZXNcIixcIm5ldFwiLFwibmV1XCIsXCJuZXZcIixcIm5ld1wiLFwibmV4XCIsXCJuZXlcIixcIm5lelwiLFwibmZhXCIsXCJuZmRcIixcIm5mbFwiLFwibmZyXCIsXCJuZnVcIixcIm5nYVwiLFwibmdiXCIsXCJuZ2NcIixcIm5nZFwiLFwibmdlXCIsXCJuZ2ZcIixcIm5nZ1wiLFwibmdoXCIsXCJuZ2lcIixcIm5nalwiLFwibmdrXCIsXCJuZ2xcIixcIm5nbVwiLFwibmduXCIsXCJuZ29cIixcIm5ncFwiLFwibmdxXCIsXCJuZ3JcIixcIm5nc1wiLFwibmd0XCIsXCJuZ3VcIixcIm5ndlwiLFwibmd3XCIsXCJuZ3hcIixcIm5neVwiLFwibmd6XCIsXCJuaGFcIixcIm5oYlwiLFwibmhjXCIsXCJuaGRcIixcIm5oZVwiLFwibmhmXCIsXCJuaGdcIixcIm5oaFwiLFwibmhpXCIsXCJuaGtcIixcIm5obVwiLFwibmhuXCIsXCJuaG9cIixcIm5ocFwiLFwibmhxXCIsXCJuaHJcIixcIm5odFwiLFwibmh1XCIsXCJuaHZcIixcIm5od1wiLFwibmh4XCIsXCJuaHlcIixcIm5oelwiLFwibmlhXCIsXCJuaWJcIixcIm5pY1wiLFwibmlkXCIsXCJuaWVcIixcIm5pZlwiLFwibmlnXCIsXCJuaWhcIixcIm5paVwiLFwibmlqXCIsXCJuaWtcIixcIm5pbFwiLFwibmltXCIsXCJuaW5cIixcIm5pb1wiLFwibmlxXCIsXCJuaXJcIixcIm5pc1wiLFwibml0XCIsXCJuaXVcIixcIm5pdlwiLFwibml3XCIsXCJuaXhcIixcIm5peVwiLFwibml6XCIsXCJuamFcIixcIm5qYlwiLFwibmpkXCIsXCJuamhcIixcIm5qaVwiLFwibmpqXCIsXCJuamxcIixcIm5qbVwiLFwibmpuXCIsXCJuam9cIixcIm5qclwiLFwibmpzXCIsXCJuanRcIixcIm5qdVwiLFwibmp4XCIsXCJuanlcIixcIm5qelwiLFwibmthXCIsXCJua2JcIixcIm5rY1wiLFwibmtkXCIsXCJua2VcIixcIm5rZlwiLFwibmtnXCIsXCJua2hcIixcIm5raVwiLFwibmtqXCIsXCJua2tcIixcIm5rbVwiLFwibmtuXCIsXCJua29cIixcIm5rcFwiLFwibmtxXCIsXCJua3JcIixcIm5rc1wiLFwibmt0XCIsXCJua3VcIixcIm5rdlwiLFwibmt3XCIsXCJua3hcIixcIm5relwiLFwibmxhXCIsXCJubGNcIixcIm5sZVwiLFwibmxnXCIsXCJubGlcIixcIm5salwiLFwibmxrXCIsXCJubGxcIixcIm5sbVwiLFwibmxuXCIsXCJubG9cIixcIm5scVwiLFwibmxyXCIsXCJubHVcIixcIm5sdlwiLFwibmx3XCIsXCJubHhcIixcIm5seVwiLFwibmx6XCIsXCJubWFcIixcIm5tYlwiLFwibm1jXCIsXCJubWRcIixcIm5tZVwiLFwibm1mXCIsXCJubWdcIixcIm5taFwiLFwibm1pXCIsXCJubWpcIixcIm5ta1wiLFwibm1sXCIsXCJubW1cIixcIm5tblwiLFwibm1vXCIsXCJubXBcIixcIm5tcVwiLFwibm1yXCIsXCJubXNcIixcIm5tdFwiLFwibm11XCIsXCJubXZcIixcIm5td1wiLFwibm14XCIsXCJubXlcIixcIm5telwiLFwibm5hXCIsXCJubmJcIixcIm5uY1wiLFwibm5kXCIsXCJubmVcIixcIm5uZlwiLFwibm5nXCIsXCJubmhcIixcIm5uaVwiLFwibm5qXCIsXCJubmtcIixcIm5ubFwiLFwibm5tXCIsXCJubm5cIixcIm5ucFwiLFwibm5xXCIsXCJubnJcIixcIm5uc1wiLFwibm50XCIsXCJubnVcIixcIm5udlwiLFwibm53XCIsXCJubnhcIixcIm5ueVwiLFwibm56XCIsXCJub2FcIixcIm5vY1wiLFwibm9kXCIsXCJub2VcIixcIm5vZlwiLFwibm9nXCIsXCJub2hcIixcIm5vaVwiLFwibm9qXCIsXCJub2tcIixcIm5vbFwiLFwibm9tXCIsXCJub25cIixcIm5vb1wiLFwibm9wXCIsXCJub3FcIixcIm5vc1wiLFwibm90XCIsXCJub3VcIixcIm5vdlwiLFwibm93XCIsXCJub3lcIixcIm5velwiLFwibnBhXCIsXCJucGJcIixcIm5wZ1wiLFwibnBoXCIsXCJucGlcIixcIm5wbFwiLFwibnBuXCIsXCJucG9cIixcIm5wc1wiLFwibnB1XCIsXCJucHhcIixcIm5weVwiLFwibnFnXCIsXCJucWtcIixcIm5xbFwiLFwibnFtXCIsXCJucW5cIixcIm5xb1wiLFwibnFxXCIsXCJucXRcIixcIm5xeVwiLFwibnJhXCIsXCJucmJcIixcIm5yY1wiLFwibnJlXCIsXCJucmZcIixcIm5yZ1wiLFwibnJpXCIsXCJucmtcIixcIm5ybFwiLFwibnJtXCIsXCJucm5cIixcIm5ycFwiLFwibnJyXCIsXCJucnRcIixcIm5ydVwiLFwibnJ4XCIsXCJucnpcIixcIm5zYVwiLFwibnNiXCIsXCJuc2NcIixcIm5zZFwiLFwibnNlXCIsXCJuc2ZcIixcIm5zZ1wiLFwibnNoXCIsXCJuc2lcIixcIm5za1wiLFwibnNsXCIsXCJuc21cIixcIm5zblwiLFwibnNvXCIsXCJuc3BcIixcIm5zcVwiLFwibnNyXCIsXCJuc3NcIixcIm5zdFwiLFwibnN1XCIsXCJuc3ZcIixcIm5zd1wiLFwibnN4XCIsXCJuc3lcIixcIm5zelwiLFwibnRkXCIsXCJudGVcIixcIm50Z1wiLFwibnRpXCIsXCJudGpcIixcIm50a1wiLFwibnRtXCIsXCJudG9cIixcIm50cFwiLFwibnRyXCIsXCJudHNcIixcIm50dVwiLFwibnR3XCIsXCJudHhcIixcIm50eVwiLFwibnR6XCIsXCJudWFcIixcIm51YlwiLFwibnVjXCIsXCJudWRcIixcIm51ZVwiLFwibnVmXCIsXCJudWdcIixcIm51aFwiLFwibnVpXCIsXCJudWpcIixcIm51a1wiLFwibnVsXCIsXCJudW1cIixcIm51blwiLFwibnVvXCIsXCJudXBcIixcIm51cVwiLFwibnVyXCIsXCJudXNcIixcIm51dFwiLFwibnV1XCIsXCJudXZcIixcIm51d1wiLFwibnV4XCIsXCJudXlcIixcIm51elwiLFwibnZoXCIsXCJudm1cIixcIm52b1wiLFwibndhXCIsXCJud2JcIixcIm53Y1wiLFwibndlXCIsXCJud2dcIixcIm53aVwiLFwibndtXCIsXCJud29cIixcIm53clwiLFwibnd4XCIsXCJud3lcIixcIm54YVwiLFwibnhkXCIsXCJueGVcIixcIm54Z1wiLFwibnhpXCIsXCJueGtcIixcIm54bFwiLFwibnhtXCIsXCJueG5cIixcIm54b1wiLFwibnhxXCIsXCJueHJcIixcIm54dVwiLFwibnh4XCIsXCJueWJcIixcIm55Y1wiLFwibnlkXCIsXCJueWVcIixcIm55ZlwiLFwibnlnXCIsXCJueWhcIixcIm55aVwiLFwibnlqXCIsXCJueWtcIixcIm55bFwiLFwibnltXCIsXCJueW5cIixcIm55b1wiLFwibnlwXCIsXCJueXFcIixcIm55clwiLFwibnlzXCIsXCJueXRcIixcIm55dVwiLFwibnl2XCIsXCJueXdcIixcIm55eFwiLFwibnl5XCIsXCJuemFcIixcIm56YlwiLFwibnpkXCIsXCJuemlcIixcIm56a1wiLFwibnptXCIsXCJuenNcIixcIm56dVwiLFwibnp5XCIsXCJuenpcIl1cbixbIFwib2NcIixcIm9qXCIsXCJvbVwiLFwib3JcIixcIm9zXCIsXCJvYWFcIixcIm9hY1wiLFwib2FyXCIsXCJvYXZcIixcIm9iaVwiLFwib2JrXCIsXCJvYmxcIixcIm9ibVwiLFwib2JvXCIsXCJvYnJcIixcIm9idFwiLFwib2J1XCIsXCJvY2FcIixcIm9jaFwiLFwib2NtXCIsXCJvY29cIixcIm9jdVwiLFwib2RhXCIsXCJvZGtcIixcIm9kdFwiLFwib2R1XCIsXCJvZm9cIixcIm9mc1wiLFwib2Z1XCIsXCJvZ2JcIixcIm9nY1wiLFwib2dlXCIsXCJvZ2dcIixcIm9nb1wiLFwib2d1XCIsXCJvaHRcIixcIm9odVwiLFwib2lhXCIsXCJvaW5cIixcIm9qYlwiLFwib2pjXCIsXCJvamdcIixcIm9qcFwiLFwib2pzXCIsXCJvanZcIixcIm9qd1wiLFwib2thXCIsXCJva2JcIixcIm9rY1wiLFwib2tkXCIsXCJva2VcIixcIm9rZ1wiLFwib2toXCIsXCJva2lcIixcIm9ralwiLFwib2trXCIsXCJva2xcIixcIm9rbVwiLFwib2tuXCIsXCJva29cIixcIm9rclwiLFwib2tzXCIsXCJva3VcIixcIm9rdlwiLFwib2t4XCIsXCJva3pcIixcIm9sYVwiLFwib2xkXCIsXCJvbGVcIixcIm9sa1wiLFwib2xtXCIsXCJvbG9cIixcIm9sclwiLFwib2x0XCIsXCJvbHVcIixcIm9tYVwiLFwib21iXCIsXCJvbWNcIixcIm9tZVwiLFwib21nXCIsXCJvbWlcIixcIm9ta1wiLFwib21sXCIsXCJvbW5cIixcIm9tb1wiLFwib21wXCIsXCJvbXFcIixcIm9tclwiLFwib210XCIsXCJvbXVcIixcIm9tdlwiLFwib213XCIsXCJvbXhcIixcIm9teVwiLFwib25hXCIsXCJvbmJcIixcIm9uZVwiLFwib25nXCIsXCJvbmlcIixcIm9ualwiLFwib25rXCIsXCJvbm5cIixcIm9ub1wiLFwib25wXCIsXCJvbnJcIixcIm9uc1wiLFwib250XCIsXCJvbnVcIixcIm9ud1wiLFwib254XCIsXCJvb2RcIixcIm9vZ1wiLFwib29uXCIsXCJvb3JcIixcIm9vc1wiLFwib3BhXCIsXCJvcGtcIixcIm9wbVwiLFwib3BvXCIsXCJvcHRcIixcIm9weVwiLFwib3JhXCIsXCJvcmNcIixcIm9yZVwiLFwib3JnXCIsXCJvcmhcIixcIm9yblwiLFwib3JvXCIsXCJvcnJcIixcIm9yc1wiLFwib3J0XCIsXCJvcnVcIixcIm9ydlwiLFwib3J3XCIsXCJvcnhcIixcIm9yeVwiLFwib3J6XCIsXCJvc2FcIixcIm9zY1wiLFwib3NpXCIsXCJvc25cIixcIm9zb1wiLFwib3NwXCIsXCJvc3RcIixcIm9zdVwiLFwib3N4XCIsXCJvdGFcIixcIm90YlwiLFwib3RkXCIsXCJvdGVcIixcIm90aVwiLFwib3RrXCIsXCJvdGxcIixcIm90bVwiLFwib3RuXCIsXCJvdG9cIixcIm90cVwiLFwib3RyXCIsXCJvdHNcIixcIm90dFwiLFwib3R1XCIsXCJvdHdcIixcIm90eFwiLFwib3R5XCIsXCJvdHpcIixcIm91YVwiLFwib3ViXCIsXCJvdWVcIixcIm91aVwiLFwib3VtXCIsXCJvdW5cIixcIm92ZFwiLFwib3dpXCIsXCJvd2xcIixcIm95YlwiLFwib3lkXCIsXCJveW1cIixcIm95eVwiLFwib3ptXCJdXG4sWyBcInBhXCIsXCJwaVwiLFwicGxcIixcInBzXCIsXCJwdFwiLFwicGFhXCIsXCJwYWJcIixcInBhY1wiLFwicGFkXCIsXCJwYWVcIixcInBhZlwiLFwicGFnXCIsXCJwYWhcIixcInBhaVwiLFwicGFrXCIsXCJwYWxcIixcInBhbVwiLFwicGFvXCIsXCJwYXBcIixcInBhcVwiLFwicGFyXCIsXCJwYXNcIixcInBhdFwiLFwicGF1XCIsXCJwYXZcIixcInBhd1wiLFwicGF4XCIsXCJwYXlcIixcInBhelwiLFwicGJiXCIsXCJwYmNcIixcInBiZVwiLFwicGJmXCIsXCJwYmdcIixcInBiaFwiLFwicGJpXCIsXCJwYmxcIixcInBibVwiLFwicGJuXCIsXCJwYm9cIixcInBicFwiLFwicGJyXCIsXCJwYnNcIixcInBidFwiLFwicGJ1XCIsXCJwYnZcIixcInBieVwiLFwicGJ6XCIsXCJwY2FcIixcInBjYlwiLFwicGNjXCIsXCJwY2RcIixcInBjZVwiLFwicGNmXCIsXCJwY2dcIixcInBjaFwiLFwicGNpXCIsXCJwY2pcIixcInBja1wiLFwicGNsXCIsXCJwY21cIixcInBjblwiLFwicGNwXCIsXCJwY3JcIixcInBjd1wiLFwicGRhXCIsXCJwZGNcIixcInBkaVwiLFwicGRuXCIsXCJwZG9cIixcInBkdFwiLFwicGR1XCIsXCJwZWFcIixcInBlYlwiLFwicGVkXCIsXCJwZWVcIixcInBlZlwiLFwicGVnXCIsXCJwZWhcIixcInBlaVwiLFwicGVqXCIsXCJwZWtcIixcInBlbFwiLFwicGVtXCIsXCJwZW9cIixcInBlcFwiLFwicGVxXCIsXCJwZXNcIixcInBldlwiLFwicGV4XCIsXCJwZXlcIixcInBlelwiLFwicGZhXCIsXCJwZmVcIixcInBmbFwiLFwicGdhXCIsXCJwZ2RcIixcInBnZ1wiLFwicGdpXCIsXCJwZ2tcIixcInBnbFwiLFwicGduXCIsXCJwZ3NcIixcInBndVwiLFwicGd5XCIsXCJwZ3pcIixcInBoYVwiLFwicGhkXCIsXCJwaGdcIixcInBoaFwiLFwicGhpXCIsXCJwaGtcIixcInBobFwiLFwicGhtXCIsXCJwaG5cIixcInBob1wiLFwicGhxXCIsXCJwaHJcIixcInBodFwiLFwicGh1XCIsXCJwaHZcIixcInBod1wiLFwicGlhXCIsXCJwaWJcIixcInBpY1wiLFwicGlkXCIsXCJwaWVcIixcInBpZlwiLFwicGlnXCIsXCJwaWhcIixcInBpaVwiLFwicGlqXCIsXCJwaWxcIixcInBpbVwiLFwicGluXCIsXCJwaW9cIixcInBpcFwiLFwicGlyXCIsXCJwaXNcIixcInBpdFwiLFwicGl1XCIsXCJwaXZcIixcInBpd1wiLFwicGl4XCIsXCJwaXlcIixcInBpelwiLFwicGp0XCIsXCJwa2FcIixcInBrYlwiLFwicGtjXCIsXCJwa2dcIixcInBraFwiLFwicGtuXCIsXCJwa29cIixcInBrcFwiLFwicGtyXCIsXCJwa3NcIixcInBrdFwiLFwicGt1XCIsXCJwbGFcIixcInBsYlwiLFwicGxjXCIsXCJwbGRcIixcInBsZVwiLFwicGxmXCIsXCJwbGdcIixcInBsaFwiLFwicGxqXCIsXCJwbGtcIixcInBsbFwiLFwicGxuXCIsXCJwbG9cIixcInBscFwiLFwicGxxXCIsXCJwbHJcIixcInBsc1wiLFwicGx0XCIsXCJwbHVcIixcInBsdlwiLFwicGx3XCIsXCJwbHlcIixcInBselwiLFwicG1hXCIsXCJwbWJcIixcInBtY1wiLFwicG1kXCIsXCJwbWVcIixcInBtZlwiLFwicG1oXCIsXCJwbWlcIixcInBtalwiLFwicG1rXCIsXCJwbWxcIixcInBtbVwiLFwicG1uXCIsXCJwbW9cIixcInBtcVwiLFwicG1yXCIsXCJwbXNcIixcInBtdFwiLFwicG11XCIsXCJwbXdcIixcInBteFwiLFwicG15XCIsXCJwbXpcIixcInBuYVwiLFwicG5iXCIsXCJwbmNcIixcInBuZFwiLFwicG5lXCIsXCJwbmdcIixcInBuaFwiLFwicG5pXCIsXCJwbmpcIixcInBua1wiLFwicG5sXCIsXCJwbm1cIixcInBublwiLFwicG5vXCIsXCJwbnBcIixcInBucVwiLFwicG5yXCIsXCJwbnNcIixcInBudFwiLFwicG51XCIsXCJwbnZcIixcInBud1wiLFwicG54XCIsXCJwbnlcIixcInBuelwiLFwicG9jXCIsXCJwb2RcIixcInBvZVwiLFwicG9mXCIsXCJwb2dcIixcInBvaFwiLFwicG9pXCIsXCJwb2tcIixcInBvbVwiLFwicG9uXCIsXCJwb29cIixcInBvcFwiLFwicG9xXCIsXCJwb3NcIixcInBvdFwiLFwicG92XCIsXCJwb3dcIixcInBveFwiLFwicG95XCIsXCJwb3pcIixcInBwYVwiLFwicHBlXCIsXCJwcGlcIixcInBwa1wiLFwicHBsXCIsXCJwcG1cIixcInBwblwiLFwicHBvXCIsXCJwcHBcIixcInBwcVwiLFwicHByXCIsXCJwcHNcIixcInBwdFwiLFwicHB1XCIsXCJwcWFcIixcInBxZVwiLFwicHFtXCIsXCJwcXdcIixcInByYVwiLFwicHJiXCIsXCJwcmNcIixcInByZFwiLFwicHJlXCIsXCJwcmZcIixcInByZ1wiLFwicHJoXCIsXCJwcmlcIixcInBya1wiLFwicHJsXCIsXCJwcm1cIixcInByblwiLFwicHJvXCIsXCJwcnBcIixcInBycVwiLFwicHJyXCIsXCJwcnNcIixcInBydFwiLFwicHJ1XCIsXCJwcndcIixcInByeFwiLFwicHJ5XCIsXCJwcnpcIixcInBzYVwiLFwicHNjXCIsXCJwc2RcIixcInBzZVwiLFwicHNnXCIsXCJwc2hcIixcInBzaVwiLFwicHNsXCIsXCJwc21cIixcInBzblwiLFwicHNvXCIsXCJwc3BcIixcInBzcVwiLFwicHNyXCIsXCJwc3NcIixcInBzdFwiLFwicHN1XCIsXCJwc3dcIixcInBzeVwiLFwicHRhXCIsXCJwdGhcIixcInB0aVwiLFwicHRuXCIsXCJwdG9cIixcInB0cFwiLFwicHRxXCIsXCJwdHJcIixcInB0dFwiLFwicHR1XCIsXCJwdHZcIixcInB0d1wiLFwicHR5XCIsXCJwdWFcIixcInB1YlwiLFwicHVjXCIsXCJwdWRcIixcInB1ZVwiLFwicHVmXCIsXCJwdWdcIixcInB1aVwiLFwicHVqXCIsXCJwdWtcIixcInB1bVwiLFwicHVvXCIsXCJwdXBcIixcInB1cVwiLFwicHVyXCIsXCJwdXRcIixcInB1dVwiLFwicHV3XCIsXCJwdXhcIixcInB1eVwiLFwicHV6XCIsXCJwd2FcIixcInB3YlwiLFwicHdnXCIsXCJwd2lcIixcInB3bVwiLFwicHduXCIsXCJwd29cIixcInB3clwiLFwicHd3XCIsXCJweG1cIixcInB5ZVwiLFwicHltXCIsXCJweW5cIixcInB5c1wiLFwicHl1XCIsXCJweXhcIixcInB5eVwiLFwicHpuXCJdXG4sWyBcInF1XCIsXCJxdWFcIixcInF1YlwiLFwicXVjXCIsXCJxdWRcIixcInF1ZlwiLFwicXVnXCIsXCJxdWhcIixcInF1aVwiLFwicXVrXCIsXCJxdWxcIixcInF1bVwiLFwicXVuXCIsXCJxdXBcIixcInF1cVwiLFwicXVyXCIsXCJxdXNcIixcInF1dlwiLFwicXV3XCIsXCJxdXhcIixcInF1eVwiLFwicXV6XCIsXCJxdmFcIixcInF2Y1wiLFwicXZlXCIsXCJxdmhcIixcInF2aVwiLFwicXZqXCIsXCJxdmxcIixcInF2bVwiLFwicXZuXCIsXCJxdm9cIixcInF2cFwiLFwicXZzXCIsXCJxdndcIixcInF2eVwiLFwicXZ6XCIsXCJxd2FcIixcInF3Y1wiLFwicXdlXCIsXCJxd2hcIixcInF3bVwiLFwicXdzXCIsXCJxd3RcIixcInF4YVwiLFwicXhjXCIsXCJxeGhcIixcInF4bFwiLFwicXhuXCIsXCJxeG9cIixcInF4cFwiLFwicXhxXCIsXCJxeHJcIixcInF4c1wiLFwicXh0XCIsXCJxeHVcIixcInF4d1wiLFwicXlhXCIsXCJxeXBcIl1cbixbIFwicm1cIixcInJuXCIsXCJyb1wiLFwicnVcIixcInJ3XCIsXCJyYWFcIixcInJhYlwiLFwicmFjXCIsXCJyYWRcIixcInJhZlwiLFwicmFnXCIsXCJyYWhcIixcInJhaVwiLFwicmFqXCIsXCJyYWtcIixcInJhbFwiLFwicmFtXCIsXCJyYW5cIixcInJhb1wiLFwicmFwXCIsXCJyYXFcIixcInJhclwiLFwicmFzXCIsXCJyYXRcIixcInJhdVwiLFwicmF2XCIsXCJyYXdcIixcInJheFwiLFwicmF5XCIsXCJyYXpcIixcInJiYlwiLFwicmJrXCIsXCJyYmxcIixcInJicFwiLFwicmNmXCIsXCJyZGJcIixcInJlYVwiLFwicmViXCIsXCJyZWVcIixcInJlZ1wiLFwicmVpXCIsXCJyZWpcIixcInJlbFwiLFwicmVtXCIsXCJyZW5cIixcInJlclwiLFwicmVzXCIsXCJyZXRcIixcInJleVwiLFwicmdhXCIsXCJyZ2VcIixcInJna1wiLFwicmduXCIsXCJyZ3JcIixcInJnc1wiLFwicmd1XCIsXCJyaGdcIixcInJocFwiLFwicmlhXCIsXCJyaWVcIixcInJpZlwiLFwicmlsXCIsXCJyaW1cIixcInJpblwiLFwicmlyXCIsXCJyaXRcIixcInJpdVwiLFwicmpnXCIsXCJyamlcIixcInJqc1wiLFwicmthXCIsXCJya2JcIixcInJraFwiLFwicmtpXCIsXCJya21cIixcInJrdFwiLFwicmt3XCIsXCJybWFcIixcInJtYlwiLFwicm1jXCIsXCJybWRcIixcInJtZVwiLFwicm1mXCIsXCJybWdcIixcInJtaFwiLFwicm1pXCIsXCJybWtcIixcInJtbFwiLFwicm1tXCIsXCJybW5cIixcInJtb1wiLFwicm1wXCIsXCJybXFcIixcInJtclwiLFwicm1zXCIsXCJybXRcIixcInJtdVwiLFwicm12XCIsXCJybXdcIixcInJteFwiLFwicm15XCIsXCJybXpcIixcInJuYVwiLFwicm5kXCIsXCJybmdcIixcInJubFwiLFwicm5uXCIsXCJybnBcIixcInJuclwiLFwicm53XCIsXCJyb2FcIixcInJvYlwiLFwicm9jXCIsXCJyb2RcIixcInJvZVwiLFwicm9mXCIsXCJyb2dcIixcInJvbFwiLFwicm9tXCIsXCJyb29cIixcInJvcFwiLFwicm9yXCIsXCJyb3VcIixcInJvd1wiLFwicnBuXCIsXCJycHRcIixcInJyaVwiLFwicnJvXCIsXCJycnRcIixcInJzYlwiLFwicnNpXCIsXCJyc2xcIixcInJzbVwiLFwicnRjXCIsXCJydGhcIixcInJ0bVwiLFwicnRzXCIsXCJydHdcIixcInJ1YlwiLFwicnVjXCIsXCJydWVcIixcInJ1ZlwiLFwicnVnXCIsXCJydWhcIixcInJ1aVwiLFwicnVrXCIsXCJydW9cIixcInJ1cFwiLFwicnVxXCIsXCJydXRcIixcInJ1dVwiLFwicnV5XCIsXCJydXpcIixcInJ3YVwiLFwicndrXCIsXCJyd2xcIixcInJ3bVwiLFwicndvXCIsXCJyd3JcIixcInJ4ZFwiLFwicnh3XCIsXCJyeW5cIixcInJ5c1wiLFwicnl1XCIsXCJyemhcIl1cbixbIFwic2FcIixcInNjXCIsXCJzZFwiLFwic2VcIixcInNnXCIsXCJzaFwiLFwic2lcIixcInNrXCIsXCJzbFwiLFwic21cIixcInNuXCIsXCJzb1wiLFwic3FcIixcInNyXCIsXCJzc1wiLFwic3RcIixcInN1XCIsXCJzdlwiLFwic3dcIixcInNhYVwiLFwic2FiXCIsXCJzYWNcIixcInNhZFwiLFwic2FlXCIsXCJzYWZcIixcInNhaFwiLFwic2FpXCIsXCJzYWpcIixcInNha1wiLFwic2FsXCIsXCJzYW1cIixcInNhb1wiLFwic2FwXCIsXCJzYXFcIixcInNhclwiLFwic2FzXCIsXCJzYXRcIixcInNhdVwiLFwic2F2XCIsXCJzYXdcIixcInNheFwiLFwic2F5XCIsXCJzYXpcIixcInNiYVwiLFwic2JiXCIsXCJzYmNcIixcInNiZFwiLFwic2JlXCIsXCJzYmZcIixcInNiZ1wiLFwic2JoXCIsXCJzYmlcIixcInNialwiLFwic2JrXCIsXCJzYmxcIixcInNibVwiLFwic2JuXCIsXCJzYm9cIixcInNicFwiLFwic2JxXCIsXCJzYnJcIixcInNic1wiLFwic2J0XCIsXCJzYnVcIixcInNidlwiLFwic2J3XCIsXCJzYnhcIixcInNieVwiLFwic2J6XCIsXCJzY2FcIixcInNjYlwiLFwic2NlXCIsXCJzY2ZcIixcInNjZ1wiLFwic2NoXCIsXCJzY2lcIixcInNja1wiLFwic2NsXCIsXCJzY25cIixcInNjb1wiLFwic2NwXCIsXCJzY3FcIixcInNjc1wiLFwic2N0XCIsXCJzY3VcIixcInNjdlwiLFwic2N3XCIsXCJzY3hcIixcInNkYVwiLFwic2RiXCIsXCJzZGNcIixcInNkZVwiLFwic2RmXCIsXCJzZGdcIixcInNkaFwiLFwic2RqXCIsXCJzZGtcIixcInNkbFwiLFwic2RtXCIsXCJzZG5cIixcInNkb1wiLFwic2RwXCIsXCJzZHFcIixcInNkclwiLFwic2RzXCIsXCJzZHRcIixcInNkdVwiLFwic2R2XCIsXCJzZHhcIixcInNkelwiLFwic2VhXCIsXCJzZWJcIixcInNlY1wiLFwic2VkXCIsXCJzZWVcIixcInNlZlwiLFwic2VnXCIsXCJzZWhcIixcInNlaVwiLFwic2VqXCIsXCJzZWtcIixcInNlbFwiLFwic2VtXCIsXCJzZW5cIixcInNlb1wiLFwic2VwXCIsXCJzZXFcIixcInNlclwiLFwic2VzXCIsXCJzZXRcIixcInNldVwiLFwic2V2XCIsXCJzZXdcIixcInNleVwiLFwic2V6XCIsXCJzZmJcIixcInNmZVwiLFwic2ZtXCIsXCJzZnNcIixcInNmd1wiLFwic2dhXCIsXCJzZ2JcIixcInNnY1wiLFwic2dkXCIsXCJzZ2VcIixcInNnZ1wiLFwic2doXCIsXCJzZ2lcIixcInNnalwiLFwic2drXCIsXCJzZ2xcIixcInNnbVwiLFwic2duXCIsXCJzZ29cIixcInNncFwiLFwic2dyXCIsXCJzZ3NcIixcInNndFwiLFwic2d1XCIsXCJzZ3dcIixcInNneFwiLFwic2d5XCIsXCJzZ3pcIixcInNoYVwiLFwic2hiXCIsXCJzaGNcIixcInNoZFwiLFwic2hlXCIsXCJzaGdcIixcInNoaFwiLFwic2hpXCIsXCJzaGpcIixcInNoa1wiLFwic2hsXCIsXCJzaG1cIixcInNoblwiLFwic2hvXCIsXCJzaHBcIixcInNocVwiLFwic2hyXCIsXCJzaHNcIixcInNodFwiLFwic2h1XCIsXCJzaHZcIixcInNod1wiLFwic2h4XCIsXCJzaHlcIixcInNoelwiLFwic2lhXCIsXCJzaWJcIixcInNpZFwiLFwic2llXCIsXCJzaWZcIixcInNpZ1wiLFwic2loXCIsXCJzaWlcIixcInNpalwiLFwic2lrXCIsXCJzaWxcIixcInNpbVwiLFwic2lvXCIsXCJzaXBcIixcInNpcVwiLFwic2lyXCIsXCJzaXNcIixcInNpdFwiLFwic2l1XCIsXCJzaXZcIixcInNpd1wiLFwic2l4XCIsXCJzaXlcIixcInNpelwiLFwic2phXCIsXCJzamJcIixcInNqZFwiLFwic2plXCIsXCJzamdcIixcInNqa1wiLFwic2psXCIsXCJzam1cIixcInNqblwiLFwic2pvXCIsXCJzanBcIixcInNqclwiLFwic2pzXCIsXCJzanRcIixcInNqdVwiLFwic2p3XCIsXCJza2FcIixcInNrYlwiLFwic2tjXCIsXCJza2RcIixcInNrZVwiLFwic2tmXCIsXCJza2dcIixcInNraFwiLFwic2tpXCIsXCJza2pcIixcInNra1wiLFwic2ttXCIsXCJza25cIixcInNrb1wiLFwic2twXCIsXCJza3FcIixcInNrclwiLFwic2tzXCIsXCJza3RcIixcInNrdVwiLFwic2t2XCIsXCJza3dcIixcInNreFwiLFwic2t5XCIsXCJza3pcIixcInNsYVwiLFwic2xjXCIsXCJzbGRcIixcInNsZVwiLFwic2xmXCIsXCJzbGdcIixcInNsaFwiLFwic2xpXCIsXCJzbGpcIixcInNsbFwiLFwic2xtXCIsXCJzbG5cIixcInNscFwiLFwic2xxXCIsXCJzbHJcIixcInNsc1wiLFwic2x0XCIsXCJzbHVcIixcInNsd1wiLFwic2x4XCIsXCJzbHlcIixcInNselwiLFwic21hXCIsXCJzbWJcIixcInNtY1wiLFwic21kXCIsXCJzbWZcIixcInNtZ1wiLFwic21oXCIsXCJzbWlcIixcInNtalwiLFwic21rXCIsXCJzbWxcIixcInNtbVwiLFwic21uXCIsXCJzbXBcIixcInNtcVwiLFwic21yXCIsXCJzbXNcIixcInNtdFwiLFwic211XCIsXCJzbXZcIixcInNtd1wiLFwic214XCIsXCJzbXlcIixcInNtelwiLFwic25iXCIsXCJzbmNcIixcInNuZVwiLFwic25mXCIsXCJzbmdcIixcInNuaFwiLFwic25pXCIsXCJzbmpcIixcInNua1wiLFwic25sXCIsXCJzbm1cIixcInNublwiLFwic25vXCIsXCJzbnBcIixcInNucVwiLFwic25yXCIsXCJzbnNcIixcInNudVwiLFwic252XCIsXCJzbndcIixcInNueFwiLFwic255XCIsXCJzbnpcIixcInNvYVwiLFwic29iXCIsXCJzb2NcIixcInNvZFwiLFwic29lXCIsXCJzb2dcIixcInNvaFwiLFwic29pXCIsXCJzb2pcIixcInNva1wiLFwic29sXCIsXCJzb25cIixcInNvb1wiLFwic29wXCIsXCJzb3FcIixcInNvclwiLFwic29zXCIsXCJzb3VcIixcInNvdlwiLFwic293XCIsXCJzb3hcIixcInNveVwiLFwic296XCIsXCJzcGJcIixcInNwY1wiLFwic3BkXCIsXCJzcGVcIixcInNwZ1wiLFwic3BpXCIsXCJzcGtcIixcInNwbFwiLFwic3BtXCIsXCJzcG5cIixcInNwb1wiLFwic3BwXCIsXCJzcHFcIixcInNwclwiLFwic3BzXCIsXCJzcHRcIixcInNwdVwiLFwic3B2XCIsXCJzcHhcIixcInNweVwiLFwic3FhXCIsXCJzcWhcIixcInNxalwiLFwic3FrXCIsXCJzcW1cIixcInNxblwiLFwic3FvXCIsXCJzcXFcIixcInNxclwiLFwic3FzXCIsXCJzcXRcIixcInNxdVwiLFwic3F4XCIsXCJzcmFcIixcInNyYlwiLFwic3JjXCIsXCJzcmVcIixcInNyZlwiLFwic3JnXCIsXCJzcmhcIixcInNyaVwiLFwic3JrXCIsXCJzcmxcIixcInNybVwiLFwic3JuXCIsXCJzcm9cIixcInNycVwiLFwic3JyXCIsXCJzcnNcIixcInNydFwiLFwic3J1XCIsXCJzcnZcIixcInNyd1wiLFwic3J4XCIsXCJzcnlcIixcInNyelwiLFwic3NhXCIsXCJzc2JcIixcInNzY1wiLFwic3NkXCIsXCJzc2VcIixcInNzZlwiLFwic3NnXCIsXCJzc2hcIixcInNzaVwiLFwic3NqXCIsXCJzc2tcIixcInNzbFwiLFwic3NtXCIsXCJzc25cIixcInNzb1wiLFwic3NwXCIsXCJzc3FcIixcInNzclwiLFwic3NzXCIsXCJzc3RcIixcInNzdVwiLFwic3N2XCIsXCJzc3hcIixcInNzeVwiLFwic3N6XCIsXCJzdGFcIixcInN0YlwiLFwic3RkXCIsXCJzdGVcIixcInN0ZlwiLFwic3RnXCIsXCJzdGhcIixcInN0aVwiLFwic3RqXCIsXCJzdGtcIixcInN0bFwiLFwic3RtXCIsXCJzdG5cIixcInN0b1wiLFwic3RwXCIsXCJzdHFcIixcInN0clwiLFwic3RzXCIsXCJzdHRcIixcInN0dVwiLFwic3R2XCIsXCJzdHdcIixcInN0eVwiLFwic3VhXCIsXCJzdWJcIixcInN1Y1wiLFwic3VlXCIsXCJzdWdcIixcInN1aVwiLFwic3VqXCIsXCJzdWtcIixcInN1bFwiLFwic3VtXCIsXCJzdW9cIixcInN1cVwiLFwic3VyXCIsXCJzdXNcIixcInN1dFwiLFwic3V2XCIsXCJzdXdcIixcInN1eFwiLFwic3V5XCIsXCJzdXpcIixcInN2YVwiLFwic3ZiXCIsXCJzdmNcIixcInN2ZVwiLFwic3ZrXCIsXCJzdm1cIixcInN2clwiLFwic3ZzXCIsXCJzdnhcIixcInN3YlwiLFwic3djXCIsXCJzd2ZcIixcInN3Z1wiLFwic3doXCIsXCJzd2lcIixcInN3alwiLFwic3drXCIsXCJzd2xcIixcInN3bVwiLFwic3duXCIsXCJzd29cIixcInN3cFwiLFwic3dxXCIsXCJzd3JcIixcInN3c1wiLFwic3d0XCIsXCJzd3VcIixcInN3dlwiLFwic3d3XCIsXCJzd3hcIixcInN3eVwiLFwic3hiXCIsXCJzeGNcIixcInN4ZVwiLFwic3hnXCIsXCJzeGtcIixcInN4bFwiLFwic3htXCIsXCJzeG5cIixcInN4b1wiLFwic3hyXCIsXCJzeHNcIixcInN4dVwiLFwic3h3XCIsXCJzeWFcIixcInN5YlwiLFwic3ljXCIsXCJzeWRcIixcInN5aVwiLFwic3lrXCIsXCJzeWxcIixcInN5bVwiLFwic3luXCIsXCJzeW9cIixcInN5clwiLFwic3lzXCIsXCJzeXdcIixcInN5eFwiLFwic3l5XCIsXCJzemFcIixcInN6YlwiLFwic3pjXCIsXCJzemRcIixcInN6ZVwiLFwic3pnXCIsXCJzemxcIixcInN6blwiLFwic3pwXCIsXCJzenNcIixcInN6dlwiLFwic3p3XCIsXCJzenlcIl1cbixbIFwidGFcIixcInRlXCIsXCJ0Z1wiLFwidGhcIixcInRpXCIsXCJ0a1wiLFwidGxcIixcInRuXCIsXCJ0b1wiLFwidHJcIixcInRzXCIsXCJ0dFwiLFwidHdcIixcInR5XCIsXCJ0YWFcIixcInRhYlwiLFwidGFjXCIsXCJ0YWRcIixcInRhZVwiLFwidGFmXCIsXCJ0YWdcIixcInRhaVwiLFwidGFqXCIsXCJ0YWtcIixcInRhbFwiLFwidGFuXCIsXCJ0YW9cIixcInRhcFwiLFwidGFxXCIsXCJ0YXJcIixcInRhc1wiLFwidGF1XCIsXCJ0YXZcIixcInRhd1wiLFwidGF4XCIsXCJ0YXlcIixcInRhelwiLFwidGJhXCIsXCJ0YmJcIixcInRiY1wiLFwidGJkXCIsXCJ0YmVcIixcInRiZlwiLFwidGJnXCIsXCJ0YmhcIixcInRiaVwiLFwidGJqXCIsXCJ0YmtcIixcInRibFwiLFwidGJtXCIsXCJ0Ym5cIixcInRib1wiLFwidGJwXCIsXCJ0YnFcIixcInRiclwiLFwidGJzXCIsXCJ0YnRcIixcInRidVwiLFwidGJ2XCIsXCJ0YndcIixcInRieFwiLFwidGJ5XCIsXCJ0YnpcIixcInRjYVwiLFwidGNiXCIsXCJ0Y2NcIixcInRjZFwiLFwidGNlXCIsXCJ0Y2ZcIixcInRjZ1wiLFwidGNoXCIsXCJ0Y2lcIixcInRja1wiLFwidGNsXCIsXCJ0Y21cIixcInRjblwiLFwidGNvXCIsXCJ0Y3BcIixcInRjcVwiLFwidGNzXCIsXCJ0Y3RcIixcInRjdVwiLFwidGN3XCIsXCJ0Y3hcIixcInRjeVwiLFwidGN6XCIsXCJ0ZGFcIixcInRkYlwiLFwidGRjXCIsXCJ0ZGRcIixcInRkZVwiLFwidGRmXCIsXCJ0ZGdcIixcInRkaFwiLFwidGRpXCIsXCJ0ZGpcIixcInRka1wiLFwidGRsXCIsXCJ0ZG1cIixcInRkblwiLFwidGRvXCIsXCJ0ZHFcIixcInRkclwiLFwidGRzXCIsXCJ0ZHRcIixcInRkdVwiLFwidGR2XCIsXCJ0ZHhcIixcInRkeVwiLFwidGVhXCIsXCJ0ZWJcIixcInRlY1wiLFwidGVkXCIsXCJ0ZWVcIixcInRlZlwiLFwidGVnXCIsXCJ0ZWhcIixcInRlaVwiLFwidGVrXCIsXCJ0ZW1cIixcInRlblwiLFwidGVvXCIsXCJ0ZXBcIixcInRlcVwiLFwidGVyXCIsXCJ0ZXNcIixcInRldFwiLFwidGV1XCIsXCJ0ZXZcIixcInRld1wiLFwidGV4XCIsXCJ0ZXlcIixcInRlelwiLFwidGZpXCIsXCJ0Zm5cIixcInRmb1wiLFwidGZyXCIsXCJ0ZnRcIixcInRnYVwiLFwidGdiXCIsXCJ0Z2NcIixcInRnZFwiLFwidGdlXCIsXCJ0Z2ZcIixcInRnZ1wiLFwidGdoXCIsXCJ0Z2lcIixcInRnalwiLFwidGduXCIsXCJ0Z29cIixcInRncFwiLFwidGdxXCIsXCJ0Z3JcIixcInRnc1wiLFwidGd0XCIsXCJ0Z3VcIixcInRndlwiLFwidGd3XCIsXCJ0Z3hcIixcInRneVwiLFwidGd6XCIsXCJ0aGNcIixcInRoZFwiLFwidGhlXCIsXCJ0aGZcIixcInRoaFwiLFwidGhpXCIsXCJ0aGtcIixcInRobFwiLFwidGhtXCIsXCJ0aG5cIixcInRocFwiLFwidGhxXCIsXCJ0aHJcIixcInRoc1wiLFwidGh0XCIsXCJ0aHVcIixcInRodlwiLFwidGh3XCIsXCJ0aHhcIixcInRoeVwiLFwidGh6XCIsXCJ0aWFcIixcInRpY1wiLFwidGlkXCIsXCJ0aWVcIixcInRpZlwiLFwidGlnXCIsXCJ0aWhcIixcInRpaVwiLFwidGlqXCIsXCJ0aWtcIixcInRpbFwiLFwidGltXCIsXCJ0aW5cIixcInRpb1wiLFwidGlwXCIsXCJ0aXFcIixcInRpc1wiLFwidGl0XCIsXCJ0aXVcIixcInRpdlwiLFwidGl3XCIsXCJ0aXhcIixcInRpeVwiLFwidGl6XCIsXCJ0amFcIixcInRqZ1wiLFwidGppXCIsXCJ0ampcIixcInRqbFwiLFwidGptXCIsXCJ0am5cIixcInRqb1wiLFwidGpwXCIsXCJ0anNcIixcInRqdVwiLFwidGp3XCIsXCJ0a2FcIixcInRrYlwiLFwidGtkXCIsXCJ0a2VcIixcInRrZlwiLFwidGtnXCIsXCJ0a2tcIixcInRrbFwiLFwidGttXCIsXCJ0a25cIixcInRrcFwiLFwidGtxXCIsXCJ0a3JcIixcInRrc1wiLFwidGt0XCIsXCJ0a3VcIixcInRrdlwiLFwidGt3XCIsXCJ0a3hcIixcInRrelwiLFwidGxhXCIsXCJ0bGJcIixcInRsY1wiLFwidGxkXCIsXCJ0bGZcIixcInRsZ1wiLFwidGxoXCIsXCJ0bGlcIixcInRsalwiLFwidGxrXCIsXCJ0bGxcIixcInRsbVwiLFwidGxuXCIsXCJ0bG9cIixcInRscFwiLFwidGxxXCIsXCJ0bHJcIixcInRsc1wiLFwidGx0XCIsXCJ0bHVcIixcInRsdlwiLFwidGx3XCIsXCJ0bHhcIixcInRseVwiLFwidG1hXCIsXCJ0bWJcIixcInRtY1wiLFwidG1kXCIsXCJ0bWVcIixcInRtZlwiLFwidG1nXCIsXCJ0bWhcIixcInRtaVwiLFwidG1qXCIsXCJ0bWtcIixcInRtbFwiLFwidG1tXCIsXCJ0bW5cIixcInRtb1wiLFwidG1wXCIsXCJ0bXFcIixcInRtclwiLFwidG1zXCIsXCJ0bXRcIixcInRtdVwiLFwidG12XCIsXCJ0bXdcIixcInRteVwiLFwidG16XCIsXCJ0bmFcIixcInRuYlwiLFwidG5jXCIsXCJ0bmRcIixcInRuZVwiLFwidG5mXCIsXCJ0bmdcIixcInRuaFwiLFwidG5pXCIsXCJ0bmtcIixcInRubFwiLFwidG5tXCIsXCJ0bm5cIixcInRub1wiLFwidG5wXCIsXCJ0bnFcIixcInRuclwiLFwidG5zXCIsXCJ0bnRcIixcInRudVwiLFwidG52XCIsXCJ0bndcIixcInRueFwiLFwidG55XCIsXCJ0bnpcIixcInRvYlwiLFwidG9jXCIsXCJ0b2RcIixcInRvZVwiLFwidG9mXCIsXCJ0b2dcIixcInRvaFwiLFwidG9pXCIsXCJ0b2pcIixcInRvbFwiLFwidG9tXCIsXCJ0b29cIixcInRvcFwiLFwidG9xXCIsXCJ0b3JcIixcInRvc1wiLFwidG91XCIsXCJ0b3ZcIixcInRvd1wiLFwidG94XCIsXCJ0b3lcIixcInRvelwiLFwidHBhXCIsXCJ0cGNcIixcInRwZVwiLFwidHBmXCIsXCJ0cGdcIixcInRwaVwiLFwidHBqXCIsXCJ0cGtcIixcInRwbFwiLFwidHBtXCIsXCJ0cG5cIixcInRwb1wiLFwidHBwXCIsXCJ0cHFcIixcInRwclwiLFwidHB0XCIsXCJ0cHVcIixcInRwdlwiLFwidHB3XCIsXCJ0cHhcIixcInRweVwiLFwidHB6XCIsXCJ0cWJcIixcInRxbFwiLFwidHFtXCIsXCJ0cW5cIixcInRxb1wiLFwidHFwXCIsXCJ0cXFcIixcInRxclwiLFwidHF0XCIsXCJ0cXVcIixcInRxd1wiLFwidHJhXCIsXCJ0cmJcIixcInRyY1wiLFwidHJkXCIsXCJ0cmVcIixcInRyZlwiLFwidHJnXCIsXCJ0cmhcIixcInRyaVwiLFwidHJqXCIsXCJ0cmtcIixcInRybFwiLFwidHJtXCIsXCJ0cm5cIixcInRyb1wiLFwidHJwXCIsXCJ0cnFcIixcInRyclwiLFwidHJzXCIsXCJ0cnRcIixcInRydVwiLFwidHJ2XCIsXCJ0cndcIixcInRyeFwiLFwidHJ5XCIsXCJ0cnpcIixcInRzYVwiLFwidHNiXCIsXCJ0c2NcIixcInRzZFwiLFwidHNlXCIsXCJ0c2ZcIixcInRzZ1wiLFwidHNoXCIsXCJ0c2lcIixcInRzalwiLFwidHNrXCIsXCJ0c2xcIixcInRzbVwiLFwidHNwXCIsXCJ0c3FcIixcInRzclwiLFwidHNzXCIsXCJ0c3RcIixcInRzdVwiLFwidHN2XCIsXCJ0c3dcIixcInRzeFwiLFwidHN5XCIsXCJ0c3pcIixcInR0YVwiLFwidHRiXCIsXCJ0dGNcIixcInR0ZFwiLFwidHRlXCIsXCJ0dGZcIixcInR0Z1wiLFwidHRoXCIsXCJ0dGlcIixcInR0alwiLFwidHRrXCIsXCJ0dGxcIixcInR0bVwiLFwidHRuXCIsXCJ0dG9cIixcInR0cFwiLFwidHRxXCIsXCJ0dHJcIixcInR0c1wiLFwidHR0XCIsXCJ0dHVcIixcInR0dlwiLFwidHR3XCIsXCJ0dHlcIixcInR0elwiLFwidHVhXCIsXCJ0dWJcIixcInR1Y1wiLFwidHVkXCIsXCJ0dWVcIixcInR1ZlwiLFwidHVnXCIsXCJ0dWhcIixcInR1aVwiLFwidHVqXCIsXCJ0dWxcIixcInR1bVwiLFwidHVuXCIsXCJ0dW9cIixcInR1cFwiLFwidHVxXCIsXCJ0dXNcIixcInR1dFwiLFwidHV1XCIsXCJ0dXZcIixcInR1d1wiLFwidHV4XCIsXCJ0dXlcIixcInR1elwiLFwidHZhXCIsXCJ0dmRcIixcInR2ZVwiLFwidHZrXCIsXCJ0dmxcIixcInR2bVwiLFwidHZuXCIsXCJ0dm9cIixcInR2c1wiLFwidHZ0XCIsXCJ0dnVcIixcInR2d1wiLFwidHZ4XCIsXCJ0dnlcIixcInR3YVwiLFwidHdiXCIsXCJ0d2NcIixcInR3ZFwiLFwidHdlXCIsXCJ0d2ZcIixcInR3Z1wiLFwidHdoXCIsXCJ0d2xcIixcInR3bVwiLFwidHduXCIsXCJ0d29cIixcInR3cFwiLFwidHdxXCIsXCJ0d3JcIixcInR3dFwiLFwidHd1XCIsXCJ0d3dcIixcInR3eFwiLFwidHd5XCIsXCJ0eGFcIixcInR4YlwiLFwidHhjXCIsXCJ0eGVcIixcInR4Z1wiLFwidHhoXCIsXCJ0eGlcIixcInR4alwiLFwidHhtXCIsXCJ0eG5cIixcInR4b1wiLFwidHhxXCIsXCJ0eHJcIixcInR4c1wiLFwidHh0XCIsXCJ0eHVcIixcInR4eFwiLFwidHh5XCIsXCJ0eWFcIixcInR5ZVwiLFwidHloXCIsXCJ0eWlcIixcInR5alwiLFwidHlsXCIsXCJ0eW5cIixcInR5cFwiLFwidHlyXCIsXCJ0eXNcIixcInR5dFwiLFwidHl1XCIsXCJ0eXZcIixcInR5eFwiLFwidHl5XCIsXCJ0eXpcIixcInR6YVwiLFwidHpoXCIsXCJ0empcIixcInR6bFwiLFwidHptXCIsXCJ0em5cIixcInR6b1wiLFwidHp4XCJdXG4sWyBcInVnXCIsXCJ1a1wiLFwidXJcIixcInV6XCIsXCJ1YW1cIixcInVhblwiLFwidWFyXCIsXCJ1YmFcIixcInViaVwiLFwidWJsXCIsXCJ1YnJcIixcInVidVwiLFwidWJ5XCIsXCJ1ZGFcIixcInVkZVwiLFwidWRnXCIsXCJ1ZGlcIixcInVkalwiLFwidWRsXCIsXCJ1ZG1cIixcInVkdVwiLFwidWVzXCIsXCJ1ZmlcIixcInVnYVwiLFwidWdiXCIsXCJ1Z2VcIixcInVnblwiLFwidWdvXCIsXCJ1Z3lcIixcInVoYVwiLFwidWhuXCIsXCJ1aXNcIixcInVpdlwiLFwidWppXCIsXCJ1a2FcIixcInVrZ1wiLFwidWtoXCIsXCJ1a2lcIixcInVra1wiLFwidWtsXCIsXCJ1a3BcIixcInVrcVwiLFwidWtzXCIsXCJ1a3VcIixcInVrdlwiLFwidWt3XCIsXCJ1a3lcIixcInVsYVwiLFwidWxiXCIsXCJ1bGNcIixcInVsZVwiLFwidWxmXCIsXCJ1bGlcIixcInVsa1wiLFwidWxsXCIsXCJ1bG1cIixcInVsblwiLFwidWx1XCIsXCJ1bHdcIixcInVtYVwiLFwidW1iXCIsXCJ1bWNcIixcInVtZFwiLFwidW1nXCIsXCJ1bWlcIixcInVtbVwiLFwidW1uXCIsXCJ1bW9cIixcInVtcFwiLFwidW1yXCIsXCJ1bXNcIixcInVtdVwiLFwidW5hXCIsXCJ1bmRcIixcInVuZVwiLFwidW5nXCIsXCJ1bmlcIixcInVua1wiLFwidW5tXCIsXCJ1bm5cIixcInVucFwiLFwidW5yXCIsXCJ1bnVcIixcInVueFwiLFwidW56XCIsXCJ1b2tcIixcInVwaVwiLFwidXB2XCIsXCJ1cmFcIixcInVyYlwiLFwidXJjXCIsXCJ1cmVcIixcInVyZlwiLFwidXJnXCIsXCJ1cmhcIixcInVyaVwiLFwidXJqXCIsXCJ1cmtcIixcInVybFwiLFwidXJtXCIsXCJ1cm5cIixcInVyb1wiLFwidXJwXCIsXCJ1cnJcIixcInVydFwiLFwidXJ1XCIsXCJ1cnZcIixcInVyd1wiLFwidXJ4XCIsXCJ1cnlcIixcInVyelwiLFwidXNhXCIsXCJ1c2hcIixcInVzaVwiLFwidXNrXCIsXCJ1c3BcIixcInVzc1wiLFwidXN1XCIsXCJ1dGFcIixcInV0ZVwiLFwidXRoXCIsXCJ1dHBcIixcInV0clwiLFwidXR1XCIsXCJ1dW1cIixcInV1blwiLFwidXVyXCIsXCJ1dXVcIixcInV2ZVwiLFwidXZoXCIsXCJ1dmxcIixcInV3YVwiLFwidXlhXCIsXCJ1em5cIixcInV6c1wiXVxuLFsgXCJ2ZVwiLFwidmlcIixcInZvXCIsXCJ2YWFcIixcInZhZVwiLFwidmFmXCIsXCJ2YWdcIixcInZhaFwiLFwidmFpXCIsXCJ2YWpcIixcInZhbFwiLFwidmFtXCIsXCJ2YW5cIixcInZhb1wiLFwidmFwXCIsXCJ2YXJcIixcInZhc1wiLFwidmF1XCIsXCJ2YXZcIixcInZheVwiLFwidmJiXCIsXCJ2YmtcIixcInZlY1wiLFwidmVkXCIsXCJ2ZWxcIixcInZlbVwiLFwidmVvXCIsXCJ2ZXBcIixcInZlclwiLFwidmdyXCIsXCJ2Z3RcIixcInZpY1wiLFwidmlkXCIsXCJ2aWZcIixcInZpZ1wiLFwidmlsXCIsXCJ2aW5cIixcInZpc1wiLFwidml0XCIsXCJ2aXZcIixcInZrYVwiLFwidmtpXCIsXCJ2a2pcIixcInZra1wiLFwidmtsXCIsXCJ2a21cIixcInZrblwiLFwidmtvXCIsXCJ2a3BcIixcInZrdFwiLFwidmt1XCIsXCJ2a3pcIixcInZscFwiLFwidmxzXCIsXCJ2bWFcIixcInZtYlwiLFwidm1jXCIsXCJ2bWRcIixcInZtZVwiLFwidm1mXCIsXCJ2bWdcIixcInZtaFwiLFwidm1pXCIsXCJ2bWpcIixcInZta1wiLFwidm1sXCIsXCJ2bW1cIixcInZtcFwiLFwidm1xXCIsXCJ2bXJcIixcInZtc1wiLFwidm11XCIsXCJ2bXZcIixcInZtd1wiLFwidm14XCIsXCJ2bXlcIixcInZtelwiLFwidm5rXCIsXCJ2bm1cIixcInZucFwiLFwidm9yXCIsXCJ2b3RcIixcInZyYVwiLFwidnJvXCIsXCJ2cnNcIixcInZydFwiLFwidnNpXCIsXCJ2c2xcIixcInZzdlwiLFwidnRvXCIsXCJ2dW1cIixcInZ1blwiLFwidnV0XCIsXCJ2d2FcIl1cbixbIFwid2FcIixcIndvXCIsXCJ3YWFcIixcIndhYlwiLFwid2FjXCIsXCJ3YWRcIixcIndhZVwiLFwid2FmXCIsXCJ3YWdcIixcIndhaFwiLFwid2FpXCIsXCJ3YWpcIixcIndha1wiLFwid2FsXCIsXCJ3YW1cIixcIndhblwiLFwid2FvXCIsXCJ3YXBcIixcIndhcVwiLFwid2FyXCIsXCJ3YXNcIixcIndhdFwiLFwid2F1XCIsXCJ3YXZcIixcIndhd1wiLFwid2F4XCIsXCJ3YXlcIixcIndhelwiLFwid2JhXCIsXCJ3YmJcIixcIndiZVwiLFwid2JmXCIsXCJ3YmhcIixcIndiaVwiLFwid2JqXCIsXCJ3YmtcIixcIndibFwiLFwid2JtXCIsXCJ3YnBcIixcIndicVwiLFwid2JyXCIsXCJ3YnNcIixcIndidFwiLFwid2J2XCIsXCJ3YndcIixcIndjYVwiLFwid2NpXCIsXCJ3ZGRcIixcIndkZ1wiLFwid2RqXCIsXCJ3ZGtcIixcIndkdVwiLFwid2R5XCIsXCJ3ZWFcIixcIndlY1wiLFwid2VkXCIsXCJ3ZWdcIixcIndlaFwiLFwid2VpXCIsXCJ3ZW1cIixcIndlblwiLFwid2VvXCIsXCJ3ZXBcIixcIndlclwiLFwid2VzXCIsXCJ3ZXRcIixcIndldVwiLFwid2V3XCIsXCJ3ZmdcIixcIndnYVwiLFwid2diXCIsXCJ3Z2dcIixcIndnaVwiLFwid2dvXCIsXCJ3Z3VcIixcIndnd1wiLFwid2d5XCIsXCJ3aGFcIixcIndoZ1wiLFwid2hrXCIsXCJ3aHVcIixcIndpYlwiLFwid2ljXCIsXCJ3aWVcIixcIndpZlwiLFwid2lnXCIsXCJ3aWhcIixcIndpaVwiLFwid2lqXCIsXCJ3aWtcIixcIndpbFwiLFwid2ltXCIsXCJ3aW5cIixcIndpclwiLFwid2l0XCIsXCJ3aXVcIixcIndpdlwiLFwid2l3XCIsXCJ3aXlcIixcIndqYVwiLFwid2ppXCIsXCJ3a2FcIixcIndrYlwiLFwid2tkXCIsXCJ3a2xcIixcIndrclwiLFwid2t1XCIsXCJ3a3dcIixcIndreVwiLFwid2xhXCIsXCJ3bGNcIixcIndsZVwiLFwid2xnXCIsXCJ3bGhcIixcIndsaVwiLFwid2xrXCIsXCJ3bGxcIixcIndsbVwiLFwid2xvXCIsXCJ3bHJcIixcIndsc1wiLFwid2x1XCIsXCJ3bHZcIixcIndsd1wiLFwid2x4XCIsXCJ3bHlcIixcIndtYVwiLFwid21iXCIsXCJ3bWNcIixcIndtZFwiLFwid21lXCIsXCJ3bWdcIixcIndtaFwiLFwid21pXCIsXCJ3bW1cIixcIndtblwiLFwid21vXCIsXCJ3bXNcIixcIndtdFwiLFwid213XCIsXCJ3bXhcIixcInduYlwiLFwid25jXCIsXCJ3bmRcIixcInduZVwiLFwid25nXCIsXCJ3bmlcIixcIndua1wiLFwid25tXCIsXCJ3bm5cIixcIndub1wiLFwid25wXCIsXCJ3bnVcIixcIndud1wiLFwid255XCIsXCJ3b2FcIixcIndvYlwiLFwid29jXCIsXCJ3b2RcIixcIndvZVwiLFwid29mXCIsXCJ3b2dcIixcIndvaVwiLFwid29rXCIsXCJ3b21cIixcIndvblwiLFwid29vXCIsXCJ3b3JcIixcIndvc1wiLFwid293XCIsXCJ3b3lcIixcIndwY1wiLFwid3JhXCIsXCJ3cmJcIixcIndyZFwiLFwid3JnXCIsXCJ3cmhcIixcIndyaVwiLFwid3JrXCIsXCJ3cmxcIixcIndybVwiLFwid3JuXCIsXCJ3cm9cIixcIndycFwiLFwid3JyXCIsXCJ3cnNcIixcIndydVwiLFwid3J2XCIsXCJ3cndcIixcIndyeFwiLFwid3J5XCIsXCJ3cnpcIixcIndzYVwiLFwid3NnXCIsXCJ3c2lcIixcIndza1wiLFwid3NyXCIsXCJ3c3NcIixcIndzdVwiLFwid3N2XCIsXCJ3dGZcIixcInd0aFwiLFwid3RpXCIsXCJ3dGtcIixcInd0bVwiLFwid3R3XCIsXCJ3dWFcIixcInd1YlwiLFwid3VkXCIsXCJ3dWhcIixcInd1bFwiLFwid3VtXCIsXCJ3dW5cIixcInd1clwiLFwid3V0XCIsXCJ3dXVcIixcInd1dlwiLFwid3V4XCIsXCJ3dXlcIixcInd3YVwiLFwid3diXCIsXCJ3d29cIixcInd3clwiLFwid3d3XCIsXCJ3eGFcIixcInd4d1wiLFwid3lhXCIsXCJ3eWJcIixcInd5aVwiLFwid3ltXCIsXCJ3eXJcIixcInd5eVwiXVxuLFsgXCJ4aFwiLFwieGFhXCIsXCJ4YWJcIixcInhhY1wiLFwieGFkXCIsXCJ4YWVcIixcInhhZ1wiLFwieGFpXCIsXCJ4YWpcIixcInhha1wiLFwieGFsXCIsXCJ4YW1cIixcInhhblwiLFwieGFvXCIsXCJ4YXBcIixcInhhcVwiLFwieGFyXCIsXCJ4YXNcIixcInhhdFwiLFwieGF1XCIsXCJ4YXZcIixcInhhd1wiLFwieGF5XCIsXCJ4YmFcIixcInhiYlwiLFwieGJjXCIsXCJ4YmRcIixcInhiZVwiLFwieGJnXCIsXCJ4YmlcIixcInhialwiLFwieGJtXCIsXCJ4Ym5cIixcInhib1wiLFwieGJwXCIsXCJ4YnJcIixcInhid1wiLFwieGJ4XCIsXCJ4YnlcIixcInhjYlwiLFwieGNjXCIsXCJ4Y2VcIixcInhjZ1wiLFwieGNoXCIsXCJ4Y2xcIixcInhjbVwiLFwieGNuXCIsXCJ4Y29cIixcInhjclwiLFwieGN0XCIsXCJ4Y3VcIixcInhjdlwiLFwieGN3XCIsXCJ4Y3lcIixcInhkYVwiLFwieGRjXCIsXCJ4ZGtcIixcInhkbVwiLFwieGRvXCIsXCJ4ZHlcIixcInhlYlwiLFwieGVkXCIsXCJ4ZWdcIixcInhlbFwiLFwieGVtXCIsXCJ4ZXBcIixcInhlclwiLFwieGVzXCIsXCJ4ZXRcIixcInhldVwiLFwieGZhXCIsXCJ4Z2FcIixcInhnYlwiLFwieGdkXCIsXCJ4Z2ZcIixcInhnZ1wiLFwieGdpXCIsXCJ4Z2xcIixcInhnbVwiLFwieGduXCIsXCJ4Z3JcIixcInhndVwiLFwieGd3XCIsXCJ4aGFcIixcInhoY1wiLFwieGhkXCIsXCJ4aGVcIixcInhoclwiLFwieGh0XCIsXCJ4aHVcIixcInhodlwiLFwieGlhXCIsXCJ4aWJcIixcInhpaVwiLFwieGlsXCIsXCJ4aW5cIixcInhpcFwiLFwieGlyXCIsXCJ4aXNcIixcInhpdlwiLFwieGl5XCIsXCJ4amJcIixcInhqdFwiLFwieGthXCIsXCJ4a2JcIixcInhrY1wiLFwieGtkXCIsXCJ4a2VcIixcInhrZlwiLFwieGtnXCIsXCJ4a2hcIixcInhraVwiLFwieGtqXCIsXCJ4a2tcIixcInhrbFwiLFwieGtuXCIsXCJ4a29cIixcInhrcFwiLFwieGtxXCIsXCJ4a3JcIixcInhrc1wiLFwieGt0XCIsXCJ4a3VcIixcInhrdlwiLFwieGt3XCIsXCJ4a3hcIixcInhreVwiLFwieGt6XCIsXCJ4bGFcIixcInhsYlwiLFwieGxjXCIsXCJ4bGRcIixcInhsZVwiLFwieGxnXCIsXCJ4bGlcIixcInhsblwiLFwieGxvXCIsXCJ4bHBcIixcInhsc1wiLFwieGx1XCIsXCJ4bHlcIixcInhtYVwiLFwieG1iXCIsXCJ4bWNcIixcInhtZFwiLFwieG1lXCIsXCJ4bWZcIixcInhtZ1wiLFwieG1oXCIsXCJ4bWpcIixcInhta1wiLFwieG1sXCIsXCJ4bW1cIixcInhtblwiLFwieG1vXCIsXCJ4bXBcIixcInhtcVwiLFwieG1yXCIsXCJ4bXNcIixcInhtdFwiLFwieG11XCIsXCJ4bXZcIixcInhtd1wiLFwieG14XCIsXCJ4bXlcIixcInhtelwiLFwieG5hXCIsXCJ4bmJcIixcInhuZFwiLFwieG5nXCIsXCJ4bmhcIixcInhuaVwiLFwieG5qXCIsXCJ4bmtcIixcInhubVwiLFwieG5uXCIsXCJ4bm9cIixcInhucVwiLFwieG5yXCIsXCJ4bnNcIixcInhudFwiLFwieG51XCIsXCJ4bnlcIixcInhuelwiLFwieG9jXCIsXCJ4b2RcIixcInhvZ1wiLFwieG9pXCIsXCJ4b2tcIixcInhvbVwiLFwieG9uXCIsXCJ4b29cIixcInhvcFwiLFwieG9yXCIsXCJ4b3dcIixcInhwYVwiLFwieHBiXCIsXCJ4cGNcIixcInhwZFwiLFwieHBlXCIsXCJ4cGZcIixcInhwZ1wiLFwieHBoXCIsXCJ4cGlcIixcInhwalwiLFwieHBrXCIsXCJ4cGxcIixcInhwbVwiLFwieHBuXCIsXCJ4cG9cIixcInhwcFwiLFwieHBxXCIsXCJ4cHJcIixcInhwc1wiLFwieHB0XCIsXCJ4cHVcIixcInhwdlwiLFwieHB3XCIsXCJ4cHhcIixcInhweVwiLFwieHB6XCIsXCJ4cWFcIixcInhxdFwiLFwieHJhXCIsXCJ4cmJcIixcInhyZFwiLFwieHJlXCIsXCJ4cmdcIixcInhyaVwiLFwieHJtXCIsXCJ4cm5cIixcInhycVwiLFwieHJyXCIsXCJ4cnRcIixcInhydVwiLFwieHJ3XCIsXCJ4c2FcIixcInhzYlwiLFwieHNjXCIsXCJ4c2RcIixcInhzZVwiLFwieHNoXCIsXCJ4c2lcIixcInhzalwiLFwieHNsXCIsXCJ4c21cIixcInhzblwiLFwieHNvXCIsXCJ4c3BcIixcInhzcVwiLFwieHNyXCIsXCJ4c3NcIixcInhzdVwiLFwieHN2XCIsXCJ4c3lcIixcInh0YVwiLFwieHRiXCIsXCJ4dGNcIixcInh0ZFwiLFwieHRlXCIsXCJ4dGdcIixcInh0aFwiLFwieHRpXCIsXCJ4dGpcIixcInh0bFwiLFwieHRtXCIsXCJ4dG5cIixcInh0b1wiLFwieHRwXCIsXCJ4dHFcIixcInh0clwiLFwieHRzXCIsXCJ4dHRcIixcInh0dVwiLFwieHR2XCIsXCJ4dHdcIixcInh0eVwiLFwieHR6XCIsXCJ4dWFcIixcInh1YlwiLFwieHVkXCIsXCJ4dWdcIixcInh1alwiLFwieHVsXCIsXCJ4dW1cIixcInh1blwiLFwieHVvXCIsXCJ4dXBcIixcInh1clwiLFwieHV0XCIsXCJ4dXVcIixcInh2ZVwiLFwieHZpXCIsXCJ4dm5cIixcInh2b1wiLFwieHZzXCIsXCJ4d2FcIixcInh3Y1wiLFwieHdkXCIsXCJ4d2VcIixcInh3Z1wiLFwieHdqXCIsXCJ4d2tcIixcInh3bFwiLFwieHdvXCIsXCJ4d3JcIixcInh3dFwiLFwieHd3XCIsXCJ4eGJcIixcInh4a1wiLFwieHhtXCIsXCJ4eHJcIixcInh4dFwiLFwieHlhXCIsXCJ4eWJcIixcInh5alwiLFwieHlrXCIsXCJ4eWxcIixcInh5dFwiLFwieHl5XCIsXCJ4emhcIixcInh6bVwiLFwieHpwXCJdXG4sWyBcInlpXCIsXCJ5b1wiLFwieWFhXCIsXCJ5YWJcIixcInlhY1wiLFwieWFkXCIsXCJ5YWVcIixcInlhZlwiLFwieWFnXCIsXCJ5YWhcIixcInlhaVwiLFwieWFqXCIsXCJ5YWtcIixcInlhbFwiLFwieWFtXCIsXCJ5YW5cIixcInlhb1wiLFwieWFwXCIsXCJ5YXFcIixcInlhclwiLFwieWFzXCIsXCJ5YXRcIixcInlhdVwiLFwieWF2XCIsXCJ5YXdcIixcInlheFwiLFwieWF5XCIsXCJ5YXpcIixcInliYVwiLFwieWJiXCIsXCJ5YmRcIixcInliZVwiLFwieWJoXCIsXCJ5YmlcIixcInlialwiLFwieWJrXCIsXCJ5YmxcIixcInlibVwiLFwieWJuXCIsXCJ5Ym9cIixcInlieFwiLFwieWJ5XCIsXCJ5Y2hcIixcInljbFwiLFwieWNuXCIsXCJ5Y3BcIixcInlkYVwiLFwieWRkXCIsXCJ5ZGVcIixcInlkZ1wiLFwieWRrXCIsXCJ5ZHNcIixcInllYVwiLFwieWVjXCIsXCJ5ZWVcIixcInllaVwiLFwieWVqXCIsXCJ5ZWxcIixcInllblwiLFwieWVyXCIsXCJ5ZXNcIixcInlldFwiLFwieWV1XCIsXCJ5ZXZcIixcInlleVwiLFwieWdhXCIsXCJ5Z2lcIixcInlnbFwiLFwieWdtXCIsXCJ5Z3BcIixcInlnclwiLFwieWdzXCIsXCJ5Z3VcIixcInlnd1wiLFwieWhhXCIsXCJ5aGRcIixcInlobFwiLFwieWhzXCIsXCJ5aWFcIixcInlpZlwiLFwieWlnXCIsXCJ5aWhcIixcInlpaVwiLFwieWlqXCIsXCJ5aWtcIixcInlpbFwiLFwieWltXCIsXCJ5aW5cIixcInlpcFwiLFwieWlxXCIsXCJ5aXJcIixcInlpc1wiLFwieWl0XCIsXCJ5aXVcIixcInlpdlwiLFwieWl4XCIsXCJ5aXlcIixcInlpelwiLFwieWthXCIsXCJ5a2dcIixcInlraVwiLFwieWtrXCIsXCJ5a2xcIixcInlrbVwiLFwieWtuXCIsXCJ5a29cIixcInlrclwiLFwieWt0XCIsXCJ5a3VcIixcInlreVwiLFwieWxhXCIsXCJ5bGJcIixcInlsZVwiLFwieWxnXCIsXCJ5bGlcIixcInlsbFwiLFwieWxtXCIsXCJ5bG5cIixcInlsb1wiLFwieWxyXCIsXCJ5bHVcIixcInlseVwiLFwieW1hXCIsXCJ5bWJcIixcInltY1wiLFwieW1kXCIsXCJ5bWVcIixcInltZ1wiLFwieW1oXCIsXCJ5bWlcIixcInlta1wiLFwieW1sXCIsXCJ5bW1cIixcInltblwiLFwieW1vXCIsXCJ5bXBcIixcInltcVwiLFwieW1yXCIsXCJ5bXNcIixcInltdFwiLFwieW14XCIsXCJ5bXpcIixcInluYVwiLFwieW5kXCIsXCJ5bmVcIixcInluZ1wiLFwieW5oXCIsXCJ5bmtcIixcInlubFwiLFwieW5uXCIsXCJ5bm9cIixcInlucVwiLFwieW5zXCIsXCJ5bnVcIixcInlvYlwiLFwieW9nXCIsXCJ5b2lcIixcInlva1wiLFwieW9sXCIsXCJ5b21cIixcInlvblwiLFwieW9zXCIsXCJ5b3RcIixcInlveFwiLFwieW95XCIsXCJ5cGFcIixcInlwYlwiLFwieXBnXCIsXCJ5cGhcIixcInlwa1wiLFwieXBtXCIsXCJ5cG5cIixcInlwb1wiLFwieXBwXCIsXCJ5cHpcIixcInlyYVwiLFwieXJiXCIsXCJ5cmVcIixcInlyaVwiLFwieXJrXCIsXCJ5cmxcIixcInlybVwiLFwieXJuXCIsXCJ5cm9cIixcInlyc1wiLFwieXJ3XCIsXCJ5cnlcIixcInlzY1wiLFwieXNkXCIsXCJ5c2dcIixcInlzbFwiLFwieXNtXCIsXCJ5c25cIixcInlzb1wiLFwieXNwXCIsXCJ5c3JcIixcInlzc1wiLFwieXN5XCIsXCJ5dGFcIixcInl0bFwiLFwieXRwXCIsXCJ5dHdcIixcInl0eVwiLFwieXVhXCIsXCJ5dWJcIixcInl1Y1wiLFwieXVkXCIsXCJ5dWVcIixcInl1ZlwiLFwieXVnXCIsXCJ5dWlcIixcInl1alwiLFwieXVrXCIsXCJ5dWxcIixcInl1bVwiLFwieXVuXCIsXCJ5dXBcIixcInl1cVwiLFwieXVyXCIsXCJ5dXRcIixcInl1dVwiLFwieXV3XCIsXCJ5dXhcIixcInl1eVwiLFwieXV6XCIsXCJ5dmFcIixcInl2dFwiLFwieXdhXCIsXCJ5d2dcIixcInl3bFwiLFwieXduXCIsXCJ5d3FcIixcInl3clwiLFwieXd0XCIsXCJ5d3VcIixcInl3d1wiLFwieXhhXCIsXCJ5eGdcIixcInl4bFwiLFwieXhtXCIsXCJ5eHVcIixcInl4eVwiLFwieXlyXCIsXCJ5eXVcIixcInl5elwiLFwieXpnXCIsXCJ5emtcIl1cbixbIFwiemFcIixcInpoXCIsXCJ6dVwiLFwiemFhXCIsXCJ6YWJcIixcInphY1wiLFwiemFkXCIsXCJ6YWVcIixcInphZlwiLFwiemFnXCIsXCJ6YWhcIixcInphaVwiLFwiemFqXCIsXCJ6YWtcIixcInphbFwiLFwiemFtXCIsXCJ6YW9cIixcInphcFwiLFwiemFxXCIsXCJ6YXJcIixcInphc1wiLFwiemF0XCIsXCJ6YXVcIixcInphdlwiLFwiemF3XCIsXCJ6YXhcIixcInpheVwiLFwiemF6XCIsXCJ6YmFcIixcInpiY1wiLFwiemJlXCIsXCJ6YmxcIixcInpidFwiLFwiemJ1XCIsXCJ6YndcIixcInpjYVwiLFwiemNoXCIsXCJ6ZGpcIixcInplYVwiLFwiemVnXCIsXCJ6ZWhcIixcInplblwiLFwiemdhXCIsXCJ6Z2JcIixcInpnaFwiLFwiemdtXCIsXCJ6Z25cIixcInpnclwiLFwiemhiXCIsXCJ6aGRcIixcInpoaVwiLFwiemhuXCIsXCJ6aHdcIixcInpoeFwiLFwiemlhXCIsXCJ6aWJcIixcInppa1wiLFwiemlsXCIsXCJ6aW1cIixcInppblwiLFwiemlyXCIsXCJ6aXdcIixcInppelwiLFwiemthXCIsXCJ6a2JcIixcInprZFwiLFwiemtnXCIsXCJ6a2hcIixcInpra1wiLFwiemtuXCIsXCJ6a29cIixcInprcFwiLFwiemtyXCIsXCJ6a3RcIixcInprdVwiLFwiemt2XCIsXCJ6a3pcIixcInpsYVwiLFwiemxlXCIsXCJ6bGpcIixcInpsbVwiLFwiemxuXCIsXCJ6bHFcIixcInpsc1wiLFwiemx3XCIsXCJ6bWFcIixcInptYlwiLFwiem1jXCIsXCJ6bWRcIixcInptZVwiLFwiem1mXCIsXCJ6bWdcIixcInptaFwiLFwiem1pXCIsXCJ6bWpcIixcInpta1wiLFwiem1sXCIsXCJ6bW1cIixcInptblwiLFwiem1vXCIsXCJ6bXBcIixcInptcVwiLFwiem1yXCIsXCJ6bXNcIixcInptdFwiLFwiem11XCIsXCJ6bXZcIixcInptd1wiLFwiem14XCIsXCJ6bXlcIixcInptelwiLFwiem5hXCIsXCJ6bmRcIixcInpuZVwiLFwiem5nXCIsXCJ6bmtcIixcInpuc1wiLFwiem9jXCIsXCJ6b2hcIixcInpvbVwiLFwiem9vXCIsXCJ6b3FcIixcInpvclwiLFwiem9zXCIsXCJ6cGFcIixcInpwYlwiLFwienBjXCIsXCJ6cGRcIixcInpwZVwiLFwienBmXCIsXCJ6cGdcIixcInpwaFwiLFwienBpXCIsXCJ6cGpcIixcInpwa1wiLFwienBsXCIsXCJ6cG1cIixcInpwblwiLFwienBvXCIsXCJ6cHBcIixcInpwcVwiLFwienByXCIsXCJ6cHNcIixcInpwdFwiLFwienB1XCIsXCJ6cHZcIixcInpwd1wiLFwienB4XCIsXCJ6cHlcIixcInpwelwiLFwienFlXCIsXCJ6cmFcIixcInpyZ1wiLFwienJuXCIsXCJ6cm9cIixcInpycFwiLFwienJzXCIsXCJ6c2FcIixcInpza1wiLFwienNsXCIsXCJ6c21cIixcInpzclwiLFwienN1XCIsXCJ6dGVcIixcInp0Z1wiLFwienRsXCIsXCJ6dG1cIixcInp0blwiLFwienRwXCIsXCJ6dHFcIixcInp0c1wiLFwienR0XCIsXCJ6dHVcIixcInp0eFwiLFwienR5XCIsXCJ6dWFcIixcInp1aFwiLFwienVtXCIsXCJ6dW5cIixcInp1eVwiLFwiendhXCIsXCJ6eHhcIixcInp5YlwiLFwienlnXCIsXCJ6eWpcIixcInp5blwiLFwienlwXCIsXCJ6emFcIixcInp6alwiXVxuXTtcblxuXG5leHBvcnQgY2xhc3MgTGFuZ1V0aWwge1xuXG4gICAgLyogRGV0ZXJtaW5lIGlmIGdpdmVuIHN0cmluZyBpcyBhIHZhbGlkIEJDUCA0NyBzdHJpbmcgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzQmNwNDcobGFuZ1N0cjogc3RyaW5nKSA6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gL14oKFthLXpBLVpdezIsM30oLVthLXpBLVpdKC1bYS16QS1aXXszfSl7MCwyfSk/fFthLXpBLVpdezR9fFthLXpBLVpdezUsOH0pKC1bYS16QS1aXXs0fSk/KC0oW2EtekEtWl17Mn18WzAtOV17M30pKT8oLShbMC05YS16QS1aXXs1LDh9fFswLTldW2EtekEtWl17M30pKSooLVswLTlhLXd5LXpBLVdZLVpdKC1bYS16QS1aMC05XXsyLDh9KSspKigteCgtW2EtekEtWjAtOV17MSw4fSkrKT98eCgtW2EtekEtWjAtOV17MSw4fSkrfChlbi1HQi1vZWR8aS1hbWl8aS1ibm58aS1kZWZhdWx0fGktZW5vY2hpYW58aS1oYWt8aS1rbGluZ29ufGktbHV4fGktbWluZ298aS1uYXZham98aS1wd258aS10YW98aS10YXl8aS10c3V8c2duLUJFLUZSfHNnbi1CRS1OTHxzZ24tQ0gtREV8YXJ0LWxvamJhbnxjZWwtZ2F1bGlzaHxuby1ib2t8bm8tbnlufHpoLWd1b3l1fHpoLWhha2thfHpoLW1pbnx6aC1taW4tbmFufHpoLXhpYW5nKSkkLy50ZXN0KGxhbmdTdHIpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB2YWxpZFByaW1hcnlMYW5nKGxhbmdTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcHJpbWFyeSA9IGxhbmdTdHIudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHByaW1hcnkuaW5jbHVkZXMoXCItXCIpKSB7XG4gICAgICAgICAgICBwcmltYXJ5ID0gcHJpbWFyeS5zcGxpdChcIi1cIilbMF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXByaW1hcnkubWF0Y2goL1thLXpdezIsM30vKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIHFhYS4ucXR6XG4gICAgICAgIGlmIChwcmltYXJ5Lmxlbmd0aCA9PT0gMyBcbiAgICAgICAgICAgICYmIHByaW1hcnkuY2hhckF0KDApID09PSBcInFcIlxuICAgICAgICAgICAgJiYgcHJpbWFyeS5jaGFyQ29kZUF0KDEpID49IDk3ICYmIHByaW1hcnkuY2hhckNvZGVBdCgxKSA8PSAxMTZcbiAgICAgICAgICAgICYmIHByaW1hcnkuY2hhckNvZGVBdCgyKSA+PSA5NyAmJiBwcmltYXJ5LmNoYXJDb2RlQXQoMikgPD0gMTIyKSB7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbGlkUHJpbWFyeUxhbmdzW3ByaW1hcnkuY2hhckNvZGVBdCgwKS05N10uaW5jbHVkZXMocHJpbWFyeSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBtYXRjaFByaW1hcnlMYW5nKGxhbmcxOiBzdHJpbmcsIGxhbmcyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHByaW1hcnkxID0gbGFuZzE7XG4gICAgICAgIGlmIChwcmltYXJ5MS5pbmNsdWRlcyhcIi1cIikpIHtcbiAgICAgICAgICAgIHByaW1hcnkxID0gcHJpbWFyeTEuc3BsaXQoXCItXCIpWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHByaW1hcnkyID0gbGFuZzI7XG4gICAgICAgIGlmIChwcmltYXJ5Mi5pbmNsdWRlcyhcIi1cIikpIHtcbiAgICAgICAgICAgIHByaW1hcnkyID0gcHJpbWFyeTIuc3BsaXQoXCItXCIpWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByaW1hcnkxLnRvTG93ZXJDYXNlKCkgPT09IHByaW1hcnkyLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3Y0L3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMsIElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgfSBmcm9tIFwiLi4vLi4vLi4vYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vLi4vYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vLi4vZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi8uLi9kb20vVmlzVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4vZnJhZ21lbnRcIjtcbmltcG9ydCB7IGdldERlZmluZWRTdHlsZXMgfSBmcm9tIFwiLi4vLi4vLi4vLi4vdjQvdXRpbC9DU1NVdGlsXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uLy4uL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBjbGFzcyBSUFRVdGlsIHtcblxuXG4gICAgLy8gVGhpcyBsaXN0IGNvbnRhaW5zIGEgbGlzdCBvZiBlbGVtZW50cyB0YWdzIHdoaWNoIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBzaW5jZSB3ZSBoYXZlIHJ1bGVzIHRyaWdnZXJpbmdcbiAgICBwdWJsaWMgc3RhdGljIG5hdkxpbmtLZXl3b3JkcyA9IFsnc3RhcnQnLCAnbmV4dCcsICdwcmV2JywgJ3ByZXZpb3VzJywgJ2NvbnRlbnRzJywgJ2luZGV4J11cblxuICAgIC8vIFRoaXMgbGlzdCBjb250YWlucyBhIGxpc3Qgb2YgcnVsZSBpZHMgZm9yIHRoZSBydWxlcyB0aGF0IGhhdmUgdG8gY2hlY2sgZm9yIGhpZGRlbiBjb250ZW50IHJlZ2FyZGxlc3Mgb2YgdGhlIENoZWNrIEhpZGRlblxuICAgIC8vIENvbnRlbnQgU2V0dGluZy4gVGhpcyBtZWFucyB0aGF0IHdoZW4gdGhlIGVuZ2luZSBpcyBhY3R1YWxseSBkZXRlcm1pbmUgd2hpY2ggZWxlbWVudHMgdG8gbWFzcyB0byB0aGUgcnVsZXMsIGl0IHdpbGwgYWx3YXlzXG4gICAgLy8gcGFzcyB0aGVzZXMgcnVsZXMgbm8gbWF0dGVyIHdoYXQgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IFNldHRpbmcgaXMuXG4gICAgcHVibGljIHN0YXRpYyBydWxlc1RoYXRIYXZlVG9DaGVja0hpZGRlbiA9IFsnUlBUX0VsZW1fVW5pcXVlSWQnXVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0RlZmluZWRBcmlhQXR0cmlidXRlQXRJbmRleChlbGUsIGluZGV4KSB7XG4gICAgICAgIGxldCBhdHRyTmFtZSA9IGVsZS5hdHRyaWJ1dGVzW2luZGV4XS5uYW1lO1xuICAgICAgICByZXR1cm4gUlBUVXRpbC5pc0RlZmluZWRBcmlhQXR0cmlidXRlKGVsZSwgYXR0ck5hbWUpO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjEvI2ludHJvc3RhdGVzXG4gICAgcHVibGljIHN0YXRpYyBhcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzID0ge1xuICAgICAgICBcImFsZXJ0XCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1saXZlXCI6IFwiYXNzZXJ0aXZlXCIsXG4gICAgICAgICAgICBcImFyaWEtYXRvbWljXCI6IFwidHJ1ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29tYm9ib3hcIjoge1xuICAgICAgICAgICAgXCJhcmlhLWhhc3BvcHVwXCI6IFwibGlzdGJveFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGlzdGJveFwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJ2ZXJ0aWNhbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibG9nXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1saXZlXCI6IFwicG9saXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZW51XCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcInZlcnRpY2FsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZW51YmFyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcImhvcml6b250YWxcIlxuICAgICAgICB9LFxuICAgICAgICBcIm1ldGVyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiBcIjBcIixcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1heFwiOiBcIjEwMFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwib3B0aW9uXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1zZWxlY3RlZFwiOiBcImZhbHNlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJwcm9ncmVzc2JhclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjogXCIwXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjogXCIxMDBcIlxuICAgICAgICB9LFxuICAgICAgICBcInNjcm9sbGJhclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJ2ZXJ0aWNhbFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXBhcmF0b3JcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzbGlkZXJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzcGluYnV0dG9uXCI6IHtcbiAgICAgICAgICAgIC8vIE5vdCBzdXJlIGhvdyB0byBlbmNvZGUgbWluL21heCAob3Igbm93IGluIDEuMiAtIFwiaGFzIG5vIHZhbHVlXCIpXG4gICAgICAgICAgICAvL1wiYXJpYS12YWx1ZW5vd1wiOiBcIjBcIiBUT0RPOiBhdCByaXNrOiBtYXliZSBkZWxldGUgYWZ0ZXIgQVJJQSAxLjIgcmVhY2hlcyBwcm9wb3NlZCByZWNcbiAgICAgICAgICAgIC8vIFByb2JhYmx5IGp1c3QgZGVsZXRlIHNwaW5idXR0b24gZnJvbSB0aGlzIGxpc3QgY29tcGxldGVseSBhbmQgbGV0IHVzZXIgYWdlbnRzIGhhbmRsZSBcImRlZmF1bHRzXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdGF0dXNcIjoge1xuICAgICAgICAgICAgXCJhcmlhLWxpdmVcIjogXCJwb2xpdGVcIixcbiAgICAgICAgICAgIFwiYXJpYS1hdG9taWNcIjogXCJ0cnVlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0YWJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IFwiZmFsc2VcIlxuICAgICAgICB9LFxuICAgICAgICBcInRhYmxpc3RcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidG9vbGJhclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJob3Jpem9udGFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0cmVlXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcInZlcnRpY2FsXCJcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjEvI2FyaWEtYXRvbWljXG4gICAgcHVibGljIHN0YXRpYyBhcmlhQXR0cmlidXRlR2xvYmFsRGVmYXVsdHMgPSB7XG4gICAgICAgIFwiYXJpYS1hdG9taWNcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IFwibm9uZVwiLFxuICAgICAgICBcImFyaWEtYnVzeVwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWN1cnJlbnRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtZHJvcGVmZmVjdFwiOiBcIm5vbmVcIixcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWdyYWJiZWRcIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtaGFzcG9wdXBcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWludmFsaWRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtbGl2ZVwiOiBcIm9mZlwiLFxuICAgICAgICBcImFyaWEtbW9kYWxcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtbXVsdGlsaW5lXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiB1bmRlZmluZWQsXG4gICAgICAgIFwiYXJpYS1wcmVzc2VkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLXJlYWRvbmx5XCI6IFwiZmFsc2VcIixcbiAgICAgICAgLy9cImFyaWEtcmVsZXZhbnRcIjogXCJhZGRpdGlvbnMgdGV4dFwiLCBUT0RPOiBhcmUgbXVsdGlwbGUgdmFsdWVzIHN1cHBvcnRlZD9cbiAgICAgICAgXCJhcmlhLXJlcXVpcmVkXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLXNvcnRcIjogXCJub25lXCJcbiAgICB9XG5cbiAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbC1hYW0tMS4wLyNodG1sLWF0dHJpYnV0ZS1zdGF0ZS1hbmQtcHJvcGVydHktbWFwcGluZ3NcbiAgICBwdWJsaWMgc3RhdGljIGFyaWFBdHRyaWJ1dGVJbXBsaWNpdE1hcHBpbmdzID0ge1xuICAgICAgICBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IHtcbiAgICAgICAgICAgIFwiZm9ybVwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm9mZlwiID09PSBlLmdldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiKSA/IFwibm9uZVwiIDogXCJib3RoXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm9mZlwiID09PSBlLmdldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiKSA/IFwibm9uZVwiIDogXCJib3RoXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvZmZcIiA9PT0gZS5nZXRBdHRyaWJ1dGUoXCJhdXRvY29tcGxldGVcIikgPyBcIm5vbmVcIiA6IFwiYm90aFwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvZmZcIiA9PT0gZS5nZXRBdHRyaWJ1dGUoXCJhdXRvY29tcGxldGVcIikgPyBcIm5vbmVcIiA6IFwiYm90aFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiB7XG4gICAgICAgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuaGFzQXR0cmlidXRlKFwiaW5kZXRlcm1pbmF0ZVwiKSkgcmV0dXJuIFwibWl4ZWRcIjtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIiArIGUuaGFzQXR0cmlidXRlKFwiY2hlY2tlZFwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm1lbnVpdGVtXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuaGFzQXR0cmlidXRlKFwiaW5kZXRlcm1pbmF0ZVwiKSkgcmV0dXJuIFwibWl4ZWRcIjtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIiArIGUuaGFzQXR0cmlidXRlKFwiY2hlY2tlZFwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIipcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJpbmRldGVybWluYXRlXCIpKSByZXR1cm4gXCJtaXhlZFwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IHtcbiAgICAgICAgICAgIFwiYnV0dG9uXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZmllbGRzZXRcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpID8gXCJ0cnVlXCIgOiBcImZhbHNlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm9wdGdyb3VwXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwib3B0aW9uXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic2VsZWN0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiB7XG4gICAgICAgICAgICBcImRldGFpbHNcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJvcGVuXCIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkaWFsb2dcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJvcGVuXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIjoge1xuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSkgcmV0dXJuIFwidHJ1ZVwiO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXBsYWNlaG9sZGVyXCI6IHtcbiAgICAgICAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcmVxdWlyZWRcIjoge1xuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcInJlcXVpcmVkXCIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgcmV0dXJucyB1c2VyLWRlZmluZWQgYXJpYSBhdHRyaWJ1dGUgbmFtZSBmcm9tIGRvbVxuICAgICAqIEBwYXJhbSBlbGUgIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB1c2VyIGRlZmluZWQgYXJpYSBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKGVsZW0pIHtcbiAgICAgICAgbGV0IGFyaWFBdHRyaWJ1dGVzID0gW107XG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gZWxlbS5hdHRyaWJ1dGVzO1xuICAgICAgICBpZiAoZG9tQXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21BdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gZG9tQXR0cmlidXRlc1tpXS5uYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpOyBcbiAgICAgICAgICAgICAgICBsZXQgaXNBcmlhID0gYXR0ck5hbWUuc3Vic3RyaW5nKDAsIDUpID09PSAnYXJpYS0nO1xuICAgICAgICAgICAgICAgIGlmIChpc0FyaWEpXG4gICAgICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVzLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcmlhQXR0cmlidXRlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zIHVzZXItZGVmaW5lZCBodG1sIGF0dHJpYnV0ZSBuYW1lIGZyb20gZG9tXG4gICAgICogQHBhcmFtIGVsZSAgZWxlbWVudFxuICAgICAqIEByZXR1cm5zIHVzZXIgZGVmaW5lZCBodG1sIGF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFVzZXJEZWZpbmVkSHRtbEF0dHJpYnV0ZXMoZWxlbSkge1xuICAgICAgICBsZXQgaHRtbEF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgbGV0IGRvbUF0dHJpYnV0ZXMgPSBlbGVtLmF0dHJpYnV0ZXM7XG4gICAgICAgIGlmIChkb21BdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBkb21BdHRyaWJ1dGVzW2ldLm5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7IFxuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0FyaWEpXG4gICAgICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVzLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodG1sQXR0cmlidXRlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zIHVzZXItZGVmaW5lZCBhcmlhIGF0dHJpYnV0ZSBuYW1lLXZhbHVlIHBhaXIgZnJvbSBkb21cbiAgICAgKiBAcGFyYW0gZWxlICBlbGVtZW50XG4gICAgICogQHJldHVybnMgdXNlciBkZWZpbmVkIGFyaWEgYXR0cmlidXRlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VXNlckRlZmluZWRBcmlhQXR0cmlidXRlTmFtZVZhbHVlUGFpcnMoZWxlbSkge1xuICAgICAgICBsZXQgYXJpYUF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgbGV0IGRvbUF0dHJpYnV0ZXMgPSBlbGVtLmF0dHJpYnV0ZXM7XG4gICAgICAgIGlmIChkb21BdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBkb21BdHRyaWJ1dGVzW2ldLm5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJWYWx1ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoYXR0clZhbHVlID09PSAnJykgYXR0clZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgaXNBcmlhID0gYXR0ck5hbWUuc3Vic3RyaW5nKDAsIDUpID09PSAnYXJpYS0nO1xuICAgICAgICAgICAgICAgIGlmIChpc0FyaWEpXG4gICAgICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVzLnB1c2goe25hbWU6IGF0dHJOYW1lLCB2YWx1ZTogYXR0clZhbHVlfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyaWFBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgdXNlci1kZWZpbmVkIGh0bWwgYXR0cmlidXRlIG5hbWUtdmFsdWUgcGFpciBmcm9tIGRvbVxuICAgICAqIEBwYXJhbSBlbGUgIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB1c2VyIGRlZmluZWQgaHRtbCBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZEh0bWxBdHRyaWJ1dGVOYW1lVmFsdWVQYWlycyhlbGVtKSB7XG4gICAgICAgIGxldCBodG1sQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW0uYXR0cmlidXRlcztcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTsgXG4gICAgICAgICAgICAgICAgbGV0IGF0dHJWYWx1ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoYXR0clZhbHVlID09PSAnJykgYXR0clZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBsZXQgaXNBcmlhID0gYXR0ck5hbWUuc3Vic3RyaW5nKDAsIDUpID09PSAnYXJpYS0nO1xuICAgICAgICAgICAgICAgIGlmICghaXNBcmlhKVxuICAgICAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlcy5wdXNoKHtuYW1lOiBhdHRyTmFtZSwgdmFsdWU6IGF0dHJWYWx1ZX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodG1sQXR0cmlidXRlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIGltcGxpY2l0IGFyaWEgZGVmaW5pdGlvbnMsIGZvciBleGFtcGxlLCBhbiBpbnB1dCB3aXRoIGNoZWNrZWQgaXMgZXF1aXZhbGVudCB0byBhcmlhLWNoZWNrZWQ9XCJ0cnVlXCJcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFyaWFBdHRyaWJ1dGUoZWxlLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgICAgIC8vIElmIHRoZSBhdHRyaWJ1dGUgaXMgZGVmaW5lZCwgaXQgdGFrZXMgcHJlY2VkZW5jZVxuICAgICAgICBsZXQgcmV0VmFsID0gZWxlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblxuICAgICAgICBpZiAoZWxlLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSAmJiByZXRWYWwudHJpbSgpID09PSBcIlwiKSB7IC8vXCJcIiBpcyB0cmVhdGVkIGFzIGZhbHNlLCBzbyB3ZSBuZWVkIHJldHVybiBpdCBiZWZvcmUgdGhlIGJlbG93IGNoZWNrXG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZW4gZGV0ZXJtaW5lIGltcGxpY2l0IHZhbHVlcyBmcm9tIG90aGVyIGF0dHJpYnV0ZXNcbiAgICAgICAgaWYgKCFyZXRWYWwpIHtcbiAgICAgICAgICAgIGxldCB0YWcgPSBlbGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lIGluIFJQVFV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3MpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFnIGluIFJQVFV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gUlBUVXRpbC5hcmlhQXR0cmlidXRlSW1wbGljaXRNYXBwaW5nc1thdHRyaWJ1dGVOYW1lXVt0YWddO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbChlbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcIipcIiBpbiBSUFRVdGlsLmFyaWFBdHRyaWJ1dGVJbXBsaWNpdE1hcHBpbmdzW2F0dHJpYnV0ZU5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IFJQVFV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV1bXCIqXCJdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbChlbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgcm9sZS1iYXNlZCBkZWZhdWx0c1xuICAgICAgICBpZiAoIXJldFZhbCkge1xuICAgICAgICAgICAgbGV0IHJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUoZWxlKTtcbiAgICAgICAgICAgIGlmIChyb2xlIGluIFJQVFV0aWwuYXJpYUF0dHJpYnV0ZVJvbGVEZWZhdWx0cyAmJiBhdHRyaWJ1dGVOYW1lIGluIFJQVFV0aWwuYXJpYUF0dHJpYnV0ZVJvbGVEZWZhdWx0c1tyb2xlXSkge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IFJQVFV0aWwuYXJpYUF0dHJpYnV0ZVJvbGVEZWZhdWx0c1tyb2xlXVthdHRyaWJ1dGVOYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsKGVsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RpbGwgbm90IGRlZmluZWQ/IENoZWNrIGdsb2JhbCBkZWZhdWx0c1xuICAgICAgICBpZiAoIXJldFZhbCAmJiBhdHRyaWJ1dGVOYW1lIGluIFJQVFV0aWwuYXJpYUF0dHJpYnV0ZUdsb2JhbERlZmF1bHRzKSB7XG4gICAgICAgICAgICByZXRWYWwgPSBSUFRVdGlsLmFyaWFBdHRyaWJ1dGVHbG9iYWxEZWZhdWx0c1thdHRyaWJ1dGVOYW1lXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdGFiVGFnTWFwID0ge1xuICAgICAgICBcImJ1dHRvblwiOiBmdW5jdGlvbiAoZWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICAgICAgcmV0dXJuICFlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcImlmcmFtZVwiOiB0cnVlLFxuICAgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uIChlbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpICE9PSBcImhpZGRlblwiICYmICFlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcInNlbGVjdFwiOiBmdW5jdGlvbiAoZWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICAgICAgcmV0dXJuICFlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcInRleHRhcmVhXCI6IHRydWUsXG4gICAgICAgIFwiZGl2XCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJjb250ZW50ZWRpdGFibGVcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwiYVwiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgLy8geGxpbms6aHJlZj8/IHNlZSBzdmdcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImhyZWZcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJlYVwiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJhdWRpb1wiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiY29udHJvbHNcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwidmlkZW9cIjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImNvbnRyb2xzXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcInN1bW1hcnlcIjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IHN1bW1hcnkgY2hpbGQgb2YgYSBkZXRhaWxzIGVsZW1lbnQgaXMgYXV0b21hdGljYWxseSBmb2N1c2FibGUgXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5wYXJlbnRFbGVtZW50ICYmIGVsZW1lbnQucGFyZW50RWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZGV0YWlscycgXG4gICAgICAgICAgICAgICAgICAgJiYgRE9NVXRpbC5zYW1lTm9kZShbLi4uZWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuXS5maWx0ZXIoZWxlbT0+ZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnc3VtbWFyeScpWzBdLCBlbGVtZW50KTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZXRhaWxzXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICAvL2RldGFpbHMgZWxlbWVudCB3aXRob3V0IGEgZGlyZWN0IHN1bW1hcnkgY2hpbGQgaXMgYXV0b21hdGljYWxseSBmb2N1c2FibGVcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmNoaWxkcmVuICYmIFsuLi5lbGVtZW50LmNoaWxkcmVuXS5maWx0ZXIoZWxlbT0+ZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnc3VtbWFyeScpLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgd29yZENvdW50KHN0cikgOiBudW1iZXIge1xuICAgICAgICBzdHIgPSBzdHIudHJpbSgpO1xuICAgICAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgICAgIHJldHVybiBzdHIuc3BsaXQoL1xccysvZykubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vdGUgdGhhdCB0aGlzIG9ubHkgZGV0ZWN0cyBpZiB0aGUgZWxlbWVudCBpdHNlbGYgaXMgaW4gdGhlIHRhYiBvcmRlci5cbiAgICAgKiBIb3dldmVyLCB0aGlzIGVsZW1lbnQgbWF5IGRlbGVnYXRlIGZvY3VzIHRvIGFub3RoZXIgZWxlbWVudCB2aWEgYXJpYS1hY3RpdmVkZXNjZW5kYW50XG4gICAgICogQWxzbywgZm9jdXMgdmFyaWVzIGJ5IGJyb3dzZXIuLi4gIHN0aWNraW5nIHRvIHRoaW5ncyB0aGF0IGFyZSBmb2N1c2FibGUgb24gY2hyb21lIGFuZCBmaXJlZm94XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc1RhYmJhYmxlKGVsZW1lbnQpIHtcbiAgICAgICAgLy8gVXNpbmcgaHR0cHM6Ly9hbGx5anMuaW8vZGF0YS10YWJsZXMvZm9jdXNhYmxlLmh0bWxcbiAgICAgICAgLy8gSGFuZGxlIHRoZSBleHBsaWNpdCBjYXNlcyBmaXJzdFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIikpID49IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXhwbGljaXQgY2FzZXMgaGFuZGxlZCAtIG5vdyB0aGUgaW1wbGljaXRcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgaW4gUlBUVXRpbC50YWJUYWdNYXApIHtcbiAgICAgICAgICAgIGxldCByZXRWYWwgPSBSUFRVdGlsLnRhYlRhZ01hcFtub2RlTmFtZV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB0YWJJbmRleExFWmVybyhlbGVtKSB7XG4gICAgICAgIGlmIChSUFRVdGlsLmhhc0F0dHJpYnV0ZShlbGVtLCBcInRhYmluZGV4XCIpKSB7XG4gICAgICAgICAgICBpZiAoZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKS5tYXRjaCgvXi0/XFxkKyQvKSkge1xuICAgICAgICAgICAgICAgIGxldCB0YWJpbmRleFZhbHVlID0gcGFyc2VJbnQoZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhYmluZGV4VmFsdWUgPT09IDAgfHwgdGFiaW5kZXhWYWx1ZSA9PT0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGdldCBudW1iZXIgb2YgdGFiYmFibGUgY2hpbGRyZW5cbiAgICAgKiBAcGFyYW0gZWxlbWVudCBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFRhYmJhYmxlQ2hpbGRyZW4oZWxlbWVudCkge1xuICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICAvLyBJZiBub2RlIGhhcyBjaGlsZHJlbiwgbG9vayBmb3IgdGFiIHN0b3BzIGluIHRoZSBjaGlsZHJlblxuICAgICAgICBpZiAoZWxlbWVudC5maXJzdENoaWxkIHx8IGVsZW1lbnQubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJRlJBTUVcIikge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIoZWxlbWVudCk7XG4gICAgICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PSAxICYmICFudy5iRW5kVGFnICYmIFJQVFV0aWwuaXNUYWJiYWJsZShudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICArK2NvdW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgfVxuXG4gICAgLy9UT0RPOiBmdW5jdGlvbiBkb2VzIG5vdCBoYW5kbGUgZXF1aXZhbGVudHMgZm9yIHJvbGVzOiByb3csIGxpbmssIGhlYWRlciwgYnV0dG9uXG4gICAgLy8gQnV0IGl0IG1heSBub3QgaGF2ZSB0by4gIEJ1ZyByZXBvcnRzIGhhdmUgYmVlbiBhYm91dCByYWRpbyBidXR0b25zIGFuZCBjaGVja2JveGVzLlxuICAgIHB1YmxpYyBzdGF0aWMgaXNIdG1sRXF1aXYobm9kZSwgaHRtbEVxdWl2KSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBmYWxzZTtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGxldCBub2RlTmFtZSA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBub2RlLmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaHRtbEVxdWl2LmluZGV4T2YoXCJjaGVja2JveFwiKSAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gdHlwZSA9PT0gXCJjaGVja2JveFwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGh0bWxFcXVpdi5pbmRleE9mKFwicmFkaW9cIikgIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHR5cGUgPT09IFwicmFkaW9cIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEZWZpbmVkQXJpYUF0dHJpYnV0ZShlbGUsIGF0dHJOYW1lKSB7XG4gICAgICAgIGxldCBpc0RlZmluZWRBcmlhQXR0cmlidXRlID0gZmFsc2U7XG4gICAgICAgIGlmIChhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLScpIHtcbiAgICAgICAgICAgIC8vIFVzZXIgYWdlbnRzIFNIT1VMRCB0cmVhdCBzdGF0ZSBhbmQgcHJvcGVydHkgYXR0cmlidXRlcyB3aXRoIGEgdmFsdWUgb2YgXCJcIiB0aGUgc2FtZSBhcyB0aGV5IHRyZWF0IGFuIGFic2VudCBhdHRyaWJ1dGUuXG4gICAgICAgICAgICBpc0RlZmluZWRBcmlhQXR0cmlidXRlID0gZWxlLmhhc0F0dHJpYnV0ZSAmJiBlbGUuaGFzQXR0cmlidXRlKGF0dHJOYW1lKSAmJiBlbGUuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKS5sZW5ndGggPiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0RlZmluZWRBcmlhQXR0cmlidXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbm9ybWFsaXplU3BhY2luZyhzKSB7XG4gICAgICAgIHJldHVybiBzLnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csICcgJyk7XG4gICAgfTtcblxuICAgIHB1YmxpYyBzdGF0aWMgbm9uRXhpc3RhbnRJRHMobm9kZSwgdGFyZ2V0aWRzKSB7XG4gICAgICAgIGxldCByZXR1cm5ub3Rmb3VuZGlkcyA9ICcnO1xuICAgICAgICBpZiAoUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKHRhcmdldGlkcykubGVuZ3RoIDwgMSkgcmV0dXJuIHJldHVybm5vdGZvdW5kaWRzO1xuXG4gICAgICAgIGxldCB0YXJnZXRBcnJheSA9IHRhcmdldGlkcy5zcGxpdChcIiBcIik7XG4gICAgICAgIGxldCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0QXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB4cCA9IFwiLy8qW0BpZD0nXCIgKyB0YXJnZXRBcnJheVtpXSArIFwiJ11cIjtcbiAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdCA9IGRvYy5ldmFsdWF0ZSh4cCwgbm9kZSwgZG9jLmRlZmF1bHROU1Jlc29sdmVyLCAwIC8qIFhQYXRoUmVzdWx0LkFOWV9UWVBFICovLCBudWxsKTtcbiAgICAgICAgICAgIGxldCByID0geHBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKTtcbiAgICAgICAgICAgIGlmICghcikgcmV0dXJubm90Zm91bmRpZHMgKz0gdGFyZ2V0QXJyYXlbaV0gKyAnLCAnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcocmV0dXJubm90Zm91bmRpZHMpLmxlbmd0aCA+PSAyKVxuICAgICAgICAgICAgcmV0dXJubm90Zm91bmRpZHMgPSByZXR1cm5ub3Rmb3VuZGlkcy5zdWJzdHJpbmcoMCwgcmV0dXJubm90Zm91bmRpZHMubGVuZ3RoIC0gMik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybm5vdGZvdW5kaWRzID0gJyc7XG4gICAgICAgIHJldHVybiByZXR1cm5ub3Rmb3VuZGlkcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldERvY0VsZW1lbnRzQnlUYWcoZWxlbSwgdGFnTmFtZSkge1xuICAgICAgICBsZXQgZG9jID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQoZWxlbSkgYXMgYW55O1xuICAgICAgICB0YWdOYW1lID0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgY2FjaGUgPSBnZXRDYWNoZShkb2MsIFwiUlBUX0RPQ0VMRU1TQllUQUdcIiwge30pO1xuICAgICAgICBpZiAoISh0YWdOYW1lIGluIGNhY2hlKSkge1xuICAgICAgICAgICAgY2FjaGVbdGFnTmFtZV0gPSBkb2MucXVlcnlTZWxlY3RvckFsbCh0YWdOYW1lKTtcbiAgICAgICAgICAgIHNldENhY2hlKGRvYywgXCJSUFRfRE9DRUxFTVNCWVRBR1wiLCBjYWNoZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlW3RhZ05hbWVdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldCBhIGxpc3Qgb2YgYWxsIHRoZSBjaGlsZCBlbGVtbnRzIHdoaWNoIG1hdGNoIHRoZSB0YWdcbiAgICAgKiBuYW1lIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBpcyBhIHdyYXBwZXIgZnVuY3Rpb24gdG86IFJQVFV0aWwuZ2V0Q2hpbGRCeVRhZ0hpZGRlblxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IHBhcmVudEVsZW0gLSBUaGUgcGFyZW50IGVsZW1lbnRcbiAgICAgKiBAcGFybSB7c3RyaW5nfSB0YWdOYW1lIC0gVGhlIHRhZyB0byBzZWFyY2ggZm9yIHVuZGVyIHRoZSBwYXJlbnQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtib29sZWFufSBpZ25vcmVIaWRkZW4gLSB0cnVlIGlmIGhpZGRlbiBlbGVtZW50cyB3aXRoIHRoZSB0YWcgc2hvdWxkIGlnbm9yZWQgZnJvbSB0aGUgbGlzdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBpZiB0aGUgaGlkZGVuIGVsZW1lbnRzIHNob3VsZCBiZSBhZGRlZFxuICAgICAqXG4gICAgICogQHJldHVybiB7TGlzdH0gcmV0VmFsIC0gbGlzdCBvZiBhbGwgdGhlIGVsZW1lbnRzIHdoaWNoIG1hdGNoZWQgdGhlIHRhZyB1bmRlciB0aGUgcGFyZW50IHRoYXQgd2VyZSBwcm92aWRlZC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRDaGlsZEJ5VGFnKHBhcmVudEVsZW0sIHRhZ05hbWUpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuZ2V0Q2hpbGRCeVRhZ0hpZGRlbihwYXJlbnRFbGVtLCB0YWdOYW1lLCBmYWxzZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldCBhIGxpc3Qgb2YgYWxsIHRoZSBjaGlsZCBlbGVtbnRzIHdoaWNoIG1hdGNoIHRoZSB0YWdcbiAgICAgKiBuYW1lIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IHBhcmVudEVsZW0gLSBUaGUgcGFyZW50IGVsZW1lbnRcbiAgICAgKiBAcGFybSB7c3RyaW5nfSB0YWdOYW1lIC0gVGhlIHRhZyB0byBzZWFyY2ggZm9yIHVuZGVyIHRoZSBwYXJlbnQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtib29sZWFufSBpZ25vcmVIaWRkZW4gLSB0cnVlIGlmIGhpZGRlbiBlbGVtZW50cyB3aXRoIHRoZSB0YWcgc2hvdWxkIGlnbm9yZWQgZnJvbSB0aGUgbGlzdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBpZiB0aGUgaGlkZGVuIGVsZW1lbnRzIHNob3VsZCBiZSBhZGRlZFxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckhpZGRlblNldHRpbmcgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGhpZGRlbiBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TGlzdH0gcmV0VmFsIC0gbGlzdCBvZiBhbGwgdGhlIGVsZW1lbnRzIHdoaWNoIG1hdGNoZWQgdGhlIHRhZyB1bmRlciB0aGUgcGFyZW50IHRoYXQgd2VyZSBwcm92aWRlZC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRDaGlsZEJ5VGFnSGlkZGVuKHBhcmVudEVsZW0sIHRhZ05hbWUsIGlnbm9yZUhpZGRlbiwgY29uc2lkZXJIaWRkZW5TZXR0aW5nKSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcbiAgICAgICAgbGV0IGNoaWxkID0gcGFyZW50RWxlbS5maXJzdENoaWxkO1xuXG4gICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBwYXJlbnQgdG8gYnVpbGQgYSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgdGhhdFxuICAgICAgICAvLyBtYXRjaCB0aGUgdGFnTmFtZSBwcm92aWRlZFxuICAgICAgICB3aGlsZSAoY2hpbGQgIT0gbnVsbCkge1xuXG4gICAgICAgICAgICAvLyBPbmx5IGluY2x1ZGUgdGhlIGNoaWxkcmVuIGludG8gdGhlIHJldHVybiBhcnJheSBpZiB0aGV5IG1hdGNoIHdpdGggdGFnbmFtZS5cbiAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YWdOYW1lKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGlnbm9yZWhpZGRlbiB3YXMgc2V0IHRvIHRydWUsIHRoZW4gcGVyZm9ybSBhIGlzTm9kZVZpc2libGUgY2hlY2tcbiAgICAgICAgICAgICAgICAvLyBhbmQgaW4gdGhlIGNhc2UgdGhlIG5vZGUgaXMgbm90IHZpc2lsYmxlIHdlIG1vcmUgdG8gdGhlc2VzIHRoZW4gbW92ZSB0byB0aGUgbmV4dCBub2RlLlxuICAgICAgICAgICAgICAgIC8vIFBlcmZvcm0gYSBjb3VwbGUgb2YgY2hlY2tzIHRvIGRldGVybWluZSBpZiBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGlnbm9yZWQgb3Igbm90LlxuICAgICAgICAgICAgICAgIC8vICAxLiBXaGVuIGlnbm9yZUhpZGRlbiBpcyBzZXQgdG8gdHJ1ZSB1cGZyb250LCB0aGVuIHBlcmZvcm0gYSBpc05vZGVWaXNpYmxlXG4gICAgICAgICAgICAgICAgLy8gIDIuIElmIGNvbnNpZGVySGlkZGVuU2V0dGluZyBvcHRpb24gaXMgc2V0IHRvIHRydWUgdGhlbiB3ZSBwZXJmb3JtIHRoZSBjaGVjayB0byBjb25zaWRlciB0aGVcbiAgICAgICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgICAgICAvLyAgMi4xLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAvLyAgICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAvLyAgICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgaWYgKChpZ25vcmVIaWRkZW4gfHwgKGNvbnNpZGVySGlkZGVuU2V0dGluZyAmJiAhUlBUVXRpbC5zaG91bGRDaGVja0hpZGRlbkNvbnRlbnQoY2hpbGQpKSkgJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShjaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUHVzaCB0aGUgZWxlbWVudFxuICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTW92ZSB0byB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnRcbiAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGEgbGlzdCBvZiBlbGVtZW50cyB0aGF0IG1hdGNoIGdpdmVuIHJvbGVzKHMpLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYnkgZGVmYXVseSB3aWxsIG5vdCBjb25zaWRlciBDaGVjayBIaWRkZW4gU2V0dGluZyBhdCBhbGwuXG4gICAgICogVGhpcyBmdW5jdGlvbiBieSBkZWZhdWx5IHdpbGwgbm90IGNvbnNpZGVyIGltcGxpY2l0IHJvbGVzLlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZG9jdW1lbnR9IGRvYyAtIFRoZSBkb2N1bWVudCBub2RlXG4gICAgICogQHBhcm0ge2xpc3Qgb3Igc3RyaW5nfSByb2xlcyAtIExpc3Qgb3Igc2luZ2xlIHJvbGUgZm9yIHdoaWNoIHRvIHJldHVybiBlbGVtZW50cyBiYXNlZCBvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJldFZhbCAtIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyB3aGljaCBtYXRjaGVkIHRoZSByb2xlKHMpIHRoYXQgd2VyZSBwcm92aWRlZC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRFbGVtZW50c0J5Um9sZShkb2MsIHJvbGVzKSB7XG4gICAgICAgIHJldHVybiBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKGRvYywgcm9sZXMsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBhIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBtYXRjaCBnaXZlbiByb2xlcyhzKS5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGFzbG8gZmluZHMgZWxlbWVudHMgd2l0aCBpbXBsaWNpdCByb2xlcy5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxzbyBjb25zaWRlciBlbGVtZW50cyB0aGF0IGFyZSBoaWRkZW4gYmFzZWQgb24gdGhlIGlmIHRoZSBDaGVja1xuICAgICAqIEhpZGRlbiBDb250ZW50IHNldHRpbmdzIHNob3VsZCBiZSBjb25zaWRlcmVkIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtkb2N1bWVudH0gZG9jIC0gVGhlIGRvY3VtZW50IG5vZGVcbiAgICAgKiBAcGFybSB7bGlzdCBvciBzdHJpbmd9IHJvbGVzIC0gTGlzdCBvciBzaW5nbGUgcm9sZSBmb3Igd2hpY2ggdG8gcmV0dXJuIGVsZW1lbnRzIGJhc2VkIG9uLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckhpZGRlblNldHRpbmcgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGhpZGRlbiBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0Um9sZXMgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGltcGxpY2l0IHJvbGVzIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbWF0Y2hlZCB0aGUgcm9sZShzKSB0aGF0IHdlcmUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oZG9jLCByb2xlcywgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXM/KSB7XG4gICAgICAgIFxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSByb2xlIHRvIGVsZW1lbnQgYXNzb2ljYXRpb24gaXMgYWxyZWFkeSBtYWRlLCBhbmQgYXZhaWxhYmxlIGluIHRoZSBnbG9iYWwgaGFzQXR0cmlidXRlXG4gICAgICAgIC8vIHdlIGNhbiBqdXN0IHVzZSB0aGF0IG9uZSBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEgbmV3IG9uZS5cbiAgICAgICAgbGV0IHJvbGVUb0VsZW1zID0gbnVsbDtcbiAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgcm9sZVRvRWxlbXMgPSBnZXRDYWNoZShkb2MsIFwiUlBUVXRpbF9HRVRFTEVNRU5UU0JZX1JPTEVfSU1QTElDSVRcIiwgbnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb2xlVG9FbGVtcyA9IGdldENhY2hlKGRvYywgXCJSUFRVdGlsX0dFVEVMRU1FTlRTQllfUk9MRVwiLCBudWxsKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gQnVpbGQgdGhlIG5ldyByb2xlIHRvIGVsZW1lbnQsIHRoaXMgaXMgd2hlcmUgd2UgbG9vcCB0aHJvdWdoIGFsbCB0aGUgZWxlbWVudHMgYW5kIGV4dHJhY3QgYWxsIHRoZVxuICAgICAgICAvLyBlbGVtZW50cyBic2FlZCBvbiByb2xlcy5cbiAgICAgICAgaWYgKHJvbGVUb0VsZW1zID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBSZS1pbml0aWFsaXplIHRoZSByb2xlVG9FbGVtcyBoYXNoXG4gICAgICAgICAgICByb2xlVG9FbGVtcyA9IHt9O1xuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGJvZHkgb2YgdGhlIGRvY1xuICAgICAgICAgICAgbGV0IHJvb3QgPSBkb2MuYm9keTtcblxuICAgICAgICAgICAgLy8gS2VlcCBsb29waW5nIHVudGlsIHdlIGFyZSBhdCB0aGUgdmVyeSBwYXJlbnQgbm9kZSBvZiB0aGUgZW50aXJlIHBhZ2UsIHNvIHRoYXQgd2UgY2FuIGxvb3AgdGhyb3VnaFxuICAgICAgICAgICAgLy8gYWxsIHRoZSBub2Rlcy5cbiAgICAgICAgICAgIHdoaWxlIChET01XYWxrZXIucGFyZW50Tm9kZShyb290KSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcGFyZW50Tm9kZVxuICAgICAgICAgICAgICAgIHJvb3QgPSBET01XYWxrZXIucGFyZW50Tm9kZShyb290KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEJ1aWxkIGEgbm9kZXdhbHRlciBiYXNlZCBvZiB0aGUgcm9vdCBub2RlLCB0aGlzIG5vZGUgd2FsdGVyIHdpbGwgYmUgdXNlIGxvb3Agb3ZlciBhbGwgdGhlIG5vZGVzXG4gICAgICAgICAgICAvLyBhbmQgYnVpbGQgdGhlIHJvbGVzIHRvIEVsZW1lbnQgY29yYWxhdGlvblxuICAgICAgICAgICAgbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIocm9vdCk7XG5cbiAgICAgICAgICAgIC8vIExvb3Agb3ZlciB0aGUgZW50aXJlIGRvYy9saXN0IG9mIG5vZGVzIHRvIGJ1aWxkIHRoZSByb2xlIHRvIGVsZW1lbnQgbWFwXG4gICAgICAgICAgICAvLyBOb3RlOiBUaGlzIHdpbGwgYnVpbGQgYW4gcm9sZVRvRWxlbXMgaGFzaCB3aGljaCBpcyBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdC5cbiAgICAgICAgICAgIC8vIHJvbGVUb0VsZW1zID0ge1xuICAgICAgICAgICAgLy8gICAgZG9jdW1lbnQ6IFt7ZGl2fSx7YWJicn0se3Zhcn1dLFxuICAgICAgICAgICAgLy8gICAgbWFpbjogW3tkaXZ9XSxcbiAgICAgICAgICAgIC8vICAgIG5hdmlnYXRpb246IFt7ZGl2fV1cbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFudy5lbGVtKCkpIGNvbnRpbnVlOyAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGNoZWNrIHRoZSBlbGVtZW50cyB3aGljaCBoYXZlIHRoZSByb2xlIGF0dHJpYnV0ZSBhc3NpY2lhdGVkIHRvIHRoZW1cbiAgICAgICAgICAgICAgICBpZiAoIW53LmJFbmRUYWcpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgd1JvbGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgdGhlIG5vZGUgaGFzIHJvbGUgYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgICBpZiAobncuZWxlbSgpICYmIG53LmVsZW0oKS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IGFsbCB0aGUgcm9sZXMgdGhhdCBhcmUgYXNzaWduZWQgdG8gdGhpcyBlbGVtZW50LCBjYW4gaGF2ZSBtdWx0aXBsZSByb2xlcyBvbiBvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQgc3BsaXQgYnkgc3BhY2UsIHNvIHdlIG5lZWQgdG8gZXh0cmFjdCBhbGwgb2YgdGhlbSBpbnRvIGFuIGFycmF5LlxuICAgICAgICAgICAgICAgICAgICAgICAgd1JvbGVzID0gbncuZWxlbSgpLmdldEF0dHJpYnV0ZShcInJvbGVcIikuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG53LmVsZW0oKSAmJiB3Um9sZXMubGVuZ3RoID09PSAwICYmIGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBpZiB0aGVyZSBhcmUgYW55IGltcGxpY2l0IHJvbGVzIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wbGljaXRSb2xlID0gUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUobncubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wbGljaXRSb2xlICE9PSBudWxsICYmIGltcGxpY2l0Um9sZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdSb2xlcyA9IGltcGxpY2l0Um9sZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh3Um9sZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgIC8vICAxLiBJZiBjb25zaWRlckhpZGRlblNldHRpbmcgb3B0aW9uIGlzIHNldCB0byB0cnVlIHRoZW4gd2UgcGVyZm9ybSB0aGUgY2hlY2sgdG8gY29uc2lkZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBDaGVjayBIaWRkZW4gQ29udGVudCB0aGF0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgICAgICAgICAvLyAgMi4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHJvbGVzIGFuZCBhc3NpZ25lZCB0aGlzIG5vZGUgdG8gYWxsIHRoZXMgcm9sZXNcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3Um9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlIHJvbGUga2V5IGlzIG5vdCBhbHJlYWR5IGluIHRoZSByb2xlVG9FbGVtcyBoYXNoLCBjb25zdHJ1Y3QgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIGtleSBhbmQgYXNzaWduIGVtcHR5IGFycmF5LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEod1JvbGVzW2ldIGluIHJvbGVUb0VsZW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVUb0VsZW1zW3dSb2xlc1tpXV0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBub2RlIHRvIHRoZSBhcnJheSBmb3IgdGhlIHJvbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVUb0VsZW1zW3dSb2xlc1tpXV0ucHVzaChudy5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0IHRoZSByb2xlVG9FbGVtcyBoYXNoIG1hcCBhcyBhIGdsb2JhbCB2YXJpYWJsZVxuICAgICAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgICAgIHNldENhY2hlKGRvYywgXCJSUFRVdGlsX0dFVEVMRU1FTlRTQllfUk9MRV9JTVBMSUNJVFwiLCByb2xlVG9FbGVtcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldENhY2hlKGRvYywgXCJSUFRVdGlsX0dFVEVMRU1FTlRTQllfUk9MRVwiLCByb2xlVG9FbGVtcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluaXRpbGl6ZSB0aGUgcmV0dXJuIHZhbHVlXG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcblxuICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2VzIHdoZXJlIHRoZSBwcm92aWRlZCByb2xlIGlzIGEgc3RyaW5nIGFuZCBub3QgYW4gYXJyYXksXG4gICAgICAgIC8vIGZvciB0aGlzIGNhc2Ugd2UgdGFrZSB0aGUgc3RyaW5nIGFuZCBwdXQgaXQgaW50byBhbiBhcnJheVxuICAgICAgICBpZiAodHlwZW9mIChyb2xlcykgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCByb2xlID0gcm9sZXM7XG4gICAgICAgICAgICByb2xlcyA9IFtdO1xuICAgICAgICAgICAgcm9sZXMucHVzaChyb2xlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgcm9sZXMgdGhhdCB3ZXJlIHByb3ZpZGVkIGFuZCBmaW5kIHRoZSBsaXN0IG9mIGVsZW1lbnRzIGZvciB0aGlzIHJvbGVzXG4gICAgICAgIC8vIGFuZCBhZGQgdGhlbSB0byB0aGUgcmV0dXJuIHZhbHVlLlxuICAgICAgICBpZiAocm9sZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBsb29wIG92ZXIgYWxsIHRoZSByb2xlc1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHJvbGUgZnJvbSB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICBsZXQgbmV4dFJvbGUgPSByb2xlc1tpXTtcbiAgICAgICAgICAgICAgICAvLyBGZXRjaCB0aGUgbGlzdCBvZiBhbGwgdGhlIGVsZW1lbnRzIGZvciB0aGlzIHJvbGVcbiAgICAgICAgICAgICAgICBsZXQgY29weVJvbGVzID0gcm9sZVRvRWxlbXNbbmV4dFJvbGVdO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIGVsZW1lbnRzIHRvIGNvcHkgdG8gYW5vdGhlciBhcnJheSwgdGhlbiBwZXJmb3JtIHRoZSBjb3B5XG4gICAgICAgICAgICAgICAgaWYgKGNvcHlSb2xlcykge1xuICAgICAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBlbGVtZW50cyB3aGljaCBhcmUgdG8gYmUgY29waWVkXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29weVJvbGVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhpcyBlbGVtZW50IHRvIHRoZSByZXR1cm4gdmFsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwucHVzaChjb3B5Um9sZXNbal0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZXRyaWV2aW5nIHVzZXIgZGVmaW5lZCBlbGVtZW50J3Mgcm9sZXMgZnJvbSBkb20uXG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBlbGUgLSBlbGVtZW50IGZvciB3aGljaCB0byBmaW5kIHJvbGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByb2xlcyAtIGxpc3Qgb2YgdXNlciBkZWZpbmVkIHJvbGVzIGluIHRoZSBlbGVtZW50IHJvbGUgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFVzZXJEZWZpbmVkUm9sZXMoZWxlOiBFbGVtZW50KSA6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuZ2V0Um9sZXMoZWxlLCBmYWxzZSk7XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHJldHJpZXZpbmcgZWxlbWVudCdzIHJvbGVzLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBmaW5kcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TGlzdH0gcm9sZXMgLSBsaXN0IG9mIGF0dHJpYnV0ZSByb2xlcyBhbmQgaW1wbGljaXQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Um9sZXMoZWxlOiBFbGVtZW50LCBjb25zaWRlckltcGxpY2l0Um9sZXM6IGJvb2xlYW4pIDogc3RyaW5nW10ge1xuICAgICAgICBsZXQgcm9sZXMgOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoZWxlICYmIGVsZS5oYXNBdHRyaWJ1dGUgJiYgZWxlLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIGxldCBhdHRyUm9sZXMgPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcoZWxlLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJSb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHJvbGVzLnB1c2goYXR0clJvbGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgaWYgaW1wbGljaXQgcm9sZXMgZXhpc3QuXG4gICAgICAgIC8vTm90ZTogZWxlbWVudCBjYW4gaGF2ZSBtdWx0aXBsZSBpbXBsaWNpdCByb2xlc1xuICAgICAgICBpZiAoY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgICAgICBsZXQgaW1wbGljaXRSb2xlID0gUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgICAgIGlmIChpbXBsaWNpdFJvbGUgIT09IG51bGwgJiYgaW1wbGljaXRSb2xlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvL2FkZCBpbXBsaWNpdCByb2xlcyB0byB0aGUgYXR0cmlidXRlcyByb2xlcy5cbiAgICAgICAgICAgICAgICBSUFRVdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoaW1wbGljaXRSb2xlLCByb2xlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvbGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGltcGxpY2l0IHJvbGUgb2YgdGhlIGVsZW1lbWVudFxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGUgaW1wbGljaXQgcm9sZSBvciBbXSBpZiBkb2Vzbid0IGV4aXN0XG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW1wbGljaXRSb2xlKGVsZSkgOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmICghZWxlIHx8IGVsZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIFtdO1xuICAgICAgICBsZXQgaW1wbGljaXRSb2xlcyA6IHN0cmluZ1tdID0gZ2V0Q2FjaGUoZWxlLCBcIlJQVFV0aWxfSW1wbGljaXRSb2xlXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IFJQVFV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShlbGUpO1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBpbXBsaWNpdCByb2xlcyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5ICYmIHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSkge1xuICAgICAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUuaW5jbHVkZXMoXCJnZW5lcmljXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSAnZ2VuZXJpYycgcm9sZSBpcyBvbmx5IGFsbG93ZWQgaWYgYSB2YWxpZCBhcmlhIGF0dHJpYnV0ZSBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgIGxldCBkb21BcmlhQXR0cmlidXRlcyA9IFJQVFV0aWwuZ2V0VXNlckRlZmluZWRBcmlhQXR0cmlidXRlcyhlbGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9tQXJpYUF0dHJpYnV0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRDYWNoZShlbGUsIFwiUlBUVXRpbF9JbXBsaWNpdFJvbGVcIiwgW10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZUF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdHRlcm4gPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbJ2dlbmVyaWMnXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4ucmVxUHJvcHMgJiYgcGF0dGVybi5yZXFQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHBhdHRlcm4ucmVxUHJvcHMsIHJvbGVBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eS5nbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkKVxuICAgICAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KEFSSUFEZWZpbml0aW9ucy5nbG9iYWxQcm9wZXJ0aWVzLCByb2xlQXR0cmlidXRlcyk7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5kZXByZWNhdGVkUHJvcHMgJiYgcGF0dGVybi5kZXByZWNhdGVkUHJvcHMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwucmVkdWNlQXJyYXlJdGVtTGlzdChwYXR0ZXJuLmRlcHJlY2F0ZWRQcm9wcywgcm9sZUF0dHJpYnV0ZXMpOyBcblxuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgJ2dlbmVyaWMnIHJvbGUgaWYgcm9sZUF0dHJpYnV0ZXMgZG9lc24ndCBjb250YWluIGFueSBvZiBkb21BcmlhQXR0cmlidXRlcyBcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVBdHRyaWJ1dGVzLmxlbmd0aCA+IDAgJiYgIXJvbGVBdHRyaWJ1dGVzLnNvbWUoYXR0cj0+IGRvbUFyaWFBdHRyaWJ1dGVzLmluY2x1ZGVzKGF0dHIpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltcGxpY2l0ID0gUlBUVXRpbC5yZWR1Y2VBcnJheUl0ZW1MaXN0KFsnZ2VuZXJpYyddLCB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FjaGUoZWxlLCBcIlJQVFV0aWxfSW1wbGljaXRSb2xlXCIsIGltcGxpY2l0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbXBsaWNpdDtcbiAgICAgICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2V0Q2FjaGUoZWxlLCBcIlJQVFV0aWxfSW1wbGljaXRSb2xlXCIsIHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZTsgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldENhY2hlKGVsZSwgXCJSUFRVdGlsX0ltcGxpY2l0Um9sZVwiLCBbXSk7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH0gICAgXG4gICAgICAgIHJldHVybiBpbXBsaWNpdFJvbGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHJlcXVpcmVkIHByb3BlcnRpZXMgb2YgdGhlIHJvbGVcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlIC0gdGhlIHJvbGVcbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHByb3BlcnRpZXMgLSBsaXN0IG9mIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVxdWlyZWQgYnkgdGhlIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRSb2xlUmVxdWlyZWRQcm9wZXJ0aWVzKHJvbGUsIGVsZSkge1xuICAgICAgICBpZiAocm9sZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdKSB7XG4gICAgICAgICAgICBsZXQgcmVxdWlyZWRBdHRyaWJ1dGVzID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLnJlcVByb3BzO1xuICAgICAgICAgICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBzZXBhcmF0b3JcbiAgICAgICAgICAgIGlmIChyb2xlLnRvTG93ZXJDYXNlKCkgPT09IFwic2VwYXJhdG9yXCIgJiYgZWxlICYmIFJQVFV0aWwuaXNGb2N1c2FibGUoZWxlKSkge1xuICAgICAgICAgICAgICAgIHJlcXVpcmVkQXR0cmlidXRlcyA9IFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChbXCJhcmlhLXZhbHVlbm93XCJdLCByZXF1aXJlZEF0dHJpYnV0ZXMgfHwgW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmVkQXR0cmlidXRlcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGVzdCBpZiB0aGUgZWxlIG5vZGUgaXMgZm9jdXNhYmxlXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0ZvY3VzYWJsZShlbGUpIHtcbiAgICAgICAgaWYgKGVsZSA9PT0gXCJ1bmRlZmluZWRcIiB8fCBlbGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUlBUVXRpbC5pc1RhYmJhYmxlKGVsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBpZiBhIGVsZW1lbnQgaGFzIGdpdmVuIHJvbGUuXG4gICAgICogVGhpcyBmdW5jdGlvbiBhc2xvIGZpbmRzIGlmIGVsZW1lbnQgaGFzIGdpdmVuIHJvbGVzIGFzIGltcGxpY2l0IHJvbGUuXG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBlbGUgLSBlbGVtZW50IGZvciB3aGljaCB0byBmaW5kIHJvbGUuXG4gICAgICogQHBhcm0ge2xpc3Qgb3Igc3RyaW5nfSByb2xlcyAtIExpc3Qgb3Igc2luZ2xlIHJvbGUgZm9yIHdoaWNoIHRvIGZpbmQgaWYgZWxlbWVudCBoYXMgdGhlc2Ugcm9sZXMuXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXRSb2xlcyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaW1wbGljaXQgcm9sZXMgc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJldFZhbCAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgdGggZWxlbWVudCBoYXMgdGhlIHNwZWNpZmllZCByb2xlLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFJQVFV0aWxcbiAgICAgKlxuICAgICAqIENvbnNpZGVyIHRvIHVzZSBoYXNSb2xlSW5TZW1hbnRpY3MoKSBpbnN0ZWFkLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaGFzUm9sZShlbGUsIHJvbGUsIGNvbnNpZGVySW1wbGljaXRSb2xlcz8pIHsgIC8vQ29uc2lkZXIgdG8gdXNlIGhhc1JvbGVJblNlbWFudGljcygpIGluc3RlYWQuXG4gICAgICAgIGxldCByZXRWYWwgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVsZSAmJiBlbGUuaGFzQXR0cmlidXRlICYmIGVsZS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyb2xlKSAhPSB0eXBlb2YgKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVzID0gZWxlLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcm9sZXNbaV0gaW4gcm9sZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCByb2xlcyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IHJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHJvbGVzW2ldID09PSByb2xlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL2lmIG5vbmUgb2YgdGhlIHRoZSBhdHRyaWJ1dGUgcm9sZXMgbWF0Y2hlZCB3aXRoIGdpdmVuIHJvbGVcbiAgICAgICAgLy9jaGVjayBpZiBpbXBsaWNpdCByb2xlcyBtYXRjaGVzLlxuICAgICAgICAvL05vdGU6IGVsZW1lbnQgY2FuIGhhdmUgbXVsdGlwbGUgaW1wbGljaXQgcm9sZXNcbiAgICAgICAgaWYgKCFyZXRWYWwgJiYgY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgICAgICBsZXQgd1JvbGVzID0gW107XG4gICAgICAgICAgICAvL2NoZWNrIGlmIHRoZXJlIGFyZSBhbnkgaW1wbGljaXQgcm9sZXMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGUgPSBSUFRVdGlsLmdldEltcGxpY2l0Um9sZShlbGUpO1xuICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZSAhPT0gbnVsbCAmJiBpbXBsaWNpdFJvbGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIFJQVFV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChpbXBsaWNpdFJvbGUsIHdSb2xlcyk7XG4gICAgICAgICAgICAgICAgLy9pZiByb2xlIGlzIGFycmF5IGxvb3AgdGhydSBhbmQgc2VlIGlmIGFueSAgb2YgdGhlIGltcGxpY2l0IHJvbGUgcHJlc2VudCBpbiB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyb2xlKSAhPSB0eXBlb2YgKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCB3Um9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHdSb2xlc1tpXSBpbiByb2xlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IHdSb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gd1JvbGVzW2ldID09PSByb2xlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBlbGVtZW50IGhhcyB0aGUgcm9sZSwgaW5jbHVkaW5nIHRoZSBpbXBsaWVkIHJvbGUgaWYgcm9sZSBpcyBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlcGxhY2luZyB0aGUgaGFzUm9sZSBmdW5jdGlvblxuICAgICAqXG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBlbGUgLSBlbGVtZW50IGZvciB3aGljaCB0byBmaW5kIHJvbGUuXG4gICAgICogQHBhcm0ge2xpc3Qgb3Igc3RyaW5nfSByb2xlcyAtIExpc3Qgb3Igc2luZ2xlIHJvbGUgZm9yIHdoaWNoIHRvIGZpbmQgaWYgZWxlbWVudCBoYXMgdGhlc2Ugcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIHRoZSBlbGVtZW50IGhhcyB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgUlBUVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaGFzUm9sZUluU2VtYW50aWNzKGVsZSwgcm9sZSkge1xuICAgICAgICBsZXQgcmV0VmFsID0gZmFsc2U7XG4gICAgICAgIGxldCByb2xlU3BlY2lmaWVkID0gZmFsc2U7XG4gICAgICAgIGlmIChlbGUgJiYgZWxlLmhhc0F0dHJpYnV0ZSAmJiBlbGUuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAocm9sZSkgIT0gdHlwZW9mIChcIlwiKSkge1xuICAgICAgICAgICAgICAgIGxldCByb2xlcyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IHJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvbGVTcGVjaWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByb2xlc1tpXSBpbiByb2xlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVzID0gZWxlLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1xccysvKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZVNwZWNpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHJvbGVzW2ldID09PSByb2xlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyb2xlU3BlY2lmaWVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBpbXBsaWNpdCByb2xlcyBtYXRjaGVzLlxuICAgICAgICAvL05vdGU6IGVsZW1lbnQgY2FuIGhhdmUgbXVsdGlwbGUgaW1wbGljaXQgcm9sZXNcbiAgICAgICAgLy9jaGVjayBpZiB0aGVyZSBhcmUgYW55IGltcGxpY2l0IHJvbGVzIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgIGxldCBpbXBSb2xlcyA9IFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKGVsZSk7XG4gICAgICAgIGlmIChpbXBSb2xlcyAhPT0gbnVsbCAmJiBpbXBSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvL2lmIHJvbGUgaXMgYXJyYXkgbG9vcCB0aHJ1IGFuZCBzZWUgaWYgYW55ICBvZiB0aGUgaW1wbGljaXQgcm9sZSBwcmVzZW50IGluIHRoZSBhcnJheVxuICAgICAgICAgICAgaWYgKHR5cGVvZiAocm9sZSkgIT0gdHlwZW9mIChcIlwiKSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCBpbXBSb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBpbXBSb2xlc1tpXSBpbiByb2xlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IGltcFJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGltcFJvbGVzW2ldID09PSByb2xlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcgaWYgYSBlbGVtZW50IGhhcyBnaXZlbiByb2xlLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBjaGVja3MgaWYgZWxlbWVudCBoYXMgZ2l2ZW4gcm9sZXMgYXMgaW1wbGljaXQgcm9sZXMuXG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBlbGUgLSBlbGVtZW50IGZvciB3aGljaCB0byBmaW5kIHJvbGUuXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXRSb2xlcyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaW1wbGljaXQgcm9sZXMgc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHJldFZhbCAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgdGhlIGVsZW1lbnQgaGFzIHRoZSBzcGVjaWZpZWQgcm9sZS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBSUFRVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBoYXNBbnlSb2xlKGVsZSwgY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVsZSAmJiBlbGUuaGFzQXR0cmlidXRlICYmIGVsZS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICByZXRWYWwgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBpbXBsaWNpdCByb2xlcyBleGlzdC5cbiAgICAgICAgLy9Ob3RlOiBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgIGlmICghcmV0VmFsICYmIGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgLy9jaGVjayBpZiB0aGVyZSBhcmUgYW55IGltcGxpY2l0IHJvbGVzIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgICAgICBsZXQgaW1wUm9sZXMgPSBSUFRVdGlsLmdldEltcGxpY2l0Um9sZShlbGUpO1xuICAgICAgICAgICAgaWYgKGltcFJvbGVzICE9PSBudWxsICYmIGltcFJvbGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0VmFsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEYXRhVGFibGUodGFibGVOb2RlKSB7XG4gICAgICAgIHJldHVybiAhKFJQVFV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwibm9uZVwiKSB8fCBSUFRVdGlsLmhhc1JvbGUodGFibGVOb2RlLCBcInByZXNlbnRhdGlvblwiKSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBBIGNvbXBsZXggZGF0YSB0YWJsZSBpcyBhIGRhdGEgdGFibGUgd2l0aCBhbnkgb2YgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJpc3RpY3M6XG4gICAgICpcbiAgICAgKiBhIHRoZWFkIGVsZW1lbnQgdGhhdCBjb250YWlucyB0d28gb3IgbW9yZSB0ciBlbGVtZW50c1xuICAgICAqIGEgdGFibGUgd2l0aCBtb3JlIHRoYW4gb25lIHRoZWFkIGVsZW1lbnRcbiAgICAgKiBhIHRhYmxlIHdpdGggdHdvIG9yIG1vcmUgdHIgZWxlbWVudHMgdGhhdCBjb250YWluIG9ubHkgdGggZWxlbWVudHNcbiAgICAgKiBhIHRoIG9yIHRkIGVsZW1lbnQgd2l0aCBhIHJvd3NwYW4gb3IgY29sc3BhbiBhdHRyaWJ1dGVcbiAgICAgKiBhIHRyIGVsZW1lbnQgdGhhdCBjb250YWlucyBhdCBsZWFzdCBvbmUgdGQgZWxlbWVudCBhbmQgdHdvIG9yIG1vcmUgdGggZWxlbWVudHNcbiAgICAgKiBhIHRhYmxlIHdpdGggaGVhZGVycyBub3QgbG9jYXRlZCBpbiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0IGNvbHVtblxuICAgICAqIGEgdGQgZWxlbWVudCB3aXRoIGEgaGVhZGVycyBhdHRyaWJ1dGUgdmFsdWUgdGhhdCBjb250YWlucyBtb3JlIHRoYW4gdHdvIElEUkVGc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNDb21wbGV4RGF0YVRhYmxlKHRhYmxlKSB7XG5cbiAgICAgICAgaWYgKFwiUlBUVXRpbF9pc0NvbXBsZXhEYXRhVGFibGVcIiBpbiB0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuICEhdGFibGUuUlBUVXRpbF9pc0NvbXBsZXhEYXRhVGFibGU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaXNDb21wbGV4VGFibGUgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGFibGUgJiYgUlBUVXRpbC5pc0RhdGFUYWJsZSh0YWJsZSkpIHtcblxuICAgICAgICAgICAgbGV0IHRoTm9kZXMgPSBudWxsLFxuICAgICAgICAgICAgICAgIHRkTm9kZXMgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHRyTm9kZXMgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRyXCIpO1xuICAgICAgICAgICAgbGV0IHRyTm9kZUNvdW50ID0gdHJOb2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgdGROb2RlQ291bnQgPSAwLFxuICAgICAgICAgICAgICAgIHRoTm9kZUNvdW50ID0gMCxcbiAgICAgICAgICAgICAgICB0ck5vZGVzSGF2aW5nT25seVRoTm9kZXMgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIWlzQ29tcGxleFRhYmxlICYmIGkgPCB0ck5vZGVDb3VudDsgKytpKSB7XG5cbiAgICAgICAgICAgICAgICB0aE5vZGVzID0gdHJOb2Rlc1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRoXCIpO1xuICAgICAgICAgICAgICAgIHRkTm9kZXMgPSB0ck5vZGVzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGRcIik7XG4gICAgICAgICAgICAgICAgdGhOb2RlQ291bnQgPSB0aE5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB0ZE5vZGVDb3VudCA9IHRkTm9kZXMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRkTm9kZUNvdW50ICE9PSAwKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSB0ciBlbGVtZW50IHRoYXQgY29udGFpbnMgYXQgbGVhc3Qgb25lIHRkIGVsZW1lbnQgYW5kIHR3byBvciBtb3JlIHRoIGVsZW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXhUYWJsZSA9IHRoTm9kZUNvdW50ID4gMTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRoIGVsZW1lbnQgd2l0aCBhIHJvd3NwYW4gb3IgY29sc3BhbiBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7ICFpc0NvbXBsZXhUYWJsZSAmJiBqIDwgdGhOb2RlQ291bnQ7ICsraikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSAoKHRoTm9kZXNbal0uaGFzQXR0cmlidXRlKFwicm93c3BhblwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoTm9kZXNbal0uaGFzQXR0cmlidXRlKFwiY29sc3BhblwiKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmdldEFuY2VzdG9yKHRoTm9kZXNbal0sIFwidGFibGVcIikgPT09IHRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgdGQgZWxlbWVudCB3aXRoIGEgcm93c3BhbiBvciBjb2xzcGFuIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRkIGVsZW1lbnQgd2l0aCBhIGhlYWRlcnMgYXR0cmlidXRlIHZhbHVlIHRoYXQgY29udGFpbnMgbW9yZSB0aGFuIHR3byBJRFJFRnNcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7ICFpc0NvbXBsZXhUYWJsZSAmJiBrIDwgdGROb2RlQ291bnQ7ICsraykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSAoKHRkTm9kZXNba10uaGFzQXR0cmlidXRlKFwicm93c3BhblwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkTm9kZXNba10uaGFzQXR0cmlidXRlKFwiY29sc3BhblwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZE5vZGVzW2tdLmhhc0F0dHJpYnV0ZShcImhlYWRlcnNcIikgJiYgUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKHRkTm9kZXNba10uZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKSkuc3BsaXQoXCIgXCIpLmxlbmd0aCA+IDIpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuZ2V0QW5jZXN0b3IodGROb2Rlc1trXSwgXCJ0YWJsZVwiKSA9PT0gdGFibGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHR3byBvciBtb3JlIHRyIGVsZW1lbnRzIHRoYXQgY29udGFpbiBvbmx5IHRoIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aE5vZGVDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICsrdHJOb2Rlc0hhdmluZ09ubHlUaE5vZGVzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdHJOb2Rlc0hhdmluZ09ubHlUaE5vZGVzID09PSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFpc0NvbXBsZXhUYWJsZSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IHRoZWFkTm9kZXMgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRoZWFkXCIpO1xuICAgICAgICAgICAgICAgIGxldCB0aGVhZE5vZGVzTGVuZ3RoID0gdGhlYWROb2Rlcy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhlYWROb2Rlc0xlbmd0aCA+IDApIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyB0YWJsZSBoYXMgbW9yZSB0aGFuIG9uZSB0aGVhZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdGhlYWROb2Rlc0xlbmd0aCA+IDE7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSB0aGVhZCBlbGVtZW50IHRoYXQgY29udGFpbnMgdHdvIG9yIG1vcmUgdHIgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0NvbXBsZXhUYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSB0aGVhZE5vZGVzWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidHJcIikubGVuZ3RoID4gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNDb21wbGV4VGFibGUgJiYgdHJOb2RlQ291bnQgIT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBhIHRhYmxlIHdpdGggaGVhZGVycyBub3QgbG9jYXRlZCBpbiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0IGNvbHVtblxuICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdGhOb2RlQ291bnQgPiAwICYmICFSUFRVdGlsLmlzVGFibGVIZWFkZXJJbkZpcnN0Um93T3JDb2x1bW4odGFibGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRhYmxlLlJQVFV0aWxfaXNDb21wbGV4RGF0YVRhYmxlID0gaXNDb21wbGV4VGFibGU7XG5cbiAgICAgICAgcmV0dXJuIGlzQ29tcGxleFRhYmxlO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIGEgdGFibGUncyBoZWFkZXIgaXMgaW4gdGhlIGZpcnN0IHJvdyBvciBjb2x1bW5cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFibGVIZWFkZXJJbkZpcnN0Um93T3JDb2x1bW4ocnVsZUNvbnRleHQpIHtcblxuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIGxldCByb3dzID0gcnVsZUNvbnRleHQucm93cztcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZpcnN0IHJvdyBpcyBhbGwgVEgnc1xuICAgICAgICBpZiAocm93cyAhPSBudWxsICYmIHJvd3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGZpcnN0Um93ID0gcm93c1swXTtcbiAgICAgICAgICAgIHBhc3NlZCA9IGZpcnN0Um93LmNlbGxzLmxlbmd0aCA+IDAgJiYgUlBUVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuKGZpcnN0Um93LCBcInRkXCIsIGZhbHNlLCB0cnVlKS5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZmlyc3Qgcm93IGlzbid0IGEgaGVhZGVyIHJvdywgdHJ5IHRoZSBmaXJzdCBjb2x1bW5cbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgLy8gQXNzdW1lIHRoYXQgdGhlIGZpcnN0IGNvbHVtbiBoYXMgYWxsIFRIJ3MgdW5sZXNzIHdlIGZpbmQgYSBURCBpbiB0aGUgZmlyc3QgY29sdW1uLlxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgcm93cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBubyBjZWxscyBpbiB0aGlzIHJvdywgdGhhdCdzIG9rYXkgdG9vLlxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAhcm93c1tpXS5jZWxscyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgcm93c1tpXS5jZWxscy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd3NbaV0uY2VsbHNbMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSBcInRkXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgLSBib3RoIGZpcnN0IHJvdyBhbmQgZmlyc3QgY29sdW1uIGFyZSBoZWFkZXJzLCBidXQgdGhleSBkaWQgbm90IHVzZVxuICAgICAgICAgICAgICAgIC8vIGEgdGggZm9yIHRoZSB1cHBlci1sZWZ0IGNlbGxcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBwYXNzZWQgJiYgaSA8IGZpcnN0Um93LmNlbGxzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZpcnN0Um93LmNlbGxzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT0gXCJ0ZFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgcGFzc2VkICYmIGkgPCByb3dzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIG5vIGNlbGxzIGluIHRoaXMgcm93LCB0aGF0J3Mgb2theSB0b28uXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9ICFyb3dzW2ldLmNlbGxzIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICByb3dzW2ldLmNlbGxzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgcm93c1tpXS5jZWxsc1swXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9IFwidGRcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhc3NlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTm9kZUluR3JpZChub2RlKSB7XG4gICAgICAgIHJldHVybiBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUobm9kZSwgXCJncmlkXCIpICE9IG51bGw7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNMYXlvdXRUYWJsZSh0YWJsZU5vZGUpIHtcbiAgICAgICAgcmV0dXJuIFJQVFV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwicHJlc2VudGF0aW9uXCIpIHx8IFJQVFV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwibm9uZVwiKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRGaWxlRXh0KHVybCkge1xuICAgICAgICBsZXQgbSA9IHVybC5tYXRjaCgvXFwuKChbXjs/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+XT8pLyk7XG4gICAgICAgICAgICBsZXQgYXR0ckluZm8gOiBBdHRySW5mb1tdID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGF0dHJQYXJ0IG9mIHBhcnRzWzNdLm1hdGNoKC9cXFsoW15cXF1dKylcXF0vZykgfHwgW10pIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0clBhcnRzID0gYXR0clBhcnQubWF0Y2goL1xcWyghPykoW2EtejpBLVoqXFwtX10rKSghP1s9fl0pPyhbXlxcXV0rKT9cXF0vKTtcbiAgICAgICAgICAgICAgICBhdHRySW5mby5wdXNoKG5ldyBBdHRySW5mbyhcbiAgICAgICAgICAgICAgICAgICAgYXR0clBhcnRzWzFdICE9PSBcIiFcIixcbiAgICAgICAgICAgICAgICAgICAgYXR0clBhcnRzWzJdLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgICAgIGF0dHJQYXJ0c1szXSxcbiAgICAgICAgICAgICAgICAgICAgYXR0clBhcnRzWzRdXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJ0c1syXSA9IHBhcnRzWzJdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBjb25zdCBuc1BhcnRzID0gcGFydHNbMl0uc3BsaXQoXCI6XCIpO1xuICAgICAgICAgICAgbGV0IGluY2wgPSBwYXJ0c1sxXSAhPT0gXCIhXCI7XG4gICAgICAgICAgICBjb25zdCBucyA9IG5zUGFydHMuc2hpZnQoKTtcbiAgICAgICAgICAgIGxldCByb2xlID0gbnNQYXJ0cy5qb2luKFwiOlwiKTtcbiAgICAgICAgICAgIGxldCBwYXJ0SW5mbyA9IG5ldyBQYXJ0SW5mbyhpbmNsLCBucywgcm9sZSwgYXR0ckluZm8sIHBhcnRzW3BhcnRzLmxlbmd0aC0xXSk7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2gocGFydEluZm8pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGV4dEluZm8gPSByZXN1bHRzO1xuICAgIH1cblxuICAgIHN0YXRpYyBjbGVhbkNvbnRleHQoY29udGV4dDogc3RyaW5nKSA6IHN0cmluZyB7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dC5yZXBsYWNlKC8gKyEvZywgXCIgIVwiKTtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQucmVwbGFjZSgvICsoWz4rfixdKS9nLCBcIiQxXCIpO1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dC5yZXBsYWNlKC8oWz4rfixdKSArL2csIFwiJDFcIik7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnJlcGxhY2UoLyArL2csIFwiIFwiKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQudHJpbSgpO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShjb250ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGNvbnRleHRzID0gQ29udGV4dC5zcGxpdE11bHRpcGxlKENvbnRleHQuY2xlYW5Db250ZXh0KGNvbnRleHQpKTtcblxuICAgICAgICBsZXQgcmV0VmFsIDogQ29udGV4dFtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbGV0IGN0eCA9IG5ldyBDb250ZXh0KGNvbnRleHRzW2ldKTtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGluaXRpYWwgcHJvY2Vzc2luZyBvZiBzcGxpdHRpbmcgb24gY29tbWEgLSBjb250ZXh0LGNvbnRleHRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBcbiAgICAgKi9cbiAgICBzdGF0aWMgc3BsaXRNdWx0aXBsZShjb250ZXh0OiBzdHJpbmcpIDogc3RyaW5nW10ge1xuICAgICAgICBsZXQgY29udGV4dHMgPSBbXTtcbiAgICAgICAgaWYgKGNvbnRleHQpIHtcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmluZGV4T2YoXCIsXCIpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBjb250ZXh0LnNwbGl0KFwiLFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0cy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGV4dHM7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgSUVuZ2luZSwgUmVwb3J0LCBSdWxlLCBSdWxlRGV0YWlscywgUnVsZVJlc3VsdCwgZVJ1bGVDb25maWRlbmNlLCBSdWxlQ29udGV4dCwgTmxzTWFwLCBIZWxwTWFwLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSUVuZ2luZVwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IENvbnRleHQsIFBhcnRJbmZvLCBBdHRySW5mbyB9IGZyb20gXCIuL0NvbnRleHRcIjtcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gXCIuLi9jb25maWcvQ29uZmlnXCI7XG5pbXBvcnQgeyBJTWFwUmVzdWx0LCBJTWFwcGVyIH0gZnJvbSBcIi4uL2FwaS9JTWFwcGVyXCI7XG5pbXBvcnQgeyBET01NYXBwZXIgfSBmcm9tIFwiLi4vZG9tL0RPTU1hcHBlclwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgY2xlYXJDYWNoZXMgfSBmcm9tIFwiLi4vLi4vdjQvdXRpbC9DYWNoZVV0aWxcIjtcblxuY2xhc3MgV3JhcHBlZFJ1bGUge1xuICAgIG5zOiBzdHJpbmc7XG4gICAgaWR4PzogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IgKHB1YmxpYyBydWxlOiBSdWxlLCBwdWJsaWMgcGFyc2VkSW5mbyA6IENvbnRleHQpIHtcbiAgICAgICAgdGhpcy5ucyA9IHRoaXMucGFyc2VkSW5mby5jb250ZXh0SW5mb1t0aGlzLnBhcnNlZEluZm8uY29udGV4dEluZm8ubGVuZ3RoLTFdLm5hbWVzcGFjZTtcbiAgICAgICAgQ29uZmlnLkRFQlVHICYmIGNvbnNvbGUubG9nKFwiQWRkZWQgUnVsZTpcIiwgcnVsZS5pZCwgSlNPTi5zdHJpbmdpZnkodGhpcy5wYXJzZWRJbmZvKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBjb252ZXJ0aW5nIHRoZSBub2RlIGludG8gYSBzbmlwcGV0IHdoaWNoIGNhbiBiZSBhZGRlZCB0byByZXBvcnQuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGFrZSB0aGUgbm9kZSBhbmQgZXh0cmFjdCB0aGUgbm9kZSBuYW1lIGFuZCB0aGUgYXR0cmlidXRlcyBhbmQgYnVpbGQgdGhlIHNuaXBwZXQgYmFzZWQgb24gdGhpcy5cbiAgICAgKlxuICAgICAqIFRPRE86IEZ1dHVyZSwgbWF5YmUgd2UgY2FuIGV4dHJhY3QgbW9yZSB0aGVuIGp1c3Qgc2luZ2xlIGxpbmUsIGFkZCBtb3JlIGluZm8gb3IgZXZlbiBhZGQgY2xvc2luZyB0YWdzIGV0Yy4uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSAtIFRoZSBodG1sIGVsZW1lbnQgdG8gY29udmVydCBpbnRvIGVsZW1lbnQgc25pcHBldCB3aXRoIG5vZGUgbmFtZSBhbmQgYXR0cmlidXRlcyBvbmx5LlxuICAgICAqXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBub2RlU25pcHBldCAtIHJldHVybiB0aGUgZWxlbWVudCBzbmlwcGV0IG9mIHRoZSBlbGVtZW50IHRoYXQgd2FzIHByb3ZpZGVkIHdoaWNoIG9ubHkgY29udGFpbnMsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVuYW1lIGFuZCBhdHRyaWJ1dGVzLiBpLmUuIDx0YWJsZSBpZD1cXFwibGF5b3V0X3RhYmxlMVxcXCIgcm9sZT1cXFwicHJlc2VudGF0aW9uXFxcIj5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiB0aGlzXG4gICAgICovXG4gICAgc3RhdGljIGNvbnZlcnROb2RlVG9TbmlwcGV0KG5vZGUgOiBFbGVtZW50KSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIHZhciBub2RlU25pcHBldCA9ICcnO1xuXG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIG5vZGUgbmFtZSBhbmQgYWRkIGl0IHRvIHRoZSBub2RlIHNuaXBwZXRcbiAgICAgICAgbm9kZVNuaXBwZXQgKz0gJzwnICsgbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIEV4dHJhY3QgYWxsIHRoZSBub2RlIGF0dHJpYnV0ZXMgYXMgYW4gYXJyYXlcbiAgICAgICAgdmFyIG5vZGVBdHRyaWJ1dGVzID0gbm9kZS5hdHRyaWJ1dGVzO1xuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoZXJlIGFyZSBhdHRyaWJ1dGVzIG9uIHRoaXMgbm9kZVxuICAgICAgICBpZiAobm9kZUF0dHJpYnV0ZXMgIT09IG51bGwgJiYgdHlwZW9mIG5vZGVBdHRyaWJ1dGVzICE9PSAndW5kZWZpbmVkJykge1xuXG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZXNlcyBhdHRyaWJ1dGVzIGFuZCBhZGQgdGhlIG5hbWUgYW5kIHZhbHVlIHRvIHRoZSBub2RlU25pcHBldCB3aGljaCB3aWxsIGJlIHJldHVybmVkXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gbm9kZUF0dHJpYnV0ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZUF0dHJpYnV0ZXNbaV0ubmFtZSA9PT0gXCJkYXRhLW5hbWV3YWxrXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgYXR0cmlidXRlIG5hbWUgYW5kIHZhbHVlLlxuICAgICAgICAgICAgICAgIG5vZGVTbmlwcGV0ICs9ICcgJyArIG5vZGVBdHRyaWJ1dGVzW2ldLm5hbWUgKyAnPVwiJyArIG5vZGVBdHRyaWJ1dGVzW2ldLnZhbHVlICsgJ1wiJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsb3NlIHRoZSBub2RlXG4gICAgICAgIG5vZGVTbmlwcGV0ICs9ICc+JztcblxuICAgICAgICAvLyBSZXR1cm4gdGhlIG5vZGUgc25pcHBldFxuICAgICAgICByZXR1cm4gbm9kZVNuaXBwZXQ7XG4gICAgfVxuXG4gICAgcnVuKGVuZ2luZTogRW5naW5lLCBjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgOiBSdWxlRGV0YWlsc1tdIHtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIGxldCByZXN1bHRzOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0cyA9IHRoaXMucnVsZS5ydW4oY29udGV4dCwgb3B0aW9ucywgY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc3QgZXJyOiBFcnJvciA9IGU7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUlVMRSBFWENFUFRJT046XCIsdGhpcy5ydWxlLmlkLCBjb250ZXh0LmRvbS5yb2xlUGF0aCwgZXJyLnN0YWNrKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW5kVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBpZiAoIXJlc3VsdHMpIHJlc3VsdHMgPSBbXTtcblxuICAgICAgICBpZiAoIShyZXN1bHRzIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgICAgICByZXN1bHRzID0gW3Jlc3VsdHNdO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRWYWwgOiBSdWxlRGV0YWlsc1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlbmdpbmUuZ2V0TWVzc2FnZSh0aGlzLnJ1bGUuaWQsIHJlc3VsdC5yZWFzb25JZCwgcmVzdWx0Lm1lc3NhZ2VBcmdzKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbnMgaW4gY29udGV4dCkge1xuICAgICAgICAgICAgICAgIHBhdGhbbnNdID0gY29udGV4dFtuc10ucm9sZVBhdGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJ1bGVJZCA9IHRoaXMucnVsZS5pZC5yZXBsYWNlKC9eKC4qKVxcJFxcJFxcZCskLywgXCIkMVwiKTtcblxuICAgICAgICAgICAgcmV0VmFsLnB1c2goe1xuICAgICAgICAgICAgICAgIHJ1bGVJZDogcnVsZUlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgbm9kZTogY29udGV4dFtcImRvbVwiXS5ub2RlLFxuICAgICAgICAgICAgICAgIHBhdGg6IHBhdGgsXG4gICAgICAgICAgICAgICAgcnVsZVRpbWU6IGVuZFRpbWUtc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgIHJlYXNvbklkOiByZXN1bHQucmVhc29uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlQXJnczogcmVzdWx0Lm1lc3NhZ2VBcmdzLFxuICAgICAgICAgICAgICAgIGFwaUFyZ3M6IHJlc3VsdC5hcGlBcmdzLFxuICAgICAgICAgICAgICAgIGJvdW5kczogY29udGV4dFtcImRvbVwiXS5ib3VuZHMsXG4gICAgICAgICAgICAgICAgc25pcHBldDogV3JhcHBlZFJ1bGUuY29udmVydE5vZGVUb1NuaXBwZXQoY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5naW5lIGltcGxlbWVudHMgSUVuZ2luZSB7XG4gICAgcHVibGljIHN0YXRpYyBnZXRMYW5ndWFnZXMoKSB7XG4gICAgICAgIGNvbnN0IGVudiA9IHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiAocHJvY2VzcyBhcyBhbnkpLm5vZGVUeXBlID09PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52O1xuICAgICAgICAvLyBJZiBhbGwgZWxzZSBmYWlscywgZGVmYXVsdCB0byBVUyBFbmdsaXNoXG4gICAgICAgIGxldCBub2RlTGFuZyA9IFwiZW4tVVNcIjtcbiAgICAgICAgaWYgKGVudikge1xuICAgICAgICAgICAgbm9kZUxhbmcgPSBlbnYuTEFORyB8fCBlbnYuTEFOR1VBR0UgfHwgZW52LkxDX0FMTCB8fCBlbnYuTENfTUVTU0FHRVM7XG4gICAgICAgICAgICBpZiAobm9kZUxhbmcgJiYgbm9kZUxhbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIG5vZGVMYW5nID0gbm9kZUxhbmcuc3BsaXQoXCIuXCIpWzBdLnJlcGxhY2UoL18vZyxcIi1cIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vZGVMYW5nID0gXCJlbi1VU1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIG5hdmlnYXRvci5sYW5ndWFnZXMgfHwgW25vZGVMYW5nXTtcbiAgICB9XG4gICAgbWFwcGVycyA6IHsgW25hbWVzcGFjZTogc3RyaW5nXSA6IElNYXBwZXIgfSA9IHt9O1xuICAgIHJ1bGVNYXAgOiB7IFtpZDogc3RyaW5nXTogUnVsZSB9ID0ge307XG4gICAgd3JhcHBlZFJ1bGVNYXAgOiB7IFtpZDogc3RyaW5nXTogV3JhcHBlZFJ1bGUgfSA9IHt9O1xuICAgIG5sc01hcCA6IE5sc01hcCA9IHt9XG4gICAgaGVscE1hcCA6IEhlbHBNYXAgPSB7fVxuXG4gICAgcHJpdmF0ZSBpbmNsUnVsZXM6IHtcbiAgICAgICAgW25zUm9sZTogc3RyaW5nXTogV3JhcHBlZFJ1bGVbXVxuICAgIH0gPSB7fVxuXG4gICAgcHJpdmF0ZSBleGNsUnVsZXM6IHtcbiAgICAgICAgW25zUm9sZTogc3RyaW5nXTogV3JhcHBlZFJ1bGVbXVxuICAgIH0gPSB7fVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIE5lZWQgYSBET00gTWFwcGVyIGFzIGEgbWluaW11bVxuICAgICAgICB0aGlzLmFkZE1hcHBlcihuZXcgRE9NTWFwcGVyKCkpO1xuICAgIH1cblxuICAgIHJ1bihyb290OiBEb2N1bWVudCB8IE5vZGUsIG9wdGlvbnM/OiB7fSk6IFByb21pc2U8UmVwb3J0PiB7XG4gICAgICAgIGlmIChyb290ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJudWxsIGRvY3VtZW50XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb290Lm5vZGVUeXBlID09PSA5IC8qIE5vZGUuRE9DVU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgcm9vdCA9IChyb290IGFzIERvY3VtZW50KS5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdC5vd25lckRvY3VtZW50ICYmICgocm9vdC5vd25lckRvY3VtZW50IGFzIGFueSkuUFRfQ0hFQ0tfSElEREVOX0NPTlRFTlQgPSBmYWxzZSk7XG4gICAgICAgIGNsZWFyQ2FjaGVzKHJvb3QpO1xuICAgICAgICBjb25zdCB3YWxrZXIgPSBuZXcgRE9NV2Fsa2VyKHJvb3QpO1xuICAgICAgICBjb25zdCByZXRWYWwgOiBSZXBvcnQgPSB7XG4gICAgICAgICAgICByZXN1bHRzOiBbXSxcbiAgICAgICAgICAgIG51bUV4ZWN1dGVkOiAwLFxuICAgICAgICAgICAgcnVsZVRpbWU6IDAsXG4gICAgICAgICAgICB0b3RhbFRpbWU6IDBcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICAvLyBSZXNldCB0aGUgcm9sZSBtYXBwZXJzXG4gICAgICAgIGZvciAoY29uc3QgbmFtZXNwYWNlIGluIHRoaXMubWFwcGVycykge1xuICAgICAgICAgICAgdGhpcy5tYXBwZXJzW25hbWVzcGFjZV0ucmVzZXQocm9vdCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBjb250ZXh0IGRldGVjdG9yXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgY29udGV4dCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBydWxlIG1hcHBlcnNcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHRIaWVyYXJjaGllcyA6IFJ1bGVDb250ZXh0SGllcmFyY2h5ID0ge31cbiAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZXNwYWNlIGluIHRoaXMubWFwcGVycykge1xuICAgICAgICAgICAgICAgIGlmICghd2Fsa2VyLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dEhpZXJhcmNoaWVzW25hbWVzcGFjZV0gPSB0aGlzLm1hcHBlcnNbbmFtZXNwYWNlXS5vcGVuU2NvcGUod2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAobmFtZXNwYWNlID09PSBcImRvbVwiICYmIHdhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBlbGVtID0gd2Fsa2VyLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldCBpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImlkXCIpICYmIChpZCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikudHJpbSgpKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHJvb3Qub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkgPT09IGVsZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGV4dEhpZXJhcmNoaWVzW1wiZG9tXCJdW2NvbnRleHRIaWVyYXJjaGllc1tcImRvbVwiXS5sZW5ndGgtMV0ucm9sZVBhdGggPSBcIi8vKltAaWQ9J1wiK2lkK1wiJ11cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0SGllcmFyY2hpZXNbbmFtZXNwYWNlXSA9IHRoaXMubWFwcGVyc1tuYW1lc3BhY2VdLmNsb3NlU2NvcGUod2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHdhbGtlci5ub2RlLm5vZGVUeXBlICE9PSAxMSBcbiAgICAgICAgICAgICAgICAmJiAoRE9NV2Fsa2VyLmlzTm9kZVZpc2libGUod2Fsa2VyLm5vZGUpXG4gICAgICAgICAgICAgICAgICAgIC8vIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaGVhZFwiXG4gICAgICAgICAgICAgICAgICAgIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwibWV0YVwiXG4gICAgICAgICAgICAgICAgICAgIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICB8fCB3YWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImRhdGFsaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgfHwgd2Fsa2VyLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJwYXJhbVwiXG4gICAgICAgICAgICAgICAgICAgIHx8ICFET01VdGlsLmdldEFuY2VzdG9yKHdhbGtlci5ub2RlLCBbXCJib2R5XCJdKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGxldCBjb250ZXh0IDogUnVsZUNvbnRleHQgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG5zIGluIGNvbnRleHRIaWVyYXJjaGllcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuc0hpZXIgPSBjb250ZXh0SGllcmFyY2hpZXNbbnNdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0SGllciA9IG5zSGllcltuc0hpZXIubGVuZ3RoLTFdO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0W25zXSA9IGxhc3RIaWVyOyBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hpbmdSdWxlcyA9IHRoaXMuZ2V0TWF0Y2hpbmdSdWxlcyhjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAgICAgICAgIGxldCBkZXBNYXRjaCA9IHt9XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaGluZ1J1bGUgb2YgbWF0Y2hpbmdSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZnVsZmlsbHNEZXBlbmRlbmNpZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcCBvZiBtYXRjaGluZ1J1bGUucnVsZS5kZXBlbmRlbmNpZXMgfHwgW10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGVwTWF0Y2hbZGVwXSkgZnVsZmlsbHNEZXBlbmRlbmNpZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZnVsZmlsbHNEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzIDogUnVsZURldGFpbHNbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbWF0Y2hpbmdSdWxlLnJ1bih0aGlzLCBjb250ZXh0LCBvcHRpb25zLCBjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JhcHBlciBzaG93cyBlcnJvciBpbiBjb25zb2xlLiBTa2lwIHRoaXMgcnVsZSBhcyBOL0FcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGtpbGwgdGhlIGVuZ2luZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgb3V0IG9mIHNjb3BlLCBpdCBmdWxmaWxscyB0aGUgZGVwZW5kZW5jeVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwTWF0Y2hbbWF0Y2hpbmdSdWxlLnJ1bGUuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwucmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnJ1bGVUaW1lICs9IHJlc3VsdC5ydWxlVGltZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwubnVtRXhlY3V0ZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnZhbHVlWzFdID09PSBlUnVsZUNvbmZpZGVuY2UuUEFTUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBNYXRjaFtyZXN1bHQucnVsZUlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlICh3YWxrZXIubmV4dE5vZGUoKSk7XG4gICAgICAgIGNsZWFyQ2FjaGVzKHJvb3QpO1xuICAgICAgICByZXRWYWwudG90YWxUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCktc3RhcnQ7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmV0VmFsKTtcbiAgICB9XG5cbiAgICBlbmFibGVSdWxlcyhydWxlSWRzOiBzdHJpbmdbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGVJZCBpbiB0aGlzLnJ1bGVNYXApIHtcbiAgICAgICAgICAgIHRoaXMucnVsZU1hcFtydWxlSWRdLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJ1bGVJZCBvZiBydWxlSWRzIHx8IFtdKSB7XG4gICAgICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5ydWxlTWFwKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIldBUk5JTkc6IFJ1bGUgSWRcIixydWxlSWQsXCJjb3VsZCBub3QgYmUgZW5hYmxlZC5cIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucnVsZU1hcFtydWxlSWRdLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0UnVsZShydWxlSWQ6IHN0cmluZyk6IFJ1bGUge1xuICAgICAgICByZXR1cm4gdGhpcy5ydWxlTWFwW3J1bGVJZF07XG4gICAgfVxuXG4gICAgZ2V0UnVsZXNJZHMoKSA6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGVJZCBpbiB0aGlzLnJ1bGVNYXApIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKHJ1bGVJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBhZGRSdWxlcyhydWxlczogUnVsZVtdKSB7XG4gICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgICAgICAgICAgdGhpcy5hZGRSdWxlKHJ1bGUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NvcnRSdWxlcygpO1xuICAgIH1cblxuICAgIGFkZFJ1bGUocnVsZTogUnVsZSwgc2tpcFNvcnQ/OiBib29sZWFuKSB7XG4gICAgICAgIGxldCBjdHhzIDpDb250ZXh0W10gPSBDb250ZXh0LnBhcnNlKHJ1bGUuY29udGV4dCk7XG4gICAgICAgIGxldCBpZHggPSAwO1xuICAgICAgICBjb25zdCBydWxlSWQgPSBydWxlLmlkO1xuICAgICAgICBpZiAocnVsZUlkIGluIHRoaXMucnVsZU1hcCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJXQVJOSU5HOiBSdWxlXCIscnVsZUlkLFwiYWxyZWFkeSBhZGRlZCB0byBlbmdpbmUuIElnbm9yaW5nLi4uXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucnVsZU1hcFtydWxlSWRdID0gcnVsZTtcbiAgICAgICAgZm9yIChjb25zdCBjdHggb2YgY3R4cykge1xuICAgICAgICAgICAgbGV0IHdyYXBJZCA9IHJ1bGVJZDtcbiAgICAgICAgICAgIGlmIChpZHggPj0gMSkge1xuICAgICAgICAgICAgICAgIHdyYXBJZCA9IHJ1bGVJZCtcIiQkXCIraWR4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKytpZHg7XG4gICAgICAgICAgICBsZXQgd3JhcHBlZFJ1bGUgPSBuZXcgV3JhcHBlZFJ1bGUocnVsZSxjdHgpO1xuICAgICAgICAgICAgdGhpcy53cmFwcGVkUnVsZU1hcFt3cmFwSWRdID0gd3JhcHBlZFJ1bGU7XG4gICAgICAgICAgICBsZXQgcGFydHMgPSB3cmFwcGVkUnVsZS5wYXJzZWRJbmZvLmNvbnRleHRJbmZvO1xuICAgICAgICAgICAgbGV0IGxhc3RQYXJ0ID0gcGFydHNbcGFydHMubGVuZ3RoLTFdO1xuICAgICAgICAgICAgbGV0IHRyaWdnZXJSb2xlID0gbGFzdFBhcnQubmFtZXNwYWNlK1wiOlwiK2xhc3RQYXJ0LnJvbGU7XG4gICAgICAgICAgICBpZiAobGFzdFBhcnQuaW5jbHVzaXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmNsUnVsZXNbdHJpZ2dlclJvbGVdID0gdGhpcy5pbmNsUnVsZXNbdHJpZ2dlclJvbGVdIHx8IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jbFJ1bGVzW3RyaWdnZXJSb2xlXS5wdXNoKHdyYXBwZWRSdWxlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGNsUnVsZXNbdHJpZ2dlclJvbGVdID0gdGhpcy5leGNsUnVsZXNbdHJpZ2dlclJvbGVdIHx8IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuZXhjbFJ1bGVzW3RyaWdnZXJSb2xlXS5wdXNoKHdyYXBwZWRSdWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNraXBTb3J0KSB7XG4gICAgICAgICAgICB0aGlzLl9zb3J0UnVsZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9zb3J0UnVsZXMoKSB7XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBpbiB0aGlzLmluY2xSdWxlcykge1xuICAgICAgICAgICAgdGhpcy5pbmNsUnVsZXNbcm9sZV0uc29ydCgocnVsZUE6IFdyYXBwZWRSdWxlLCBydWxlQjogV3JhcHBlZFJ1bGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBBID0gcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBCID0gcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAvLyBJZiBCIGRlcGVuZHMgb24gQSwgc29ydCBBIGJlZm9yZSBCXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEIgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUEucnVsZS5pZCkpIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICAvLyBJZiBBIGRlcGVuZHMgb24gQiwgc29ydCBCIGJlZm9yZSBBXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEEgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUIucnVsZS5pZCkpIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgZG9lc24ndCBtYXR0ZXJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBpbiB0aGlzLmV4Y2xSdWxlcykge1xuICAgICAgICAgICAgdGhpcy5leGNsUnVsZXNbcm9sZV0uc29ydCgocnVsZUE6IFdyYXBwZWRSdWxlLCBydWxlQjogV3JhcHBlZFJ1bGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBBID0gcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBCID0gcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAvLyBJZiBCIGRlcGVuZHMgb24gQSwgc29ydCBBIGJlZm9yZSBCXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEIgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUEucnVsZS5pZCkpIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICAvLyBJZiBBIGRlcGVuZHMgb24gQiwgc29ydCBCIGJlZm9yZSBBXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEEgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUIucnVsZS5pZCkpIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgZG9lc24ndCBtYXR0ZXJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkTmxzTWFwKG1hcDogTmxzTWFwKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1hcCkge1xuICAgICAgICAgICAgdGhpcy5ubHNNYXBba2V5XSA9IG1hcFtrZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkSGVscE1hcChtYXA6IEhlbHBNYXApIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbWFwKSB7XG4gICAgICAgICAgICB0aGlzLmhlbHBNYXBba2V5XSA9IG1hcFtrZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0TWVzc2FnZShydWxlSWQ6IHN0cmluZywgcnVsZUlkeDogbnVtYmVyIHwgc3RyaW5nLCBtc2dBcmdzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgICAgICBsZXQgc3BsaXR0ZXIgPSBydWxlSWQuaW5kZXhPZihcIiQkXCIpO1xuICAgICAgICBpZiAoc3BsaXR0ZXIgPj0gMCkge1xuICAgICAgICAgICAgcnVsZUlkID0gcnVsZUlkLnN1YnN0cmluZygwLHNwbGl0dGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5ubHNNYXApKSByZXR1cm4gcnVsZUlkO1xuICAgICAgICBsZXQgbWVzc2FnZVRlbXBsYXRlID0gdGhpcy5ubHNNYXBbcnVsZUlkXVtydWxlSWR4IHx8IDBdO1xuICAgICAgICBpZiAoIW1lc3NhZ2VUZW1wbGF0ZSkgcmV0dXJuIHJ1bGVJZCtcIl9cIitydWxlSWR4O1xuICAgICAgICByZXR1cm4gbWVzc2FnZVRlbXBsYXRlLnJlcGxhY2UoL1xceyhcXGQrKVxcfS9nLFxuICAgICAgICAgICAgKG1hdGNoZWRTdHIsIG1hdGNoZWROdW0sIG1hdGNoZWRJbmRleCkgPT4gbXNnQXJnc1ttYXRjaGVkTnVtXVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldEhlbHAocnVsZUlkOiBzdHJpbmcsIHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIGFyY2hpdmVJZD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICghYXJjaGl2ZUlkKSB7XG4gICAgICAgICAgICAvLyBTZXQgdG8gdGhlIGxhdGVzdFxuICAgICAgICAgICAgYXJjaGl2ZUlkID0gXCJsYXRlc3RcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7Q29uZmlnLmhlbHBSb290fS8ke2FyY2hpdmVJZH0vZG9jJHt0aGlzLmdldEhlbHBSZWwocnVsZUlkLCByZWFzb25JZCl9YDtcbiAgICB9XG5cbiAgICBnZXRIZWxwUmVsKHJ1bGVJZDogc3RyaW5nLCBydWxlSWR4OiBudW1iZXIgfCBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgc3BsaXR0ZXIgPSBydWxlSWQuaW5kZXhPZihcIiQkXCIpO1xuICAgICAgICBpZiAoc3BsaXR0ZXIgPj0gMCkge1xuICAgICAgICAgICAgcnVsZUlkID0gcnVsZUlkLnN1YnN0cmluZygwLHNwbGl0dGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5oZWxwTWFwKSkgcmV0dXJuIHJ1bGVJZDtcbiAgICAgICAgcnVsZUlkeCA9IHJ1bGVJZHggfHwgMDtcbiAgICAgICAgbGV0IGhlbHBTdHIgPSBudWxsO1xuICAgICAgICBpZiAocnVsZUlkeCBpbiB0aGlzLmhlbHBNYXBbcnVsZUlkXSkge1xuICAgICAgICAgICAgaGVscFN0ciA9IHRoaXMuaGVscE1hcFtydWxlSWRdW3J1bGVJZHggfHwgMF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoZWxwU3RyID0gdGhpcy5oZWxwTWFwW3J1bGVJZF1bMF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWhlbHBTdHIpIHJldHVybiBydWxlSWQrXCJfXCIrcnVsZUlkeDtcbiAgICAgICAgcmV0dXJuIGhlbHBTdHI7XG4gICAgfVxuXG4gICAgYWRkTWFwcGVyKG1hcHBlcjogSU1hcHBlcikge1xuICAgICAgICB0aGlzLm1hcHBlcnNbbWFwcGVyLmdldE5hbWVzcGFjZSgpXSA9IG1hcHBlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBtYXRjaChydWxlOiBXcmFwcGVkUnVsZSxcbiAgICAgICAgY29udGV4dEhpZXI6IFJ1bGVDb250ZXh0SGllcmFyY2h5KSA6IGJvb2xlYW5cbiAgICB7XG4gICAgICAgIGxldCBydWxlUGFydHMgPSBydWxlLnBhcnNlZEluZm8uY29udGV4dEluZm87XG4gICAgICAgIGxldCBwYXJ0SWR4ID0gcnVsZVBhcnRzLmxlbmd0aC0xO1xuICAgICAgICBsZXQgY3VyTlMgPSBydWxlUGFydHNbcGFydElkeF0ubmFtZXNwYWNlO1xuICAgICAgICBsZXQgY3VySGllciA9IGNvbnRleHRIaWVyW2N1ck5TXVtjb250ZXh0SGllcltjdXJOU10ubGVuZ3RoLTFdO1xuICAgICAgICBjb25zdCBjb250ZXh0Tm9kZSA9IGN1ckhpZXIubm9kZTtcblxuICAgICAgICAvLyBJZiB0aGUgZW5kIG9mIHRoZSBydWxlIHBhcnQgZG9lc24ndCBtYXRjaCB0aGUgZW5kIG9mIHRoZSBoaWVyYXJjaHksIHdlIGRvbid0IGhhdmUgYSBtYXRjaFxuICAgICAgICBpZiAoIXJ1bGVQYXJ0c1twYXJ0SWR4XS5tYXRjaGVzKGNvbnRleHRIaWVyLCBjb250ZXh0SGllcltjdXJOU10ubGVuZ3RoLTEpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUgd2FzIG9ubHkgb25lIHBhcnQsIHdlIGhhdmUgYSBtYXRjaFxuICAgICAgICBpZiAocnVsZVBhcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTmVlZCB0byBkZWFsIHdpdGggcGFyZW50IHBhcnRzLiBUbyB3YWxrIHRoZSBoaWVyYXJjaHksIHRoZXNlIG5lZWQgdG8gYmVcbiAgICAgICAgLy8gYWxsIGluIHRoZSBzYW1lIG5hbWVzcGFjZS4gQ29uZmlybSB0aGF0IGlzIHRydWUuXG4gICAgICAgIGN1ck5TID0gcnVsZVBhcnRzWzBdLm5hbWVzcGFjZTtcbiAgICAgICAgY3VySGllciA9IGNvbnRleHRIaWVyW2N1ck5TXVtjb250ZXh0SGllcltjdXJOU10ubGVuZ3RoLTFdO1xuICAgICAgICAtLXBhcnRJZHg7XG4gICAgICAgIGlmIChydWxlUGFydHMuc2xpY2UoMCwgcnVsZVBhcnRzLmxlbmd0aC0xKS5zb21lKHBhcnQgPT4gcGFydC5uYW1lc3BhY2UgIT09IGN1ck5TKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgW0VSUk9SXSBSdWxlICR7cnVsZS5ydWxlLmlkfSBoYXMgaW5jb25zaXRlbnQgcGFyZW50IG5hbWVzcGFjZXNgKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgdGFyZ2V0IG5vZGUgbWF0Y2hlcyB0aGUgZW5kIG9mIHRoZSBoaWVyYXJjaHksIG1vdmUgdXAgcGFzdCBpdCwgb3RoZXJ3aXNlLCBzdGFydCBhdCB0aGUgZW5kXG4gICAgICAgIGxldCBoaWVySWR4ID0gY29udGV4dEhpZXJbY3VyTlNdLmxlbmd0aCAtIChjdXJIaWVyLm5vZGUuaXNTYW1lTm9kZShjb250ZXh0Tm9kZSkgPyAyIDogMSk7XG4gICAgICAgIHdoaWxlIChoaWVySWR4ID49IDAgJiYgcGFydElkeCA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcnVsZVBhcnRzW3BhcnRJZHhdO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlc1BhcnQgPSBydWxlUGFydHNbcGFydElkeF0ubWF0Y2hlcyhjb250ZXh0SGllciwgaGllcklkeCk7XG4gICAgICAgICAgICBpZiAocGFydC5jb25uZWN0b3IgPT09IFwiPlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVzUGFydCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBEaXJlY3QgcGFyZW50IGNoZWNrIGFuZCBkb2Vzbid0IG1hdGNoXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBEaXJlY3QgcGFyZW50IGNoZWNrIGFuZCBkb2VzIG1hdGNoXG4gICAgICAgICAgICAgICAgICAgIC0tcGFydElkeDtcbiAgICAgICAgICAgICAgICAgICAgLS1oaWVySWR4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC5jb25uZWN0b3IgPT09IFwiIFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQuaW5jbHVzaXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGluY2x1c2l2ZSBhbmNlc3RvciBtYXRjaFxuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlc1BhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC0tcGFydElkeDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBkb2Vzbid0IG1hdGNoLCBqdXN0IG1vdmUgdXAgdGhlIHJvbGUgaGllcmFyY2h5XG4gICAgICAgICAgICAgICAgICAgIC0taGllcklkeDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtYXRjaGVzUGFydCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBleGNsdXNpdmUgYW5jZXN0b3IgbWF0Y2ggYW5kIGN1cnJlbnQgbWF0Y2hlc1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhjbHVzaXZlIGFuY2VzdG9yIG1hdGNoIGFuZCBjdXJyZW50IGRvZXNuJ3QgbWF0Y2ggLSBjaGVjayBmb3Igb3RoZXIgYW5jZXN0b3JzXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnRNYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzZWFyY2hJZHggPSBoaWVySWR4LTE7ICFwYXJlbnRNYXRjaCAmJiBzZWFyY2hJZHggPj0gMDsgLS1zZWFyY2hJZHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE1hdGNoID0gIXJ1bGVQYXJ0c1twYXJ0SWR4XS5tYXRjaGVzKGNvbnRleHRIaWVyLCBzZWFyY2hJZHgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRNYXRjaCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIC0tcGFydElkeDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnRleHQgY29ubmVjdG9yIFwiK3BhcnQuY29ubmVjdG9yK1wiIGlzIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnRJZHggPT09IC0xO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TWF0Y2hpbmdSdWxlcyhjdHhIaWVyIDogUnVsZUNvbnRleHRIaWVyYXJjaHkpIDogV3JhcHBlZFJ1bGVbXSB7XG4gICAgICAgIGxldCBtYXRjaGVzIDogV3JhcHBlZFJ1bGVbXSA9IFtdO1xuICAgICAgICBmdW5jdGlvbiBhZGRNYXRjaGVzKHJ1bGVzOiBXcmFwcGVkUnVsZVtdKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocnVsZS5ydWxlLmVuYWJsZWQgJiYgRW5naW5lLm1hdGNoKHJ1bGUsIGN0eEhpZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChydWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBucyBpbiBjdHhIaWVyKSB7XG4gICAgICAgICAgICBsZXQgcm9sZSA9IG5zK1wiOlwiKyhjdHhIaWVyW25zXS5sZW5ndGggPiAwID8gY3R4SGllcltuc11bY3R4SGllcltuc10ubGVuZ3RoLTFdLnJvbGUgOiBcIm5vbmVcIik7XG4gICAgICAgICAgICBpZiAocm9sZSBpbiB0aGlzLmluY2xSdWxlcykge1xuICAgICAgICAgICAgICAgIGFkZE1hdGNoZXModGhpcy5pbmNsUnVsZXNbcm9sZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCB4Um9sZSBpbiB0aGlzLmV4Y2xSdWxlcykge1xuICAgICAgICAgICAgICAgIGlmICh4Um9sZSAhPT0gcm9sZSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRNYXRjaGVzKHRoaXMuZXhjbFJ1bGVzW3hSb2xlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvbGUgIT09IG5zK1wiOm5vbmVcIikge1xuICAgICAgICAgICAgICAgIGlmIChyb2xlLnN0YXJ0c1dpdGgobnMrXCI6L1wiKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobnMrXCI6LypcIiBpbiB0aGlzLmluY2xSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWF0Y2hlcyh0aGlzLmluY2xSdWxlc1tucytcIjovKlwiXSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChucytcIjoqXCIgaW4gdGhpcy5pbmNsUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1hdGNoZXModGhpcy5pbmNsUnVsZXNbbnMrXCI6KlwiXSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zb3J0RGVwcyhtYXRjaGVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTb3J0cyB0aGUgcnVsZXMgaW4gb3JkZXIgdG8gZXhlY3V0ZSBkZXBlbmRlbmNpZXMgaW4gdGhlIGNvcnJlY3Qgb3JkZXJcbiAgICAgKiBAcGFyYW0gaW5SdWxlcyBMaXN0IG9mIHdyYXBwZWQgcnVsZXMgdG8gc29ydFxuICAgICAqIEByZXR1cm5zIFNvcnRlZCBsaXN0IG9mIHdyYXBwZWQgcnVsZXNcbiAgICAgKi9cbiAgICBzb3J0RGVwcyhpblJ1bGVzOiBXcmFwcGVkUnVsZVtdKSB7XG4gICAgICAgIGxldCBkZXBSdWxlczogV3JhcHBlZFJ1bGVbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgaW5SdWxlcykge1xuICAgICAgICAgICAgZGVwUnVsZXMucHVzaChydWxlKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHJldFZhbCA6IFdyYXBwZWRSdWxlW10gPSBbXTtcbiAgICAgICAgbGV0IGlkVG9SdWxlID0ge307XG4gICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcnVsZXMuIElmIHRoYXQgcnVsZSdzIGRlcGVuZGVuY2llcyBjYW4gYmUgbWV0IGJ5IHJ1bGVzIGFscmVhZHkgaW4gdGhlIGxpc3QsIGFkZCBpdCB0byB0aGUgbGlzdFxuICAgICAgICAvLyBSZXBlYXQgdW50aWwgbm8gY2hhbmdlcyBhcmUgbWFkZSB0byB0aGUgc2F0aXNmaWVkIGxpc3RcbiAgICAgICAgLy8gSWYgYSBydWxlIGNhbm5vdCBiZSBzYXRpc2ZpZWQsIGl0IHdpbGwgbmV2ZXIgZXhlY3V0ZSwgc28gaXQgY2FuIGJlIGRyb3BwZWQuXG4gICAgICAgIGxldCBjaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgY2hhbmdlID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PGRlcFJ1bGVzLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXBSdWxlID0gZGVwUnVsZXNbaWR4XTtcbiAgICAgICAgICAgICAgICBpZiAoZGVwUnVsZS5ydWxlLmlkIGluIGlkVG9SdWxlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgYWxsTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChkZXBSdWxlLnJ1bGUuZGVwZW5kZW5jaWVzICYmIGRlcFJ1bGUucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcElkIG9mIGRlcFJ1bGUucnVsZS5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGRlcElkIGluIGlkVG9SdWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbE1hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRlcFJ1bGUucnVsZS5wcmVyZXFzICYmIGRlcFJ1bGUucnVsZS5wcmVyZXFzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBkZXBJZCBvZiBkZXBSdWxlLnJ1bGUucHJlcmVxcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoZGVwSWQgaW4gaWRUb1J1bGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsTWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYWxsTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnB1c2goZGVwUnVsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlkVG9SdWxlW2RlcFJ1bGUucnVsZS5pZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBkZXBSdWxlcy5zcGxpY2UoaWR4LS0sIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoY2hhbmdlKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5leHBvcnQgY2xhc3MgQ29uZmlnIHtcbiAgICBzdGF0aWMgREVCVUcgPSBmYWxzZTtcbiAgICBzdGF0aWMgaGVscFJvb3QgPSBcImh0dHBzOi8vYWJsZS5pYm0uY29tL3J1bGVzL2FyY2hpdmVzXCI7XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi9ET01XYWxrZXJcIjtcblxuZXhwb3J0IGNsYXNzIENvbG9yVXRpbCB7XG5cbiAgICBwdWJsaWMgc3RhdGljIENTU0NvbG9yTG9va3VwID0ge1xuICAgICAgICBcImFsaWNlYmx1ZVwiOiBcIiNmMGY4ZmZcIixcbiAgICAgICAgXCJhbnRpcXVld2hpdGVcIjogXCIjZmFlYmQ3XCIsXG4gICAgICAgIFwiYXF1YVwiOiBcIiMwMGZmZmZcIixcbiAgICAgICAgXCJhcXVhbWFyaW5lXCI6IFwiIzdmZmZkNFwiLFxuICAgICAgICBcImF6dXJlXCI6IFwiI2YwZmZmZlwiLFxuICAgICAgICBcImJlaWdlXCI6IFwiI2Y1ZjVkY1wiLFxuICAgICAgICBcImJpc3F1ZVwiOiBcIiNmZmU0YzRcIixcbiAgICAgICAgXCJibGFja1wiOiBcIiMwMDAwMDBcIixcbiAgICAgICAgXCJibGFuY2hlZGFsbW9uZFwiOiBcIiNmZmViY2RcIixcbiAgICAgICAgXCJibHVlXCI6IFwiIzAwMDBmZlwiLFxuICAgICAgICBcImJsdWV2aW9sZXRcIjogXCIjOGEyYmUyXCIsXG4gICAgICAgIFwiYnJvd25cIjogXCIjYTUyYTJhXCIsXG4gICAgICAgIFwiYnVybHl3b29kXCI6IFwiI2RlYjg4N1wiLFxuICAgICAgICBcImNhZGV0Ymx1ZVwiOiBcIiM1ZjllYTBcIixcbiAgICAgICAgXCJjaGFydHJldXNlXCI6IFwiIzdmZmYwMFwiLFxuICAgICAgICBcImNob2NvbGF0ZVwiOiBcIiNkMjY5MWVcIixcbiAgICAgICAgXCJjb3JhbFwiOiBcIiNmZjdmNTBcIixcbiAgICAgICAgXCJjb3JuZmxvd2VyYmx1ZVwiOiBcIiM2NDk1ZWRcIixcbiAgICAgICAgXCJjb3Juc2lsa1wiOiBcIiNmZmY4ZGNcIixcbiAgICAgICAgXCJjcmltc29uXCI6IFwiI2RjMTQzY1wiLFxuICAgICAgICBcImN5YW5cIjogXCIjMDBmZmZmXCIsXG4gICAgICAgIFwiZGFya2JsdWVcIjogXCIjMDAwMDhiXCIsXG4gICAgICAgIFwiZGFya2N5YW5cIjogXCIjMDA4YjhiXCIsXG4gICAgICAgIFwiZGFya2dvbGRlbnJvZFwiOiBcIiNiODg2MGJcIixcbiAgICAgICAgXCJkYXJrZ3JheVwiOiBcIiNhOWE5YTlcIixcbiAgICAgICAgXCJkYXJrZ3JlZW5cIjogXCIjMDA2NDAwXCIsXG4gICAgICAgIFwiZGFya2toYWtpXCI6IFwiI2JkYjc2YlwiLFxuICAgICAgICBcImRhcmttYWdlbnRhXCI6IFwiIzhiMDA4YlwiLFxuICAgICAgICBcImRhcmtvbGl2ZWdyZWVuXCI6IFwiIzU1NmIyZlwiLFxuICAgICAgICBcImRhcmtvcmFuZ2VcIjogXCIjZmY4YzAwXCIsXG4gICAgICAgIFwiZGFya29yY2hpZFwiOiBcIiM5OTMyY2NcIixcbiAgICAgICAgXCJkYXJrcmVkXCI6IFwiIzhiMDAwMFwiLFxuICAgICAgICBcImRhcmtzYWxtb25cIjogXCIjZTk5NjdhXCIsXG4gICAgICAgIFwiZGFya3NlYWdyZWVuXCI6IFwiIzhmYmM4ZlwiLFxuICAgICAgICBcImRhcmtzbGF0ZWJsdWVcIjogXCIjNDgzZDhiXCIsXG4gICAgICAgIFwiZGFya3NsYXRlZ3JheVwiOiBcIiMyZjRmNGZcIixcbiAgICAgICAgXCJkYXJrdHVycXVvaXNlXCI6IFwiIzAwY2VkMVwiLFxuICAgICAgICBcImRhcmt2aW9sZXRcIjogXCIjOTQwMGQzXCIsXG4gICAgICAgIFwiZGVlcHBpbmtcIjogXCIjZmYxNDkzXCIsXG4gICAgICAgIFwiZGVlcHNreWJsdWVcIjogXCIjMDBiZmZmXCIsXG4gICAgICAgIFwiZGltZ3JheVwiOiBcIiM2OTY5NjlcIixcbiAgICAgICAgXCJkb2RnZXJibHVlXCI6IFwiIzFlOTBmZlwiLFxuICAgICAgICBcImZpcmVicmlja1wiOiBcIiNiMjIyMjJcIixcbiAgICAgICAgXCJmbG9yYWx3aGl0ZVwiOiBcIiNmZmZhZjBcIixcbiAgICAgICAgXCJmb3Jlc3RncmVlblwiOiBcIiMyMjhiMjJcIixcbiAgICAgICAgXCJmdWNoc2lhXCI6IFwiI2ZmMDBmZlwiLFxuICAgICAgICBcImdhaW5zYm9yb1wiOiBcIiNkY2RjZGNcIixcbiAgICAgICAgXCJnaG9zdHdoaXRlXCI6IFwiI2Y4ZjhmZlwiLFxuICAgICAgICBcImdvbGRcIjogXCIjZmZkNzAwXCIsXG4gICAgICAgIFwiZ29sZGVucm9kXCI6IFwiI2RhYTUyMFwiLFxuICAgICAgICBcImdyYXlcIjogXCIjODA4MDgwXCIsXG4gICAgICAgIFwiZ3JlZW5cIjogXCIjMDA4MDAwXCIsXG4gICAgICAgIFwiZ3JlZW55ZWxsb3dcIjogXCIjYWRmZjJmXCIsXG4gICAgICAgIFwiaG9uZXlkZXdcIjogXCIjZjBmZmYwXCIsXG4gICAgICAgIFwiaG90cGlua1wiOiBcIiNmZjY5YjRcIixcbiAgICAgICAgXCJpbmRpYW5yZWRcIjogXCIjY2Q1YzVjXCIsXG4gICAgICAgIFwiaW5kaWdvXCI6IFwiIzRiMDA4MlwiLFxuICAgICAgICBcIml2b3J5XCI6IFwiI2ZmZmZmMFwiLFxuICAgICAgICBcImtoYWtpXCI6IFwiI2YwZTY4Y1wiLFxuICAgICAgICBcImxhdmVuZGVyXCI6IFwiI2U2ZTZmYVwiLFxuICAgICAgICBcImxhdmVuZGVyYmx1c2hcIjogXCIjZmZmMGY1XCIsXG4gICAgICAgIFwibGF3bmdyZWVuXCI6IFwiIzdjZmMwMFwiLFxuICAgICAgICBcImxlbW9uY2hpZmZvblwiOiBcIiNmZmZhY2RcIixcbiAgICAgICAgXCJsaWdodGJsdWVcIjogXCIjYWRkOGU2XCIsXG4gICAgICAgIFwibGlnaHRjb3JhbFwiOiBcIiNmMDgwODBcIixcbiAgICAgICAgXCJsaWdodGN5YW5cIjogXCIjZTBmZmZmXCIsXG4gICAgICAgIFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjogXCIjZmFmYWQyXCIsXG4gICAgICAgIFwibGlnaHRncmV5XCI6IFwiI2QzZDNkM1wiLFxuICAgICAgICBcImxpZ2h0Z3JlZW5cIjogXCIjOTBlZTkwXCIsXG4gICAgICAgIFwibGlnaHRwaW5rXCI6IFwiI2ZmYjZjMVwiLFxuICAgICAgICBcImxpZ2h0c2FsbW9uXCI6IFwiI2ZmYTA3YVwiLFxuICAgICAgICBcImxpZ2h0c2VhZ3JlZW5cIjogXCIjMjBiMmFhXCIsXG4gICAgICAgIFwibGlnaHRza3libHVlXCI6IFwiIzg3Y2VmYVwiLFxuICAgICAgICBcImxpZ2h0c2xhdGVncmF5XCI6IFwiIzc3ODg5OVwiLFxuICAgICAgICBcImxpZ2h0c3RlZWxibHVlXCI6IFwiI2IwYzRkZVwiLFxuICAgICAgICBcImxpZ2h0eWVsbG93XCI6IFwiI2ZmZmZlMFwiLFxuICAgICAgICBcImxpbWVcIjogXCIjMDBmZjAwXCIsXG4gICAgICAgIFwibGltZWdyZWVuXCI6IFwiIzMyY2QzMlwiLFxuICAgICAgICBcImxpbmVuXCI6IFwiI2ZhZjBlNlwiLFxuICAgICAgICBcIm1hZ2VudGFcIjogXCIjZmYwMGZmXCIsXG4gICAgICAgIFwibWFyb29uXCI6IFwiIzgwMDAwMFwiLFxuICAgICAgICBcIm1lZGl1bWFxdWFtYXJpbmVcIjogXCIjNjZjZGFhXCIsXG4gICAgICAgIFwibWVkaXVtYmx1ZVwiOiBcIiMwMDAwY2RcIixcbiAgICAgICAgXCJtZWRpdW1vcmNoaWRcIjogXCIjYmE1NWQzXCIsXG4gICAgICAgIFwibWVkaXVtcHVycGxlXCI6IFwiIzkzNzBkOFwiLFxuICAgICAgICBcIm1lZGl1bXNlYWdyZWVuXCI6IFwiIzNjYjM3MVwiLFxuICAgICAgICBcIm1lZGl1bXNsYXRlYmx1ZVwiOiBcIiM3YjY4ZWVcIixcbiAgICAgICAgXCJtZWRpdW1zcHJpbmdncmVlblwiOiBcIiMwMGZhOWFcIixcbiAgICAgICAgXCJtZWRpdW10dXJxdW9pc2VcIjogXCIjNDhkMWNjXCIsXG4gICAgICAgIFwibWVkaXVtdmlvbGV0cmVkXCI6IFwiI2M3MTU4NVwiLFxuICAgICAgICBcIm1pZG5pZ2h0Ymx1ZVwiOiBcIiMxOTE5NzBcIixcbiAgICAgICAgXCJtaW50Y3JlYW1cIjogXCIjZjVmZmZhXCIsXG4gICAgICAgIFwibWlzdHlyb3NlXCI6IFwiI2ZmZTRlMVwiLFxuICAgICAgICBcIm1vY2Nhc2luXCI6IFwiI2ZmZTRiNVwiLFxuICAgICAgICBcIm5hdmFqb3doaXRlXCI6IFwiI2ZmZGVhZFwiLFxuICAgICAgICBcIm5hdnlcIjogXCIjMDAwMDgwXCIsXG4gICAgICAgIFwib2xkbGFjZVwiOiBcIiNmZGY1ZTZcIixcbiAgICAgICAgXCJvbGl2ZVwiOiBcIiM4MDgwMDBcIixcbiAgICAgICAgXCJvbGl2ZWRyYWJcIjogXCIjNmI4ZTIzXCIsXG4gICAgICAgIFwib3JhbmdlXCI6IFwiI2ZmYTUwMFwiLFxuICAgICAgICBcIm9yYW5nZXJlZFwiOiBcIiNmZjQ1MDBcIixcbiAgICAgICAgXCJvcmNoaWRcIjogXCIjZGE3MGQ2XCIsXG4gICAgICAgIFwicGFsZWdvbGRlbnJvZFwiOiBcIiNlZWU4YWFcIixcbiAgICAgICAgXCJwYWxlZ3JlZW5cIjogXCIjOThmYjk4XCIsXG4gICAgICAgIFwicGFsZXR1cnF1b2lzZVwiOiBcIiNhZmVlZWVcIixcbiAgICAgICAgXCJwYWxldmlvbGV0cmVkXCI6IFwiI2Q4NzA5M1wiLFxuICAgICAgICBcInBhcGF5YXdoaXBcIjogXCIjZmZlZmQ1XCIsXG4gICAgICAgIFwicGVhY2hwdWZmXCI6IFwiI2ZmZGFiOVwiLFxuICAgICAgICBcInBlcnVcIjogXCIjY2Q4NTNmXCIsXG4gICAgICAgIFwicGlua1wiOiBcIiNmZmMwY2JcIixcbiAgICAgICAgXCJwbHVtXCI6IFwiI2RkYTBkZFwiLFxuICAgICAgICBcInBvd2RlcmJsdWVcIjogXCIjYjBlMGU2XCIsXG4gICAgICAgIFwicHVycGxlXCI6IFwiIzgwMDA4MFwiLFxuICAgICAgICBcInJlZFwiOiBcIiNmZjAwMDBcIixcbiAgICAgICAgXCJyb3N5YnJvd25cIjogXCIjYmM4ZjhmXCIsXG4gICAgICAgIFwicm95YWxibHVlXCI6IFwiIzQxNjllMVwiLFxuICAgICAgICBcInNhZGRsZWJyb3duXCI6IFwiIzhiNDUxM1wiLFxuICAgICAgICBcInNhbG1vblwiOiBcIiNmYTgwNzJcIixcbiAgICAgICAgXCJzYW5keWJyb3duXCI6IFwiI2Y0YTQ2MFwiLFxuICAgICAgICBcInNlYWdyZWVuXCI6IFwiIzJlOGI1N1wiLFxuICAgICAgICBcInNlYXNoZWxsXCI6IFwiI2ZmZjVlZVwiLFxuICAgICAgICBcInNpZW5uYVwiOiBcIiNhMDUyMmRcIixcbiAgICAgICAgXCJzaWx2ZXJcIjogXCIjYzBjMGMwXCIsXG4gICAgICAgIFwic2t5Ymx1ZVwiOiBcIiM4N2NlZWJcIixcbiAgICAgICAgXCJzbGF0ZWJsdWVcIjogXCIjNmE1YWNkXCIsXG4gICAgICAgIFwic2xhdGVncmF5XCI6IFwiIzcwODA5MFwiLFxuICAgICAgICBcInNub3dcIjogXCIjZmZmYWZhXCIsXG4gICAgICAgIFwic3ByaW5nZ3JlZW5cIjogXCIjMDBmZjdmXCIsXG4gICAgICAgIFwic3RlZWxibHVlXCI6IFwiIzQ2ODJiNFwiLFxuICAgICAgICBcInRhblwiOiBcIiNkMmI0OGNcIixcbiAgICAgICAgXCJ0ZWFsXCI6IFwiIzAwODA4MFwiLFxuICAgICAgICBcInRoaXN0bGVcIjogXCIjZDhiZmQ4XCIsXG4gICAgICAgIFwidG9tYXRvXCI6IFwiI2ZmNjM0N1wiLFxuICAgICAgICBcInR1cnF1b2lzZVwiOiBcIiM0MGUwZDBcIixcbiAgICAgICAgXCJ2aW9sZXRcIjogXCIjZWU4MmVlXCIsXG4gICAgICAgIFwid2hlYXRcIjogXCIjZjVkZWIzXCIsXG4gICAgICAgIFwid2hpdGVcIjogXCIjZmZmZmZmXCIsXG4gICAgICAgIFwid2hpdGVzbW9rZVwiOiBcIiNmNWY1ZjVcIixcbiAgICAgICAgXCJ5ZWxsb3dcIjogXCIjZmZmZjAwXCIsXG4gICAgICAgIFwieWVsbG93Z3JlZW5cIjogXCIjOWFjZDMyXCIsXG4gICAgICAgIFwiYnV0dG9udGV4dFwiOiBcInJnYmEoMCwgMCwgMCwgMC44NDcpXCIsXG4gICAgICAgIFwiYnV0dG9uZmFjZVwiOiBcIiNmZmZmZmZcIixcbiAgICAgICAgXCJncmF5dGV4dFwiOiBcInJnYmEoMCwgMCwgMCwgMC4yNDcpXCJcbiAgICB9XG5cblxuICAgIC8vIFJld3JpdGUgdGhlIGNvbG9yIG9iamVjdCB0byBhY2NvdW50IGZvciBhbHBoYVxuICAgIHB1YmxpYyBzdGF0aWMgQ29sb3IoY3NzU3R5bGVDb2xvcikge1xuICAgICAgICBjc3NTdHlsZUNvbG9yID0gY3NzU3R5bGVDb2xvci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoY3NzU3R5bGVDb2xvciA9PT0gXCJ0cmFuc3BhcmVudFwiKSByZXR1cm4gbmV3IENvbG9yT2JqKDI1NSwgMjU1LCAyNTUsIDApO1xuICAgICAgICBpZiAoY3NzU3R5bGVDb2xvciBpbiBDb2xvclV0aWwuQ1NTQ29sb3JMb29rdXApXG4gICAgICAgICAgICBjc3NTdHlsZUNvbG9yID0gQ29sb3JVdGlsLkNTU0NvbG9yTG9va3VwW2Nzc1N0eWxlQ29sb3JdO1xuICAgICAgICBpZiAoY3NzU3R5bGVDb2xvci5zdGFydHNXaXRoKFwicmdiKFwiKSkge1xuICAgICAgICAgICAgbGV0IHJnYlJlZ2V4ID0gL1xccypyZ2JcXHMqXFwoXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccypcXCkvO1xuICAgICAgICAgICAgbGV0IG0gPSBjc3NTdHlsZUNvbG9yLm1hdGNoKHJnYlJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChtID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmoobVsxXSwgbVsyXSwgbVszXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY3NzU3R5bGVDb2xvci5zdGFydHNXaXRoKFwicmdiYShcIikpIHtcbiAgICAgICAgICAgIGxldCByZ2JSZWdleCA9IC9cXHMqcmdiYVxccypcXChcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKC4rKVxccypcXCkvO1xuICAgICAgICAgICAgbGV0IG0gPSBjc3NTdHlsZUNvbG9yLm1hdGNoKHJnYlJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChtID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmoobVsxXSwgbVsyXSwgbVszXSwgbVs0XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY3NzU3R5bGVDb2xvci5jaGFyQXQoMCkgIT0gXCIjXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHRocmVlLWRpZ2l0IFJHQiAoI3JnYikgaXMgY29udmVydGVkIHRvIHNpeC1kaWdpdCBmb3JtICgjcnJnZ2JiKSBieSByZXBsaWNhdGluZyBkaWdpdHNcbiAgICAgICAgICAgICAgICAvLyAoaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1jb2xvci0zLyNyZ2ItY29sb3IpXG4gICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvciA9IFwiI1wiICsgY3NzU3R5bGVDb2xvci5jaGFyQXQoMSkucmVwZWF0KDIpICtcbiAgICAgICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvci5jaGFyQXQoMikucmVwZWF0KDIpICtcbiAgICAgICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvci5jaGFyQXQoMykucmVwZWF0KDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHRoaXNSZWQgPSBwYXJzZUludChjc3NTdHlsZUNvbG9yLnN1YnN0cmluZygxLCAzKSwgMTYpO1xuICAgICAgICAgICAgbGV0IHRoaXNHcmVlbiA9IHBhcnNlSW50KGNzc1N0eWxlQ29sb3Iuc3Vic3RyaW5nKDMsIDUpLCAxNik7XG4gICAgICAgICAgICBsZXQgdGhpc0JsdWUgPSBwYXJzZUludChjc3NTdHlsZUNvbG9yLnN1YnN0cmluZyg1LCA3KSwgMTYpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvck9iaih0aGlzUmVkLCB0aGlzR3JlZW4sIHRoaXNCbHVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAgICByZXR1cm4gbnVsbDsgLy8gVW5yZWFjaGFibGVcbiAgICB9O1xuXG4gcHVibGljIHN0YXRpYyBDb2xvckNvbWJvKHJ1bGVDb250ZXh0IDogSFRNTEVsZW1lbnQpIHtcbiAgICB0cnkgeyBcbiAgICAgICAgdmFyIGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgd2luID0gZG9jLmRlZmF1bHRWaWV3O1xuICAgICAgICBpZiAoIXdpbikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYW5jZXN0b3JzID0gW107XG4gICAgICAgIGxldCB3YWxrTm9kZSA6IEVsZW1lbnQgPSBydWxlQ29udGV4dDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlKSB7XG4gICAgICAgICAgICBpZiAod2Fsa05vZGUubm9kZVR5cGUgPT09IDEpIFxuICAgICAgICAgICAgICAgIGFuY2VzdG9ycy5wdXNoKHdhbGtOb2RlKTtcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB2YXIgcmV0VmFsID0ge1xuICAgICAgICAgICAgXCJoYXNHcmFkaWVudFwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwiaGFzQkdJbWFnZVwiOiBmYWxzZSxcbiAgICAgICAgICAgIFwidGV4dFNoYWRvd1wiOiBmYWxzZSxcbiAgICAgICAgICAgIFwiZmdcIjogbnVsbCxcbiAgICAgICAgICAgIFwiYmdcIjogbnVsbFxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gc3RhcnRcbiAgICAgICAgdmFyIGNTdHlsZSA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgdmFyIGNvbXBTdHlsZUNvbG9yID0gY1N0eWxlLmNvbG9yO1xuICAgICAgICBpZiAoIWNvbXBTdHlsZUNvbG9yKVxuICAgICAgICAgICAgY29tcFN0eWxlQ29sb3IgPSBcImJsYWNrXCI7XG4gICAgICAgIHZhciBmZyA9IENvbG9yVXRpbC5Db2xvcihjb21wU3R5bGVDb2xvcik7XG4gICAgICAgIHZhciByZUNvbG9yID0gL3RyYW5zcGFyZW50fHJnYmE/XFwoW14pXStcXCkvZ2k7XG4gICAgICAgIHZhciBndWVzc0dyYWRDb2xvciA9IGZ1bmN0aW9uIChncmFkTGlzdCwgYmdDb2xvciwgZmdDb2xvcikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG9ubHkgb25lIGNvbG9yLCByZXR1cm4gdGhhdFxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZ3JhZExpc3QubGVuZ3RoID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3JhZExpc3Q7XG5cbiAgICAgICAgICAgICAgICB2YXIgb3ZlcmFsbFdvcnN0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB2YXIgb3ZlcmFsbFdvcnN0UmF0aW8gPSBudWxsO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGlHcmFkID0gMTsgaUdyYWQgPCBncmFkTGlzdC5sZW5ndGg7ICsraUdyYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHdvcnN0Q29sb3IgPSBncmFkTGlzdFtpR3JhZCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgd29yc3RSYXRpbyA9IGZnQ29sb3IuY29udHJhc3RSYXRpbyhncmFkTGlzdFtpR3JhZCAtIDFdKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXAgPSAuMTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkeCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdGVwID4gLjAwMDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpZHggKyBzdGVwIDw9IDEgJiYgd29yc3RSYXRpbyA+IGZnQ29sb3IuY29udHJhc3RSYXRpbyhncmFkTGlzdFtpR3JhZF0ubWl4KGdyYWRMaXN0W2lHcmFkIC0gMV0sIGlkeCArIHN0ZXApLmdldE92ZXJsYXlDb2xvcihiZ0NvbG9yKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JzdENvbG9yID0gZ3JhZExpc3RbaUdyYWRdLm1peChncmFkTGlzdFtpR3JhZCAtIDFdLCBpZHggKyBzdGVwKS5nZXRPdmVybGF5Q29sb3IoYmdDb2xvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yc3RSYXRpbyA9IGZnQ29sb3IuY29udHJhc3RSYXRpbyh3b3JzdENvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHggPSBpZHggKyBzdGVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlkeCAtIHN0ZXAgPj0gMCAmJiB3b3JzdFJhdGlvID4gZmdDb2xvci5jb250cmFzdFJhdGlvKGdyYWRMaXN0W2lHcmFkXS5taXgoZ3JhZExpc3RbaUdyYWQgLSAxXSwgaWR4IC0gc3RlcCkuZ2V0T3ZlcmxheUNvbG9yKGJnQ29sb3IpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcnN0Q29sb3IgPSBncmFkTGlzdFtpR3JhZF0ubWl4KGdyYWRMaXN0W2lHcmFkIC0gMV0sIGlkeCAtIHN0ZXApLmdldE92ZXJsYXlDb2xvcihiZ0NvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JzdFJhdGlvID0gZmdDb2xvci5jb250cmFzdFJhdGlvKHdvcnN0Q29sb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IGlkeCAtIHN0ZXA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwID0gc3RlcCAvIDEwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvdmVyYWxsV29yc3RSYXRpbyA9PT0gbnVsbCB8fCBvdmVyYWxsV29yc3RSYXRpbyA+IHdvcnN0UmF0aW8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJhbGxXb3JzdFJhdGlvID0gd29yc3RSYXRpbztcbiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJhbGxXb3JzdCA9IHdvcnN0Q29sb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG92ZXJhbGxXb3JzdDsgLy8gcmV0dXJuIHRoZSBkYXJrZXN0IGNvbG9yXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYmdDb2xvcjtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgcHJpb3JTdGFja0JHID0gQ29sb3JVdGlsLkNvbG9yKFwid2hpdGVcIik7XG4gICAgICAgIHZhciB0aGlzU3RhY2tPcGFjaXR5ID0gbnVsbDtcbiAgICAgICAgdmFyIHRoaXNTdGFja0FscGhhID0gbnVsbDtcbiAgICAgICAgdmFyIHRoaXNTdGFja0JHID0gbnVsbDtcbiAgICAgICAgLy8gQW5jZXN0b3JzIHByb2Nlc3NlZCBmcm9tIHRoZSB0b3Btb3N0IHBhcmVudCB0b3dhcmQgdGhlIGNoaWxkXG4gICAgICAgIHdoaWxlIChhbmNlc3RvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIHByb2NOZXh0ID0gYW5jZXN0b3JzLnBvcCgpO1xuICAgICAgICAgICAgLy92YXIgcHJvY05leHQgPSBhbmNlc3RvcnMuc3BsaWNlKDAsIDEpWzBdO1xuICAgICAgICAgICAgLy8gY1N0eWxlIGlzIHRoZSBjb21wdXRlZCBzdHlsZSBvZiB0aGlzIGxheWVyXG4gICAgICAgICAgICB2YXIgY1N0eWxlID0gd2luLmdldENvbXB1dGVkU3R5bGUocHJvY05leHQpO1xuICAgICAgICAgICAgaWYgKGNTdHlsZSA9PT0gbnVsbCkgY29udGludWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIHRoaXNCZ0NvbG9yIGlzIHRoZSBjb2xvciBvZiB0aGlzIGxheWVyIG9yIG51bGwgaWYgdGhlIGxheWVyIGlzIHRyYW5zcGFyZW50XG4gICAgICAgICAgICB2YXIgdGhpc0JnQ29sb3IgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGNTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgJiYgY1N0eWxlLmJhY2tncm91bmRDb2xvciAhPSBcInRyYW5zcGFyZW50XCIgJiYgY1N0eWxlLmJhY2tncm91bmRDb2xvciAhPSBcInJnYmEoMCwgMCwgMCwgMClcIikge1xuICAgICAgICAgICAgICAgIHRoaXNCZ0NvbG9yID0gQ29sb3JVdGlsLkNvbG9yKGNTdHlsZS5iYWNrZ3JvdW5kQ29sb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBncmFkaWVudCBpbnZvbHZlZCwgc2V0IHRoaXNCZ0NvbG9yIHRvIHRoZSB3b3JzdCBjb2xvciBjb21iaW5hdGlvbiBhdmFpbGFibGUgYWdhaW5zdCB0aGUgZm9yZWdyb3VuZFxuICAgICAgICAgICAgaWYgKGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgJiYgY1N0eWxlLmJhY2tncm91bmRJbWFnZS5pbmRleE9mICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZihcImdyYWRpZW50XCIpICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgdmFyIGdyYWRDb2xvcnMgOiBzdHJpbmdbXSA9IGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UubWF0Y2gocmVDb2xvcik7XG4gICAgICAgICAgICAgICAgaWYgKGdyYWRDb2xvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGdyYWRDb2xvckNvbXAgOiBDb2xvck9ialtdID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JhZENvbG9ycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFncmFkQ29sb3JzW2ldLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRDb2xvcnMuc3BsaWNlKGktLSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2xvckNvbXAgPSBDb2xvclV0aWwuQ29sb3IoZ3JhZENvbG9yc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yQ29tcC5hbHBoYSAhPT0gdW5kZWZpbmVkICYmIGNvbG9yQ29tcC5hbHBoYSA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWl4IHRoZSBncmRpZW50IGJnIGNvbG9yIHdpdCBwYXJlbnQgYmcgaWYgYWxwaGEgPCAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb21wU3RhY2tCZyA9IHRoaXNTdGFja0JHIHx8IHByaW9yU3RhY2tCRztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JDb21wID0gY29sb3JDb21wLmdldE92ZXJsYXlDb2xvcihjb21wU3RhY2tCZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRDb2xvckNvbXAucHVzaChjb2xvckNvbXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXNCZ0NvbG9yID0gZ3Vlc3NHcmFkQ29sb3IoZ3JhZENvbG9yQ29tcCwgdGhpc1N0YWNrQkcgfHwgcHJpb3JTdGFja0JHLCBmZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBIYW5kbGUgbm9uLXNvbGlkIG9wYWNpdHlcbiAgICAgICAgICAgIGlmICh0aGlzU3RhY2tPcGFjaXR5ID09PSBudWxsIHx8IChjU3R5bGUub3BhY2l0eSAmJiBjU3R5bGUub3BhY2l0eS5sZW5ndGggPiAwICYmIHBhcnNlRmxvYXQoY1N0eWxlLm9wYWNpdHkpIDwgMSkpIHtcbiAgICAgICAgICAgICAgICAvLyBOZXcgc3RhY2ssIHJlc2V0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNTdGFja0JHICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gT3ZlcmxheVxuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tCRy5hbHBoYSA9IHRoaXNTdGFja09wYWNpdHkgKiB0aGlzU3RhY2tBbHBoYTtcbiAgICAgICAgICAgICAgICAgICAgcHJpb3JTdGFja0JHID0gdGhpc1N0YWNrQkcuZ2V0T3ZlcmxheUNvbG9yKHByaW9yU3RhY2tCRyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXNTdGFja09wYWNpdHkgPSAxLjA7XG4gICAgICAgICAgICAgICAgdGhpc1N0YWNrQWxwaGEgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXNTdGFja0JHID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoY1N0eWxlLm9wYWNpdHkgJiYgY1N0eWxlLm9wYWNpdHkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tPcGFjaXR5ID0gcGFyc2VGbG9hdChjU3R5bGUub3BhY2l0eSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzQmdDb2xvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0JHID0gdGhpc0JnQ29sb3I7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0FscGhhID0gdGhpc1N0YWNrQkcuYWxwaGEgfHwgMS4wO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpc1N0YWNrQkcuYWxwaGE7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzU3RhY2tPcGFjaXR5ID09PSAxLjAgJiYgdGhpc1N0YWNrQWxwaGEgPT09IDEuMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmhhc0JHSW1hZ2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNHcmFkaWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSGFuZGxlIHNvbGlkIGNvbG9yIGJhY2tncm91bmRzIGFuZCBncmFkaWVudCBjb2xvciBiYWNrZ3JvdW5kc1xuICAgICAgICAgICAgZWxzZSBpZiAodGhpc0JnQ29sb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgc3RhY2sgYWxyZWFkeSBoYXMgYSBiYWNrZ3JvdW5kIGNvbG9yLCBibGVuZCBpdFxuICAgICAgICAgICAgICAgIGlmICh0aGlzU3RhY2tCRyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tCRyA9IHRoaXNCZ0NvbG9yO1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tBbHBoYSA9IHRoaXNTdGFja0JHLmFscGhhIHx8IDEuMDtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXNTdGFja0JHLmFscGhhO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0JHID0gdGhpc0JnQ29sb3IuZ2V0T3ZlcmxheUNvbG9yKHRoaXNTdGFja0JHKTtcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzU3RhY2tBbHBoYSA9IHRoaXNCZ0NvbG9yLmFscGhhIHx8IDEuMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQWxwaGEgPSB0aGlzU3RhY2tCRy5hbHBoYSB8fCAxLjA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vICM1MjY6IElmIHRoaXNCZ0NvbG9yIGhhZCBhbiBhbHBoYSB2YWx1ZSwgaXQgbWF5IG5vdCBleHBvc2UgdGhyb3VnaCB0aGlzU3RhY2tCRyBpbiB0aGUgYWJvdmUgY29kZVxuICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IHdpcGUgb3V0IHRoZSBncmFkaWVudCBpbmZvIGlmIHRoaXMgbGF5ZXIgd2FzIHRyYW5zcGFyZW50XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNTdGFja09wYWNpdHkgPT09IDEuMCAmJiB0aGlzU3RhY2tBbHBoYSA9PT0gMS4wICYmICh0aGlzU3RhY2tCRy5hbHBoYSB8fCAxLjApID09PSAxLjAgJiYgKHRoaXNCZ0NvbG9yLmFscGhhIHx8IDEuMCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmhhc0JHSW1hZ2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmhhc0dyYWRpZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgJiYgY1N0eWxlLmJhY2tncm91bmRJbWFnZSAhPSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgIGlmIChjU3R5bGUuYmFja2dyb3VuZEltYWdlLmluZGV4T2YgJiYgY1N0eWxlLmJhY2tncm91bmRJbWFnZS5pbmRleE9mKFwiZ3JhZGllbnRcIikgIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmhhc0dyYWRpZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwuaGFzQkdJbWFnZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzU3RhY2tCRyAhPSBudWxsKSB7XG4gICAgICAgICAgICBmZyA9IGZnLmdldE92ZXJsYXlDb2xvcih0aGlzU3RhY2tCRyk7XG4gICAgICAgICAgICBkZWxldGUgZmcuYWxwaGE7XG4gICAgICAgIH1cbiAgICAgICAgZmcuYWxwaGEgPSAoZmcuYWxwaGEgfHwgMSkgKiB0aGlzU3RhY2tPcGFjaXR5O1xuICAgICAgICBmZyA9IGZnLmdldE92ZXJsYXlDb2xvcihwcmlvclN0YWNrQkcpO1xuICAgICAgICBpZiAodGhpc1N0YWNrQkcgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpc1N0YWNrQkcuYWxwaGEgPSB0aGlzU3RhY2tPcGFjaXR5ICogdGhpc1N0YWNrQWxwaGE7XG4gICAgICAgICAgICBwcmlvclN0YWNrQkcgPSB0aGlzU3RhY2tCRy5nZXRPdmVybGF5Q29sb3IocHJpb3JTdGFja0JHKTtcbiAgICAgICAgfVxuICAgICAgICByZXRWYWwuZmcgPSBmZztcbiAgICAgICAgcmV0VmFsLmJnID0gcHJpb3JTdGFja0JHO1xuXG4gICAgICAgIGlmIChjU3R5bGUudGV4dFNoYWRvdyAmJiBjU3R5bGUudGV4dFNoYWRvdyAhPT0gJ25vbmUnKVxuICAgICAgICAgICAgcmV0VmFsLnRleHRTaGFkb3cgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIHNvbWV0aGluZyBoYXBwZW5lZCwgdGhlbi4uLlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gfTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbG9yT2JqIHtcbiAgICByZWQgOiBudW1iZXI7XG4gICAgZ3JlZW4gOiBudW1iZXI7XG4gICAgYmx1ZSA6IG51bWJlcjtcbiAgICBhbHBoYSA6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHJlZCA6IHN0cmluZyB8IG51bWJlciwgZ3JlZW4gOiBzdHJpbmcgfCBudW1iZXIsIGJsdWUgOiBzdHJpbmcgfCBudW1iZXIsIGFscGhhPyA6IHN0cmluZyB8IG51bWJlcikge1xuICAgICAgICBmdW5jdGlvbiBmaXhDb21wb25lbnQoY29tcCA6IHN0cmluZyB8IG51bWJlcikgOiBudW1iZXIge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAoY29tcCkgIT0gdHlwZW9mIChcIlwiKSkgcmV0dXJuIGNvbXAgYXMgbnVtYmVyO1xuICAgICAgICAgICAgbGV0IGNvbXBTdHIgPSBjb21wIGFzIHN0cmluZztcbiAgICAgICAgICAgIGNvbXBTdHIgPSBjb21wU3RyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmIChjb21wU3RyW2NvbXBTdHIubGVuZ3RoIC0gMV0gIT0gXCIlXCIpIHJldHVybiBwYXJzZUludChjb21wU3RyKTtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoY29tcFN0ci5zdWJzdHJpbmcoMCwgY29tcFN0ci5sZW5ndGggLSAxKSkgKiAyLjU1KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlZCA9IGZpeENvbXBvbmVudChyZWQpO1xuICAgICAgICB0aGlzLmdyZWVuID0gZml4Q29tcG9uZW50KGdyZWVuKTtcbiAgICAgICAgdGhpcy5ibHVlID0gZml4Q29tcG9uZW50KGJsdWUpO1xuICAgICAgICBpZiAodHlwZW9mIChhbHBoYSkgIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5hbHBoYSA9ICh0eXBlb2YgKGFscGhhKSA9PT0gdHlwZW9mIChcIlwiKSkgPyBwYXJzZUZsb2F0KGFscGhhIGFzIHN0cmluZykgOiBhbHBoYSBhcyBudW1iZXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b0hleEhlbHAodmFsdWUgOiBudW1iZXIpIDogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IE1hdGgucm91bmQodmFsdWUpLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgaWYgKHJldFZhbC5sZW5ndGggPT09IDEpXG4gICAgICAgICAgICByZXR1cm4gXCIwXCIgKyByZXRWYWw7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfTtcblxuICAgIHRvSGV4KCkgOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCIjXCIgKyB0aGlzLnRvSGV4SGVscCh0aGlzLnJlZCkgKyB0aGlzLnRvSGV4SGVscCh0aGlzLmdyZWVuKSArIHRoaXMudG9IZXhIZWxwKHRoaXMuYmx1ZSk7XG4gICAgfTtcblxuICAgIGNvbnRyYXN0UmF0aW8oYmdDb2xvciA6IENvbG9yT2JqKSB7IFxuICAgICAgICBsZXQgZmdDb2xvcjogQ29sb3JPYmogPSB0aGlzO1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5hbHBoYSkgIT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICAgIGZnQ29sb3IgPSB0aGlzLmdldE92ZXJsYXlDb2xvcihiZ0NvbG9yKTtcbiAgICAgICAgICAgICBcbiAgICAgICAgbGV0IGx1bTEgPSBmZ0NvbG9yLnJlbGF0aXZlTHVtaW5hbmNlKCk7XG4gICAgICAgIGlmICghYmdDb2xvci5yZWxhdGl2ZUx1bWluYW5jZSkge1xuICAgICAgICAgICAgbGV0IHMgPSBcIlwiO1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGJnQ29sb3IpIHtcbiAgICAgICAgICAgICAgICBzICs9IGtleSArIFwiXFxuXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhbGVydChiZ0NvbG9yKTtcbiAgICAgICAgICAgIGFsZXJ0KHMpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsdW0yID0gYmdDb2xvci5yZWxhdGl2ZUx1bWluYW5jZSgpO1xuICAgICAgICBsZXQgcmF0aW8gPSAobHVtMSA+IGx1bTIpID8gKGx1bTEgKyAuMDUpIC8gKGx1bTIgKyAuMDUpIDogKGx1bTIgKyAuMDUpIC8gKGx1bTEgKyAuMDUpO1xuICAgICAgICByZXR1cm4gcmF0aW87XG4gICAgfTtcblxuICAgIHJlbGF0aXZlTHVtaW5hbmNlKCkgOiBudW1iZXIge1xuICAgICAgICBsZXQgUiA9IHRoaXMucmVkIC8gMjU1LjA7XG4gICAgICAgIGxldCBHID0gdGhpcy5ncmVlbiAvIDI1NS4wO1xuICAgICAgICBsZXQgQiA9IHRoaXMuYmx1ZSAvIDI1NS4wO1xuICAgICAgICBSID0gUiA8PSAuMDQwNDUgPyBSIC8gMTIuOTIgOiBNYXRoLnBvdygoUiArIC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgICAgIEcgPSBHIDw9IC4wNDA0NSA/IEcgLyAxMi45MiA6IE1hdGgucG93KChHICsgLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICAgICAgQiA9IEIgPD0gLjA0MDQ1ID8gQiAvIDEyLjkyIDogTWF0aC5wb3coKEIgKyAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgICAgICByZXR1cm4gMC4yMTI2ICogUiArIDAuNzE1MiAqIEcgKyAwLjA3MjIgKiBCO1xuICAgIH07XG5cbiAgICBtaXgoY29sb3IyIDogQ29sb3JPYmosIHBlcmNUaGlzIDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuYWxwaGEpID09PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiAoY29sb3IyLmFscGhhKSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvck9iaihcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMucmVkICsgKDEgLSBwZXJjVGhpcykgKiBjb2xvcjIucmVkLFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogdGhpcy5ncmVlbiArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLmdyZWVuLFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogdGhpcy5ibHVlICsgKDEgLSBwZXJjVGhpcykgKiBjb2xvcjIuYmx1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhbHBoYVRoaXMgPSB0aGlzLmFscGhhID8gdGhpcy5hbHBoYSA6IDE7XG4gICAgICAgICAgICBsZXQgYWxwaGFPdGhlciA9IGNvbG9yMi5hbHBoYSA/IGNvbG9yMi5hbHBoYSA6IDE7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yT2JqKFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogdGhpcy5yZWQgKyAoMSAtIHBlcmNUaGlzKSAqIGNvbG9yMi5yZWQsXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiB0aGlzLmdyZWVuICsgKDEgLSBwZXJjVGhpcykgKiBjb2xvcjIuZ3JlZW4sXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiB0aGlzLmJsdWUgKyAoMSAtIHBlcmNUaGlzKSAqIGNvbG9yMi5ibHVlLFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogYWxwaGFUaGlzICsgKDEgLSBwZXJjVGhpcykgKiBhbHBoYU90aGVyXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGdldE92ZXJsYXlDb2xvcihiZ0NvbG9yIDogQ29sb3JPYmopIHtcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5hbHBoYSkgPT09IFwidW5kZWZpbmVkXCIgfHwgdGhpcy5hbHBoYSA+PSAxKSB7XG4gICAgICAgICAgICAvLyBObyBtaXhpbmcgcmVxdWlyZWQgLSBpdCdzIG9wYXF1ZVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWxwaGEgPCAwKSB7XG4gICAgICAgICAgICAvL1x0XHRIYWFjLkVycm9yLmxvZ0Vycm9yKFwiSW52YWxpZCBhbHBoYSB2YWx1ZVwiKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgKGJnQ29sb3IuYWxwaGEpICE9IFwidW5kZWZpbmVkXCIgJiYgYmdDb2xvci5hbHBoYSA8IDEpIHtcbiAgICAgICAgICAgIC8vXHRcdEhhYWMuRXJyb3IubG9nRXJyb3IoXCJDYW5ub3QgbWl4IHdpdGggYSBiYWNrZ3JvdW5kIGFscGhhXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldFZhbCA9IHRoaXMubWl4KGJnQ29sb3IsIHRoaXMuYWxwaGEpO1xuICAgICAgICBkZWxldGUgcmV0VmFsLmFscGhhOyBcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21DU1NDb2xvcihjc3NTdHlsZUNvbG9yKSB7XG4gICAgICAgIGxldCB0aGlzUmVkID0gLTE7XG4gICAgICAgIGxldCB0aGlzR3JlZW4gPSAtMTtcbiAgICAgICAgbGV0IHRoaXNCbHVlID0gLTE7XG5cbiAgICAgICAgY3NzU3R5bGVDb2xvciA9IGNzc1N0eWxlQ29sb3IudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3Iuc3RhcnRzV2l0aChcInJnYihcIikpIHtcbiAgICAgICAgICAgIGxldCByZ2JSZWdleCA9IC9cXHMqcmdiXFxzKlxcKFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqXFwpLztcbiAgICAgICAgICAgIGxldCBtID0gY3NzU3R5bGVDb2xvci5tYXRjaChyZ2JSZWdleCk7XG4gICAgICAgICAgICBpZiAobSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzUmVkID0gbVsxXTtcbiAgICAgICAgICAgICAgICB0aGlzR3JlZW4gPSBtWzJdO1xuICAgICAgICAgICAgICAgIHRoaXNCbHVlID0gbVszXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjc3NTdHlsZUNvbG9yLnN0YXJ0c1dpdGgoXCJyZ2JhKFwiKSkge1xuICAgICAgICAgICAgbGV0IHJnYlJlZ2V4ID0gL1xccypyZ2JhXFxzKlxcKFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooLispXFxzKlxcKS87XG4gICAgICAgICAgICBsZXQgbSA9IGNzc1N0eWxlQ29sb3IubWF0Y2gocmdiUmVnZXgpO1xuICAgICAgICAgICAgaWYgKG0gPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpc1JlZCA9IG1bMV07XG4gICAgICAgICAgICAgICAgdGhpc0dyZWVuID0gbVsyXTtcbiAgICAgICAgICAgICAgICB0aGlzQmx1ZSA9IG1bM107XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3NzU3R5bGVDb2xvci5jaGFyQXQoMCkgIT0gXCIjXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3NzU3R5bGVDb2xvciBpbiBDb2xvclV0aWwuQ1NTQ29sb3JMb29rdXApXG4gICAgICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IgPSBDb2xvclV0aWwuQ1NTQ29sb3JMb29rdXBbY3NzU3R5bGVDb2xvcl07XG4gICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBmcm9tSGV4ID0gZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgICAgIGxldCBsb29rdXAgPSB7XG4gICAgICAgICAgICAgICAgICAgIFwiYVwiOiAxMCxcbiAgICAgICAgICAgICAgICAgICAgXCJiXCI6IDExLFxuICAgICAgICAgICAgICAgICAgICBcImNcIjogMTIsXG4gICAgICAgICAgICAgICAgICAgIFwiZFwiOiAxMyxcbiAgICAgICAgICAgICAgICAgICAgXCJlXCI6IDE0LFxuICAgICAgICAgICAgICAgICAgICBcImZcIjogMTVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGxldCByZXRWYWwgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbCAqIDE2ICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KHZhbC5jaGFyQXQoaSkgaW4gbG9va3VwID8gbG9va3VwW3ZhbC5jaGFyQXQoaSldIDogdmFsLmNoYXJBdChpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3NzU3R5bGVDb2xvci5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgdGhyZWUtZGlnaXQgUkdCICgjcmdiKSBpcyBjb252ZXJ0ZWQgdG8gc2l4LWRpZ2l0IGZvcm0gKCNycmdnYmIpIGJ5IHJlcGxpY2F0aW5nIGRpZ2l0c1xuICAgICAgICAgICAgICAgIC8vIChodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWNvbG9yLTMvI3JnYi1jb2xvcilcbiAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yID0gXCIjXCIgKyBjc3NTdHlsZUNvbG9yLmNoYXJBdCgxKS5yZXBlYXQoMikgK1xuICAgICAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yLmNoYXJBdCgyKS5yZXBlYXQoMikgK1xuICAgICAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yLmNoYXJBdCgzKS5yZXBlYXQoMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzUmVkID0gZnJvbUhleChjc3NTdHlsZUNvbG9yLnN1YnN0cmluZygxLCAzKSk7XG4gICAgICAgICAgICB0aGlzR3JlZW4gPSBmcm9tSGV4KGNzc1N0eWxlQ29sb3Iuc3Vic3RyaW5nKDMsIDUpKTtcbiAgICAgICAgICAgIHRoaXNCbHVlID0gZnJvbUhleChjc3NTdHlsZUNvbG9yLnN1YnN0cmluZyg1LCA3KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDb2xvck9iaih0aGlzUmVkLCB0aGlzR3JlZW4sIHRoaXNCbHVlKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vbk1hcHBlciB9IGZyb20gXCIuLi9jb21tb24vQ29tbW9uTWFwcGVyXCI7XG5pbXBvcnQgeyBCb3VuZHMgfSBmcm9tIFwiLi4vYXBpL0lNYXBwZXJcIjtcblxuZXhwb3J0IGNsYXNzIERPTU1hcHBlciBleHRlbmRzIENvbW1vbk1hcHBlciB7XG4gICAgZ2V0Um9sZShub2RlOiBOb2RlKSA6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGdldE5hbWVzcGFjZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJkb21cIlxuICAgIH1cbiAgICBnZXRBdHRyaWJ1dGVzKG5vZGU6IE5vZGUpIDogeyBba2V5OnN0cmluZ106IHN0cmluZyB9IHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHt9O1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8ZWxlbS5hdHRyaWJ1dGVzLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRySW5mbyA9IGVsZW0uYXR0cmlidXRlc1tpZHhdO1xuICAgICAgICAgICAgICAgIHJldFZhbFthdHRySW5mby5uYW1lLnRvTG93ZXJDYXNlKCldID0gYXR0ckluZm8ubm9kZVZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgZ2V0Qm91bmRzKG5vZGU6IE5vZGUpIDogQm91bmRzIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEgLypOb2RlLkVMRU1FTlRfTk9ERSovKSB7XG4gICAgICAgICAgICBsZXQgYWRqdXN0bWVudCA9IDE7XG4gICAgICAgICAgICBpZiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZGV2aWNlUGl4ZWxSYXRpbykge1xuICAgICAgICAgICAgICAgIGFkanVzdG1lbnQgPSBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBib3VuZHMgPSAobm9kZSBhcyBFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBcbiAgICAgICAgICAgIC8vIERvIGEgY2hlY2sgd2hldGhlciBib3VuZHMgaGFzIHZhbHVlIGFzIHdlIHVzZSBkaWZmZXJlbnQgdG9vbCAoaHRtbFVuaXQsIGJyb3dzZXIpIHRvIGNhbGwgdGhpcyBmdW5jdGlvblxuICAgICAgICAgICAgaWYgKGJvdW5kcykge1xuICAgICAgICAgICAgICAgIGxldCBzY3JvbGxYID0gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5zY3JvbGxYIHx8IDA7XG4gICAgICAgICAgICAgICAgbGV0IHNjcm9sbFkgPSBub2RlICYmIG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LnNjcm9sbFkgfHwgMDtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBcImxlZnRcIjogTWF0aC5jZWlsKChib3VuZHMubGVmdCArIHNjcm9sbFgpICogYWRqdXN0bWVudCksXG4gICAgICAgICAgICAgICAgICAgIFwidG9wXCI6IE1hdGguY2VpbCgoYm91bmRzLnRvcCArIHNjcm9sbFkpICogYWRqdXN0bWVudCksXG4gICAgICAgICAgICAgICAgICAgIFwiaGVpZ2h0XCI6IE1hdGguY2VpbChib3VuZHMuaGVpZ2h0ICogYWRqdXN0bWVudCksXG4gICAgICAgICAgICAgICAgICAgIFwid2lkdGhcIjogTWF0aC5jZWlsKGJvdW5kcy53aWR0aCAqIGFkanVzdG1lbnQpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4vRE9NV2Fsa2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBET01VdGlsIHtcbiAgICBcbiAgICBzdGF0aWMgaGFzUGFyZW50KG5vZGU6IE5vZGUsIG5hbWVzOnN0cmluZ1tdKSB7XG4gICAgICAgIGxldCBwID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSk7XG4gICAgICAgIHdoaWxlIChwICYmICFuYW1lcy5pbmNsdWRlcyhwLm5vZGVOYW1lKSkge1xuICAgICAgICAgICAgcCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhIXA7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEFuY2VzdG9yKG5vZGU6IE5vZGUsIG5hbWVzOnN0cmluZ1tdKSB7XG4gICAgICAgIGxldCBwID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSk7XG4gICAgICAgIHdoaWxlIChwICYmICFuYW1lcy5pbmNsdWRlcyhwLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICBwID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuXG4gICAgc3RhdGljIHNhbWVOb2RlKGE6IE5vZGUsIGI6IE5vZGUpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmIChhID09PSBiKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChhLmlzU2FtZU5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBhLmlzU2FtZU5vZGUoYik7XG4gICAgICAgIH0gZWxzZSBpZiAoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikgPT09IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOb3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQgLSB0cnkgb3VyIGJlc3RcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGNsZWFuV2hpdGVzcGFjZShzOiBzdHJpbmcpIDogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHMucmVwbGFjZSgvWyBcXHRcXHJcXG5dL2csIFwiIFwiKS5yZXBsYWNlKC8gKy9nLFwiIFwiKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgY2xlYW5TcGFjZShzOiBzdHJpbmcpIDogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHMucmVwbGFjZSgvICsvZyxcIiBcIik7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIHRydWUgaWYgZWxlbWVudDEgYW5kIGVsZW1lbnQyIChjZWxscykgYXJlIGluIHRoZSBzYW1lIHRhYmxlXG4gICAgc3RhdGljIGlzSW5TYW1lVGFibGUoZWxlbWVudDEsIGVsZW1lbnQyKSB7XG4gICAgICAgIGlmIChlbGVtZW50MSAmJiBlbGVtZW50Mikge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50TmFtZSA9IFsndGFibGUnXTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudDE9IERPTVV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudDEsIHBhcmVudE5hbWUpO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50Mj0gRE9NVXRpbC5nZXRBbmNlc3RvcihlbGVtZW50MiwgcGFyZW50TmFtZSk7XG4gICAgICAgICAgICBpZiAocGFyZW50MSAhPT0gbnVsbCAmJiBwYXJlbnQyICE9IG51bGwgJiYgRE9NVXRpbC5zYW1lTm9kZShwYXJlbnQxLCBwYXJlbnQyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyBzaGFkb3dSb290Tm9kZShub2RlOiBOb2RlKSA6IE5vZGUgfCBudWxsIHtcbiAgICAgICAgbGV0IG5kID0gbm9kZTtcbiAgICAgICAgd2hpbGUgKG5kICE9IG51bGwgJiYgbmQubm9kZVR5cGUgIT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAqLykgXG4gICAgICAgICAgICBuZCA9IG5kLnBhcmVudE5vZGU7XG4gICAgICAgIHJldHVybiBuZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgb2JqZWN0cywgYnV0IHJldGFpbnMgTm9kZSBhdHRyaWJ1dGVzIGFzIHJlZmVyZW5jZXNcbiAgICAgKiBAcGFyYW0gcmhzIFxuICAgICAqL1xuICAgIHN0YXRpYyBvYmplY3RDb3B5V2l0aE5vZGVSZWZzKHJoczogYW55KSB7XG4gICAgICAgIGlmICghcmhzKSByZXR1cm4gcmhzO1xuICAgICAgICBpZiAodHlwZW9mIHJocyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByaHMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiByaHM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJocykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHJocyBpbnN0YW5jZW9mIE5vZGUgfHwgISFyaHMubm9kZVR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiByaHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcmV0VmFsO1xuICAgICAgICAgICAgaWYgKHJocy5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIkFycmF5XCIpIHtcbiAgICAgICAgICAgICAgICByZXRWYWwgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcmhzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKHRoaXMub2JqZWN0Q29weVdpdGhOb2RlUmVmcyhpdGVtKSk7XG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcmhzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbFtrZXldID0gdGhpcy5vYmplY3RDb3B5V2l0aE5vZGVSZWZzKHJoc1trZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmNlc3RvcldpdGhBdHRyaWJ1dGUoZWxlbWVudCwgYXR0ck5hbWUsIGF0dHJWYWx1ZSkge1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtZW50KTtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAod2Fsa05vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gJiYgKDxFbGVtZW50PndhbGtOb2RlKS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpID09PSBhdHRyVmFsdWUpIFxuICAgICAgICAgICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogV2Fsa3MgaW4gYSBET00gb3JkZXJcbiAqIFxuICogU2VlIGFsc28gLi4vYXJpYS9BUklBV2Fsa2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBET01XYWxrZXIge1xuICAgIHJvb3QgOiBOb2RlO1xuICAgIG5vZGUgOiBOb2RlO1xuICAgIGJFbmRUYWc6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50IDogTm9kZSwgYkVuZD8gOiBib29sZWFuLCByb290PyA6IE5vZGUpIHtcbiAgICAgICAgdGhpcy5yb290ID0gcm9vdCB8fCBlbGVtZW50O1xuICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLmJFbmRUYWcgPSAoYkVuZCA9PSB1bmRlZmluZWQgPyBmYWxzZSA6IGJFbmQgPT0gdHJ1ZSk7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcmVudE5vZGUobm9kZTogTm9kZSkgOiBOb2RlIHwgbnVsbCB7XG4gICAgICAgIGlmIChub2RlID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHAgOiBOb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICBpZiAoKG5vZGUgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgIHAgPSAobm9kZSBhcyBhbnkpLnNsb3RPd25lcjtcbiAgICAgICAgfSBlbHNlIGlmICgobm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCkge1xuICAgICAgICAgICAgcCA9IChub2RlIGFzIGFueSkub3duZXJFbGVtZW50O1xuICAgICAgICB9IGVsc2UgaWYgKHAgJiYgcC5ub2RlVHlwZSA9PT0gMTEpIHtcbiAgICAgICAgICAgIGlmICgocCBhcyBTaGFkb3dSb290KS5ob3N0KSB7XG4gICAgICAgICAgICAgICAgcCA9IChwIGFzIFNoYWRvd1Jvb3QpLmhvc3Q7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHAgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJlbnRFbGVtZW50KG5vZGU6IE5vZGUpIDogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBsZXQgZWxlbSA6IEVsZW1lbnQgPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGVsZW0gPSBET01XYWxrZXIucGFyZW50Tm9kZShlbGVtKSBhcyBFbGVtZW50O1xuICAgICAgICB9IHdoaWxlIChlbGVtICYmIGVsZW0ubm9kZVR5cGUgIT09IDEpO1xuICAgICAgICByZXR1cm4gZWxlbTtcbiAgICB9XG4gICAgXG4gICAgc3RhdGljIGlzTm9kZVZpc2libGUobm9kZTogTm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHZpcyA9IG51bGw7XG4gICAgICAgICAgICB3aGlsZSAobm9kZSAmJiBub2RlLm5vZGVUeXBlICE9PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGVsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBsZXQgdyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBsZXQgY3MgPSB3LmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKGNzLmRpc3BsYXkgPT09IFwibm9uZVwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHZpcyA9PT0gbnVsbCAmJiBjcy52aXNpYmlsaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZpcyA9IGNzLnZpc2liaWxpdHk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2aXMgPT09IFwiaGlkZGVuXCIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxlbSA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KGVsZW0pO1xuICAgICAgICAgICAgfSB3aGlsZSAoZWxlbSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhdFJvb3QoKSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoKHRoaXMgYXMgYW55KS5vd25lckVsZW1lbnQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PT0gdGhpcy5ub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJvb3QuaXNTYW1lTm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5pc1NhbWVOb2RlKHRoaXMubm9kZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yb290LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMubm9kZSkgPT09IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOb3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQgLSB0cnkgb3VyIGJlc3RcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vZGUucGFyZW50Tm9kZSA9PT0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5leHROb2RlKCkgOiBib29sZWFuIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5ub2RlLm5vZGVOYW1lLCB0aGlzLmJFbmRUYWc/XCJFTkRcIjpcIlNUQVJUXCIsIHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIGFueSkuZ2V0QXR0cmlidXRlKFwiaWRcIikpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50Tm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBzbG90RWxlbWVudCA9ICh0aGlzLm5vZGUgYXMgSFRNTFNsb3RFbGVtZW50KVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5pc05vZGVWaXNpYmxlKGlmcmFtZU5vZGUpXG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50XG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyBcbiAgICAgICAgICAgICAgICAgICAgJiYgRE9NV2Fsa2VyLmlzTm9kZVZpc2libGUoZWxlbWVudE5vZGUpXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3RcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdC5maXJzdENoaWxkKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gZWxlbWVudE5vZGUuc2hhZG93Um9vdDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSBcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzbG90XCJcbiAgICAgICAgICAgICAgICAgICAgJiYgc2xvdEVsZW1lbnQuYXNzaWduZWROb2RlcygpLmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNsb3RPd25lciA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdEVsZW1lbnQuYXNzaWduZWROb2RlcygpWzBdO1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyID0gc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gfHwgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxMSkgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gJiYgdGhpcy5ub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0Um9vdCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNsb3RPd25lciA9ICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0U2xvdEluZGV4ID0gKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleCsxO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0U2xvdEluZGV4IDwgc2xvdE93bmVyLmFzc2lnbmVkTm9kZXMoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKClbbmV4dFNsb3RJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyID0gc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleCA9IG5leHRTbG90SW5kZXg7ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKFxuICAgICAgICAgICAgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDExICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMyAvKiBOb2RlLlRFWFRfTk9ERSAqLylcbiAgICAgICAgICAgIHx8ICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhQ2hlY2tlclwiKSA9PT0gXCJBQ0VcIilcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJldk5vZGUoKSA6IGJvb2xlYW4ge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAodGhpcy5iRW5kVGFnKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlmcmFtZU5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxJRnJhbWVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudE5vZGUgPSAodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJRlJBTUVcIlxuICAgICAgICAgICAgICAgICAgICAmJiBET01XYWxrZXIuaXNOb2RlVmlzaWJsZShpZnJhbWVOb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIFxuICAgICAgICAgICAgICAgICAgICAmJiBET01XYWxrZXIuaXNOb2RlVmlzaWJsZShlbGVtZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290Lmxhc3RDaGlsZCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50Tm9kZS5zaGFkb3dSb290O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyB8fCB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDExKSAmJiB0aGlzLm5vZGUubGFzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdFJvb3QoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUucHJldmlvdXNTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKFxuICAgICAgICAgICAgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDExKVxuICAgICAgICAgICAgfHwgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFDaGVja2VyXCIpID09PSBcIkFDRVwiKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi8uLi92NC91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuL0RPTVV0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgY2xhc3MgVmlzVXRpbCB7XG4gICAgLy8gVGhpcyBsaXN0IGNvbnRhaW5zIGEgbGlzdCBvZiBlbGVtZW50IHRhZ3Mgd2hpY2ggY2FuIG5vdCBiZSBoaWRkZW4sIHdoZW4gaGlkZGVuIGlzXG4gICAgLy8gYWRkZWQgdG8gdGhlc2VzIGVsZW1lbnRzIGl0IGRvZXMgbm90IGRvIGFueXRoaW5nIGF0IGFsbC5cbiAgICAvLyAgYXJlYSAtLT4gYXJlYSBlbGVtZW50IGlzIHBhcnQgb2YgYSBtYXAgZWxlbWVudCBhbmQgaXQgY2FuIG5vdCBiZSBoaWRkZW4gYmVjYXVzZSBpdCBpcyB1c2VkIHRvXG4gICAgLy8gICAgICAgICAgIG1ha2UgYW4gY2VydGlhbiBwYXJ0cyBvZiBhbiBtYXAgaW50ZXJhY3RpdmUuXG4gICAgLy8gIHBhcmFtIC0tPiBlbGVtZW50IGNhbiBvbmx5IGJlIHBhcnQgb2Ygb2JqZWN0IGVsbWVudCBhbmQgaXQgY2Fubm90IGJlIGhpZGRlbiBkaXJlY3RseSwgaXRcbiAgICAvLyAgICAgICAgICAgIGNhbiBvbmx5IGJlIGhpZGRlbiBpZiB0aGUgcGFyZW50IGlzIGhpZGRlbi5cbiAgICAvLyAgYXVkaW8gLS0+IElmIHRoaXMgZWxlbWVudCBpcyBoaWRkZW4gaXQgd2lsbCBzdGlsbCBwbGF5IHRoZSBtdXNpYywgc28gd2Ugc2hvdWxkIHN0aWxsIHRyaWdnZXJcbiAgICAvLyAgICAgICAgICAgIHZpb2xhdGlvbnMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAvLyBOb3RlOiBBbGwgZWxlbWVudCB0YWdzIHRoYXQgYXJlIGFkZGVkIGhlcmUgc2hvdWxkIGJlIGFkZGVkIGFzIGxvd2VyY2FzZSwgYXMgd2UgYXJlIHVzaW5nIGluZGV4T2YgdG8gZG8gdGhlIGNoZWNrLlxuICAgIHB1YmxpYyBzdGF0aWMgdW5oaWRlYWJsZUVsZW1lbnRzID0gWydhcmVhJywgJ3BhcmFtJywgJ2F1ZGlvJ107XG5cbiAgICAvLyBUaGlzIGxpc3QgY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnRzIHRhZ3Mgd2hpY2ggaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIHNpbmNlIHdlIGhhdmUgcnVsZXMgdHJpZ2dlcmluZ1xuICAgIC8vIG9uIHRoZXNlcyBlbGVtZW50cyB3ZSBuZWVkIHRvIG1ha2UgdGhlbiB2aXNpYmxlIGJ5IGRlZmF1bHQgc28gdGhhdCB0aGUgcnVsZXMgY2FuIHRyaWdnZXIgcmVnYXJkbGVzcyBvZiB0aGVcbiAgICAvLyBDaGVjayBIaWRkZW4gQ29udGVudCBvcHRpb24gaW4gdGhlIHRvb2xzLlxuICAgIC8vICBzY3JpcHQgLS0+IHNjcmlwdCBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdFxuICAgIC8vICBsaW5rIC0tPiBsaW5rIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgdGhlIGFjdHVhbGx5IENTUyBzY3JpcHQgaXMgc3RpbGwgZXhlY3V0ZWQgc28gd2UgaGF2ZSB0b1xuICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgLy8gIHN0eWxlIC0tPiBzdHlsZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IHRoZSBhY3R1YWxseSBDU1Mgc2NyaXB0IGlzIHN0aWxsIGV4ZWN1dGVkIHNvIHdlIGhhdmUgdG9cbiAgICAvLyAgICAgICAgICAgIG1hcmsgdGhpcyBlbGVtZW50IGFzIHZpc2libGUgYXQgYWxsIHRpbWVzLlxuICAgIC8vICBoZWFkIC0tPiBoZWFkIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgaXQgd2lsbCBzdGlsbCBiZWhhdmUgY29ycmVjdFxuICAgIC8vICB0aXRsZSAtLT4gdGl0bGUgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCBpdCB3aWxsIHN0aWxsIGRpc3BsYXkgdGhlIHRpdGxlXG4gICAgLy8gIG1ldGEgLS0+IG1ldGEgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCBpdCB3aWxsIHN0aWxsIHBlcmZvcm0gdGhlIGFjdGlvbiB0aGF0IG1ldGEgaXMgc3VwcG9zZSB0b1xuICAgIC8vICBiYXNlIC0tPiBiYXNlIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgaXQgd2lsbCBzdGlsbCBwZXJmb3JtIHRoZSBhY3Rpb24gdGhhdCBtZXRhIGlzIHN1cHBvc2UgdG9cbiAgICAvLyAgbm9zY3JpcHQgLS0+IG5vc2NyaXB0IGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgaXQgd2lsbCBzdGlsbCBwZXJmb3JtIHRoZSBhY3Rpb24gdGhhdCBtZXRhIGlzIHN1cHBvc2UgdG9cbiAgICAvLyAgdGVtcGxhdGUgLS0+IHRlbXBsYXRlIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBiZWNhdXNlIHRoZXkgYXJlIGp1c3QgYSBtZWNoYW5pc20gZm9yIGhvbGRpbmcgY2xpZW50LXNpZGUgY29udGVudFxuICAgIC8vICAgICAgICAgICAgICAgdGhhdCBpcyBub3QgdG8gYmUgcmVuZGVyZWQgd2hlbiBhIHBhZ2UgaXMgbG9hZGVkLiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvdGVtcGxhdGVcbiAgICAvLyAgZGF0YWxpc3QgLS0+IGRhdGFsaXN0IGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LFxuICAgIHB1YmxpYyBzdGF0aWMgaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgPSBbJ3NjcmlwdCcsICdsaW5rJywgJ3N0eWxlJywgJ2hlYWQnLCAndGl0bGUnLCAnbWV0YScsICdiYXNlJywgJ25vc2NyaXB0JywgJ3RlbXBsYXRlJywgJ2RhdGFsaXN0J11cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIGlmIHRoZSBub2RlIHRoYXQgaXMgcHJvdmllZCBpc1xuICAgICAqIHZpc2libGUgb3Igbm90LiBGb2xsb3dpbmcgaXMgaG93IHRoZSBjaGVjayBpcyBwZXJmb3JtZWQ6XG4gICAgICogICAgMS4gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6XG4gICAgICogICAgICAgQ1NTIC0tPiBkaXNsYXk6IG5vbmVcbiAgICAgKiAgICAgICBDU1MgLS0+IHZpc2liaWxpdHk6IGhpZGRlblxuICAgICAqICAgICAgIGF0dHJpYnV0ZSAtLT4gaGlkZGVuXG4gICAgICogICAgMi4gQ2hlY2sgaWYgdGhlIGFueSBvZiB0aGUgY3VycmVudCBub2RlcyBwYXJlbnRzIGFyZSBoaWRkZW4gd2l0aCB0aGUgc2FtZVxuICAgICAqICAgICAgIG9wdGlvbnMgbGlzdGVkIGluIDEuXG4gICAgICpcbiAgICAgKiAgICBOb3RlOiBJZiBlaXRoZXIgY3VycmVudCBub2RlIG9yIGFueSBvZiB0aGUgcGFyZW50IG5vZGVzIGFyZSBoaWRkZW4gdGhlbiB0aGlzXG4gICAgICogICAgICAgICAgZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgKG5vZGUgaXMgbm90IHZpc2libGUpLlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IG5vZGUgVGhlIG5vZGUgd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQgaWYgaXQgaXMgdmlzaWJsZSBvciBub3QuXG4gICAgICogQHJldHVybiB7Ym9vbH0gZmFsc2UgaWYgdGhlIG5vZGUgaXMgTk9UIHZpc2libGUsIHRydWUgb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgVmlzVXRpbFxuICAgICAqL1xuICAgICBwdWJsaWMgc3RhdGljIGlzTm9kZVZpc2libGUobm9kZUluOiBOb2RlKSA6IGJvb2xlYW4ge1xuXG4gICAgICAgIC8vIENoZWNrIHRoZSBub2RlVHlwZSBpZiB0aGlzIG5vZGUsIGlmIHRoaXMgbm9kZSBpcyBhIHRleHQgbm9kZSB0aGVuXG4gICAgICAgIC8vIHdlIGdldCB0aGUgcGFyZW50bm9kZSBhbmQgc2V0IHRoYXQgYXMgdGhlIG5vZGUgYXMgYSB0ZXh0IG5vZGVzLFxuICAgICAgICAvLyB2aXNpYmlsaXR5IGlzIGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIHBhcmVudCBub2RlLlxuICAgICAgICBpZiAobm9kZUluLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICBub2RlSW4gPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlSW4pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBub2RlID0gbm9kZUluIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIFNldCBQVF9OT0RFX0hJRERFTiB0byBmYWxzZSBmb3IgYWxsIHRoZSBub2RlcywgYmVmb3JlIHRoZSBjaGVjayBhbmQgdGhpcyB3aWxsIGJlIGNoYW5nZWQgdG9cbiAgICAgICAgLy8gdHJ1ZSB3aGVuIHdlIGRldGVjdCB0aGF0IHRoZSBub2RlIGlzIGhpZGRlbi4gV2UgaGF2ZSB0byBzZXQgaXQgdG8gZmFsc2Ugc28gdGhhdCB3ZSBrbm93XG4gICAgICAgIC8vIHRoZSBydWxlcyBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuXG4gICAgICAgIHNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgZ2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCBmYWxzZSkpO1xuXG4gICAgICAgIC8vIFdlIHNob3VsZCBvbmx5IGFsbG93IG5vZGVUeXBlIGVsZW1lbnQsIGFuZCBUZXh0Tm9kZSBhbGwgb3RoZXIgbm9kZXNUeXBlc1xuICAgICAgICAvLyB3ZSBjYW4gcmV0dXJuIHRoZSB2aXNpYmlsaXR5IGFzIHZpc2libGUuXG4gICAgICAgIC8vIEZvbGxvd2luZyBub2RlcyB3aWxsIGJlIHJldHVybmVkIGFzIHZpc2FibGUgYnkgZGVmYXVsdCwgc2luY2Ugd2UgY2FuIG5vdFxuICAgICAgICAvLyBhY3R1YWxseSBjaGFuZ2UgdGhlaXIgdmlzaWJpbGl0eS5cbiAgICAgICAgLy8gIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIC0tPiA3XG4gICAgICAgIC8vICBOb2RlLkNPTU1FTlRfTk9ERSAgICAgICAgICAgICAgICAtLT4gOFxuICAgICAgICAvLyAgOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gICAgICAgICAgICAgICAtLT4gOVxuICAgICAgICAvLyAgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgICAgICAgICAgLS0+IDEwXG4gICAgICAgIC8vICBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgICAgICAtLT4gMTFcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG93bmVyRG9jdW1lbnQgaXMgcHJlc2VudCBiZWZvcmUgbW92aW5nIGZvcndhcmRcbiAgICAgICAgLy8gaW4gZGV0ZWN0aW5nIGlmIHRoZSBub2RlIGlzIHZpc2libGUgb3Igbm90LiBJbiB0aGUgY2FzZSB0aGF0IG93bmVyRG9jdW1lbnRcbiAgICAgICAgLy8gZG9lcyBub3QgZXhpc3QgdGhlbiB3ZSBzaW1wbHkgcmV0dXJuIG5vZGUgaXMgdmlzaWJsZSBieSBkZWZhdWx0LlxuICAgICAgICBpZiAoIW5vZGUub3duZXJEb2N1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsYXJhdGlvblxuICAgICAgICBsZXQgY29tcFN0eWxlO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhpcyBub2RlIGlzIGEgc2NyaXB0LCBsaW5rIG9yIHN0eWxlIG5vZGUsIHJpZ2h0IGF3YXkgcmV0dXJuIG5vZGUgaXMgdmlzaWJsZVxuICAgICAgICAvLyBiZWNhdXNlIHNjcmlwdHMsIGxpbmtzIGFuZCBzdHlsZSBub2RlcyBjYW4gbm90IGJlIGhpZGRlbiBieSBIVE1MIGF0dHJpYnV0ZSBvciBDU1Mgb3IgYXJlIGhpZGRlbiBieSBkZWZhdWx0LiBCdXQgd2Ugd2FudCB0byBzY2FuXG4gICAgICAgIC8vIHRoZSBlbGVtZW50cyBldmVyeXRpbWUgYXMgdGhleSByZW5kZXIgY29udGVudCBzdGlsbCB3aGljaCBpcyBzdGlsbCB2aXNpYmxlIHRvIHVzZXJzLlxuICAgICAgICAvLyAgc2NyaXB0IC0tPiBzY3JpcHQgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHRcbiAgICAgICAgLy8gIGxpbmsgLS0+IGxpbmsgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgICAgIC8vICBzdHlsZSAtLT4gc3R5bGUgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgICAgIGlmIChWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IG51bGwgJiYgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cyAhPSB1bmRlZmluZWQgJiYgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmRleE9mKG5vZGVOYW1lKSA+IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBpcyB2aXNpYmxlLCB3ZSBjaGVjayBjb3VwbGUgb2YgQ1NTIHByb3BlcnRpZXMgYW5kIGhpZGRlbiBhdHRyaWJ1dGUuXG4gICAgICAgIC8vIGFyZWEsIHBhcmFtIGFuZCBhdWRpbyBlbGVtZW50cyB3ZSBkbyBub3QgY2hlY2sgaWYgdGhleSBhcmUgaGlkZGVuIGFzIGl0IGRvZXMgbm90IGFwcGx5IHRvIHRoZW0uXG4gICAgICAgIC8vIENoZWNrIHRoZSB1bmhpZGVhYmxlRWxlbWVudHMgYXJyYXkgd2hpY2ggaXMgcGFydCBvZiB0aGUgcnVsZXMsIHRvIGNoZWNrIGlmIHRoaXMgZWxlbWVudCBpcyBhbGxvd2VkIHRvIGJlIGhpZGRlbiBvciBub3RcbiAgICAgICAgLy8gaW4gdGhlIGNhc2UgdGhhdCB0aGUgZWxlbWVudCBpcyBwYXJ0IG9mIHRoZSB1bmhpZGVhYmxlRWxlbWVudHMgYXJyYXkgdGhlbiB3ZSBkbyBub3QgcnVuIHRoZSBoaWRkZW4gY2hlY2sgb24gdGhpcyBlbGVtZW50LFxuICAgICAgICAvLyBhbmQgZ28gc3RyaWdodCB0byB0aGUgcGFyZW50IG5vZGUuXG4gICAgICAgIC8vIEFycmF5IGNoZWNrIGVsZW1lbnRzIGxpa2U6XG4gICAgICAgIC8vICBhcmVhIC0tPiBhcmVhIGVsZW1lbnQgaXMgcGFydCBvZiBhIG1hcCBlbGVtZW50IGFuZCBpdCBjYW4gbm90IGJlIGhpZGRlbiBiZWNhdXNlIGl0IGlzIHVzZWQgdG9cbiAgICAgICAgLy8gICAgICAgICAgIG1ha2UgYW4gY2VydGlhbiBwYXJ0cyBvZiBhbiBtYXAgaW50ZXJhY3RpdmUuXG4gICAgICAgIC8vICBwYXJhbSAtLT4gZWxlbWVudCBjYW4gb25seSBiZSBwYXJ0IG9mIG9iamVjdCBlbG1lbnQgYW5kIGl0IGNhbm5vdCBiZSBoaWRkZW4gZGlyZWN0bHksIGl0XG4gICAgICAgIC8vICAgICAgICAgICAgY2FuIG9ubHkgYmUgaGlkZGVuIGlmIHRoZSBwYXJlbnQgaXMgaGlkZGVuLlxuICAgICAgICAvLyAgYXVkaW8gLS0+IElmIHRoaXMgZWxlbWVudCBpcyBoaWRkZW4gaXQgd2lsbCBzdGlsbCBwbGF5IHRoZSBtdXNpYywgc28gd2Ugc2hvdWxkIHN0aWxsIHRyaWdnZXJcbiAgICAgICAgLy8gICAgICAgICAgICB2aW9sYXRpb25zIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdW5oaWRlYWJsZUVsZW1lbnRzIGFycmF5IGlzIG5vdCBkZWZpbmVkIHRoZW4gd2UganVzdCBzY2FuIGFsbCBlbGVtZW50cyBhbmQgZG8gbm8gZmlsdGVyaW5nIGF0IGFsbC5cbiAgICAgICAgaWYgKFZpc1V0aWwudW5oaWRlYWJsZUVsZW1lbnRzID09PSBudWxsIHx8IFZpc1V0aWwudW5oaWRlYWJsZUVsZW1lbnRzID09PSB1bmRlZmluZWQgfHwgVmlzVXRpbC51bmhpZGVhYmxlRWxlbWVudHMuaW5kZXhPZihub2RlTmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBkZWZhdWx0VmlldyBleGlzdHMgZm9yIHRoaXMgbm9kZSwgaWYgaXQgZG9lcyB0aGVuIHVzZSB0aGlzIHRvIHJ1biB0aGUgZ2V0Q29tcHV0ZWRTdHlsZVxuICAgICAgICAgICAgLy8gZnVuY3Rpb24gdG8gZ2V0IHRoZSBDU1Mgc3R5bGUgZm9yIHRoZSBub2RlLlxuICAgICAgICAgICAgaWYgKG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldykge1xuICAgICAgICAgICAgICAgIC8vIFJ1biB0aGUgZ2V0Q29tcHV0ZWRTdHlsZSBvbiB0aGlzIG5vZGUgdG8gZmV0Y2ggdGhlIENTUyBjb21wdWF0aW9uIG9mIHRoZSBub2RlXG4gICAgICAgICAgICAgICAgY29tcFN0eWxlID0gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGRlZmF1bHRWaWV3IGRvZXMgbm90IGV4aXN0cyByZXR1cm4gdHJ1ZSB0byBpZGVudGlmeSB0aGF0IHRoaXNcbiAgICAgICAgICAgIC8vIG5vZGUgaXMgdmlzaWJsZSwgYmVjYXVzZSB3ZXJlIG5vdCBhYmxlIHRvIGRldGVjdCBpZiBpdCB3YXMgbm90LlxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgaGlkZGVuIGVsZW1lbnQgcHJvcGVydHkgYW5kIGhpZGRlbiBhdHRyaWJ1dGVcbiAgICAgICAgICAgIGxldCBoaWRkZW5BdHRyaWJ1dGUgPSBub2RlLmdldEF0dHJpYnV0ZShcImhpZGRlblwiKTtcbiAgICAgICAgICAgIGxldCBoaWRkZW5Qcm9wZXJ0eUN1c3RvbSA9IGdldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIC8vIFRvIGdldCB0aGUgaGlkZGVuIHByb3BlcnR5IHdlIG5lZWQgdG8gcGVyZm9ybSBhIHNwZWNpYWwgY2hlY2sgYXMgaW4gc29tZSBjYXNlcyB0aGUgaGlkZGVuIHByb3BlcnR5IHdpbGwgbm90IGJlXG4gICAgICAgICAgICAvLyBhIGJvb2xlYW4sIGZvciB0aGVzZXMgY2FzZXMgd2Ugc2V0IGl0IHRvIGZhbHNlIGFzIHdlIGFyZSBub3QgYWJsZSB0byBkZXRlcm1pbmUgdGhlIHRydWUgaGlkZGVuIGNvbmRpdGlvbi5cbiAgICAgICAgICAgIC8vIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgYmVjYXVzZSBmb3JtIGVsZW1lbnRzIGFyZSBhYmxlIHRvIHBlcmZvcm0gYW4gb3ZlcnJpZGUsIHNvIHdoZW4gd2UgaGF2ZSBpZD1cImhpZGRlblwiIGZvciBhbiBlbGVtZW50XG4gICAgICAgICAgICAvLyB3aGljaCBpcyB1bmRlciB0aGUgZm9ybSBlbGVtZW50IHRoZW4sIG5vZGUuaGlkZGVuIGdpdmVzIHRoZSBlbGVtZW50L2xpc3Qgb2YgZWxlbWVudHMgd2hpY2ggaGF2ZSBpZD1cImhpZGRlblwiLiBSZWZlciB0b1xuICAgICAgICAgICAgLy8gbW96aWxsYSBidWc6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEyNjczNTZcbiAgICAgICAgICAgIGxldCBoaWRkZW5Qcm9wZXJ0eSA9IHR5cGVvZiAobm9kZSBhcyBhbnkpLmhpZGRlbiA9PT0gXCJib29sZWFuXCIgPyAobm9kZSBhcyBhbnkpLmhpZGRlbiA6IGZhbHNlO1xuICAgICAgICAgICAgLy8gSWYgY29tcFN0eWxlIG9iamVjdCBpcyBlbXB0eSwgbm9kZSBkb2VzJ3QgaGF2ZSBoaWRkZW4gcHJvcGVydHksIG5vZGUgZG9lcyd0IGhhdmUgaGlkZGVuIGF0dHJpYnV0ZSBhbmQgZG9lcyd0IGhhdmUgY3VzdG9tIFBUXG4gICAgICAgICAgICAvLyBoaWRkZW4gcHJvcGVydHkgdGhlbiB3ZSBjYW4ganVzdCByZXR1cm4gdHJ1ZSAobm9kZSB2aXNpYmxlKSBhdCB0aGlzIHBvaW50LlxuICAgICAgICAgICAgaWYgKCFjb21wU3R5bGUgJiZcbiAgICAgICAgICAgICAgICAhaGlkZGVuUHJvcGVydHkgJiYgLy8gdGhpcyBjb3ZlcnMgZmFsc2UsIG51bGwsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIChoaWRkZW5BdHRyaWJ1dGUgPT09IG51bGwgfHwgaGlkZGVuQXR0cmlidXRlID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAgICAgIWhpZGRlblByb3BlcnR5Q3VzdG9tIC8vIFRoaXMgY292ZXJzIGZhbHNlLCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlIGNvbXBTdHlsZSBpcyBkZWZpbmVkIHdlIGNoZWNrIHRoZSBmb2xsb3dpbmc6XG4gICAgICAgICAgICAvLyAgQ1NTIHN0eWxlIGRpc3BsYXkgc2V0IHRvIG5vbmVcbiAgICAgICAgICAgIC8vICBDU1Mgc3R5bGUgdmlzaWJpbGl0eSBzZXQgdG8gaGlkZGVuXG4gICAgICAgICAgICAvLyAgICBOb3RlOiBGb3IgdGhpcyBwcm9wZXJ0eSBzaW5jZSBpdCBpcyBpbmhlcml0ZWQsIG5lZWQgdG8gc2tpcCB0aGUgY2hlY2sgb24gcGFyZW50cyBhc1xuICAgICAgICAgICAgLy8gICAgICAgICAgdGhlIHBhcmVudCBjYW4gaGF2ZSBoaWRkZW4gYnV0IHRoZSBjaGlsZCBjYW4gYmUgdmlzaWJsZS4gU28gd2Ugb25seSBjaGVjayB0aGlzIHByb3BlcnR5XG4gICAgICAgICAgICAvLyAgICAgICAgICBvbiBjaGlsZCBlbGVtZW50cy9lbGVtZW50cyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiB0aGUgZmlyc3QgdGltZS5cbiAgICAgICAgICAgIC8vICBub2RlIGhpZGRlbiBwcm9wZXJ0eSBzZXQgKG5vZGUuaGlkZGVuKVxuICAgICAgICAgICAgLy8gIG5vZGUgYXR0cmlidXRlIGhpZGRlbiBzZXQgKHRvIGFueSB2YWx1ZSlcbiAgICAgICAgICAgIC8vICBub2RlIGN1c3RvbSBoaWRkZW4gcHJvcGVydHkgc2VyIChub2RlLlBUX05PREVfSElEREVOKVxuICAgICAgICAgICAgLy8gSWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSB0cnVlIHRoZW4gd2UgcmV0dXJuIGZhbHNlIGFzIHRoaXMgZWxlbWVudCBpcyBub3QgdmlzaWJsZVxuICAgICAgICAgICAgaWYgKChjb21wU3R5bGUgIT09IG51bGwgJiYgKChjb21wU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnZGlzcGxheScpID09PSAnbm9uZScgfHxcbiAgICAgICAgICAgICAgICAoIWdldENhY2hlKG5vZGUsIFwiVmlzaWJpbGl0eV9DaGVja19QYXJlbnRcIiwgbnVsbCkgJiYgY29tcFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3Zpc2liaWxpdHknKSA9PT0gJ2hpZGRlbicpKSkgfHxcbiAgICAgICAgICAgICAgICAoY29tcFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2Rpc3BsYXknKSAhPT0gJ2Jsb2NrJyAgJiYgKGhpZGRlblByb3BlcnR5IHx8IGhpZGRlbkF0dHJpYnV0ZSAhPSBudWxsIHx8IGhpZGRlblByb3BlcnR5Q3VzdG9tKSkpKSB7XG4gICAgICAgICAgICAgICAgLy8gU2V0IGEgY3VzdG9tIGV4cGFuZG9zIHByb3BlcnR5IG9uIHRoZSB0aGUgbm9kZSB0byBpZGVudGlmeSB0aGF0IGl0IGlzIGhpZGRlbiwgc28gdGhhdCB3ZSBjYW4gdXNlc1xuICAgICAgICAgICAgICAgIC8vIHVzZSB0aGlzIGluIHRoZSBydWxlcyB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgaXMgaGlkZGVuIG9yIG5vdCwgaWYgd2UgbmVlZCB0by5cbiAgICAgICAgICAgICAgICAvLyBVc2UgZXhwYW5kb3MgcHJvcGVydHkgaW5zdGVhZCBvZiBhIGhhc2ggbWFwIHdoaWNoIHN0b3JlcyB0aGUgZWxlbWVudHMsIGFkZGluZy9jaGVja2luZyBleHBhbmRvc1xuICAgICAgICAgICAgICAgIC8vIHByb3BlcnRpZXMgaXMgYSBsb3QgZmFzdGVyIHBlcmZvcm1hbmNlIHdoaXNlLiBGb3IgSGFzaCBtYXAgd2UgbmVlZCB0byBzdG9yZSBiYXNlZCBvbiB4cGF0aCwgYW5kIHRvIGNhbGN1bGF0ZVxuICAgICAgICAgICAgICAgIC8vIHhwYXRoIGl0IGlzIG1vcmUgcGVyZm9ybWFuY2UgaW1wYWN0LlxuICAgICAgICAgICAgICAgIHNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHRoZSBwYXJlbnROb2RlIGZvciB0aGlzIG5vZGUsIGJlY3Vhc2Ugd2UgaGF2ZSB0byBjaGVjayBhbGwgcGFyZW50cyB0byBtYWtlIHN1cmUgdGhleSBkbyBub3QgaGF2ZVxuICAgICAgICAvLyB0aGUgaGlkZGVuIENTUywgcHJvcGVydHkgb3IgYXR0cmlidXRlLiBPbmx5IGtlZXAgY2hlY2tpbmcgdW50aWwgd2UgYXJlIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIHBhcmVudE5vZGVcbiAgICAgICAgLy8gZWxlbWVudC5cbiAgICAgICAgbGV0IHBhcmVudEVsZW1lbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcblxuICAgICAgICAvLyBJZiB0aGUgcGFyZW50IG5vZGUgZXhpc3RzIGFuZCB0aGUgbm9kZXR5cGUgaXMgZWxlbWVudCAoMSksIHRoZW4gcnVuIHJlY3Vyc2l2ZSBjYWxsIHRvIHBlcmZvcm0gdGhlIGNoZWNrXG4gICAgICAgIC8vIGFsbCB0aGUgd2F5IHVwIHRvIHRoZSB2ZXJ5IHBhcmVudCBub2RlLiBVc2UgcmVjdXJzaXZlIGNhbGwgaGVyZSBpbnN0ZWFkIG9mIGEgd2hpbGUgbG9vcCBzbyB0aGF0IHdlIGRvIG5vdFxuICAgICAgICAvLyBoYXZlIHRvIGR1cGxpY2F0ZSB0aGUgbG9naWMgZm9yIGNoZWNraW5nIGlmIHRoZSBub2RlIGlzIHZpc2libGUgb3Igbm90IGZvciBhbGwgdGhlIHBhcmVudHMgc3RhcnRpbmcgd2l0aFxuICAgICAgICAvLyBjaGlsZCBub2RlLlxuICAgICAgICBpZiAocGFyZW50RWxlbWVudCAhPSBudWxsICYmIHBhcmVudEVsZW1lbnQubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgaGF2ZSBhIHBhcmVudCBlbGVtZW50IGdvaW5nIHRocm91Z2ggdGhlIGlzTm9kZVZpc2libGUgZnVuY3Rpb24gd2UgaGF2ZSB0byBtYXJrIGl0IGFzIHN1Y2hcbiAgICAgICAgICAgIC8vIHNvIHRoYXQgaW4gdGhlIGZ1bmN0aW9uIHdlIGNhbiBza2lwIGNoZWNraW5nIHZpc2liaWxpdHk6IGhpZGRlbiBmb3IgcGFyZW50IGVsZW1lbnRzIHNpbmNlIHZpc2liaWxpdHk6IGhpZGRlblxuICAgICAgICAgICAgLy8gaXMgaW5oZXJpdGVkLCB3aGljaCBhbGxvd3MgYSBjaGlsZCB0byBoYXZlIGEgZGlmZmVyZW50IHNldHRpbmcgdGhlbiB0aGUgY2hpbGQuIFRoaXMgcHJvcGVydHkgb25seSBuZWVkcyB0byBiZSBjaGVja2VkXG4gICAgICAgICAgICAvLyBvbmNlIGZvciB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIHBhc3NlZCBkb3duIGFuZCB0aGF0IGlzIGFsbC4gSWdub3JlIGl0IGZvciBhbGwgdGhlIHBhcmVudHMgdGhhdCB3ZSBpdGVyYXRlIG92ZXIuXG4gICAgICAgICAgICBzZXRDYWNoZShwYXJlbnRFbGVtZW50IGFzIEVsZW1lbnQsIFwiVmlzaWJpbGl0eV9DaGVja19QYXJlbnRcIiwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIHVwd2FyZHMgcmVjdXJzaXZlbHksIGFuZCBzYXZlIHRoZSByZXN1bHRzIGluIGFuIHZhcmlhYmxlXG4gICAgICAgICAgICBsZXQgbm9kZVZpc2libGUgPSBWaXNVdGlsLmlzTm9kZVZpc2libGUocGFyZW50RWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIGlzIGZvdW5kIHRvIG5vdCBiZSB2aXNpYmxlIHRoZW4gYWRkIHRoZSBjdXN0b20gUFRfTk9ERV9ISURERU4gdG8gdHJ1ZS5cbiAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGlzIGluIHRoZSBydWxlcy5cbiAgICAgICAgICAgIGlmICghbm9kZVZpc2libGUpIHtcbiAgICAgICAgICAgICAgICBzZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayB1cHdhcmRzIHJlY3Vyc2l2ZWx5XG4gICAgICAgICAgICByZXR1cm4gbm9kZVZpc2libGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gdHJ1ZSAobm9kZSBpcyB2aXNpYmxlKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBvciBpdHMgYW5jZXN0b3IgaXMgbmF0aXZlbHkgaGlkZGVuIG9yIGFyaWEtaGlkZGVuID0gJ3RydWUnXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzTm9kZUhpZGRlbkZyb21BVChub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShub2RlKSB8fCBub2RlLmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpID09PSAndHJ1ZScpIHJldHVybiB0cnVlO1xuICAgICAgICBsZXQgYW5jZXN0b3IgPSBET01VdGlsLmdldEFuY2VzdG9yV2l0aEF0dHJpYnV0ZShub2RlLCBcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKTtcbiAgICAgICAgaWYgKGFuY2VzdG9yKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vbk1hcHBlciB9IGZyb20gXCIuLi9jb21tb24vQ29tbW9uTWFwcGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBTdHlsZU1hcHBlciBleHRlbmRzIENvbW1vbk1hcHBlciB7XG4gICAgZ2V0Um9sZShub2RlOiBOb2RlKSA6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcImNvbXB1dGVkXCI7XG4gICAgfVxuICAgIGdldE5hbWVzcGFjZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJjc3NcIlxuICAgIH1cbiAgICBnZXRBdHRyaWJ1dGVzKG5vZGU6IE5vZGUpIDogeyBba2V5OnN0cmluZ106IHN0cmluZyB9IHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHt9O1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PHN0eWxlLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gc3R5bGVbaWR4XS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHJldFZhbFtuYW1lXSA9IHN0eWxlW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBJTWFwUmVzdWx0IH0gZnJvbSBcIi4vSU1hcHBlclwiO1xuXG5leHBvcnQgZW51bSBlUnVsZUNvbmZpZGVuY2Uge1xuICAgIFBBU1MgPSBcIlBBU1NcIixcbiAgICBGQUlMID0gXCJGQUlMXCIsXG4gICAgUE9URU5USUFMID0gXCJQT1RFTlRJQUxcIixcbiAgICBNQU5VQUwgPSBcIk1BTlVBTFwiXG59XG5cbmV4cG9ydCBlbnVtIGVSdWxlUG9saWN5IHtcbiAgICBWSU9MQVRJT04gPSBcIlZJT0xBVElPTlwiLFxuICAgIFJFQ09NTUVOREFUSU9OID0gXCJSRUNPTU1FTkRBVElPTlwiLFxuICAgIElORk9STUFUSU9OID0gXCJJTkZPUk1BVElPTlwiXG59XG5cbmV4cG9ydCBlbnVtIGVUb29sa2l0TGV2ZWwge1xuICAgIExFVkVMX09ORSA9IFwiMVwiLFxuICAgIExFVkVMX1RXTyA9IFwiMlwiLFxuICAgIExFVkVMX1RIUkVFID0gXCIzXCIsXG4gICAgTEVWRUxfRk9VUiA9IFwiNFwiXG59XG5cbmV4cG9ydCBlbnVtIGVSdWxlQ2F0ZWdvcnkge1xuICAgIEFDQ0VTU0lCSUxJVFkgPSBcIkFjY2Vzc2liaWxpdHlcIixcbiAgICBERVNJR04gPSBcIkRlc2lnblwiLFxuICAgIE9USEVSID0gXCJPdGhlclwiXG59XG5cbmV4cG9ydCBlbnVtIGVSdWxlc2V0VHlwZSB7XG4gICAgREVGQVVMVCA9IFwiZGVmYXVsdFwiLFxuICAgIEVYVEVOU0lPTiA9IFwiZXh0ZW5zaW9uXCJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVQYXNzKHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIG1lc3NhZ2VBcmdzPyA6IHN0cmluZ1tdLCBhcGlBcmdzPyA6IGFueVtdKSA6IFJ1bGVSZXN1bHQge1xuICAgIGlmICh0eXBlb2YgcmVhc29uSWQgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVhc29uSWQgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIlJlYXNvbiBJRCBtdXN0IGJlIGRlZmluZWRcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IFtlUnVsZVBvbGljeS5JTkZPUk1BVElPTiwgZVJ1bGVDb25maWRlbmNlLlBBU1NdLFxuICAgICAgICByZWFzb25JZDogcmVhc29uSWQsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVSZW5kZXIocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuUEFTU10sXG4gICAgICAgIHJlYXNvbklkOiAwLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gUnVsZUZhaWwocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuRkFJTF0sXG4gICAgICAgIHJlYXNvbklkOiByZWFzb25JZCxcbiAgICAgICAgbWVzc2FnZUFyZ3M6IG1lc3NhZ2VBcmdzIHx8IFtdLFxuICAgICAgICBhcGlBcmdzOiBhcGlBcmdzIHx8IFtdXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gUnVsZVBvdGVudGlhbChyZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBtZXNzYWdlQXJncz8gOiBzdHJpbmdbXSwgYXBpQXJncz8gOiBhbnlbXSkgOiBSdWxlUmVzdWx0IHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbklkID09PSBcInVuZGVmaW5lZFwiIHx8IHJlYXNvbklkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWFzb24gSUQgbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sIGVSdWxlQ29uZmlkZW5jZS5QT1RFTlRJQUxdLFxuICAgICAgICByZWFzb25JZDogcmVhc29uSWQsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJ1bGVNYW51YWwocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuTUFOVUFMXSxcbiAgICAgICAgcmVhc29uSWQ6IHJlYXNvbklkLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIFJ1bGVSZXN1bHQgPSB7XG4gICAgdmFsdWU6IFtlUnVsZVBvbGljeSwgZVJ1bGVDb25maWRlbmNlXSxcbiAgICByZWFzb25JZD86IG51bWJlciB8IHN0cmluZyxcbiAgICBtZXNzYWdlQXJncz86IHN0cmluZ1tdLFxuICAgIGFwaUFyZ3M/OiBhbnlbXVxufVxuXG5leHBvcnQgdHlwZSBSdWxlRGV0YWlscyA9IFJ1bGVSZXN1bHQgJiB7XG4gICAgcnVsZUlkOiBzdHJpbmcsXG5cbiAgICBub2RlOiBOb2RlLFxuICAgIC8vIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgIGNhdGVnb3J5PzogZVJ1bGVDYXRlZ29yeSxcbiAgICBwYXRoOiB7IFtuczogc3RyaW5nXSA6IHN0cmluZyB9LFxuXG4gICAgcnVsZVRpbWU6IG51bWJlcixcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgYm91bmRzPzoge1xuICAgICAgICB0b3A6IG51bWJlcixcbiAgICAgICAgbGVmdDogbnVtYmVyLFxuICAgICAgICB3aWR0aDogbnVtYmVyLFxuICAgICAgICBoZWlnaHQ6IG51bWJlclxuICAgIH0sXG4gICAgc25pcHBldDogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIFJ1bGVDb250ZXh0SGllcmFyY2h5ID0geyBbbmFtZXNwYWNlOiBzdHJpbmddIDogSU1hcFJlc3VsdFtdIH07XG5cbmV4cG9ydCB0eXBlIFJ1bGVDb250ZXh0ID0ge1xuICAgIFtuYW1lc3BhY2U6IHN0cmluZ10gOiBJTWFwUmVzdWx0XG59XG5cbmV4cG9ydCB0eXBlIFJ1bGUgPSB7XG4gICAgLy8gVW5pcXVlIHN0cmluZyBpZGVudGlmaWVyIGZvciB0aGlzIHJ1bGUgKHNob3VsZCBiZSBodW1hbiB1bmRlcnN0YW5kYWJsZSlcbiAgICAvLyBOTFMgY29kZXMgYW5kIGhlbHAgc291cmNlcyB3aWxsIGJlIGJhc2VkIG9mZiBvZiB0aGlzIGlkXG4gICAgaWQ6IHN0cmluZztcblxuICAgIHJ1bGVzZXRzOiBBcnJheTx7XG4gICAgICAgIGlkOiBzdHJpbmcgfCBzdHJpbmdbXVxuICAgICAgICBudW06IHN0cmluZyB8IHN0cmluZ1tdXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeSxcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsXG4gICAgfT5cblxuICAgIHJlZmFjdG9yPzoge1xuICAgICAgICBbb2xkUnVsZUlkOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBbb2xkUmVhc29uQ29kZTogc3RyaW5nXTogc3RyaW5nXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgW2xvY2FsZTogc3RyaW5nXToge1xuICAgICAgICAgICAgW3JlYXNvbklkOiBzdHJpbmddOiBzdHJpbmdcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBoZWxwOiB7XG4gICAgICAgIFtsb2NhbGU6IHN0cmluZ106IHtcbiAgICAgICAgICAgIFtyZWFzb25JZDogc3RyaW5nXTogc3RyaW5nXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIFxuICAgICAqIEhvdyB0aGlzIHJ1bGUgbWFwcyB0byBBQ1QgcnVsZXMsIGlmIGFueSAoaHR0cHM6Ly9hY3QtcnVsZXMuZ2l0aHViLmlvL3J1bGVzLylcbiAgICAgKiBcbiAgICAgKiBzdHJpbmc6IEZvciBhIHNpbmdsZSBydWxlIG1hcHBpbmcgdGhhdCBtYXRjaGVzIGV4YWN0bHkgdG8gdGhlIHJ1bGUgKFBhc3MgLT4gcGFzcywgUG90ZW50aWFsIC0+IGNhbnRUZWxsLCBGYWlsIC0+IGZhaWwsIHVubGlzdGVkID0+IGluYXBwbGljYWJsZSlcbiAgICAgKiBBcnJheTw+OiBDdXN0b20gbWFwcGluZyBvZiBydWxlIHRvIEFDVCByZXN1bHRzXG4gICAgICovXG4gICAgYWN0Pzogc3RyaW5nIHwgc3RyaW5nW10gfCBBcnJheTxzdHJpbmcgfCB7XG4gICAgICAgIFthY3RSdWxlSWQ6IHN0cmluZ106IHtcbiAgICAgICAgICAgIFtyZWFzb25JZDogc3RyaW5nXTogXCJwYXNzXCIgfCBcImZhaWxcIiB8IFwiY2FudFRlbGxcIiB8IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH0+XG5cbiAgICAvLyBTZWUgc3JjL3YyL2NvbW1vbi9Db250ZXh0LnRzIGZvciB2YWxpZCBjb250ZXh0c1xuICAgIGNvbnRleHQ6IHN0cmluZztcblxuICAgIC8vIEFycmF5IG9mIHJ1bGVzIHRoYXQgbXVzdCBwYXNzIHRvIGFsbG93IHRoaXMgdmFsaWRhdGUgdG8gcnVuIC0gdGhleSBtdXN0IGhhdmUgdGhlIHNhbWUgY29udGV4dCBwcm9wZXJ0eVxuICAgIGRlcGVuZGVuY2llcz86IHN0cmluZ1tdXG5cbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgPT4gUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSB8IG51bGxcblxuICAgIGVuYWJsZWQ/OiBib29sZWFuXG59XG5cblxuZXhwb3J0IHR5cGUgUmVwb3J0ID0ge1xuICAgIHJlc3VsdHM6IFJ1bGVEZXRhaWxzW10sXG4gICAgbnVtRXhlY3V0ZWQ6IG51bWJlcixcbiAgICBydWxlVGltZTogbnVtYmVyLFxuICAgIC8vIFRoaXMgbWF5IGJlIHVuZGVmaW5lZCBmb3IgYSBmaWx0ZXJlZCByZXBvcnRcbiAgICB0b3RhbFRpbWU/OiBudW1iZXIsXG4gICAgbmxzPzoge1xuICAgICAgICBbcnVsZUlkOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBbcmVhc29uSWQ6IHN0cmluZ106IHN0cmluZ1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBObHNNYXAgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nW11cbn1cblxuZXhwb3J0IHR5cGUgSGVscE1hcCA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFbmdpbmUge1xuICAgIC8qKlxuICAgICAqIFBlcmZvcm0gYSBzY2FuIG9uIGEgZG9jdW1lbnQgb3Igc3VidHJlZVxuICAgICAqIEBwYXJhbSBydWxlc2V0SWRzIEFycmF5IG9mIHJ1bGVzZXQgaWRzIG9mIHJ1bGVzZXRzIHRvIHVzZSBmb3IgdGhpcyBzY2FuXG4gICAgICogQHBhcmFtIHJvb3QgRG9jdW1lbnQgb3Igc3VidHJlZSB0byBzY2FuXG4gICAgICovXG4gICAgcnVuKHJvb3Q6IERvY3VtZW50IHwgTm9kZSwgb3B0aW9ucz86IHt9KSA6IFByb21pc2U8UmVwb3J0PjtcblxuICAgIGVuYWJsZVJ1bGVzKHJ1bGVJZHM6IHN0cmluZ1tdKTtcblxuICAgIGdldFJ1bGUocnVsZUlkOiBzdHJpbmcpOiBSdWxlO1xuXG4gICAgZ2V0UnVsZXNJZHMoKSA6IHN0cmluZ1tdO1xuXG4gICAgZ2V0TWVzc2FnZShydWxlSWQ6IHN0cmluZywgcnVsZUlkeDogbnVtYmVyIHwgc3RyaW5nLCBtc2dBcmdzPzogc3RyaW5nW10pOiBzdHJpbmc7XG5cbiAgICBnZXRIZWxwKHJ1bGVJZDogc3RyaW5nLCBydWxlSWR4OiBudW1iZXIgfCBzdHJpbmcpOiBzdHJpbmc7XG5cbiAgICBhZGRSdWxlcyhydWxlOiBSdWxlW10pO1xuXG4gICAgYWRkUnVsZShydWxlOiBSdWxlKTtcblxuICAgIGFkZE5sc01hcChtYXA6IE5sc01hcCk7XG5cbiAgICBhZGRIZWxwTWFwKG1hcDogTmxzTWFwKTtcbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IElFbmdpbmUsIGVSdWxlUG9saWN5LCBSZXBvcnQsIGVSdWxlQ2F0ZWdvcnksIGVUb29sa2l0TGV2ZWwsIGVSdWxlc2V0VHlwZSwgUnVsZSBhcyBSdWxlVjIgfSBmcm9tIFwiLi4vLi4vdjIvYXBpL0lFbmdpbmVcIjtcbmltcG9ydCB7IFJ1bGUgYXMgUnVsZVY0IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRW5naW5lIH0gZnJvbSBcIi4uLy4uL3YyL2NvbW1vbi9FbmdpbmVcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBTdHlsZU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9zdHlsZS9TdHlsZU1hcHBlclwiO1xuaW1wb3J0IHsgYTExeVJ1bGVzZXRzIH0gZnJvbSBcIi4uL3J1bGVzZXRzXCI7XG5pbXBvcnQgKiBhcyBjaGVja1J1bGVzVjQgZnJvbSBcIi4uL3J1bGVzXCI7XG5cbmxldCBjaGVja1J1bGVzID0gW107XG5sZXQgY2hlY2tObHMgPSB7fTtcbmxldCBjaGVja0hlbHAgPSB7fTtcblxuZnVuY3Rpb24gX2luaXRpYWxpemUoKSB7XG4gICAgY29uc3QgbGFuZ3MgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEVuZ2luZS5nZXRMYW5ndWFnZXMoKSkpO1xuICAgIC8vIERlZmF1bHQgbGFuZyB0byBlbi1VUyBpZiBub3RoaW5nIGVsc2Ugc3BlY2lmaWVkIGlzIGZvdW5kXG4gICAgbGFuZ3MucHVzaChcImVuLVVTXCIpO1xuICAgIC8vIFByb2Nlc3MgVjQgcnVsZXMgaW50byB0aGUgVjIgZm9ybWF0XG4gICAgZm9yIChsZXQgcnVsZW5hbWUgaW4gY2hlY2tSdWxlc1Y0KSB7XG4gICAgICAgIC8vIENvbnZlcnQgcnVsZVxuICAgICAgICBsZXQgdjRSdWxlOiBSdWxlVjQgPSBjaGVja1J1bGVzVjRbcnVsZW5hbWVdO1xuICAgICAgICBjaGVja1J1bGVzLnB1c2godjRSdWxlKTtcbiAgICAgICAgLy8gR28gYmFja3dhcmRzIGJlY2F1c2UgdGhlIGZpcnN0IGxhbmcgaXMgdGhlIHByZWZlcnJlZCwgc29cbiAgICAgICAgLy8gZWFybGllciBsYW5ndWFnZXMgd2lsbCBvdmVycmlkZSBsYXRlciBsYW5ndWFnZXNcbiAgICAgICAgZm9yIChsZXQgaWR4PWxhbmdzLmxlbmd0aC0xOyBpZHggPj0wOyAtLWlkeCkge1xuICAgICAgICAgICAgY29uc3QgbGFuZ0lkID0gbGFuZ3NbaWR4XTtcbiAgICAgICAgICAgIGlmIChsYW5nSWQgaW4gdjRSdWxlLm1lc3NhZ2VzKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tObHNbdjRSdWxlLmlkXSA9IHY0UnVsZS5tZXNzYWdlc1tsYW5nSWRdO1xuICAgICAgICAgICAgICAgIGNoZWNrTmxzW3Y0UnVsZS5pZF1bMF0gPSBjaGVja05sc1t2NFJ1bGUuaWRdLmdyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxhbmdJZCBpbiB2NFJ1bGUuaGVscCkge1xuICAgICAgICAgICAgICAgIGNoZWNrSGVscFt2NFJ1bGUuaWRdID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCByZWFzb25JZCBpbiB2NFJ1bGUuaGVscFtsYW5nSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrSGVscFt2NFJ1bGUuaWRdW3JlYXNvbklkXSA9IGAvJHtsYW5nSWR9LyR7djRSdWxlLmhlbHBbbGFuZ0lkXVtyZWFzb25JZF19YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hlY2tObHNbdjRSdWxlLmlkXVswXSA9IGNoZWNrTmxzW3Y0UnVsZS5pZF0uZ3JvdXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29udmVydCBSU1xuICAgICAgICBmb3IgKGNvbnN0IHJzU2VjdGlvbiBvZiB2NFJ1bGUucnVsZXNldHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcnMgb2YgYTExeVJ1bGVzZXRzIGFzIFJ1bGVzZXRbXSkge1xuICAgICAgICAgICAgICAgIGxldCBjaGVja1JzSWRzIDogc3RyaW5nW10gPSB0eXBlb2YgcnNTZWN0aW9uLmlkID09PSBcInN0cmluZ1wiID8gW3JzU2VjdGlvbi5pZF0gOiByc1NlY3Rpb24uaWQ7XG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrUnNJZHMuaW5jbHVkZXMocnMuaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY3Agb2YgcnMuY2hlY2twb2ludHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGVja0NQSWRzIDogc3RyaW5nW10gPSB0eXBlb2YgcnNTZWN0aW9uLm51bSA9PT0gXCJzdHJpbmdcIiA/IFtyc1NlY3Rpb24ubnVtXSA6IHJzU2VjdGlvbi5udW07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tDUElkcy5pbmNsdWRlcyhjcC5udW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AucnVsZXMgPSBjcC5ydWxlcyB8fCBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLnJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdjRSdWxlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogcnNTZWN0aW9uLmxldmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sa2l0TGV2ZWw6IHJzU2VjdGlvbi50b29sa2l0TGV2ZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuX2luaXRpYWxpemUoKTtcblxuZXhwb3J0IHR5cGUgUnVsZXNldCA9IHtcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjYXRlZ29yeTogZVJ1bGVDYXRlZ29yeSxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIHR5cGU/OiBlUnVsZXNldFR5cGUsXG4gICAgY2hlY2twb2ludHM6IEFycmF5PHtcbiAgICAgICAgbnVtOiBzdHJpbmcsXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYWN0LXJ1bGVzL2FjdC10b29scy9ibG9iL21haW4vc3JjL2RhdGEvc2MtdXJscy5qc29uXG4gICAgICAgIHNjSWQ/OiBzdHJpbmcsXG4gICAgICAgIC8vIEpDSDogYWRkIG5hbWUgb2YgY2hlY2twb2ludCBhbmQgc3VtbWFyeSBkZXNjcmlwdGlvblxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHdjYWdMZXZlbDogc3RyaW5nLFxuICAgICAgICBzdW1tYXJ5OiBzdHJpbmcsXG4gICAgICAgIHJ1bGVzPzogQXJyYXk8eyBpZDogc3RyaW5nLCBsZXZlbDogZVJ1bGVQb2xpY3ksIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbCB9PlxuICAgIH0+XG59XG5cbmV4cG9ydCBjbGFzcyBDaGVja2VyIHtcbiAgICBlbmdpbmU6IElFbmdpbmU7XG4gICAgcnVsZXNldHM6IFJ1bGVzZXRbXSA9IFtdO1xuICAgIHJ1bGVzZXRJZHM6IHN0cmluZ1tdID0gW107XG4gICAgcnVsZXNldFJ1bGVzOiB7IFtyc0lkOiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG4gICAgcnVsZUxldmVscyA6IHsgW3J1bGVJZDogc3RyaW5nXTogeyBbcnNJZDogc3RyaW5nXSA6IGVSdWxlUG9saWN5IH19ID0ge307XG4gICAgcnVsZUNhdGVnb3J5IDogeyBbcnVsZUlkOiBzdHJpbmddOiB7IFtyc0lkOiBzdHJpbmddIDogZVJ1bGVDYXRlZ29yeSB9fSA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGxldCBlbmdpbmUgPSB0aGlzLmVuZ2luZSA9IG5ldyBFbmdpbmUoKTtcblxuICAgICAgICBlbmdpbmUuYWRkTWFwcGVyKG5ldyBBUklBTWFwcGVyKCkpO1xuICAgICAgICBlbmdpbmUuYWRkTWFwcGVyKG5ldyBTdHlsZU1hcHBlcigpKTtcblxuICAgICAgICBlbmdpbmUuYWRkUnVsZXMoY2hlY2tSdWxlcyk7XG4gICAgICAgIGVuZ2luZS5hZGRObHNNYXAoY2hlY2tObHMpO1xuICAgICAgICBlbmdpbmUuYWRkSGVscE1hcChjaGVja0hlbHApO1xuXG4gICAgICAgIGZvciAoY29uc3QgcnMgb2YgYTExeVJ1bGVzZXRzKSB7XG4gICAgICAgICAgICB0aGlzLmFkZFJ1bGVzZXQocnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkUnVsZXNldChyczogUnVsZXNldCkge1xuICAgICAgICB0aGlzLnJ1bGVzZXRzLnB1c2gocnMpO1xuICAgICAgICB0aGlzLnJ1bGVzZXRJZHMucHVzaChycy5pZCk7XG4gICAgICAgIGNvbnN0IHJ1bGVJZHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjcCBvZiBycy5jaGVja3BvaW50cykge1xuICAgICAgICAgICAgY3AucnVsZXMgPSBjcC5ydWxlcyB8fCBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBjcC5ydWxlcykge1xuICAgICAgICAgICAgICAgIHJ1bGVJZHMucHVzaChydWxlLmlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bGVMZXZlbHNbcnVsZS5pZF0gPSB0aGlzLnJ1bGVMZXZlbHNbcnVsZS5pZF0gfHwge307XG4gICAgICAgICAgICAgICAgdGhpcy5ydWxlTGV2ZWxzW3J1bGUuaWRdW3JzLmlkXSA9IHJ1bGUubGV2ZWw7XG4gICAgICAgICAgICAgICAgdGhpcy5ydWxlQ2F0ZWdvcnlbcnVsZS5pZF0gPSB0aGlzLnJ1bGVDYXRlZ29yeVtydWxlLmlkXSB8fCB7fTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bGVDYXRlZ29yeVtydWxlLmlkXVtycy5pZF0gPSBycy5jYXRlZ29yeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJ1bGVzZXRSdWxlc1tycy5pZF0gPSBydWxlSWRzO1xuICAgIH1cblxuICAgIGNoZWNrKG5vZGU6IE5vZGUgfCBEb2N1bWVudCwgcnNJZHM/OiBzdHJpbmcgfCBzdHJpbmdbXSkgOiBQcm9taXNlPFJlcG9ydD4ge1xuICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggcnVsZXMgdG8gcnVuXG4gICAgICAgIGxldCBydWxlSWRzIDogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICAvLyBGaXggdGhlIGlucHV0XG4gICAgICAgIGlmICghcnNJZHMpIHtcbiAgICAgICAgICAgIHJ1bGVJZHMgPSB0aGlzLmVuZ2luZS5nZXRSdWxlc0lkcygpO1xuICAgICAgICB9IGVsc2V7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJzSWRzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgcnNJZHMgPSBbcnNJZHNdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJzSWQgb2YgcnNJZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocnNJZCBpbiB0aGlzLnJ1bGVzZXRSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICBydWxlSWRzID0gcnVsZUlkcy5jb25jYXQodGhpcy5ydWxlc2V0UnVsZXNbcnNJZF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW5naW5lLmVuYWJsZVJ1bGVzKHJ1bGVJZHMpO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgcmVwb3J0IGxldmVsc1xuICAgICAgICBsZXQgbXlUaGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5naW5lLnJ1bihub2RlKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlcG9ydCkge1xuICAgICAgICAgICAgICAgIHJlcG9ydC5ubHMgPSB7fVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVwb3J0LnJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5ydWxlSWQgaW4gY2hlY2tObHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydC5ubHNbcmVzdWx0LnJ1bGVJZF0gPSByZXBvcnQubmxzW3Jlc3VsdC5ydWxlSWRdIHx8IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBjaGVja05sc1tyZXN1bHQucnVsZUlkXVswXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yZWFzb25JZCBpbiBjaGVja05sc1tyZXN1bHQucnVsZUlkXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydC5ubHNbcmVzdWx0LnJ1bGVJZF1bcmVzdWx0LnJlYXNvbklkXSA9IGNoZWNrTmxzW3Jlc3VsdC5ydWxlSWRdW3Jlc3VsdC5yZWFzb25JZF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnZhbHVlWzBdID0gbXlUaGlzLmdldExldmVsKHJzSWRzIGFzIHN0cmluZ1tdLCByZXN1bHQucnVsZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNhdGVnb3J5ID0gbXlUaGlzLmdldENhdGVnb3J5KHJzSWRzIGFzIHN0cmluZ1tdLCByZXN1bHQucnVsZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3VsdC5wYXRoLmNzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcG9ydDtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldExldmVsKHJzSWRzOiBzdHJpbmdbXSwgcnVsZUlkOiBzdHJpbmcpIDogZVJ1bGVQb2xpY3kge1xuICAgICAgICBpZiAoIXJzSWRzKSByZXR1cm4gZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT047XG4gICAgICAgIGxldCByc0luZm8gPSB0aGlzLnJ1bGVMZXZlbHNbcnVsZUlkXTtcbiAgICAgICAgbGV0IHJldFZhbCA9IG51bGw7XG4gICAgICAgIGlmIChyc0lkcykge1xuICAgICAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMucnVsZUxldmVscykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSdWxlIHRyaWdnZXJlZCBmb3Igd2hpY2ggd2UgaGF2ZSBubyBydWxlIGxldmVsIGluZm9ybWF0aW9uOiBcIitydWxlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCByc0lkIG9mIHJzSWRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJzSWQgaW4gcnNJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyc0luZm9bcnNJZF0gPT09IGVSdWxlUG9saWN5LlZJT0xBVElPTikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuVklPTEFUSU9OO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJzSW5mb1tyc0lkXSA9PT0gZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04gJiYgcmV0VmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXRWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGVSdWxlUG9saWN5LklORk9STUFUSU9OO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXRWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJ1bGUgdHJpZ2dlcmVkIGZvciB3aGljaCB3ZSBoYXZlIG5vIHJ1bGUgbGV2ZWwgaW5mb3JtYXRpb246IFwiK3J1bGVJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBnZXRDYXRlZ29yeShyc0lkczogc3RyaW5nW10sIHJ1bGVJZDogc3RyaW5nKSA6IGVSdWxlQ2F0ZWdvcnkge1xuICAgICAgICBsZXQgcnNJbmZvID0gdGhpcy5ydWxlQ2F0ZWdvcnlbcnVsZUlkXTtcbiAgICAgICAgbGV0IHJldFZhbCA9IFwiXCI7XG5cbiAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMucnVsZUNhdGVnb3J5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGVSdWxlQ2F0ZWdvcnkuT1RIRVI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyc0lkcykge1xuICAgICAgICAgICAgcnNJZHMgPSB0aGlzLnJ1bGVzZXRJZHM7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCByc0lkIG9mIHJzSWRzKSB7XG4gICAgICAgICAgICBpZiAocnNJZCBpbiByc0luZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnNJbmZvW3JzSWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlUnVsZUNhdGVnb3J5Lk9USEVSO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGxldCBhX3RhcmdldF93YXJuaW5nOiBSdWxlID0ge1xuICAgIGlkOiBcImFfdGFyZ2V0X3dhcm5pbmdcIixcbiAgICBjb250ZXh0OiBcImRvbTphW3RhcmdldF0sZG9tOmFyZWFbdGFyZ2V0XSxkb206YmFzZVt0YXJnZXRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQV9UYXJnZXRBbmRUZXh0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYV90YXJnZXRfd2FybmluZy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhX3RhcmdldF93YXJuaW5nLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgYV90YXJnZXRfd2FybmluZy5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJVc2VycyBzaG91bGQgYmUgd2FybmVkIGluIGFkdmFuY2UgaWYgdGhlaXIgaW5wdXQgYWN0aW9uIHdpbGwgb3BlbiBhIG5ldyB3aW5kb3cgb3Igb3RoZXJ3aXNlIGNoYW5nZSB0aGVpciBjb250ZXh0XCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiSW5mb3JtIHRoZSB1c2VyIHdoZW4gdGhlaXIgaW5wdXQgYWN0aW9uIHdpbGwgb3BlbiBhIG5ldyB3aW5kb3cgb3Igb3RoZXJ3aXNlIGNoYW5nZSB0aGVpciBjb250ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiMy4yLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBza2lwIHRoZSBydWxlIGlmIGl0J3MgQVQgaGlkZGVuIGFuZCBub3QgdGFiYmFibGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSAmJiAhUlBUVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIHBhcmFtV2luVGV4dDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJuZXcgd2luZG93XCIsIFwibmV3IHRhYlwiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0U3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFyZ2V0XCIpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdFN0ciA9PSBcIl9wYXJlbnRcIiB8fCB0U3RyID09IFwiX3NlbGZcIiB8fCB0U3RyID09IFwiX3RvcFwiIHx8IFJQVFV0aWwuZ2V0RnJhbWVCeU5hbWUocnVsZUNvbnRleHQsdFN0cikgIT0gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIC8vIE5hbWUgaXMgbm90IHBhcnQgb2YgdGhpcyBmcmFtZXNldCDigJMgbXVzdCBoYXZlIHBvdGVudGlhbCB0byBjcmVhdGUgbmV3IHdpbmRvdz9cbiAgICAgICAgICAgIC8vIFNlZSBpZiBhIG5ldyB3aW5kb3cgaXMgbWVudGlvbmVkXG4gICAgICAgICAgICBsZXQgdGV4dFN0ciA9IFJQVFV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSlcbiAgICAgICAgICAgICAgICB0ZXh0U3RyICs9IFwiIFwiICsgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGl0bGVcIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXBhc3NlZCAmJiBpIDwgcGFyYW1zLnBhcmFtV2luVGV4dC52YWx1ZS5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICBpZiAodGV4dFN0ci5pbmRleE9mKHBhcmFtcy5wYXJhbVdpblRleHQudmFsdWVbaV0pICE9IC0xKSBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgbGV0IGFfdGV4dF9wdXJwb3NlOiBSdWxlID0ge1xuICAgIGlkOiBcImFfdGV4dF9wdXJwb3NlXCIsXG4gICAgLy8gZG9jLWJpYmxpb3JlZiBpcyBhIGxpbmtcbiAgICBjb250ZXh0OiBcImFyaWE6bGluayxhcmlhOmRvYy1iaWJsaW9yZWZcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9BX0hhc1RleHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFfdGV4dF9wdXJwb3NlLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGFfdGV4dF9wdXJwb3NlLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogYGFfdGV4dF9wdXJwb3NlLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkh5cGVybGlua3MgbXVzdCBoYXZlIGEgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGVpciBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkh5cGVybGluayBoYXMgYSBkZXNjcmlwdGlvbiBvZiBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJIeXBlcmxpbmsgaGFzIG5vIGxpbmsgdGV4dCwgbGFiZWwgb3IgaW1hZ2Ugd2l0aCBhIHRleHQgYWx0ZXJuYXRpdmVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogXCIyLjQuNFwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogXCJjNDg3YWVcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBSUFRVdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFJ1bGUgb25seSBwYXNzZXMgaWYgYW4gZWxlbWVudCBoYXMgaW5uZXIgY29udGVudCxcbiAgICAgICAgLy8gaW4gdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBvbmx5IGhpZGRlbiBjb250ZW50IHVuZGVyIHRoZSB0aGUgZWxlbWVudCBpdCBpcyBhIHZpb2xhdGlvblxuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIEFSSUFNYXBwZXIuY29tcHV0ZU5hbWUocnVsZUNvbnRleHQpLnRyaW0oKS5sZW5ndGggPiAwXG4gICAgICAgICAgICB8fCBSUFRVdGlsLm5vblRhYmFibGVDaGlsZENoZWNrKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGxldCBhcHBsZXRfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcHBsZXRfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFwcGxldFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0FwcGxldF9IYXNBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBgYXBwbGV0X2FsdF9leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPGFwcGxldD4gZWxlbWVudHMgbXVzdCBwcm92aWRlIGFuICdhbHQnIGF0dHJpYnV0ZSBhbmQgYW4gYWx0ZXJuYXRpdmUgZGVzY3JpcHRpb25cIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQW4gPGFwcGxldD4gZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuICdhbHQnIGF0dHJpYnV0ZSB0aGF0IHByb3ZpZGVzIGEgc2hvcnQgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ2FsdCcgYXR0cmlidXRlIHZhbHVlIGZvciBhbiA8YXBwbGV0PiBlbGVtZW50IGR1cGxpY2F0ZXMgdGhlICdjb2RlJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiQW4gPGFwcGxldD4gZWxlbWVudCBwcm92aWRlcyBhbHRlcm5hdGl2ZSB0ZXh0LCBidXQgZG9lcyBub3QgcHJvdmlkZSBpbm5lciBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiMS4xLjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gSkNIIC0gTk8gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIGlmICghUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhbHRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhbHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikudHJpbSgpO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImNvZGVcIikgJiYgYWx0ID09IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNvZGVcIikudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghUlBUVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8zXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgbGV0IGFwcGxpY2F0aW9uX2NvbnRlbnRfYWNjZXNzaWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YXBwbGljYXRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQXBwbGljYXRpb25fUm9sZV9UZXh0XCI6IHtcbiAgICAgICAgICAgIDA6IGBIQUFDX0FwcGxpY2F0aW9uX1JvbGVfVGV4dC5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgMDogYGFwcGxpY2F0aW9uX2NvbnRlbnRfYWNjZXNzaWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGUuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IGBhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGUuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTm9uLWRlY29yYXRpdmUgc3RhdGljIHRleHQgYW5kIGltYWdlIGNvbnRlbnQgd2l0aGluIGFuIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgbXVzdCBiZSBhY2Nlc3NpYmxlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIG5vbi1kZWNvcmF0aXZlIHN0YXRpYyB0ZXh0IGFuZCBpbWFnZSBjb250ZW50IHdpdGhpbiBhbiBlbGVtZW50IHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIGFyZSBhY2Nlc3NpYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiMi4xLjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBydWxlQ29udGV4dC5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlVmlzaWJsZShjaGlsZHJlbltpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MoY2hpbGRyZW5baV0sIFwiZG9jdW1lbnRcIikgfHwgUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MoY2hpbGRyZW5baV0sIFwiYXJ0aWNsZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkcmVuW2ldLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gY2hpbGRyZW5baV0ubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgbGV0IGFyZWFfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcmVhX2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTphcmVhXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQXJlYV9IYXNBbHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFyZWFfYWx0X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcmVhX2FsdF9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXJlYV9hbHRfZXhpc3RzLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIjxhcmVhPiBlbGVtZW50cyBpbiBhbiBpbWFnZSBtYXAgbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCI8YXJlYT4gZWxlbWVudCBpbiBhbiBpbWFnZSBtYXAgaGFzIG5vIHRleHQgYWx0ZXJuYXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiMS4xLjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbn1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBKQ0ggLSBOTyBPVVQgT0YgU0NPUEUgaGlkZGVuIGluIGNvbnRleHRcbiAgICAgICAgaWYgKFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYWx0XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBnZXREZXByZWNhdGVkQXJpYVJvbGVzLCBnZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMsIGdldFJvbGVzVW5kZWZpbmVkQnlBcmlhfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29sdW1uaGVhZGVyLCBhcmlhOmZvcm0sIGFyaWE6aGVhZGluZywgYXJpYTpyb3doZWFkZXIsIGFyaWE6dGFibGUsIGRvYy1iYWNrbGluaywgZG9jLWJpYmxpb2VudHJ5LCBkb2MtYmlibGlvcmVmLCBkb2MtZ2xvc3NyZWYsIGRvYy1ub3RlcmVmLCBkb2MtcGFnZWJyZWFrXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVcIjogXCJhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiQW4gYWNjZXNzaWJsZSBuYW1lIGlzIHByb3ZpZGVkIGZvciB0aGUgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZVwiOiBcIkVsZW1lbnQgPHswfT4gd2l0aCBcXFwiezF9XFxcIiByb2xlIGhhcyBubyBhY2Nlc3NpYmxlIG5hbWVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50cyB3aXRoIGNlcnRhaW4gcm9sZXMgc2hvdWxkIGhhdmUgYWNjZXNzaWJsZSBuYW1lc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIHdoZW4gdGFibGUgZWxlbWVudCB3aXRoIGEgY2FwdGlvbiBhcyBmaXJzdCBjaGlsZFxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gJ3RhYmxlJyBcbiAgICAgICAgICAgICYmIHJ1bGVDb250ZXh0LmZpcnN0RWxlbWVudENoaWxkICYmIHJ1bGVDb250ZXh0LmZpcnN0RWxlbWVudENoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdjYXB0aW9uJ1xuICAgICAgICAgICAgJiYgcnVsZUNvbnRleHQuZmlyc3RFbGVtZW50Q2hpbGQudGV4dENvbnRlbnQgJiYgcnVsZUNvbnRleHQuZmlyc3RFbGVtZW50Q2hpbGQudGV4dENvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuXG4gICAgICAgIGNvbnN0IGludmFsaWRSb2xlcyA9IGdldFJvbGVzVW5kZWZpbmVkQnlBcmlhKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGludmFsaWRSb2xlcyAmJiBpbnZhbGlkUm9sZXMubGVuZ3RoID4gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGRlcHJlY2F0ZWRSb2xlcyA9IGdldERlcHJlY2F0ZWRBcmlhUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZFJvbGVzICYmIGRlcHJlY2F0ZWRSb2xlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZEF0dHJpYnV0ZXMgPSBnZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpYnV0ZXMgJiYgZGVwcmVjYXRlZEF0dHJpYnV0ZXMubGVuZ3RoID4gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKCBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA9PT0gMCAmJiAhUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKSkge1xuICAgICAgICAgICAgbGV0IHJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICAvL3doZW4gbXVsdGlwbGUgcm9sZXMgc3BlY2lmaWVkLCBvbmx5IHRoZSBmaXJzdCB2YWxpZCByb2xlIGlzIGFwcGxpZWQsIGFuZCB0aGUgb3RoZXJzIGp1c3QgYXMgZmFsbGJhY2tzXG4gICAgICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbMF1dICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1swXV0ubmFtZUZyb20gJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzWzBdXS5uYW1lRnJvbS5pbmNsdWRlcyhcImNvbnRlbnRzXCIpKSB7XG4gICAgICAgICAgICAgICAgLy9pZiAoIVJQVFV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KSB8fCBSUFRVdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAvL2V4Y2x1ZGUgdGhlIGhpZGRlbiB0ZXh0P1xuICAgICAgICAgICAgICAgIGlmICghUlBUVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZVwiLCBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgcm9sZXNbMF1dKTsgIFxuICAgICAgICAgICAgfSBlbHNlIFxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lXCIsIFtydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCByb2xlc1swXV0pOyAgIFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGFyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2FyaWEtYWN0aXZlZGVzY2VuZGFudF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0ludmFsaWRUYWJpbmRleEZvckFjdGl2ZWRlc2NlbmRhbnRcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPHswfT4gZWxlbWVudCB1c2luZyAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBzZXQgdG8gXFxcInsxfVxcXCIgaXMgbm90IHRhYmJhYmxlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWxlbWVudCB1c2luZyAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBwcm9wZXJ0eSBzaG91bGQgYmUgdGFiYmFibGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBSdWxlIG5vdCBzdXBwb3J0ZWQgb24gbW9iaWxlXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJjbGFzc1wiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKS5zdWJzdHJpbmcoMCwgMykgPT0gXCJtYmxcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIGJ5IGRpc2FibGVkIGh0bWw1IGF0dHJpYnV0ZSBvciBhcmlhLWRpc2FibGVkOlxuICAgICAgICAvLyAgMS4gSW4gdGhlIGNhc2UgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGEgZGlzYWJsZWQgYXR0cmlidXRlIGFuZCB0aGUgZWxlbWVudCBzdXBwb3J0cyBpdCwgd2UgbWFyayB0aGlzIHJ1bGUgYXMgcGFzc2VkLlxuICAgICAgICAvLyAgMi4gSW4gdGhlIGNhc2UgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGEgYXJpYS1kaXNhYmxlZCBhdHRyaWJ1dGUgdGhlbiwgd2UgbWFyayB0aGlzIHJ1bGUgYXMgcGFzc2VkLlxuICAgICAgICAvLyBGb3IgYm90aCBvZiB0aGUgY2FzZXMgYWJvdmUgd2UgZG8gbm90IG5lZWQgdG8gcGVyZm9ybSBhbnkgZnVydGhlciBjaGVja3MsIGFzIHRoZSBlbGVtZW50IGlzIGRpc2FibGVkIGluIHNvbWUgZm9ybSBvciBhbm90aGVyLlxuICAgICAgICBpZiAoUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiB0aGUgYXR0cmlidXRlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIGlzIHZhbGlkIGZvciB0aGUgcm9sZSBvZiB0aGUgZWxlbWVudFxuICAgICAgICBcblxuICAgICAgICAvLyBJZiB0aGUgdGFiaW5kZXggYXR0cmlidXRlIGlzIHByb3ZpZGVkIHRoZW4gdmVyaWZ5IHRoYXQgaXQgaXMgMCBvciAtMVxuICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIC8vIHBhc3MgaWYgb25lIG9mIHRoZSBjaGlsZHJlbiBpcyB0YWJiYWJsZS4gaW4gdGhpcyBjYXNlLCB0aGUgdGFiIHdpbGwgc3RvcCBvbiB0aGUgZmlyc3QgdGFiYmFibGUgZWxlbWVudFxuICAgICAgICBpZiAoIXBhc3NlZCkgXG4gICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmdldFRhYmJhYmxlQ2hpbGRyZW4ocnVsZUNvbnRleHQpID4gMDtcblxuICAgICAgICAvLyBCdWlsZCBhcnJheSBmb3Igbm9kZSB0b2tlblxuICAgICAgICBsZXQgcmV0VG9rZW4xID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMS5wdXNoKG5vZGVOYW1lKTtcblxuICAgICAgICAvLyBCdWlsZCBhcnJheSBmb3IgaWQgcmVmZXJlbmNlZCBieSBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjIucHVzaChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIikuc3BsaXQoXCIgXCIpLmpvaW4oXCIsIFwiKSk7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIHBhc3NlZCA9PSB0cnVlID8gW10gOiBbcmV0VG9rZW4xLCByZXRUb2tlbjJdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbcmV0VG9rZW4xLnRvU3RyaW5nKCksIHJldFRva2VuMi50b1N0cmluZygpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2FyaWEtYWN0aXZlZGVzY2VuZGFudF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQWN0aXZlRGVzY2VuZGFudENoZWNrXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIkZhaWxfNFwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgcHJvcGVydHkgaXMgZW1wdHlcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiVGhlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIHByb3BlcnR5IHJlZmVyZW5jZXMgYSBoaWRkZW4gbm9kZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJFbGVtZW50IGlzIG5vdCBhIGNvbWJvYm94LCBhbmQgdGhlIHJlZmVyZW5jZWQgYWN0aXZlLWRlc2NlbmRhbnQgZWxlbWVudCBpcyBub3QgYSB2YWxpZCBkZXNjZW5kYW50XCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIkVsZW1lbnQgaXMgYSBjb21ib2JveCwgYW5kIHRoZSByZWZlcmVuY2VkIGFjdGl2ZS1kZXNjZW5kYW50IGVsZW1lbnQgaXMgbm90IGNvbnRyb2xsZWQgYnkgdGhpcyBjb21wb25lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgcHJvcGVydHkgbXVzdCByZWZlcmVuY2UgdGhlICdpZCcgb2YgYSBub24tZW1wdHksIG5vbi1oaWRkZW4gYWN0aXZlIGNoaWxkIGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gY29tYm9ib3ggYWN0aXZlIGRlc2NlbmRhbnRzIGhhbmRsZWQgYnkgJ2NvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50J1xuICAgICAgICBpZiAoUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwiY29tYm9ib3hcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRlc2NlbmRhbnRfaWQgPSBSUFRVdGlsLmdldEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpO1xuICAgICAgICAvLyBQT0YxOiBUaGUgYXR0cmlidXRlIGlzIGVtcHR5XG4gICAgICAgIGlmICghZGVzY2VuZGFudF9pZCB8fCBkZXNjZW5kYW50X2lkLnRyaW0oKSA9PT0gXCJcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRlc2NlbmRhbnQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgZGVzY2VuZGFudF9pZC50cmltKCkpO1xuICAgICAgICBpZiAoIWRlc2NlbmRhbnQgfHwgRE9NVXRpbC5zYW1lTm9kZShkZXNjZW5kYW50X2lkLCBydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIC8vIFRoZSByZWZlcmVuY2VkIGVsZW1lbnQgZG9lc24ndCBleGlzdC4gV2UgbGV0IDEwNzcgdG8gdHJpZ2dlciB0aGUgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUoZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgIC8vIFBPRjI6IGFyaWEtYWN0aXZlZGVzY2VuZGFudCByZWZlcmVuY2VzIGEgaGlkZGVuIG5vZGVcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDEuIFRoZSB2YWx1ZSBvZiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQgcmVmZXJzIHRvIGFuIGVsZW1lbnQgdGhhdCBpcyBlaXRoZXIgYSBkZXNjZW5kYW50IG9mIFxuICAgICAgICAvLyB0aGUgZWxlbWVudCB3aXRoIERPTSBmb2N1c1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuY29udGFpbnMoZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwb2ZJZCA9IDI7XG5cbiAgICAgICAgLy8gb3IgaXMgYSBsb2dpY2FsIGRlc2NlbmRhbnQgYXMgaW5kaWNhdGVkIGJ5IHRoZSBhcmlhLW93bnMgYXR0cmlidXRlLlxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpKSB7XG4gICAgICAgICAgICBsZXQgb3duZWRfaWRzID0gUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3duZWRfaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG93bmVkX2VsZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBvd25lZF9pZHNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChvd25lZF9lbGUgJiYgIURPTVV0aWwuc2FtZU5vZGUob3duZWRfZWxlLCBydWxlQ29udGV4dCkgJiYgb3duZWRfZWxlLmNvbnRhaW5zKGRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBUaGUgZWxlbWVudCB3aXRoIERPTSBmb2N1cyBpcyBhIHRleHRib3ggd2l0aCBhcmlhLWNvbnRyb2xzIHJlZmVycmluZyB0byBhbiBlbGVtZW50IHRoYXQgXG4gICAgICAgIC8vICBzdXBwb3J0cyBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQsIGFuZCB0aGUgdmFsdWUgb2YgYXJpYS1hY3RpdmVkZXNjZW5kYW50IHNwZWNpZmllZCBmb3IgdGhlIFxuICAgICAgICAvLyAgdGV4dGJveCByZWZlcnMgdG8gZWl0aGVyIGEgZGVzY2VuZGFudCBvZiB0aGUgZWxlbWVudCBjb250cm9sbGVkIGJ5IHRoZSB0ZXh0Ym94IG9yIGlzIGEgbG9naWNhbCBcbiAgICAgICAgLy8gIGRlc2NlbmRhbnQgb2YgdGhhdCBjb250cm9sbGVkIGVsZW1lbnQgYXMgaW5kaWNhdGVkIGJ5IHRoZSBhcmlhLW93bnMgYXR0cmlidXRlLlxuICAgICAgICAvL1xuICAgICAgICBpZiAoUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwidGV4dGJveFwiKSAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpKSB7XG4gICAgICAgICAgICBwb2ZJZCA9IDM7XG4gICAgICAgICAgICBsZXQgY29udHJvbGxlZF9pZHMgPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udHJvbGxlZF9pZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY29udHJvbGxlZF9lbGUgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgY29udHJvbGxlZF9pZHNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVkX2VsZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShjb250cm9sbGVkX2VsZSwgcnVsZUNvbnRleHQpICYmIGNvbnRyb2xsZWRfZWxlLmNvbnRhaW5zKGRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZWRfZWxlLmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duc19pZHMgPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcoY29udHJvbGxlZF9lbGUuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpLnRyaW0oKSkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG93bnNfaWRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duZWRfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIG93bnNfaWRzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvd25lZF9lbGUgJiYgIURPTVV0aWwuc2FtZU5vZGUob3duZWRfZWxlLCBydWxlQ29udGV4dCkgJiYgb3duZWRfZWxlLmNvbnRhaW5zKGRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUE9GMzogSSdtIG5vdCBhIGNvbWJvYm94LCBhbmQgdGhlIHJlZmVyZW5jZWQgYWN0aXZlLWRlc2NlbmRhbnQgaXMgbm90IGEgZGVzY2VuZGFudCBhbmQgbm90IG93bmVkIGJ5IHRoZSBlbGVtZW50IFxuICAgICAgICAvLyB0aGF0IHJlZmVyZW5jZWQgaXQuXG4gICAgICAgIGlmIChwb2ZJZCA9PSAzKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmFwcGxpY2F0aW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUFwcGxpY2F0aW9uTGFuZG1hcmtzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJhcHBsaWNhdGlvblxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcHBsaWNhdGlvblwiLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZHVwZXMgPSBnZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZHVwZXMpIHtcbiAgICAgICAgICAgIGR1cGVzID0gUlBUVXRpbC5maW5kQXJpYUxhYmVsRHVwZXMobGFuZG1hcmtzKTtcbiAgICAgICAgICAgIHNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBteUxhYmVsID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIG15TGFiZWwgIT09IFwiXCIgJiYgKCEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMSk7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBydWxlQ29udGV4dCwgJycsICcnLCBbIG15TGFiZWwgXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmFwcGxpY2F0aW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9BcHBsaWNhdGlvbkxhbmRtYXJrTGFiZWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgZG9lcyBub3QgaGF2ZSBhbiBhY2Nlc3NpYmxlIG5hbWVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBlbGVtZW50IHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIG11c3QgaGF2ZSBhbiBhY2Nlc3NpYmxlIG5hbWUgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcbiAgICAgICAgLy8gcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTphcnRpY2xlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUFydGljbGVSb2xlc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfYXJ0aWNsZV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiYXJ0aWNsZVxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImFydGljbGVcXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAvLyBBbHNvLCBjb25zaWRlciBJbXBsaWNpdCByb2xlIGNoZWNraW5nLlxuICAgICAgICBsZXQgbGFuZG1hcmtzID0gUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFydGljbGVcIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGR1cGVzID0gZ2V0Q2FjaGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZHVwZXMpIHtcbiAgICAgICAgICAgIGR1cGVzID0gUlBUVXRpbC5maW5kQXJpYUxhYmVsRHVwZXMobGFuZG1hcmtzKTtcbiAgICAgICAgICAgIHNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG15TGFiZWwgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgbXlMYWJlbCA9PT0gXCJcIiB8fCAhKG15TGFiZWwgaW4gZHVwZXMpIHx8IGR1cGVzW215TGFiZWxdIDw9IDE7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBydWxlQ29udGV4dCwgJycsICcnLCBbIG15TGFiZWwgXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX2FsbG93ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9WYWxpZFByb3BlcnR5XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGFyaWFfYXR0cmlidXRlX2FsbG93ZWQuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZC5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBUklBIGF0dHJpYnV0ZXMgbXVzdCBiZSB2YWxpZCBmb3IgdGhlIGVsZW1lbnQncyByb2xlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSBhdHRyaWJ1dGUocykgJ3swfScgcmVmZXJlbmNlZCBieSB0aGUgZWxlbWVudCA8ezF9PiBpcyBub3QgYSB2YWxpZCBBUklBIHN0YXRlIG9yIHByb3BlcnR5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiNC4xLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiNWY5OWE3XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGNvbnRleHRBdHRyaWJ1dGVzID0gcnVsZUNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgXG4gICAgICAgIC8vIFRoaXMgZ2V0cyBhbGwgZWxlbWVudHMgd2l0aCBhdHRyaWJ1dGVzIHNvIHdlIHN0aWxsIGhhdmUgc29tZVxuICAgICAgICAvLyBPdXQgb2YgU2NvcGUgc2luY2Ugbm90IGFsbCBhdHRyaWJ1dGVzIGFyZSBhcmlhIFxuXG4gICAgICAgIGlmIChjb250ZXh0QXR0cmlidXRlcykge1xuICAgICAgICAgICAgbGV0IHByb3BlcnR5RGF0YVR5cGVzID0gQVJJQURlZmluaXRpb25zLnByb3BlcnR5RGF0YVR5cGVzO1xuICAgICAgICAgICAgbGV0IGZhaWxlZFByb3BlcnRpZXMgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IHRlc3RlZFByb3BlcnRpZXMgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGNvbnRleHRBdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5pc0RlZmluZWRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydGllcysrO1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3cgd2UganVzdCBoYXZlIGFyaWEgYXR0cmlidXRlcyB3aGljaCBjYW5cbiAgICAgICAgICAgICAgICAgICAgLy8gcGFzcyBvciBmYWlsIGJhc2VkIG9uIHdoZXRoZXIgdGhlcmUgcHJvcGVydHkgaXMgdmFsaWRcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFUeXBlcyA9IHByb3BlcnR5RGF0YVR5cGVzW2F0dHJOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhVHlwZXMpIHsgLy8gaWYgcHJvcGVydHkgaXMgbm90IGluIHZhbGlkIHByb3BlcnR5IGxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmYWlsZWRQcm9wZXJ0aWVzIGNvbW1hIHNlcCBsaXN0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFpbGVkUHJvcGVydGllcy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZFByb3BlcnRpZXMgPSBhdHRyTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkUHJvcGVydGllcyA9IGZhaWxlZFByb3BlcnRpZXMgKyBcIiwgXCIgKyBhdHRyTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0ZXN0ZWRQcm9wZXJ0aWVzID09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmFpbGVkUHJvcGVydGllcy5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbZmFpbGVkUHJvcGVydGllcywgcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL3JldHVybiBSdWxlUGFzcygxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBKQ0ggLSBwYXNzaW5nIGlzIGJhc2VkIG9uIGFsbCBhdHRyaWJ1dGVzIG5vdCBqdXN0IGFyaWEgYXR0cmlidXRlc1xuICAgICAgICAvLyAgICAgICBsZWFkaW5nIHRvIE9WRVIgQ09VTlRJTkcgc28gbW92ZWQgcGFzcyB1cFxuICAgICAgICAvL3JldHVybiBSdWxlUGFzcygxKTtcbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0SW52YWxpZEFyaWFBdHRyaWJ1dGVzLCBnZXRDb25mbGljdEFyaWFBbmRIdG1sQXR0cmlidXRlcyB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX2F0dHJpYnV0ZV9jb25mbGljdDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV9jb25mbGljdFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1yZXF1aXJlZF0sIGRvbToqW2FyaWEtYXV0b2NvbXBsZXRlXSwgZG9tOipbYXJpYS1yZWFkb25seV0sIGRvbToqW2FyaWEtZGlzYWJsZWRdLCBkb206KlthcmlhLXBsYWNlaG9sZGVyXVwiIFxuICAgICAgICAgICAgKyBcIiwgZG9tOipbYXJpYS1jaGVja2VkXSwgZG9tOipbYXJpYS1oaWRkZW5dLCBkb206KlthcmlhLXZhbHVlbWF4XSwgZG9tOipbYXJpYS12YWx1ZW1pbl0sIGRvbToqW2FyaWEtY29sc3Bhbl1cIlxuICAgICAgICAgICAgKyBcIiwgZG9tOipbYXJpYS1yb3dzcGFuXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2F0dHJpYnV0ZV9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfY29uZmxpY3RcIjogXCJhcmlhX2F0dHJpYnV0ZV9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3QuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiZmFpbF9jb25mbGljdFwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBpcyBpbiBjb25mbGljdCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIEhUTUwgYXR0cmlidXRlIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gQVJJQSBhdHRyaWJ1dGUgbXVzdCBub3QgY29uZmxpY3Qgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBIVE1MIGF0dHJpYnV0ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vIGRlcGVuZGVuY3kgY2hlY2s6IGlmIHRoZSBBUklBIGF0dHJpYnV0ZSBpcyBjb21wbGV0ZWx5IGludmFsaWQsIHNraXAgdGhpcyBjaGVja1xuICAgICAgICBsZXQgaW52YWxpZEF0dHJpYnV0ZXMgPSBnZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoaW52YWxpZEF0dHJpYnV0ZXMgJiYgaW52YWxpZEF0dHJpYnV0ZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBsZXQgYXJpYUF0dHJpYnV0ZXMgPSBSUFRVdGlsLmdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWFyaWFBdHRyaWJ1dGVzIHx8IGFyaWFBdHRyaWJ1dGVzLmxlbmd0aCA9PT0wKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGNvbmZsaWN0QXR0cmlidXRlcyA9IGdldENvbmZsaWN0QXJpYUFuZEh0bWxBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25mbGljdEF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9jb25mbGljdFwiLCBbY29uZmxpY3RBdHRyaWJ1dGVzW2ldWydhcmlhQXR0ciddLCBjb25mbGljdEF0dHJpYnV0ZXNbaV1bJ2h0bWxBdHRyJ11dKSk7XG4gICAgICAgICAgICBpZiAoYXJpYUF0dHJpYnV0ZXMuaW5jbHVkZXMoY29uZmxpY3RBdHRyaWJ1dGVzW2ldWydhcmlhQXR0ciddKSlcbiAgICAgICAgICAgICAgICBSUFRVdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QoW2NvbmZsaWN0QXR0cmlidXRlc1tpXVsnYXJpYUF0dHInXV0sIGFyaWFBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJpYUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICBcbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7ICBcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBnZXREZXByZWNhdGVkQXJpYVJvbGVzLCBnZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9hcmlhX3JvbGVcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9hcmlhX2F0dHJcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9yb2xlX2F0dHJcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBBUklBIHJvbGVzIGFuZCBhdHRyaWJ1dGUgYXJlIHVzZWQgcGVyIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiZmFpbF9hcmlhX3JvbGVcIjogXCJUaGUgQVJJQSByb2xlIFxcXCJ7MH1cXFwiIGlzIGRlcHJlY2F0ZWQgaW4gdGhlIEFSSUEgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJmYWlsX2FyaWFfYXR0clwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZXMgXFxcInswfVxcXCIgYXJlIGRlcHJlY2F0ZWQgaW4gdGhlIEFSSUEgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJmYWlsX3JvbGVfYXR0clwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZXMgXFxcInswfVxcXCIgYXJlIGRlcHJlY2F0ZWQgZm9yIHRoZSByb2xlIFxcXCJ7MX1cXFwiIGluIHRoZSBBUklBIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJObyBkZXByZWNhdGVkIEFSSUEgcm9sZSBvciBhdHRyaWJ1dGUgc2hvdWxkIGJlIHVzZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjFcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBjb25zdCBkZXByZWNhdGVkUm9sZXMgPSBnZXREZXByZWNhdGVkQXJpYVJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlcHJlY2F0ZWRSb2xlcyAmJiBkZXByZWNhdGVkUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXByZWNhdGVkUm9sZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoJ2ZhaWxfYXJpYV9yb2xlJywgW2RlcHJlY2F0ZWRSb2xlc1tpXV0pKTsgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZEF0dHJpYnV0ZXMgPSBnZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpYnV0ZXMgJiYgZGVwcmVjYXRlZEF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXByZWNhdGVkQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIFwicm9sZVwiOlwiYW55XCIsIFwiYXR0cmlidXRlXCI6YXJpYUF0dHJzW2ldfVxuICAgICAgICAgICAgICAgIGlmIChkZXByZWNhdGVkQXR0cmlidXRlc1tpXS5yb2xlID09PSAnYW55JylcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoJ2ZhaWxfYXJpYV9hdHRyJywgW2RlcHJlY2F0ZWRBdHRyaWJ1dGVzW2ldLmF0dHJpYnV0ZV0pKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKCdmYWlsX3JvbGVfYXR0cicsIFtkZXByZWNhdGVkQXR0cmlidXRlc1tpXS5hdHRyaWJ1dGUsIGRlcHJlY2F0ZWRBdHRyaWJ1dGVzW2ldLnJvbGVdKSk7XG4gICAgICAgICAgICB9ICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAocmV0Lmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9hdHRyaWJ1dGVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfcm9sZV9hbGxvd2VkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfRW1wdHlQcm9wZXJ0eVZhbHVlXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbXB0eV9hdHRyaWJ1dGVcIjogXCJmYWlsX2VtcHR5X2F0dHJpYnV0ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2F0dHJpYnV0ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2VtcHR5X2F0dHJpYnV0ZVwiOiBcImFyaWFfYXR0cmlidXRlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxfZW1wdHlfYXR0cmlidXRlXCI6IFwiVGhlIGVsZW1lbnQgYXR0cmlidXRlKHMpOiAnezB9JyB2YWx1ZSBpcyBlbXB0eVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIldoZW4gc3BlY2lmeWluZyBhIHJlcXVpcmVkIEFSSUEgYXR0cmlidXRlLCB0aGUgdmFsdWUgbXVzdCBub3QgYmUgZW1wdHlcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtcIjZhNzI4MVwiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgbGV0IGF0dHJOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgbGV0IGhhc0F0dHJpYnV0ZSA9IFJQVFV0aWwuaGFzQXR0cmlidXRlO1xuICAgICAgICBsZXQgdGVzdGVkUHJvcGVydGllcyA9IDA7XG5cbiAgICAgICAgbGV0IHJvbGVzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJvbGVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBpZiAoZGVzaWduUGF0dGVybnNbcm9sZXNbal1dICYmIFJQVFV0aWwuZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyhyb2xlc1tqXSwgcnVsZUNvbnRleHQpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVxdWlyZWRSb2xlUHJvcHMgPSBSUFRVdGlsLmdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXMocm9sZXNbal0sIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gcmVxdWlyZWRSb2xlUHJvcHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZSA9IHJlcXVpcmVkUm9sZVByb3BzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0aWVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlID0gUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShyZXF1aXJlZFJvbGVQcm9wc1tpXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYWx1ZS5sZW5ndGggPT0gMCkgYXR0ck5hbWVBcnIucHVzaChyZXF1aXJlZFJvbGVQcm9wc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWlyZWRSb2xlUHJvcHNbaV0gPT0gXCJhcmlhLWxhYmVsbGVkYnlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyb2xlc1tpXSA9PSBcInJhZGlvZ3JvdXBcIikgJiYgKGhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsXCIpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RlZFByb3BlcnRpZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlID0gUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWUubGVuZ3RoID09IDApIGF0dHJOYW1lQXJyLnB1c2goXCJhcmlhLWxhYmVsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVpcmVkUm9sZVByb3BzW2ldID09IFwiYXJpYS12YWx1ZW5vd1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJvbGVzW2ldID09IFwicHJvZ3Jlc3NiYXJcIikgJiYgKGhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLXZhbHVldGV4dFwiKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0aWVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZSA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVldGV4dFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYWx1ZS5sZW5ndGggPT0gMCkgYXR0ck5hbWVBcnIucHVzaChcImFyaWEtdmFsdWV0ZXh0XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXSkge1xuICAgICAgICAgICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IFJQVFV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgbGV0IHBlcm1pdHRlZFJvbGVzID0gW107XG4gICAgICAgICAgICAgICAgcGVybWl0dGVkUm9sZXMucHVzaChyb2xlc1tqXSk7XG4gICAgICAgICAgICAgICAgbGV0IGFsbG93ZWRBdHRyaWJ1dGVzID0gUlBUVXRpbC5nZXRBbGxvd2VkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQsIHBlcm1pdHRlZFJvbGVzLCB0YWdQcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGFsbG93ZWRBdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSBhbGxvd2VkQXR0cmlidXRlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBcImFyaWEtY2hlY2tlZFwiIHx8IGF0dHJpYnV0ZSA9PSBcImFyaWEtc2VsZWN0ZWRcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlID09IFwiYXJpYS1leHBhbmRlZFwiIHx8IGF0dHJpYnV0ZSA9PSBcImFyaWEtb3JpZW50YXRpb25cIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlID09IFwiYXJpYS1sZXZlbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydGllcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWUgPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWUubGVuZ3RoID09IDAgJiYgIWF0dHJOYW1lQXJyLmluY2x1ZGVzKGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChhdHRyaWJ1dGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0TXNnID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBhdHRyTmFtZUFyci5sZW5ndGggPT0gMDtcbiAgICAgICAgcmV0TXNnLnB1c2goYXR0ck5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCBhdHRyTmFtZUFyciwgJycsIHJldE1zZyk7XG4gICAgICAgIGlmICh0ZXN0ZWRQcm9wZXJ0aWVzID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfZW1wdHlfYXR0cmlidXRlXCIsIHJldE1zZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSwgUnVsZVBvdGVudGlhbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IGdldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBnZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMsIGdldENvbmZsaWN0QXJpYUFuZEh0bWxBdHRyaWJ1dGVzIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfYXR0cmlidXRlX3JlZHVuZGFudDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV9yZWR1bmRhbnRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2FyaWEtcmVxdWlyZWRdLCBkb206KlthcmlhLWF1dG9jb21wbGV0ZV0sIGRvbToqW2FyaWEtcmVhZG9ubHldLCBkb206KlthcmlhLWRpc2FibGVkXSwgZG9tOipbYXJpYS1wbGFjZWhvbGRlcl1cIiBcbiAgICAgICAgICAgICsgXCIsIGRvbToqW2FyaWEtY2hlY2tlZF0sIGRvbToqW2FyaWEtaGlkZGVuXSwgZG9tOipbYXJpYS12YWx1ZW1heF0sIGRvbToqW2FyaWEtdmFsdWVtaW5dLCBkb206KlthcmlhLWNvbHNwYW5dXCJcbiAgICAgICAgICAgICsgXCIsIGRvbToqW2FyaWEtcm93c3Bhbl1cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9yZWR1bmRhbnRcIjogXCJhcmlhX2F0dHJpYnV0ZV9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX3JlZHVuZGFudC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJmYWlsX3JlZHVuZGFudFwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBpcyByZWR1bmRhbnQgd2l0aCB0aGUgSFRNTCBhdHRyaWJ1dGUgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBBUklBIGF0dHJpYnV0ZSBzaG91bGQgbm90IGJlIHVzZWQgd2hlbiB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgSFRNTCBhdHRyaWJ1dGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vIGRlcGVuZGVuY3kgY2hlY2s6IGlmIHRoZSBBUklBIGF0dHJpYnV0ZSBpcyBjb21wbGV0ZWx5IGludmFsaWQsIHNraXAgdGhpcyBjaGVja1xuICAgICAgICBsZXQgaW52YWxpZEF0dHJpYnV0ZXMgPSBnZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoaW52YWxpZEF0dHJpYnV0ZXMgJiYgaW52YWxpZEF0dHJpYnV0ZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGlmIGNvbmZsaWN0IGFscmVhZHkgcmVwb3J0ZWQsIGlnbm9yZSByZXBvcnRpbmcgb3ZlcmxhcFxuICAgICAgICBsZXQgY29uZmxpY3RBdHRyaWJ1dGVzID0gZ2V0Q29uZmxpY3RBcmlhQW5kSHRtbEF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoY29uZmxpY3RBdHRyaWJ1dGVzICYmIGNvbmZsaWN0QXR0cmlidXRlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGRvbUF0dHJpYnV0ZXMgPSBydWxlQ29udGV4dC5hdHRyaWJ1dGVzO1xuICAgICAgICBsZXQgYXJpYUF0dHJzID0gW107XG4gICAgICAgIGxldCBodG1sQXR0cnMgPSBbXTtcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTsgXG4gICAgICAgICAgICAgICAgbGV0IGF0dHJWYWx1ZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJWYWx1ZSA9PT0gJycpIGF0dHJWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJykgXG4gICAgICAgICAgICAgICAgICAgIGFyaWFBdHRycy5wdXNoKHtuYW1lOiBhdHRyTmFtZSwgdmFsdWU6IGF0dHJWYWx1ZX0pO1xuICAgICAgICAgICAgICAgIGVsc2UgXG4gICAgICAgICAgICAgICAgICAgIGh0bWxBdHRycy5wdXNoKHtuYW1lOiBhdHRyTmFtZSwgdmFsdWU6IGF0dHJWYWx1ZX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZXQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGV4YW1pbmVkSHRtbEF0ck5hbWVzID0gUlBUVXRpbC5nZXRDb25mbGljdE9yT3ZlcmxhcHBpbmdIdG1sQXR0cmlidXRlKGFyaWFBdHRyc1tpXSwgaHRtbEF0dHJzLCAnb3ZlcmxhcHBpbmcnKTtcbiAgICAgICAgICAgIGlmIChleGFtaW5lZEh0bWxBdHJOYW1lcyA9PT0gbnVsbCkgY29udGludWU7XG4gICAgICAgICAgICBleGFtaW5lZEh0bWxBdHJOYW1lcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtWydyZXN1bHQnXSA9PT0gJ1Bhc3MnKSB7IC8vcGFzc1xuICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbVsncmVzdWx0J10gPT09ICdGYWlsZWQnKSB7IC8vZmFpbGVkXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9yZWR1bmRhbnRcIiwgW2FyaWFBdHRyc1tpXVsnbmFtZSddLCBpdGVtWydhdHRyJ11dKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7ICAgIFxuICAgICAgICB9ICAgIFxuICAgICAgICBpZiAocmV0Lmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgbGV0IGFyaWFfYXR0cmlidXRlX3JlcXVpcmVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX3JlcXVpcmVkXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9SZXF1aXJlZFByb3BlcnRpZXNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGFyaWFfYXR0cmlidXRlX3JlcXVpcmVkLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGFyaWFfYXR0cmlidXRlX3JlcXVpcmVkLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogYGFyaWFfYXR0cmlidXRlX3JlcXVpcmVkLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIldoZW4gdXNpbmcgYSBBUklBIHJvbGUgb24gYW4gZWxlbWVudCwgdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZXMgZm9yIHRoYXQgcm9sZSBtdXN0IGJlIGRlZmluZWRcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQW4gZWxlbWVudCB3aXRoIEFSSUEgcm9sZSAnezB9JyBkb2VzIG5vdCBoYXZlIHRoZSByZXF1aXJlZCBBUklBIGF0dHJpYnV0ZShzKTogJ3sxfSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogXCI0LjEuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCI0ZThhYjZcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgYXR0ck5hbWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHJvbGVOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgbGV0IHJvbGVzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAvL2xldCBpbXBsaWNpdFJvbGUgPSBBUklBTWFwcGVyLmVsZW1Ub0ltcGxpY2l0Um9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBpbXBsaWNpdFJvbGUgPSBSUFRVdGlsLmdldEltcGxpY2l0Um9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBoYXNBdHRyaWJ1dGUgPSBSUFRVdGlsLmhhc0F0dHJpYnV0ZTtcbiAgICAgICAgbGV0IHRlc3RlZFJvbGVzID0gMDtcblxuICAgICAgICBmb3IgKGxldCBqID0gMCwgcm9sZXNMZW5ndGggPSByb2xlcy5sZW5ndGg7IGogPCByb2xlc0xlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBpZiAoaW1wbGljaXRSb2xlLmxlbmd0aCA+IDAgJiYgaW1wbGljaXRSb2xlLmluY2x1ZGVzKHJvbGVzW2pdKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoZGVzaWduUGF0dGVybnNbcm9sZXNbal1dICYmIFJQVFV0aWwuZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyhyb2xlc1tqXSwgcnVsZUNvbnRleHQpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVxdWlyZWRSb2xlUHJvcHMgPSBSUFRVdGlsLmdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXMocm9sZXNbal0sIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBsZXQgcm9sZU1pc3NpbmdSZXFQcm9wID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGVzdGVkUm9sZXMrKztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgcHJvcGVydGllc0xlbmd0aCA9IHJlcXVpcmVkUm9sZVByb3BzLmxlbmd0aDsgaSA8IHByb3BlcnRpZXNMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgcmVxdWlyZWRSb2xlUHJvcHNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbiBhcmlhLWxhYmVsbGVkYnkgaXNuJ3QgcHJlc2VudCwgYW4gYXJpYS1sYWJlbCB3aWxsIG1lZXQgdGhlIHJlcXVpcmVtZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkUm9sZVByb3BzW2ldID09IFwiYXJpYS1sYWJlbGxlZGJ5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCFoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS1sYWJlbFwiKSkgfHwgKHJvbGVzW2ldICE9IFwicmFkaW9ncm91cFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKHJlcXVpcmVkUm9sZVByb3BzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZU1pc3NpbmdSZXFQcm9wID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVpcmVkUm9sZVByb3BzW2ldID09IFwiYXJpYS12YWx1ZW5vd1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtdmFsdWV0ZXh0XCIpKSB8fCAocm9sZXNbaV0gIT0gXCJwcm9ncmVzc2JhclwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKHJlcXVpcmVkUm9sZVByb3BzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZU1pc3NpbmdSZXFQcm9wID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVpcmVkUm9sZVByb3BzW2ldID09IFwiYXJpYS1jb250cm9sc1wiICYmIHJvbGVzW2pdID09IFwiY29tYm9ib3hcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhpcyBjaGVjayBzaW5jZSBhcmlhLWNvbnRyb2xzIGluIHRoZSB0ZXh0Ym94IG9mIGEgY29tYm9ib3ggaXMgYWxyZWFkeSBoYW5kbGVkIGluIHJ1bGUgSEFBQ19Db21ib2JveF9NdXN0X2hhdmVfVGV4dF9JbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKHJlcXVpcmVkUm9sZVByb3BzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlTWlzc2luZ1JlcVByb3AgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyb2xlTWlzc2luZ1JlcVByb3AgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICByb2xlTmFtZUFyci5wdXNoKHJvbGVzW2pdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldFRva2VuID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBhdHRyTmFtZUFyci5sZW5ndGggPT0gMDsgLy8gb25seSBhcmlhIGF0dHJpYnV0ZXMgc28gTk8gT1VUIE9GIFNDT1BFXG4gICAgICAgIHJldFRva2VuLnB1c2gocm9sZU5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgcmV0VG9rZW4ucHVzaChhdHRyTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sIGF0dHJOYW1lQXJyLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IHJldFRva2VuKTtcbiAgICAgICAgaWYgKHRlc3RlZFJvbGVzID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgcmV0VG9rZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfVmFsaWRQcm9wZXJ0eVZhbHVlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2F0dHJpYnV0ZV92YWx1ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBUklBIHByb3BlcnR5IHZhbHVlcyBtdXN0IGJlIHZhbGlkXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSB2YWx1ZSBcXFwiezB9XFxcIiBzcGVjaWZpZWQgZm9yIGF0dHJpYnV0ZSAnezF9JyBvbiBlbGVtZW50IDx7Mn0+IGlzIG5vdCB2YWxpZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCI2YTcyODFcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgdmFsdWVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IGF0dHJOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBkYXRhVHlwZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcHJvcGVydHlEYXRhVHlwZXMgPSBBUklBRGVmaW5pdGlvbnMucHJvcGVydHlEYXRhVHlwZXM7XG4gICAgICAgIGxldCBjb250ZXh0QXR0cmlidXRlcyA9IHJ1bGVDb250ZXh0LmF0dHJpYnV0ZXM7XG4gICAgICAgIGxldCB0ZXN0ZWRQcm9wZXJ0eVZhbHVlcyA9IDA7XG5cbiAgICAgICAgaWYgKGNvbnRleHRBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gY29udGV4dEF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBjb250ZXh0QXR0cmlidXRlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLmlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVR5cGVzID0gcHJvcGVydHlEYXRhVHlwZXNbYXR0ck5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlID0gUlBUVXRpbC5ub3JtYWxpemVTcGFjaW5nKGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRlc3RlZFByb3BlcnR5VmFsdWVzKys7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFUeXBlcy52YWx1ZXMuaW5kZXhPZihub2RlVmFsdWUpID09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFUeXBlcy52YWx1ZXMuaW5kZXhPZigndW5kZWZpbmVkJykgIT0gLTEgJiYgbm9kZVZhbHVlLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdHJhbnNsYXRlICd1bmRlZmluZWQnIHRvIG1lYW4gJydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmlhLXJlbGV2YW50IGlzIHJlcHJlc2VudGVkIGFzIGEgc3BhY2UgZGVsaW1pdGVkIGxpc3Qgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGRpdGlvbnMsIHJlbW92YWxzLCB0ZXh0OyBvciBhIHNpbmdsZSBjYXRjaC1hbGwgdmFsdWUgYWxsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVR5cGVzLnR5cGUgPT09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlbnNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF0dHJWYWx1ZXMgPSBjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBhbGwgaXMgc3BlY2lmaWVkLCBpdCBjYW5ub3QgaGF2ZSBhbnkgb3RoZXIgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWVzLmxlbmd0aCA+IDEgJiYgYXR0clZhbHVlcy5pbmNsdWRlcyhcImFsbFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyLnB1c2goY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlLnNwbGl0KFwiIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGVBcnIucHVzaChkYXRhVHlwZXMudmFsdWVzLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGFzaCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXR0clZhbHVlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgaW5kaXZpZHVhbCB2YWx1ZSBpcyBub3QgaW4gdGhlIGxpc3Qgb2YgYWxsb3dlZCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJWYWx1ZXNbal0gIT0gXCJcIiAmJiAhZGF0YVR5cGVzLnZhbHVlcy5pbmNsdWRlcyhhdHRyVmFsdWVzW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNoLmhhc093blByb3BlcnR5KGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hbYXR0ck5hbWVdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyLnB1c2goYXR0clZhbHVlc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZUFyci5wdXNoKGRhdGFUeXBlcy52YWx1ZXMudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFyci5wdXNoKGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZS5zcGxpdChcIiBcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZUFyci5wdXNoKGRhdGFUeXBlcy52YWx1ZXMudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGVzICYmIGRhdGFUeXBlcy50eXBlICYmIGRhdGFUeXBlcy50eXBlID09PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaVZhbCA9IHBhcnNlSW50KG5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4oaVZhbCkgfHwgKFwiXCIgKyBpVmFsICE9PSBub2RlVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlcyAmJiBkYXRhVHlwZXMudHlwZSAmJiBkYXRhVHlwZXMudHlwZSA9PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RlY2ltYWxcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZWYWwgPSBwYXJzZUZsb2F0KG5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4oZlZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFyci5wdXNoKG5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGVzICYmIGRhdGFUeXBlcy50eXBlICYmIChkYXRhVHlwZXMudHlwZSA9PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0bXBWID0gbm9kZVZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcFYgIT09IFwidHJ1ZVwiICYmIHRtcFYgIT09IFwiZmFsc2VcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyLnB1c2gobm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnR5cGUgJiYgKGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjc3RyaW5nXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0eVZhbHVlcy0tO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZXRNc2cgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGF0dHJOYW1lQXJyLmxlbmd0aCA9PSAwO1xuICAgICAgICByZXRNc2cucHVzaCh2YWx1ZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICByZXRNc2cucHVzaChhdHRyTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICByZXRNc2cucHVzaChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgLy8gcmV0TXNnLnB1c2ggKGRhdGFUeXBlQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgYXR0ck5hbWVBcnIsICcnLCByZXRNc2cpO1xuICAgICAgICBpZiAodGVzdGVkUHJvcGVydHlWYWx1ZXMgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIHJldE1zZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpiYW5uZXJcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlQmFubmVyTGFuZG1hcmtzX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJiYW5uZXJcXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJiYW5uZXJcXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAvLyBBbHNvLCBjb25zaWRlciBJbXBsaWNpdCByb2xlIGNoZWNraW5nLlxuICAgICAgICBsZXQgbGFuZG1hcmtzID0gUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImJhbm5lclwiLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZHVwZXMgPSBnZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICBkdXBlcyA9IFJQVFV0aWwuZmluZEFyaWFMYWJlbER1cGVzKGxhbmRtYXJrcyk7XG4gICAgICAgICAgICBzZXRDYWNoZShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG15TGFiZWwgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgbXlMYWJlbCAhPT0gXCJcIiAmJiAoIShteUxhYmVsIGluIGR1cGVzKSB8fCBkdXBlc1tteUxhYmVsXSA8PSAxKTtcblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIHJ1bGVDb250ZXh0LCAnJywgJycsIFsgbXlMYWJlbCBdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBhcmlhX2Jhbm5lcl9zaW5nbGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9iYW5uZXJfc2luZ2xlXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXSwgZG9tOmhlYWRlclwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfT25lQmFubmVySW5TaWJsaW5nU2V0X0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9iYW5uZXJfc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9iYW5uZXJfc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2Jhbm5lcl9zaW5nbGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGVyZSBpcyBtb3JlIHRoYW4gb25lIGVsZW1lbnQgd2l0aCBcXFwiYmFubmVyXFxcIiByb2xlIG9uIHRoZSBwYWdlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlcmUgbXVzdCBiZSBvbmx5IG9uZSBlbGVtZW50IHdpdGggXFxcImJhbm5lclxcXCIgcm9sZSBvbiB0aGUgcGFnZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoIVJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImJhbm5lclwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIFJQVFV0aWwuZ2V0U2libGluZ1dpdGhSb2xlSGlkZGVuKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LFxuICAgICAgICAgICAgICAgIFwiYmFubmVyXCIsXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApID09PSBudWxsO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICdyb2xlJywgJycsIFtdKTtcbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfY2hpbGRfdGFiYmFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jaGlsZF90YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfcm9sZV9hbGxvd2VkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTWlzc2luZ0ZvY3VzYWJsZUNoaWxkXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbF9taXNzaW5nX2NoaWxkXCI6IFwiZmFpbF9taXNzaW5nX2NoaWxkXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9jaGlsZF90YWJiYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbWlzc2luZ19jaGlsZFwiOiBcImFyaWFfY2hpbGRfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY2hpbGRfdGFiYmFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiZmFpbF9taXNzaW5nX2NoaWxkXCI6IFwiTm9uZSBvZiB0aGUgZGVzY2VuZGVudCBlbGVtZW50cyB3aXRoIFxcXCJ7MX1cXFwiIHJvbGUgaXMgdGFiYmFibGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJVSSBjb21wb25lbnQgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSB0YWJiYWJsZSBkZXNjZW5kYW50IGZvciBrZXlib2FyZCBhY2Nlc3NcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHJlcXVpcmVzIHByZXNlbnRhdGlvbmFsIGNoaWxkcmVuIG9ubHlcbiAgICAgICAgaWYgKFJQVFV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5zaG91bGRCZVByZXNlbnRhdGlvbmFsQ2hpbGQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIEFuIEFSSUEgbGlzdCBpcyBub3QgaW50ZXJhY3RpdmVcbiAgICAgICAgaWYgKFJQVFV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgeyBcImxpc3RcIjogdHJ1ZSwgXCJyb3dcIjogdHJ1ZSwgXCJyb3dncm91cFwiOiB0cnVlLCBcInRhYmxlXCI6IHRydWUsIFwiZ3JpZFwiOiB0cnVlIH0pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdCBhIHZhbGlkIG1lc3NhZ2UgZm9yIG1vYmlsZSBiZWNhdXNlIGFsbCBlbGVtZW50cyBhcmUgZm9jdXNhYmxlIGluIGlPUyB3aGVuIFZvaWNlT3ZlciBpcyBlbmFibGVkLlxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiY2xhc3NcIikgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikuc3Vic3RyaW5nKDAsIDMpID09IFwibWJsXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pZ25vcmUgZGF0YWxpc3QgZWxlbWVudCBjaGVjayBzaW5jZSBpdCB3aWxsIGJlIHBhcnQgb2YgYSBpbnB1dCBlbGVtZW50IG9yIGhpZGRlbiBieSBkZWZhdWx0XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZGF0YWxpc3QnKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHJvbGVzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAvLyBEZXRlcm1pbmUgaWYgdGhpcyBpcyByZWZlcmVuY2VkIGJ5IGEgY29tYm9ib3guIElmIHNvLCBmb2N1cyBpcyBjb250cm9sbGVkIGJ5IHRoZSBjb21ib2JveFxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIGlkIG9mIHRoZSBlbGVtZW50IGlzIHJlZmVyZW5jZWQgYnkgYW5vdGhlciBlbGVtZW50IHdpdGggXCJhcmlhLWNvbnRyb2xzXCIgb3IgXCJhcmlhLWV4cGFuZGVkXCIgYW5kIHdpdGggY2VydGFpbiByb2xlcy4gSWYgc28sIGZvY3VzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHJlZmVyZW5jaW5nIGVsZW1lbnRcbiAgICAgICAgbGV0IGlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgIGlmIChpZCAmJiBpZC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLyoqaWYgKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihgKlthcmlhLWNvbnRyb2xzPScke2lkfSddW3JvbGU9J2NvbWJvYm94J11gKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCpbYXJpYS1jb250cm9scz0nJHtpZH0nXVthcmlhLWhhc3BvcHVwPSd0cnVlJ10sICpbYXJpYS1jb250cm9scz0nJHtpZH0nXVthcmlhLWV4cGFuZGVkPSd0cnVlJ11gKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBbJ2NvbWJvYm94JywgJ2xpc3Rib3gnLCAnbWVudScsICdtZW51YmFyJywgJ3JhZGlvZ3JvdXAnLCAndHJlZScsICd0cmVlZ3JpZCddO1xuICAgICAgICAgICAgaWYgKGVsZW0gJiYgUlBUVXRpbC5pc1RhYmJhYmxlKGVsZW0pICYmIHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+MCAmJiByb2xlcy5zb21lKHI9PmNvbnRhaW5lcnMuaW5jbHVkZXMocikpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBsZXQgaGFzQXR0cmlidXRlID0gUlBUVXRpbC5oYXNBdHRyaWJ1dGU7XG4gICAgICAgIGxldCByb2xlTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBcIlwiO1xuICAgICAgICBsZXQgaW5TY29wZSA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm9sZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuY29udGFpbmVycy5pbmNsdWRlcyhyb2xlc1tqXSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGlzYWJsZWQgPSBoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsICdhcmlhLWRpc2FibGVkJykgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpIDogJyc7XG4gICAgICAgICAgICAgICAgaWYgKGRpc2FibGVkICE9ICd0cnVlJyAmJiAhaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JykgJiYgIVJQVFV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlcUNoaWxkcmVuID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXS5yZXFDaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcUNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpblNjb3BlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwID0gXCJkZXNjZW5kYW50OjoqW1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXFDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwICs9IFwiQHJvbGU9J1wiICsgcmVxQ2hpbGRyZW5baV0gKyBcIicgb3IgXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB4cCA9IHhwLnN1YnN0cmluZygwLCB4cC5sZW5ndGggLSA0KSArICddJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdCA9IGRvYy5ldmFsdWF0ZSh4cCwgcnVsZUNvbnRleHQsIFJQVFV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHI6IEVsZW1lbnQgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAociAmJiAhcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAxLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0geHBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmlzVGFiYmFibGUocik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXF1aXJlZCBjaGlsZCBpcyBub3QgZm9jdXNhYmxlIHZpYSB0YWJpbmRleC4gIFNlZSBpZiB0aGVyZSBpcyBhIGdyYW5kY2hpbGQgdGhhdCBpcyBmb2N1c2FibGUgYnkgZGVmYXVsdCBvciBieSB0YWJpbmRleC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHAyID0gXCJkZXNjZW5kYW50OjoqXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdDIgPSBkb2MuZXZhbHVhdGUoeHAyLCByLCBSUFRVdGlsLmRlZmF1bHROU1Jlc29sdmVyLCAwIC8qIFhQYXRoUmVzdWx0LkFOWV9UWVBFICovLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyMiAmJiAhcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAxLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5pc1RhYmJhYmxlKHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVOYW1lQXJyID0gci5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lID0gci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0geHBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgbGV0IHJldFRva2VuMSA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcmV0VG9rZW4yID0gbmV3IEFycmF5KCk7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhlIGFycmF5cy9zdHJpbmdzIGFyZSBlbXB0eSwgdGhhdCBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIHZpb2xhdGlvbiBzbyB3ZSBjYW4gcmVzZXQgaXQgYmFjayB0byBwYXNzZWQsIHRoZSByZWFzb24gZm9yIHRoaXNcbiAgICAgICAgLy8gaXMgdGhhdCB3ZSBhcmUgc2V0dGluZyBwYXNzZWQ9ZmFsc2Ugd2hpbGUgd2UgcGVyZm9ybSBhIGxvb3Agd2hpY2ggY2F1c2VzIHZpb2xhdGlvbiB0byB0cmlnZ2VyIGV2ZW4gaWYgdGhlcmUgaXMgbm8gaXNzdWVzLiBJbnN0ZWFkIG9mXG4gICAgICAgIC8vIHVwZGF0aW5nIHRoZSB3aG9sZSBydWxlIHRvIHN3aXRjaCBmcm9tIHVzaW5nIHBhc3NlZCBpbiB0aGF0IHdheSBzaW1wbHkgZG8gdGhlIGNoZWNrIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgIGlmIChub2RlTmFtZS5sZW5ndGggPiAwICYmIHJvbGVOYW1lQXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldFRva2VuMS5wdXNoKG5vZGVOYW1lKTtcbiAgICAgICAgICAgIHJldFRva2VuMi5wdXNoKHJvbGVOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3JldFRva2VuMSwgcmV0VG9rZW4yXSk7XG4gICAgICAgIGlmICghaW5TY29wZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9taXNzaW5nX2NoaWxkXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfY2hpbGRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jaGlsZF92YWxpZFwiLFxuICAgIC8vY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIC8vZGVwZW5kZW5jaWVzOiBbXCJScHRfQXJpYV9WYWxpZFJvbGVcIl0sXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX3ZhbGlkXCIsIFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkXCJdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jaGlsZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NcIjogXCJhcmlhX2NoaWxkX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9ub19jaGlsZFwiOiBcImFyaWFfY2hpbGRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfY2hpbGRcIjogXCJhcmlhX2NoaWxkX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBlbGVtZW50IHdpdGggYSBBUklBIHJvbGUgbXVzdCBvd24gYSByZXF1aXJlZCBjaGlsZFwiLFxuICAgICAgICAgICAgXCJQYXNzXCI6IFwiQW4gZWxlbWVudCB3aXRoIGEgQVJJQSByb2xlIG93bnMgYSByZXF1aXJlZCBjaGlsZFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vX2NoaWxkXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCByb2xlIFxcXCJ7MH1cXFwiIGRvZXMgbm90IG93biBhbnkgY2hpbGQgZWxlbWVudCB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIHJvbGUocyk6IFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9jaGlsZFwiOiBcIlRoZSBlbGVtZW50IHdpdGggcm9sZSBcXFwiezB9XFxcIiBvd25zIHRoZSBjaGlsZCBlbGVtZW50IHdpdGggdGhlIHJvbGUgXFxcInsxfVxcXCIgdGhhdCBpcyBub3Qgb25lIG9mIHRoZSBhbGxvd2VkIHJvbGUocyk6IFxcXCJ7Mn1cXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IFZlcmlmeSBtYXBwaW5nXG4gICAgYWN0OiBbXCJiYzRhNzVcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCByZXF1aXJlcyBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiBvbmx5XG4gICAgICAgIGlmIChSUFRVdGlsLmNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSBcbiAgICAgICAgICAgIHJvbGVzID0gIFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIC8vaWdub3JlIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbnkgZXhwbGljaXQgb3IgaW1wbGljaXQgcm9sZSwgc2hvdWxkbid0IGhhcHBlblxuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIGlnbm9yZSBpZiB0aGUgZWxlbWVudCBjb250YWlucyBub25lIG9yIHByZXNlbnRhdGlvbiByb2xlXG4gICAgICAgIGxldCBwcmVzZW50YXRpb25Sb2xlcyA9IFtcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl07XG4gICAgICAgIGNvbnN0IGZvdW5kID0gcm9sZXMuc29tZShyPT4gcHJlc2VudGF0aW9uUm9sZXMuaW5jbHVkZXMocikpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vICBGb3IgY29tYm9ib3gsIHdlIGhhdmUgZzExOTMgLi4uIGcxMTk5IHRvIGNoZWNrIHRoZSB2YWx1ZXMgZXRjLlxuICAgICAgICAvLyAgV2UgZG9uJ3Qgd2FudCB0byB0cmlnZ2VyIDExNTIgYWdhaW4uIFNvLCB3ZSBieXBhc3MgaXQgaGVyZS5cbiAgICAgICAgaWYgKHJvbGVzLmluY2x1ZGVzKFwiY29tYm9ib3hcIikpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGxldCByZXF1aXJlZENoaWxkUm9sZXMgPSBSUFRVdGlsLmdldFJlcXVpcmVkQ2hpbGRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIC8vIGEgJ2dyb3VwJyByb2xlIGlzIGFsbG93ZWQgYnV0IG5vdCByZXF1aXJlZCBmb3Igc29tZSBlbGVtZW50cyBzbyByZW1vdmUgaXQgaWYgZXhpc3RzXG4gICAgICAgIGlmIChyZXF1aXJlZENoaWxkUm9sZXMuaW5jbHVkZXMoJ2dyb3VwJykpIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHJlcXVpcmVkQ2hpbGRSb2xlcy5pbmRleE9mKCdncm91cCcpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAgICAgcmVxdWlyZWRDaGlsZFJvbGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8qKiAgXG4gICAgICAgICAqIGlnbm9yZSBpZiBhIHJvbGUgZG9lc24ndCByZXF1aXJlIGEgY2hpbGQgd2l0aCBhbnkgc3BlY2lmaWMgcm9sZVxuICAgICAgICAgKiB0aGUgcmV2ZXJzZSBtaWdodCBiZSBub3QgdHJ1ZSAtIHBhcmVudCB3aWxsIGJlIGNoZWNrZWQgaW4gUnB0X0FyaWFfUmVxdWlyZWRQYXJlbnRfTmF0aXZlX0hvc3RfU2VtYXRpY3MgcnVsZVxuICAgICAgICAqL1xuICAgICAgICAgaWYgKHJlcXVpcmVkQ2hpbGRSb2xlcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGdldCBhbGwgdGhlIGNoaWxkcmVuIGZyb20gYWNjZXNzaWJpbGl0eSB0cmVlLCBcbiAgICAgICAgLy8gaW5jbHVkaW5nIG9uZXMgd2l0aCBhcmlhLW93bnMgICAgXG4gICAgICAgIGxldCBkaXJlY3RBVENoaWxkcmVuID0gUlBUVXRpbC5nZXREaXJlY3RBVENoaWxkcmVuKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIGlmICghZGlyZWN0QVRDaGlsZHJlbiB8fCBkaXJlY3RBVENoaWxkcmVuLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAvLyB0aGUgZWxlbWVudCB3aXRoIGF0IGxlYXN0IG9uZSByZXF1aXJlZCByb2xlIGRvc2VuJ3QgY29udGFpbiBhbnkgYWNjZXNzaWJsZSBjaGlsZFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBXaGVuIGEgd2lkZ2V0IGlzIG1pc3NpbmcgcmVxdWlyZWQgb3duZWQgZWxlbWVudHMgZHVlIHRvIHNjcmlwdCBleGVjdXRpb24gb3IgbG9hZGluZywgXG4gICAgICAgICAgICAgKiBhdXRob3JzIE1VU1QgbWFyayBhIGNvbnRhaW5pbmcgZWxlbWVudCB3aXRoICdhcmlhLWJ1c3knIGVxdWFsIHRvIHRydWUuIFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgbGV0IGJ1c3kgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWJ1c3lcIik7XG4gICAgICAgICAgICAgaWYgKCFidXN5IHx8IGJ1c3kgIT09ICd0cnVlJykge1xuICAgICAgICAgICAgICAgICBsZXQgcmV0VG9rZW4gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJlcXVpcmVkQ2hpbGRSb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX25vX2NoaWxkXCIsIHJldFRva2VuKTtcbiAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgIC8vIGl0J3MgJ2J1c3knIGxvYWRpbmcsIGlnbm9yZSBpdCBcbiAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHZpb2xhdGVFbGVtUm9sZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgZm9yIChsZXQgaj0wOyBqIDwgZGlyZWN0QVRDaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkUm9sZXMgPSBSUFRVdGlsLmdldFJvbGVzKGRpcmVjdEFUQ2hpbGRyZW5bal0sIGZhbHNlKTtcbiAgICAgICAgICAgIC8vIGlmIGV4cGxpY2l0IHJvbGUgZG9lc24ndCBleGlzdCwgZ2V0IHRoZSBpbXBsaWNpdCBvbmVcbiAgICAgICAgICAgIGlmICghY2hpbGRSb2xlcyB8fCBjaGlsZFJvbGVzLmxlbmd0aCA9PSAwKSBcbiAgICAgICAgICAgICAgICBjaGlsZFJvbGVzID0gIFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKGRpcmVjdEFUQ2hpbGRyZW5bal0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoY2hpbGRSb2xlcyAmJiBjaGlsZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiB3aGVuIG11bHRpcGxlIHJvbGVzIGFyZSBzcGVjaWZpZWQgYXMgcmVxdWlyZWQgb3duZWQgZWxlbWVudHMgZm9yIGEgcm9sZSwgYXQgbGVhc3Qgb25lIGluc3RhbmNlIG9mIG9uZSByZXF1aXJlZCBvd25lZCBlbGVtZW50IGlzIGV4cGVjdGVkLiBcbiAgICAgICAgICAgICAgICAgKiB0aGUgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCByZXF1aXJlIGFuIGluc3RhbmNlIG9mIGVhY2ggb2YgdGhlIGxpc3RlZCBvd25lZCByb2xlcy5cbiAgICAgICAgICAgICAgICAgKiB0aGVyZWZvcmUsIHRoZSByZXF1aXJlbWVudCBpcyBtZXQgaWYgaXQgaGFzIGFueSBvbmUgb2YgdGhlIHJlcXVpcmVkIHJvbGVzLiAgIFxuICAgICAgICAgICAgICAgICAqLyAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZCA9IGNoaWxkUm9sZXMuc29tZShyPT4gcmVxdWlyZWRDaGlsZFJvbGVzLmluY2x1ZGVzKHIpKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSBcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZUVsZW1Sb2xlcy5wdXNoKGNoaWxkUm9sZXMuam9pbihcIiwgXCIpKTsgXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZWxlbWVudCBzaW5jZSBpdCdzIG5vdCBzZW1hbnRpYywgc2hvdWxkbid0IGhhcHBlbiBcbiAgICAgICAgICAgIH0gICAgIFxuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgaWYgKHZpb2xhdGVFbGVtUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHJldFZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmlvbGF0ZUVsZW1Sb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHZpb2xhdGVFbGVtUm9sZXNbaV0pO1xuICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocmVxdWlyZWRDaGlsZFJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgcmV0VmFsdWVzLnB1c2goUnVsZUZhaWwoXCJGYWlsX2ludmFsaWRfY2hpbGRcIiwgcmV0VG9rZW4pKTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsdWVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21wbGVtZW50YXJ5XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUNvbXBsZW1lbnRhcnlMYW5kbWFya3NfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJjb21wbGVtZW50YXJ5XFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJjb21wbGVtZW50YXJ5XCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkdXBlcyA9IGdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICBkdXBlcyA9IFJQVFV0aWwuZmluZEFyaWFMYWJlbER1cGVzKGxhbmRtYXJrcyk7XG4gICAgICAgICAgICBzZXRDYWNoZShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBteUxhYmVsID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIG15TGFiZWwgIT09IFwiXCIgJiYgKCEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMSk7XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBydWxlQ29udGV4dCwgJycsICcnLCBbIG15TGFiZWwgXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdLCBkb206YXNpZGVcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0NvbXBsZW1lbnRhcnlMYW5kbWFya0xhYmVsX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJjb21wbGVtZW50YXJ5XFxcIiByb2xlIGRvZXMgbm90IGhhdmUgYSB2aXNpYmxlIGxhYmVsXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgc2hvdWxkIGhhdmUgYSB2aXNpYmxlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKCFSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb21wbGVtZW50YXJ5XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KFxuICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICBcImFyaWEtbGFiZWxsZWRieVwiXG4gICAgICAgICk7XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tcGxlbWVudGFyeVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfQ29tcGxlbWVudGFyeVJlcXVpcmVkTGFiZWxfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSBlbGVtZW50IHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgZG9lcyBub3QgaGF2ZSBhbiBhY2Nlc3NpYmxlIG5hbWVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBlbGVtZW50IHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgbXVzdCBoYXZlIGFuIGFjY2Vzc2libGUgbmFtZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9jb250ZW50X2luX2xhbmRtYXJrOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY29udGVudF9pbl9sYW5kbWFya1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudF9OYXRpdmVfSG9zdF9TZW1hdGljc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfY29udGVudF9pbl9sYW5kbWFyay5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29udGVudF9pbl9sYW5kbWFyay5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb250ZW50X2luX2xhbmRtYXJrLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQ29udGVudCBpcyBub3Qgd2l0aGluIGEgbGFuZG1hcmsgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFsbCBjb250ZW50IG11c3QgcmVzaWRlIHdpdGhpbiBhbiBlbGVtZW50IHdpdGggYSBsYW5kbWFyayByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlkXCI6IFtcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBsZXQgcGFyYW1zID0gZ2V0Q2FjaGUoY29udGV4dC5kb20ubm9kZS5vd25lckRvY3VtZW50LCBcImFyaWFfY29udGVudF9pbl9sYW5kbWFya1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFwYXJhbXMpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICBsYW5kbWFya3M6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFtcImJhbm5lclwiLCBcImNvbXBsZW1lbnRhcnlcIiwgXCJjb250ZW50aW5mb1wiLCBcImZvcm1cIiwgXCJtYWluXCIsIFwibmF2aWdhdGlvblwiLCBcInJlZ2lvblwiLCBcInNlYXJjaFwiXSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwb3NzaWJsZU9ycGhhbmVkV2lkZ2V0czoge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogW1wiYnV0dG9uXCIsIFwiY29tYm9ib3hcIiwgXCJjaGVja2JveFwiLCBcImdyaWRcIiwgXCJoZWFkaW5nXCIsIFwibGlua1wiLCBcImxpc3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwicHJvZ3Jlc3NiYXJcIiwgXCJyYWRpb1wiLCBcInRhYmxpc3RcIiwgXCJ0ZXh0Ym94XCIsIFwidG9vbGJhclwiLCBcInRyZWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHJlZWdyaWRcIlxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBvc3NpYmxlT3JwaGFuZWRFbGVtZW50czoge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogW1wicFwiLCBcInRhYmxlXCIsIFwiaW5wdXRcIiwgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiLCBcImJ1dHRvblwiLCBcImFcIiwgXCJvbFwiLCBcInVsXCIsIFwiZGxcIiwgXCJoMVwiLCBcImgyXCIsIFwiaDNcIiwgXCJoNFwiLCBcImg1XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImg2XCIsIFwiZW1iZWRcIiwgXCJvYmplY3RcIiwgXCJhcmVhXCJcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBub0xhbmRtYXJrZWRSb2xlczoge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSByb2xlcyBkb24ndCByZXF1aXJlIGxhbmRtYXJrc1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogW1wiYWxlcnRcIiwgXCJhbGVydGRpYWxvZ1wiLCBcImRpYWxvZ1wiLCBcInRvb2x0aXBcIl0sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbWFwTGFuZG1hcmtzOiB7fSxcbiAgICAgICAgICAgICAgICBtYXBQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0czoge30sXG4gICAgICAgICAgICAgICAgbWFwUG9zc2libGVPcnBoYW5lZEVsZW1lbnRzOiB7fSxcbiAgICAgICAgICAgICAgICBtYXBOb0xhbmRtYXJrZWRSb2xlczoge31cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENvbnZlcnQgYXJyYXlzIHRvIG1hcHNcbiAgICAgICAgICAgIHBhcmFtcy5tYXBMYW5kbWFya3MgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLmxhbmRtYXJrcy52YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5tYXBMYW5kbWFya3NbcGFyYW1zLmxhbmRtYXJrcy52YWx1ZVtpXV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwYXJhbXMubWFwUG9zc2libGVPcnBoYW5lZFdpZGdldHMgPSB7fVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMucG9zc2libGVPcnBoYW5lZFdpZGdldHMudmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMubWFwUG9zc2libGVPcnBoYW5lZFdpZGdldHNbcGFyYW1zLnBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzLnZhbHVlW2ldXSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkRWxlbWVudHMgPSB7fVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMucG9zc2libGVPcnBoYW5lZEVsZW1lbnRzLnZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRFbGVtZW50c1twYXJhbXMucG9zc2libGVPcnBoYW5lZEVsZW1lbnRzLnZhbHVlW2ldXSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcmFtcy5tYXBOb0xhbmRtYXJrZWRSb2xlcyA9IHt9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5ub0xhbmRtYXJrZWRSb2xlcy52YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5tYXBOb0xhbmRtYXJrZWRSb2xlc1twYXJhbXMubm9MYW5kbWFya2VkUm9sZXMudmFsdWVbaV1dID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2V0Q2FjaGUoY29udGV4dC5kb20ubm9kZS5vd25lckRvY3VtZW50LCBcImFyaWFfY29udGVudF9pbl9sYW5kbWFya1wiLCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCAgLy8gYXZvaWQgZGlhZ25vc2luZyBnMTE1NyBmb3Igbm9uLXZpc2libGUgbm9kZXNcbiAgICAgICAgICAgIChWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMuaW5kZXhPZihub2RlTmFtZSkgPiAtMSkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbGVtc1dpdGhvdXRDb250ZW50ID0gW1wiYXJlYVwiLCBcImlucHV0XCIsIFwiZW1iZWRcIiwgXCJidXR0b25cIiwgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiXTtcbiAgICAgICAgaWYgKCFSUFRVdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCkgJiYgLy9vbmx5IHRyaWdnZXIgdGhlIHJ1bGUgb24gZWxlbWVudHMgdGhhdCBoYXZlIGNvbnRlbnRcbiAgICAgICAgICAgIGVsZW1zV2l0aG91dENvbnRlbnQuaW5kZXhPZihub2RlTmFtZSkgPT09IC0xKSB7IC8vIGEgZmV3IGVsZW1zIHdpaG91dCBjb250ZW50IHNob3VsZCBub3QgYmUgc2tpcHBlZFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2hvcnQgY2lyY3VpdCBmb3IgbGF5b3V0IHRhYmxlc1xuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJ0YWJsZVwiICYmIFJQVFV0aWwuaXNMYXlvdXRUYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgaXQgaXMgYSBwb3NzaWJsZSBvcnBoYW5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBpc1Bvc3NpYmxlT3JwaGFuZWRXaWRnZXQgPSBSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0cywgdHJ1ZSk7XG4gICAgICAgIC8vZXhjbHVkZSA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cInh5ei5jc3NcIj4gaW4gdGhlIDxoZWFkPiBhbmQgPGJvZHk+KCM2MDgpXG4gICAgICAgIC8vaGF2aW5nIGxpbmsgaW4gdGhlIGhlYWQgY291bGQgY2F1c2UgbG90IG9mIHZpb2xhaW9ucyAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2xpbmsnKSB7XG4gICAgICAgICAgICBpc1Bvc3NpYmxlT3JwaGFuZWRXaWRnZXQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpc1Bvc3NpYmxlT3JwaGFuZWRFbGVtZW50ID0gbm9kZU5hbWUgaW4gcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRFbGVtZW50cztcbiAgICAgICAgaWYgKGlzUG9zc2libGVPcnBoYW5lZFdpZGdldCB8fCBpc1Bvc3NpYmxlT3JwaGFuZWRFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBTZWUgaWYgYW5jZXN0b3IgaGFzIGxhbmRtYXJrIHJvbGVzIG9yIGltcGxpY2l0IGxhbmQgbWFyayByb2xlc1xuICAgICAgICAgICAgbGV0IHBhcmVudFJvbGVzID0gY29udGV4dEhpZXJhcmNoaWVzW1wiYXJpYVwiXS5tYXAoaW5mbyA9PiBpbmZvLnJvbGUpO1xuICAgICAgICAgICAgcGFzc2VkID0gcGFyZW50Um9sZXMuZmlsdGVyKHJvbGUgPT4gcm9sZSBpbiBwYXJhbXMubWFwTGFuZG1hcmtzKS5sZW5ndGggPiAwXG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIERvbid0IGZhaWwgZWxlbWVudHMgd2hlbiBhIHBhcmVudCBvciBzaWJsaW5nIGhhcyBmYWlsZWQgLSBjYXVzZXMgdG9vIG1hbnkgbWVzc2FnZXMuXG4gICAgICAgICAgICAgICAgbGV0IHdhbGtFbGVtZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZ2V0Q2FjaGUod2Fsa0VsZW1lbnQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50XCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0VsZW1lbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudCh3YWxrRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gcnVsZUNvbnRleHQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZ2V0Q2FjaGUod2Fsa0VsZW1lbnQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50XCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgd2Fsa0VsZW1lbnQgPSB3YWxrRWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gcnVsZUNvbnRleHQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiB3YWxrRWxlbWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGdldENhY2hlKHdhbGtFbGVtZW50LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gd2Fsa0VsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50XCIsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHRyaWdnZXIgcnVsZSBpZiBlbGVtZW50IGlzIGEgc3RhbmQtYWxvbmUgd2lkZ2V0XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGdldENhY2hlKHJ1bGVDb250ZXh0LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudF9Ob1RyaWdnZXJcIiwgZmFsc2UpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIHBhcmFtcy5tYXBOb0xhbmRtYXJrZWRSb2xlcywgdHJ1ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgcGFyYW1zLm1hcE5vTGFuZG1hcmtlZFJvbGVzLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRDYWNoZShydWxlQ29udGV4dCwgXCJScHRfQXJpYV9PcnBoYW5lZENvbnRlbnRfTm9UcmlnZ2VyXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBbXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29udGVudGluZm9cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlQ29udGVudGluZm9MYW5kbWFya3NfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAvLyBBbHNvLCBjb25zaWRlciBJbXBsaWNpdCByb2xlIGNoZWNraW5nLlxuICAgICAgICBsZXQgbGFuZG1hcmtzID0gUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkdXBlcyA9IGdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFkdXBlcykge1xuICAgICAgICAgICAgZHVwZXMgPSBSUFRVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgc2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImFyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG15TGFiZWwgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgbXlMYWJlbCAhPT0gXCJcIiAmJiAoIShteUxhYmVsIGluIGR1cGVzKSB8fCBkdXBlc1tteUxhYmVsXSA8PSAxKTtcblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIHJ1bGVDb250ZXh0LCAnJywgJycsIFsgbXlMYWJlbCBdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBhcmlhX2NvbnRlbnRpbmZvX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbnRlbnRpbmZvX21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV0sIGRvbTpmb290ZXIsIGRvbTphZGRyZXNzXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9Db250ZW50aW5mb1dpdGhOb01haW5fSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9jb250ZW50aW5mb19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbnRlbnRpbmZvX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb250ZW50aW5mb19taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZSBpcyBwcmVzZW50IHdpdGhvdXQgYW4gZWxlbWVudCB3aXRoIFxcXCJtYWluXFxcIiByb2xlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gZWxlbWVudCB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZSBpcyBvbmx5IHBlcm1pdHRlZCB3aXRoIGFuIGVsZW1lbnQgd2l0aCBcXFwibWFpblxcXCIgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vY29uc2lkZXIgaW1wbGljaXQgcm9sZVxuICAgICAgICBpZiAoIVJQVFV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNvbnRlbnRpbmZvXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcIm1haW5cIixcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICkubGVuZ3RoID4gMDtcblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICdyb2xlJywgJycsIFtdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9jb250ZW50aW5mb19zaW5nbGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb250ZW50aW5mb19zaW5nbGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdLCBkb206Zm9vdGVyLCBkb206YWRkcmVzc1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVDb250ZW50aW5mb0luU2libGluZ1NldF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfY29udGVudGluZm9fc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9jb250ZW50aW5mb19zaW5nbGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY29udGVudGluZm9fc2luZ2xlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgZm91bmQgb24gYSBwYWdlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBwYWdlLCBkb2N1bWVudCBvciBhcHBsaWNhdGlvbiBzaG91bGQgb25seSBoYXZlIG9uZSBlbGVtZW50IHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vZmluZCBvdXQgaWYgPGZvb3Rlcj4gZWxlbWVudCBoYXMgc2libGluZ3MgYXMgPGZvb3Rlcj4gaGFzIGltcGxpY2l0IGNvbnRlbnRpbmZvIHJvbGVcbiAgICAgICAgaWYgKCFSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb250ZW50aW5mb1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gIVJQVFV0aWwuZ2V0U2libGluZ1dpdGhSb2xlSGlkZGVuKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX2Rlc2NlbmRhbnRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX3ZhbGlkXCJdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9jaGlsZF9pbXBsaWNpdF9yb2xlXCI6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9jaGlsZF9leHBsaWNpdF9yb2xlXCI6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJCcm93c2VycyBpZ25vcmUgdGhlIGV4cGxpY2l0IGFuZCBpbXBsaWNpdCBBUklBIHJvbGVzIG9mIHRoZSBkZXNjZW5kYW50cyBvZiBjZXJ0YWluIGVsZW1lbnRzXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCBjb250YWlucyB2YWxpZCBkZXNjZW5kYW50c1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfY2hpbGRfaW1wbGljaXRfcm9sZVwiOiBcIlRoZSBlbGVtZW50IHdpdGggcm9sZSBcXFwiezB9XFxcIiBjb250YWlucyBkZXNjZW5kYW50cyB3aXRoIGltcGxpY2l0IHJvbGVzIFxcXCJ7MX1cXFwiIHdoaWNoIGFyZSBpZ25vcmVkIGJ5IGJyb3dzZXJzXCIsXG4gICAgICAgICAgICBcImZhaWxfY2hpbGRfZXhwbGljaXRfcm9sZVwiOiBcIlRoZSBlbGVtZW50IHdpdGggcm9sZSBcXFwiezB9XFxcIiBjb250YWlucyBkZXNjZW5kYW50cyB3aXRoIHJvbGVzIFxcXCJ7MX1cXFwiIHdoaWNoIGFyZSBpZ25vcmVkIGJ5IGJyb3dzZXJzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgLy8gVE9ETzogQUNUOiBWZXJpZnkgbWFwcGluZ1xuICAgIGFjdDogW1wiMzA3bjV6XCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBSUFRVdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCByZXF1aXJlIHByZXNlbnRhdGlvbmFsIGNoaWxkcmVuIG9ubHlcbiAgICAgICAgaWYgKCFSUFRVdGlsLmNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSBcbiAgICAgICAgICAgIHJvbGVzID0gIFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIC8vaWdub3JlIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbnkgZXhwbGljaXQgb3IgaW1wbGljaXQgcm9sZSwgc2hvdWxkbid0IGhhcHBlblxuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gZ2V0IGFsbCB0aGUgY2hpbGRyZW4gZnJvbSBhY2Nlc3NpYmlsaXR5IHRyZWUsIFxuICAgICAgICAvLyBpbmNsdWRpbmcgb25lcyB3aXRoIGFyaWEtb3ducyAgICBcbiAgICAgICAgbGV0IGRpcmVjdEFUQ2hpbGRyZW4gPSBSUFRVdGlsLmdldERpcmVjdEFUQ2hpbGRyZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGlyZWN0QVRDaGlsZHJlbiAmJiBkaXJlY3RBVENoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IHdpdGggYXQgbGVhc3Qgb25lIG5vbi1wcmVzZW50YXRpb25hbCBjaGlsZHJlblxuICAgICAgICAgICAgbGV0IGV4cGxpY2l0Um9sZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICBmb3IgKGxldCBqPTA7IGogPCBkaXJlY3RBVENoaWxkcmVuLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIDxpbWc+IGFuZCA8c3ZnPlxuICAgICAgICAgICAgICAgIGNvbnN0IHRhZyA9IGRpcmVjdEFUQ2hpbGRyZW5bal0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAodGFnID09PSAnaW1nJyB8fCB0YWcgPT09ICdzdmcnKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBnZXQgZXhwbGljaXQgcm9sZSBpZiBleGlzdHNcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRSb2xlcyA9IFJQVFV0aWwuZ2V0Um9sZXMoZGlyZWN0QVRDaGlsZHJlbltqXSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZFJvbGVzICYmIGNoaWxkUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBleHBsaWNpdFJvbGVzLnB1c2goY2hpbGRSb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCBpbXBsaWNpdCByb2xlIGlmIGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICBjaGlsZFJvbGVzID0gIFJQVFV0aWwuZ2V0SW1wbGljaXRSb2xlKGRpcmVjdEFUQ2hpbGRyZW5bal0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRSb2xlcyAmJiBjaGlsZFJvbGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGVzLnB1c2goY2hpbGRSb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChleHBsaWNpdFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgcmV0VmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZXhwbGljaXRSb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmV0VG9rZW4gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKGV4cGxpY2l0Um9sZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICByZXRWYWx1ZXMucHVzaChSdWxlRmFpbChcImZhaWxfY2hpbGRfZXhwbGljaXRfcm9sZVwiLCByZXRUb2tlbikpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByZXRWYWx1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBpbXBsaWNpdFJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2goaW1wbGljaXRSb2xlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbHVlcy5wdXNoKFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfY2hpbGRfaW1wbGljaXRfcm9sZVwiLCByZXRUb2tlbikpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7ICAgICAgIFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX2RvY3VtZW50X2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2RvY3VtZW50X2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpkb2N1bWVudFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVEb2N1bWVudFJvbGVzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2RvY3VtZW50X2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIGEgXFxcImRvY3VtZW50XFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbGwgZWxlbWVudHMgd2l0aCBhIFxcXCJkb2N1bWVudFxcXCIgcm9sZSBtdXN0IGhhdmUgdW5pcXVlIGxhYmVsc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJkb2N1bWVudFwiLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZHVwZXMgPSBnZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZHVwZXMpIHtcbiAgICAgICAgICAgIGR1cGVzID0gUlBUVXRpbC5maW5kQXJpYUxhYmVsRHVwZXMobGFuZG1hcmtzKTtcbiAgICAgICAgICAgIHNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX2RvY3VtZW50X2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBteUxhYmVsID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIG15TGFiZWwgPT09IFwiXCIgfHwgIShteUxhYmVsIGluIGR1cGVzKSB8fCBkdXBlc1tteUxhYmVsXSA8PSAxO1xuXG4gICAgICAgIC8vIHJldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIHJ1bGVDb250ZXh0LCAnJywgJycsIFsgbXlMYWJlbCBdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBhcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW29uY2xpY2tdLGRvbToqW29uYmx1cl0sIGRvbToqW29uZGJsY2xpY2tdLCBkb206KltvbmZvY3VzXSwgZG9tOipbb25rZXlkb3duXSxkb206KltvbmtleXByZXNzXSwgZG9tOipbb25rZXl1cF0sIGRvbToqW29ubW91c2Vkb3duXSwgZG9tOipbb25tb3VzZXVwXSwgZG9tOipbb25tb3VzZW1vdmVdLCBkb206Kltvbm1vdXNlb3V0XSwgZG9tOipbb25tb3VzZW92ZXJdLCBkb206KltvbnJlc2l6ZV0sIGRvbToqW29uY2hhbmdlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfRXZlbnRIYW5kbGVyTWlzc2luZ1JvbGVfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSA8ezB9PiBlbGVtZW50IHdpdGggJ3sxfScgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIEFSSUEgcm9sZSBzcGVjaWZpZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50cyB3aXRoIGV2ZW50IGhhbmRsZXJzIG11c3QgaGF2ZSBhIHZhbGlkIEFSSUEgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciB0aGlzIGZvciBTVkcgZWxlbWVudCBmb3Igbm93IHVudGlsIGEgZGV0ZXJtaW5hdGlvbiBpcyBtYWRlIChieSBSaWNoKVxuICAgICAgICAvLyB0byBzdXBwb3J0IFNWRyBhdCBhIHBvaW50IHdoZW4gdGhlIFNWRyBhMTF5IHNwZWMgaXMgcmVhZHkuXG4gICAgICAgIGlmIChSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcInN2Z1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvL3RoaXMgcnVsZSBpcyBwYXNzZWQgaWYgYSBlbGVtZW50IGhhcyBhdHRyaWJ1dCByb2xlIFxuICAgICAgICAvL2Fsc28sIHBhc3NlZCBvZiBlbGVtZW50IGhhcyBhbnkgaW1wbGljaXQgcm9sZXMuIFxuICAgICAgICBpZiAoUlBUVXRpbC5oYXNBbnlSb2xlKHJ1bGVDb250ZXh0LCB0cnVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9wYXNzIGlmIHRoaXMgZWxlbWVudCBpcyByZWNlaXZlZCBmb2N1cyBieSBkZWZhdWx0XG4gICAgICAgIGlmIChSUFRVdGlsLmlzZm9jdXNhYmxlQnlEZWZhdWx0KHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy92YWxpZGF0ZSBpZiB0aGlzIGVsZW1lbnQgaGFzIGFueSBvZiB0aGUgZ2l2ZW4gZXZlbnQgaGFuZGxlcidzXG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4xLnB1c2gocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGxldCBldmVudEFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICAvLyBGcm9tIFdDQUcyMF9TY3JpcHRfVXNlVzNDRG9tRnVuY3Rpb25zXG4gICAgICAgIC8vbGV0IGV2ZW50cyA9IFtcIm9uYmx1clwiLCBcIm9uZm9jdXNcIiwgXCJvbmNoYW5nZVwiLCBcIm9uY2xpY2tcIiwgXCJvbmNvbnRleHRtZW51XCIsIFwib25kYmxjbGlja1wiLCBcIm9ua2V5ZG93blwiLFxuICAgICAgICAvLyAgICAgICAgICAgICAgXCJvbmtleXByZXNzXCIsIFwib25rZXl1cFwiLCBcIm9ubG9hZFwiLCBcIm9ubW91c2Vkb3duXCIsIFwib25tb3VzZXVwXCIsIFwib25tb3VzZW1vdmVcIiwgXCJvbm1vdXNlb3V0XCIsXG4gICAgICAgIC8vICAgICAgICAgICAgICBcIm9ubW91c2VvdmVyXCIsIFwib25tb3VzZXdoZWVsXCIsIFwib25yZXNldFwiLCBcIm9ucGFzdGVcIiwgXCJvbnJlc2l6ZVwiLCBcIm9uc2Nyb2xsXCIsXG4gICAgICAgIC8vICAgICAgICAgICAgICBcIm9uc2VsZWN0XCIsIFwib25zdWJtaXRcIiwgXCJvbmFjdGl2YXRlXCIsIFwib25kZWFjdGl2YXRlXCIsIFwib25tb3VzZWVudGVyXCIsIFwib25tb3VzZWxlYXZlXCJdO1xuICAgICAgICBsZXQgZXZlbnRzID0gW1wib25ibHVyXCIsIFwib25mb2N1c1wiLCBcIm9uY2hhbmdlXCIsIFwib25jbGlja1wiLCBcIm9uZGJsY2xpY2tcIiwgXCJvbmtleWRvd25cIixcbiAgICAgICAgICAgIFwib25rZXlwcmVzc1wiLCBcIm9ua2V5dXBcIiwgXCJvbm1vdXNlZG93blwiLCBcIm9ubW91c2V1cFwiLCBcIm9ubW91c2Vtb3ZlXCIsIFwib25tb3VzZW91dFwiLFxuICAgICAgICAgICAgXCJvbm1vdXNlb3ZlclwiLCBcIm9ucmVzaXplXCJcbiAgICAgICAgXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoZXZlbnRzW2ldKSlcbiAgICAgICAgICAgICAgICBldmVudEFyci5wdXNoKGV2ZW50c1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjIucHVzaChldmVudEFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChmYWxzZSwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBbcmV0VG9rZW4xLCByZXRUb2tlbjJdKTtcbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCldKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlRm9ybUxhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiZm9ybVxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImZvcm1cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gUGVyIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE3L05PVEUtd2FpLWFyaWEtcHJhY3RpY2VzLTEuMS0yMDE3MTIxNC9leGFtcGxlcy9sYW5kbWFya3MvSFRNTDUuaHRtbFxuICAgICAgICAvLyBmb3JtIGVsZW1lbnQgc2hvdWxkIG9ubHkgYmUgY29uc2lkZXJlZCBpZiBpdCBoYXMgYW4gYXJpYSBsYWJlbCBvciB0aXRsZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpID09PSBcImZvcm1cIiB8fFxuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSB8fFxuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpIHx8XG4gICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgICAgIGxldCBsYW5kbWFya3MgPSBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJmb3JtXCIsXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZHVwZXMgPSBnZXRDYWNoZShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwiYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICAgICAgZHVwZXMgPSBSUFRVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgICAgIHNldENhY2hlKFxuICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgICAgICBcImFyaWFfZm9ybV9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG15TGFiZWwgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgICAgICBteUxhYmVsICE9PSBcIlwiICYmXG4gICAgICAgICAgICAgICAgKCEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMSk7XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9ncmFwaGljX2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfZ3JhcGhpY19sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpncmFwaGljcy1kb2N1bWVudCxhcmlhOmdyYXBoaWNzLXN5bWJvbFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BcmlhX1N2Z0FsdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9ncmFwaGljX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9ncmFwaGljX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9ncmFwaGljX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiYXJpYV9ncmFwaGljX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiYXJpYV9ncmFwaGljX2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBlbGVtZW50IHdpdGggYSBncmFwaGljcyByb2xlIG11c3QgaGF2ZSBhIG5vbi1lbXB0eSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IHdpdGggXFxcInswfVxcXCIgZ3JhcGhpY3Mgcm9sZSBoYXMgbm8gbGFiZWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJ7MH1cXFwiIGdyYXBoaWNzIHJvbGUgaGFzIG5vIGxhYmVsIG9yIGFuIGVtcHR5IGxhYmVsXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkVsZW1lbnQgd2l0aCBcXFwiezB9XFxcIiBncmFwaGljcyByb2xlIG1pc3Npbmcgbm9uLWVtcHR5ICdhcmlhLWxhYmVsJyBvciAnYXJpYS1sYWJlbGxlZGJ5J1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sIC8qQ2hhbmdlIG1hcHBpbmcgdG8gMS4xLjEgZnJvbSA0LjEuMiAqL1xuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiN2Q2NzM0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpIHx8ICFydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLmluY2x1ZGVzKFwiZ3JhcGhpY3MtXCIpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvKiByZW1vdmVkIHRoZSByb2xlIGNoZWNrIHJvbGU9IHByZXNlbnRhdGlvbiBzaW5jZSBpZiBhbiBlbGVtZW50IGhhcyByb2xlPWltZywgdGhlbiB0aGVyZSBuZWVkcyB0byBiZSBhIGNoZWNrIGZvciBhbHQgYXR0cmlidXRlIHJlZ2FyZGxlc3Mgb2YgdGhlIHByZXNlY25lIG9mIHJvbGU9cHJlc2VudGF0aW9uXG4gICAgICAgIGlmIChSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwicHJlc2VudGF0aW9uXCIpIHx8IFJQVFV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgXCJub25lXCIpKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoMSk7XG4gICAgICAgIH0qL1xuXG4gICAgICAgIC8vIElmIHJvbGUgPT09IGltZywgeW91IG11c3QgdXNlIGFuIGFyaWEgbGFiZWxcbiAgICAgICAgLy9jaGVjayBhdHRyaWJ1dGVzIGFyaWEtbGFiZWwgYW5kIGFyaWEtbGFiZWxsZWRieSBmb3Igb3RoZXIgdGFncyAoZS5nLiA8ZGl2PiwgPHNwYW4+LCBldGMpXG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCkubGVuZ3RoID4gMDtcblxuICAgICAgICBpZiAoIXBhc3NlZCAmJiBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInN2Z1wiKSB7XG4gICAgICAgICAgICBsZXQgc3ZnVGl0bGUgPSBydWxlQ29udGV4dC5xdWVyeVNlbGVjdG9yKFwidGl0bGVcIik7XG4gICAgICAgICAgICBwYXNzZWQgPSBzdmdUaXRsZSAmJiBSUFRVdGlsLmhhc0lubmVyQ29udGVudChzdmdUaXRsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy9jaGVjayB0aXRsZSBhdHRyaWJ1dGVcbiAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIik7XG4gICAgICAgICAgICAvLyBXZSBzaG91bGQgZ3VpZGUgcGVvcGxlIHRvIHVzZSBhbHQgb3IgbGFiZWwgLSB0aGlzIGlzIGp1c3QgYSBzZWNvbmRhcnkgYXBwcm9hY2ggdG8gc2lsZW5jZSB0aGUgcnVsZS5cbiAgICAgICAgICAgIC8vIFNvLCB3ZSBzaG91bGQga2VlcCB0aGUgUE9GIGZyb20gYWJvdmUuXG4gICAgICAgICAgICAvLyBpZiAoIXBhc3NlZCkgUE9GID0gXCJGYWlsXzNcIjtcbiAgICAgICAgfVxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICdyb2xlJywgJycsIFtdKTtcbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpXSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGxldCBhcmlhX2hpZGRlbl9ub250YWJiYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2hpZGRlbl9ub250YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1oaWRkZW49dHJ1ZV0sIGRvbToqW2FyaWEtaGlkZGVuPXRydWVdIGRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJhcmlhX2hpZGRlbl9mb2N1c19taXN1c2VcIjogeyBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX2hpZGRlbl9ub250YWJiYWJsZS5odG1sYCwgXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYXJpYV9oaWRkZW5fbm9udGFiYmFibGUuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXJpYV9oaWRkZW5fbm9udGFiYmFibGUuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBoaWRkZW4gZWxlbWVudCBzaG91bGQgbm90IGNvbnRhaW4gYW55IHRhYmJhYmxlIGVsZW1lbnRzXCIsIFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IFxcXCJ7MH1cXFwiIHNob3VsZCBub3QgYmUgZm9jdXNhYmxlIHdpdGhpbiB0aGUgc3VidHJlZSBvZiBhbiBlbGVtZW50IHdpdGggYW4gJ2FyaWEtaGlkZGVuJyBhdHRyaWJ1dGUgd2l0aCB2YWx1ZSAndHJ1ZSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogW1wiMS4zLjFcIiwgXCI0LjEuMlwiXSwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IEhhbmRsZSB0ZXN0Y2FzZSB3aXRoIGZvY3VzIGp1bXBpbmcgYXdheVxuICAgIGFjdDogXCI2Y2ZhODRcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChSUFRVdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW25vZGVOYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfaWRfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfaWRfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfVmFsaWRJZFJlZlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfaWRfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9pZF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfaWRfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlICdpZCcgXFxcInswfVxcXCIgc3BlY2lmaWVkIGZvciB0aGUgQVJJQSBwcm9wZXJ0eSAnezF9JyB2YWx1ZSBpcyBub3QgdmFsaWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgQVJJQSBwcm9wZXJ0eSBtdXN0IHJlZmVyZW5jZSBhIG5vbi1lbXB0eSB1bmlxdWUgaWQgb2YgYW4gZXhpc3RpbmcgZWxlbWVudCB0aGF0IGlzIHZpc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IDZhNzI4MSAtIE5lZWQgYSBzZXBhcmF0ZSByZWFzb24gY29kZSB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBub3QgcmVxdWlyZWQuIEFDVCBzYXlzIGl0J3Mgb2theSB0byBiZVxuICAgIC8vIGludmFsaWQgd2hlbiBub3QgcmVxdWlyZWQuIEkgdGhpbmsgd2Ugc2hvdWxkIHN0aWxsIGZhaWwsIGJ1dCBmbGFnIGl0IGFzIGEgZGlmZmVyZW50IHJlYXNvbiBzbyB0aGF0IHdlIGNhbiBoYXZlIGEgc3Vic2V0XG4gICAgLy8gYWxpZ25zIHdpdGggQUNULlxuICAgIGFjdDogW1wiNTk3OTZmXCIsIFwiNmE3MjgxXCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzID0gdHJ1ZTtcbiAgICAgICAgbGV0IGF0dHJOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBub25FeGlzdGFudElEcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgb3duZXJEb2N1bWVudCA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGNvbnRleHRBdHRyaWJ1dGVzID0gcnVsZUNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgbGV0IGlkVG9rZW5zID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCB0ZXN0ZWRSZWZlcmVuY2VzID0gMDtcblxuICAgICAgICBpZiAoY29udGV4dEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBhdHRyTGVuZ3RoID0gY29udGV4dEF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgYXR0ckxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcGFzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5pc0RlZmluZWRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFUeXBlcyA9IEFSSUFEZWZpbml0aW9ucy5wcm9wZXJ0eURhdGFUeXBlc1thdHRyTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXBwb3J0c09uZUlEUmVmID0gKGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZcIikgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBkYXRhIHR5cGUgc3VwcG9ydHMgb25lIG9yIG1vcmUgaWQgcmVmcyBkbyBlcnJvciBjaGVja2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRzT25lSURSZWYgfHwgKGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUmVmZXJlbmNlcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWVMZW5ndGggPSBSUFRVdGlsLm5vcm1hbGl6ZVNwYWNpbmcoY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkQXJyYXkgPSBjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUuc3BsaXQoXCIgXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGFuIGVtcHR5IElEIFJlZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWVMZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb2tlbnMucHVzaChcIlxcXCJcIiArIGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZSArIFwiXFxcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRvbyBtYW55IElEUmVmc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN1cHBvcnRzT25lSURSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiBoYXMgdG9vIG1hbnkgSURSZWZzIGl0IGlzIGFuIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWVMZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNhcHR1cmUgYWxsIHRoZSBJRFJlZnMgZm9yIGlkVG9rZW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgeiA9IDAsIGxlbmd0aCA9IGlkQXJyYXkubGVuZ3RoOyB6IDwgbGVuZ3RoOyArK3opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXJyYXlbel0gIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb2tlbnMucHVzaChpZEFycmF5W3pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgaWQgcmVmcyBhcmUgaW52YWxpZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzICYmIG5vZGVWYWx1ZUxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwLCBsZW5ndGggPSBpZEFycmF5Lmxlbmd0aDsgaiA8IGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRBcnJheVtqXS5sZW5ndGggPiAwKSB7IC8vIGl0IGlzIGFuIGVtcHR5IHN0cmluZyBpZiBzcGFjZXMgYXJlIG9uZSBhZnRlciB0aGUgb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGVsZW1lbnQgYnkgSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudEJ5SWQgPSBvd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkQXJyYXlbal0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyBpZiB0aGUgZWxlbWVudCBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZWxlbWVudEJ5SWQgIT0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGV4aXN0cyBhbmQgdGhpcyBpcyBhbiBhcmlhIGF0dHJpYnV0ZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBoaWRkZW4gSUQgcmVmZXJlbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBwZXJmb3JtIGEgaXNOb2RlVmlzaWJsZSBjaGVjaywgaW4gdGhlIGNhc2UgdGhlIG5vZGUgaXMgbm90IHZpc2libGUgdGhlbiB3ZSByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZSBhbmQgdHJ1ZSBvdGhlcndpc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3MgJiYgIWRhdGFUeXBlcy5oaWRkZW5JRFJlZlN1cHBvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnRCeUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXJyYXlbal0gIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb2tlbnMucHVzaChpZEFycmF5W2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IG9uZSBvZiB0aGUgaWQgcmVmZXJlbmNlcyBuZWVkIHRvIGJlIHZhbGlkIHRvIG1hcmsgdGhlIHJ1bGUgYXMgcGFzc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlZm9yZSBpZiB3ZSBmaW5kIGEgc2luZ2xlIHZpc2libGUgZWxlbWVudCB0aGVuIHN0b3AgY2hlY2tpbmcgYW5kIG1hcmsgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3MpIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFzc2VkID0gYXR0ck5hbWVBcnIubGVuZ3RoID09IDA7XG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcmV0VG9rZW4zID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG5cbiAgICAgICAgICAgIHJldFRva2VuMi5wdXNoKGF0dHJOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICByZXRUb2tlbjMucHVzaChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIGlmIChpZFRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0VG9rZW4xLnB1c2goaWRUb2tlbnMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgYXR0ck5hbWVBcnIsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3JldFRva2VuMSwgcmV0VG9rZW4yLCByZXRUb2tlbjNdKTtcbiAgICAgICAgaWYgKHRlc3RlZFJlZmVyZW5jZXMgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCksIHJldFRva2VuMy50b1N0cmluZygpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfaW1nX2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfaW1nX2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmltZ1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BcmlhX0ltZ0FsdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9pbWdfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2ltZ19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfaW1nX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiYXJpYV9pbWdfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJhcmlhX2ltZ19sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gZWxlbWVudCB3aXRoIFxcXCJpbWdcXFwiIHJvbGUgbXVzdCBoYXZlIGEgbm9uLWVtcHR5IGxhYmVsXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiaW1nXFxcIiByb2xlIGhhcyBubyBsYWJlbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJFbGVtZW50IHdpdGggXFxcImltZ1xcXCIgcm9sZSBoYXMgbm8gbGFiZWwgb3IgYW4gZW1wdHkgbGFiZWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJpbWdcXFwiIHJvbGUgbWlzc2luZyBub24tZW1wdHkgJ2FyaWEtbGFiZWwnIG9yICdhcmlhLWxhYmVsbGVkYnknXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSwgLypDaGFuZ2UgbWFwcGluZyB0byAxLjEuMSBmcm9tIDQuMS4yICovXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW1wiMjNhMmE4XCIsIHtcbiAgICAgICAgXCI3ZDY3MzRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgLy8gSWYgbm8gcm9sZSwgdGhpcyBpcyBpbXBsaWNpdCwgYW5kIGNvdmVyZWQgYnkgV0NBRzIwX0ltZ19IYXNBbHRcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8qIHJlbW92ZWQgdGhlIHJvbGUgY2hlY2sgcm9sZT0gcHJlc2VudGF0aW9uIHNpbmNlIGlmIGFuIGVsZW1lbnQgaGFzIHJvbGU9aW1nLCB0aGVuIHRoZXJlIG5lZWRzIHRvIGJlIGEgY2hlY2sgZm9yIGFsdCBhdHRyaWJ1dGUgcmVnYXJkbGVzcyBvZiB0aGUgcHJlc2VjbmUgb2Ygcm9sZT1wcmVzZW50YXRpb25cbiAgICAgICAgaWYgKFJQVFV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgXCJwcmVzZW50YXRpb25cIikgfHwgUlBUVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCBcIm5vbmVcIikpe1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcygxKTtcbiAgICAgICAgfSovXG5cbiAgICAgICAgLyogSkNIIC0gUG9pbnRzIG9mIGZhaWx1cmVcbiAgICAgICAgICogICAgMC4gTWlzc2luZyBhbHQgYXR0ciB3aXRoIHZhbHVlXG4gICAgICAgICAqICAgIDEuIE1pc3NpbmcgYXJpYS1sYWJlbCBvciBhcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICogICAgMi4gTWlzc2luZyB0aXRsZSBhdHRyIHdpdGggdmFsdWVcbiAgICAgICAgICovXG4gICAgICAgIFxuICAgICAgICAvLyBJZiByb2xlID09PSBpbWcsIHlvdSBtdXN0IHVzZSBhbiBhcmlhIGxhYmVsXG4gICAgICAgIC8vY2hlY2sgYXR0cmlidXRlcyBhcmlhLWxhYmVsIGFuZCBhcmlhLWxhYmVsbGVkYnkgZm9yIG90aGVyIHRhZ3MgKGUuZy4gPGRpdj4sIDxzcGFuPiwgZXRjKVxuICAgICAgICBsZXQgcGFzc2VkID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLmxlbmd0aCA+IDA7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdmdcIikge1xuICAgICAgICAgICAgbGV0IHN2Z1RpdGxlID0gcnVsZUNvbnRleHQucXVlcnlTZWxlY3RvcihcInRpdGxlXCIpO1xuICAgICAgICAgICAgcGFzc2VkID0gc3ZnVGl0bGUgJiYgUlBUVXRpbC5oYXNJbm5lckNvbnRlbnQoc3ZnVGl0bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIC8vY2hlY2sgdGl0bGUgYXR0cmlidXRlXG4gICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGd1aWRlIHBlb3BsZSB0byB1c2UgYWx0IG9yIGxhYmVsIC0gdGhpcyBpcyBqdXN0IGEgc2Vjb25kYXJ5IGFwcHJvYWNoIHRvIHNpbGVuY2UgdGhlIHJ1bGUuXG4gICAgICAgICAgICAvLyBTbywgd2Ugc2hvdWxkIGtlZXAgdGhlIFBPRiBmcm9tIGFib3ZlLlxuICAgICAgICAgICAgLy8gaWYgKCFwYXNzZWQpIFBPRiA9IFwiRmFpbF8zXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NaXNzaW5nS2V5Ym9hcmRIYW5kbGVyXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wiOiBcInBvdGVudGlhbF9ub19rZXlib2FyZF9hY2Nlc3NcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wiOiBcImFyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wiOiBcIlZlcmlmeSB0aGUgPHswfT4gZWxlbWVudCB3aXRoIFxcXCJ7MX1cXFwiIHJvbGUgaGFzIGtleWJvYXJkIGFjY2Vzc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkludGVyYWN0aXZlIFdBSV9BUklBIFVJIGNvbXBvbmVudHMgbXVzdCBwcm92aWRlIGtleWJvYXJkIGFjY2Vzc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHNhdmVkUGFzc2VkID0gcGFzc2VkO1xuICAgICAgICBsZXQgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcbiAgICAgICAgbGV0IGRlc2lnblBhdHRlcm5zID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zO1xuICAgICAgICBsZXQgcm9sZXMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIFxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvL2lmIGFuIGV4cGxpY2l0IHJvbGUgaXMgc3BlY2lmaWVkLCB0aGUgJ2FyaWFfcm9sZV9yZWR1bmRhbnQnIHJ1bGUgc2hvdWxkIGJlIHRyaWdnZXJlZCBhbmQgYWRkcmVzc2VkIGZpcnN0LFxuICAgICAgICAvLyBhbmQgdGhlIGN1cnJlbnQgcnVsZSBzaG91bGQgYmUgaWdub3JlZFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhbGlzdCcgJiYgcm9sZXMgJiYgcm9sZXMuaW5jbHVkZXMoXCJsaXN0Ym94XCIpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgbGV0IGhhc0F0dHJpYnV0ZSA9IFJQVFV0aWwuaGFzQXR0cmlidXRlO1xuICAgICAgICAvLyBDb21wb3NpdGUgdXNlciBpbnRlcmZhY2Ugd2lkZ2V0IHJvbGVzLiBUaGV5IGFjdCBhcyBjb250YWluZXJzIHRoYXQgbWFuYWdlIG90aGVyLCBjb250YWluZWQgd2lkZ2V0cy5cbiAgICAgICAgbGV0IHJvbGVDb250YWluZXJzID0gW1wiY29tYm9ib3hcIiwgXCJncmlkXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwicmFkaW9ncm91cFwiLCBcInRhYmxpc3RcIiwgXCJ0cmVlXCIsIFwidHJlZWdyaWRcIl07XG4gICAgICAgIFxuICAgICAgICBsZXQgcm9sZU5hbWVBcnIgPSBuZXcgQXJyYXkoKTtcblxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJvbGVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBsZXQgcGF0dGVybiA9IGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXTtcbiAgICAgICAgICAgIGlmIChyb2xlQ29udGFpbmVycy5pbmRleE9mKHJvbGVzW2pdKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRpc2FibGVkID0gaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCAnYXJpYS1kaXNhYmxlZCcpID8gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1kaXNhYmxlZFwiKSA6ICcnO1xuICAgICAgICAgICAgICAgIGlmICghZGlzYWJsZWQpIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYSBrZXlib2FyZCBldmVudCBoYW5kbGVyIG9uIHRoZSBwYXJlbnQgZWxlbWVudC5cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ua2V5ZG93blwiKSB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleXByZXNzXCIpKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBObyBrZXlib2FyZCBldmVudCBoYW5kbGVyIGZvdW5kIG9uIHBhcmVudC4gIFNlZSBpZiBrZXlib2FyZCBldmVudCBoYW5kbGVycyBhcmUgb24gcmVxdWlyZWQgY2hpbGQgZWxlbWVudHMuXG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcUNoaWxkcmVuID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXS5yZXFDaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxQ2hpbGRyZW4pIHsgLyogU01GIFRPRE8gbWVudWJhciBkb2VzIG5vdCBoYXZlIGFueSByZXFDaGlsZHJlbiAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgcmVxdWlyZWRDaGlsZHJlbkxlbmd0aCA9IHJlcUNoaWxkcmVuLmxlbmd0aDsgaSA8IHJlcXVpcmVkQ2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwID0gXCIqW2NvbnRhaW5zKEByb2xlLCdcIiArIHJlcUNoaWxkcmVuW2ldICsgXCInKV1cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdCA9IGRvYy5ldmFsdWF0ZSh4cCwgcnVsZUNvbnRleHQsIFJQVFV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHIgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocikge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gKHIuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpIHx8IHIuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGlsZCBkaWQgbm90IGhhdmUgYSBrZXkgaGFuZGxlci4gIFNlZSBpZiBhbnkgb2YgdGhlIGdyYW5kY2hpbGRyZW4gZG8uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cDIgPSBcImRlc2NlbmRhbnQ6OipcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwYXRoUmVzdWx0MiA9IGRvYy5ldmFsdWF0ZSh4cDIsIHIsIFJQVFV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcjI6IEVsZW1lbnQgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocjIgJiYgIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgMS4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4ocjIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBSUFRVdGlsLmlzVGFiYmFibGUocjIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHIyLmhhc0F0dHJpYnV0ZShcIm9ua2V5ZG93blwiKSB8fCByMi5oYXNBdHRyaWJ1dGUoXCJvbmtleXByZXNzXCIpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXMgdGhpcyBhbiBhY3Rpb24gbGluaz9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJhXCIgJiYgcjIuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhyZWYgPSByMi5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0aW9uIGxpbmsgbXVzdCBzdGFydCB3aXRoIFwiamF2YXNjcmlwdDpcIiwgbXVzdCBub3QgY29udGFpbiBhIFwidm9pZFwiIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBoYXZlIGEgZnVuY3Rpb24gbmFtZSBmb2xsb3dpbmcgXCJqYXZhc2NyaXB0OlwiIChpLmUuLCBocmVmLmxlbmd0aCA+IDExKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gKGhyZWYuc3RhcnRzV2l0aChcImphdmFzY3JpcHQ6XCIpICYmIGhyZWYuaW5kZXhPZihcInZvaWRcIikgPT0gLTEgJiYgaHJlZi5sZW5ndGggPiAxMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGwgdGhlIHJlcXVpcmVkIGNoaWxkcmVuIChvciBhbnkgZGVzY2VuZGFudHMgb2YgdGhlIHJlcXVpcmVkIGNoaWxkcmVuKSBtdXN0IGhhdmUga2V5cHJlc3Mva2V5ZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBub3QsIGl0IGlzIGEgZmFpbHVyZSwgbm8gbmVlZCB0byBrZWVwIGNoZWNraW5nIGFueSBtb3JlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGVsZW1lbnQgZmFpbGVkIHRoZSBrZXlkb3duL2tleXByZXNzLCBhbmQgaXQgZG9lcyBub3QgaGF2ZSByZXF1aXJlZCBjaGlsZHJlbiwgc3VjaCBhcyBtZW51YmFyLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQncyBjaGVjayBpdHMgZGVzY2VuZGFudHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cDIgPSBcImRlc2NlbmRhbnQ6OipcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwYXRoUmVzdWx0MiA9IGRvYy5ldmFsdWF0ZSh4cDIsIHJ1bGVDb250ZXh0LCBSUFRVdGlsLmRlZmF1bHROU1Jlc29sdmVyLCAwIC8qIFhQYXRoUmVzdWx0LkFOWV9UWVBFICovLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHIyICYmICFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIDEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHIyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gUlBUVXRpbC5pc1RhYmJhYmxlKHIyKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyMi5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikgfHwgcjIuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXMgdGhpcyBhbiBhY3Rpb24gbGluaz9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocjIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImFcIiAmJiByMi5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBocmVmID0gcjIuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpb24gbGluayBtdXN0IHN0YXJ0IHdpdGggXCJqYXZhc2NyaXB0OlwiLCBtdXN0IG5vdCBjb250YWluIGEgXCJ2b2lkXCIgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIG5hbWUgZm9sbG93aW5nIFwiamF2YXNjcmlwdDpcIiAoaS5lLiwgaHJlZi5sZW5ndGggPiAxMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gKGhyZWYuc3RhcnRzV2l0aChcImphdmFzY3JpcHQ6XCIpICYmIGhyZWYuaW5kZXhPZihcInZvaWRcIikgPT0gLTEgJiYgaHJlZi5sZW5ndGggPiAxMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdHRyaWJ1dGUgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgaXMgc3BlY2lmaWVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIHJvbGVOYW1lQXJyLnB1c2gocm9sZXNbal0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwYXNzZWQgJiYgc2F2ZWRQYXNzZWQpIHtcbiAgICAgICAgICAgICAgICBzYXZlZFBhc3NlZCA9IHBhc3NlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4xLnB1c2gocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGxldCByZXRUb2tlbjIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4yLnB1c2gocm9sZU5hbWVBcnIuam9pbihcIiwgXCIpKTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgaWYgdGhpcyBpcyByZWZlcmVuY2VkIGJ5IGEgY29tYm9ib3guIElmIHNvLCBsZWF2ZSBpdCB0byB0aGUgY29tYm9ib3ggcnVsZXMgdG8gY2hlY2tcbiAgICAgICAgbGV0IGlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgIGlmIChpZCAmJiBpZC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihgKlthcmlhLWNvbnRyb2xzPScke2lkfSddW3JvbGU9J2NvbWJvYm94J11gKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzYXZlZFBhc3NlZCA/IFJ1bGVQYXNzKFwicGFzc1wiKSA6IFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbm9fa2V5Ym9hcmRfYWNjZXNzXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCldKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tcGxlbWVudGFyeSwgYXJpYTpiYW5uZXIsIGFyaWE6Y29udGVudGluZm8sIGFyaWE6bWFpbiwgYXJpYTpuYXZpZ2F0aW9uLCBhcmlhOnJlZ2lvbiwgYXJpYTpzZWFyY2gsIGFyaWE6Zm9ybVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwibGFuZG1hcmtfbmFtZV91bmlxdWVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8wXCI6IFwiRmFpbF8wXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8wXCI6IFwiYXJpYV9sYW5kbWFya19uYW1lX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9sYW5kbWFya19uYW1lX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIk11bHRpcGxlIFxcXCJ7MH1cXFwiIGxhbmRtYXJrcyB3aXRoIHRoZSBzYW1lIHBhcmVudCByZWdpb24gYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdW5pcXVlICdhcmlhLWxhYmVsJyBvciAnYXJpYS1sYWJlbGxlZGJ5J1wiLFxuICAgICAgICAgICAgXCJGYWlsXzBcIjogXCJNdWx0aXBsZSBcXFwiezB9XFxcIiBsYW5kbWFya3Mgd2l0aCB0aGUgc2FtZSBwYXJlbnQgcmVnaW9uIGFyZSBub3QgZGlzdGluZ3Vpc2hlZCBmcm9tIG9uZSBhbm90aGVyIGJlY2F1c2UgdGhleSBoYXZlIHRoZSBzYW1lIFxcXCJ7MX1cXFwiIGxhYmVsXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTXVsdGlwbGUgbGFuZG1hcmtzIHNob3VsZCBoYXZlIGEgdW5pcXVlICdhcmlhLWxhYmVsbGVkYnknIG9yICdhcmlhLWxhYmVsJyBvciBiZSBuZXN0ZWQgaW4gYSBkaWZmZXJlbnQgcGFyZW50IHJlZ2lvbnNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaWRcIjogW1wiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIC8vIFRPRE8gZG8gSSBuZWVkIHRvIGZpdGVyIG91dCBiYWQgY29udGVudGluZm8gbm9kZXM6IFRoZSBmb290ZXIgZWxlbWVudCBpcyBub3QgYSBjb250ZW50aW5mbyBsYW5kbWFyayB3aGVuIGl0IGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgZm9sbG93aW5nIEhUTUw1IHNlY3Rpb25pbmcgZWxlbWVudHM6IGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE3L05PVEUtd2FpLWFyaWEtcHJhY3RpY2VzLTEuMS0yMDE3MTIxNC9leGFtcGxlcy9sYW5kbWFya3MvSFRNTDUuaHRtbFxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIENoZWNraW5nIGlmIHRoaXMgbGFuZG1hcmsgaXMgaW5zaWRlIGEgZGlhbG9nIGVsZW1lbnQuIElmIGl0IGlzIHdlIGFyZSBnb2luZyB0byBza2lwIGNoZWNraW5nIGl0LiBcbiAgICAgICAgdmFyIGNvcHlPZlJ1bGVDb250ZXh0ID0gcnVsZUNvbnRleHQ7XG4gICAgICAgIHZhciBwYXJuZXROb2Rlc09mUnVsZUNvbnRleHQgPSBbXTtcbiAgICAgICAgd2hpbGUgKGNvcHlPZlJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICBwYXJuZXROb2Rlc09mUnVsZUNvbnRleHQudW5zaGlmdChjb3B5T2ZSdWxlQ29udGV4dCk7XG4gICAgICAgICAgICBjb3B5T2ZSdWxlQ29udGV4dCA9IGNvcHlPZlJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcGFybmV0Tm9kZXNPZlJ1bGVDb250ZXh0LmZvckVhY2goZWxlbSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLnRhZ05hbWUgPT0gXCJESUFMT0dcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZSgncm9sZScpID09IFwiZGlhbG9nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgLy8gU2tpcHBpbmcgY2hlY2tpbmcgbGFuZG1hcmtzIHRoYXQgaGFwcGVuIHRvIGJlIGluc2lkZSBkaWFsb2cgZWxlbWVudHNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gQmVnaW5pbmcgZm9ybUNhY2hlIHdvcmtcbiAgICAgICAgbGV0IG93bmVyRG9jdW1lbnQgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBmb3JtQ2FjaGUgOiB7XG4gICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXM6IGFueVtdLFxuICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50czogYW55W10sXG4gICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kOiBzdHJpbmdbXVxuICAgICAgICB9ID0gZ2V0Q2FjaGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZm9ybUNhY2hlKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLUVOVEVSSU5HIEZPUk0gQ0FDSEVcIilcbiAgICAgICAgICAgIGZvcm1DYWNoZSA9IHtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXM6IFtdLFxuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzOiBbXSxcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzOiBbXSxcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kOiBbXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNUZW1wID0gb3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgICAgICAgICdhc2lkZSxbcm9sZT1cImNvbXBsZW1lbnRhcnlcIl0sIGZvb3Rlcixbcm9sZT1cImNvbnRlbnRpbmZvXCJdLCBoZWFkZXIsW3JvbGU9XCJiYW5uZXJcIl0sIG1haW4sW3JvbGU9XCJtYWluXCJdLCBuYXYsW3JvbGU9XCJuYXZpZ2F0aW9uXCJdLCBmb3JtLFtyb2xlPVwiZm9ybVwiXSwgc2VjdGlvbixbcm9sZT1cInJlZ2lvblwiXSxbcm9sZT1cInNlYXJjaFwiXSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgbmF2aWdhdGlvbk5vZGVzID0gQXJyYXkuZnJvbShuYXZpZ2F0aW9uTm9kZXNUZW1wKTtcbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzID0gW107XG4gICAgICAgICAgICBsZXQgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZCA6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgICAgIC8vIFRoaXMgYmxvY2sgb2YgY29kZSBmaWx0ZXJzIG91dCBhbnkgbmF2IGVsZW1lbnRzIHRoYXQgYXJlIHVuZGVyIGFuIGRpYWxvZy4gQXMgdGhvc2UgYXJlIG5vdCBvbmVzIHdlIHdhbnQgdG8gdGVzdCBhZ2FpbnN0IGFzIHdlIGNvbnNpZGVyIGRpYWxvZ3MgYXJlIHNlcGFyYXRlIGxvY2F0aW9ucyBmcm9tIHRoZSByZXN0IG9mIHRoZSBtYWluIHBhZ2UuICAgIFxuICAgICAgICAgICAgbGV0IG5hdmlnYXRpb25Ob2Rlc1dpdGhvdXREaWFsb2dzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdmlnYXRpb25Ob2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhID0gbmF2aWdhdGlvbk5vZGVzW2ldO1xuICAgICAgICAgICAgICAgIGxldCBkaWFsb2dOb2RlRm91bmRGbGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGEpIHtcbiAgICAgICAgICAgICAgICAgICAgYSA9IGEucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLnRhZ05hbWUgPT0gXCJESUFMT0dcIiB8fCBhLmdldEF0dHJpYnV0ZSgncm9sZScpID09IFwiZGlhbG9nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2dOb2RlRm91bmRGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWRpYWxvZ05vZGVGb3VuZEZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzV2l0aG91dERpYWxvZ3MucHVzaChuYXZpZ2F0aW9uTm9kZXNbaV0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzID0gbmF2aWdhdGlvbk5vZGVzV2l0aG91dERpYWxvZ3M7XG5cblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBsYW5kbWFyayBub2Rlc1xuICAgICAgICAgICAgICAgIGxldCBlbHMgPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgYSA9IG5hdmlnYXRpb25Ob2Rlc1tpXS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIHdoaWxlIChhKSB7XG4gICAgICAgICAgICAgICAgICAgIGVscy5wdXNoKGEpO1xuICAgICAgICAgICAgICAgICAgICBhID0gYS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZWxzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIHBhcmVudHMgb2YgdGhlIGxhbmRtYXJrIG5vZGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgbmVhcmVzdCBsYW5kbWFyayBwYXJlbnQgYmFzZWQgb24gdGhlIHRhZ05hbWUgb3IgdGhlIHJvbGUgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWdOYW1lVHJpZ2dlciA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQVNJREVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRk9PVEVSXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkZPUk1cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiSEVBREVSXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIk1BSU5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiTkFWXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlNFQ1RJT05cIixcbiAgICAgICAgICAgICAgICAgICAgXS5pbmNsdWRlcyhlbHNbal0udGFnTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlTmFtZVRyaWdnZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsc1tqXS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlTmFtZVRyaWdnZXIgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb21wbGVtZW50YXJ5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb250ZW50aW5mb1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZm9ybVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYmFubmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJtYWluXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYXZpZ2F0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZWdpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInNlYXJjaFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmNsdWRlcyhlbHNbal0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKSk7IC8vIFRPRE8gd2UgYXJlIG5vdCBjb3ZlcmluZyB0aGUgY2FzZSB3aGVyZSBhIGVsZW1lbmVudCB3aXRoIG11bHRpcGxlIHJvbGVzLiBFLmcuIHJvbGUgPSBcImZvcm0gYmFubmVyXCIuIFRoaXMgaXMgYSBpbXByb3ZtZW50IHdlIG1pZ2h0IHdhbnQgdG8gYWRkIGluIHRoZSBmdXR1cmUuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ05hbWVUcmlnZ2VyIHx8IHJvbGVOYW1lVHJpZ2dlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVhcmVzdCBwYXJlbnQtbGFuZG1hcmsgZm91bmRcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHMucHVzaChlbHNbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGogPT09IGVscy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG5vZGUgaXMgYXQgdGhlIGhlYWQgb2YgdGhlIGZpbGUgc28gaXQgZG9lcyBub3QgaGF2ZSBhIHBhcmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50cy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVscyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBsYW5kbWFyayBub2Rlc1xuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIuY29tcHV0ZU5hbWUobmF2aWdhdGlvbk5vZGVzW2ldKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hdmlnYXRpb25Ob2Rlc1BhcmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBwYXJlbnRzIG9mIHRoZSBsYW5kbWFyayBub2RlcyB0byBmaW5kIGR1cGxpY2F0ZXNcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBwYXNzXzBfZmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmF2aWdhdGlvbk5vZGVzUGFyZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PT0gaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG8gbm90IHdhbnQgdG8gY29tcGFyZSBhZ2FpbnN0IG91cnNlbGZzXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaWYgc3RhdGVtZW50IGZvY3VzIG9uIHRoZSBjYXNlIHdoZXJlIHRoZSBwYXJlbnQgbGFuZG1hcmsgaXMgbnVsbFxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzW2ldID09PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzW2pdID09PSBudWxsXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGxvb2tpbmcgYXQgdHdvIHJvb3Qgbm9kZXMsIHNvIHdlIHNob3VsZCBjb21wYXJlIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5hdmlnYXRpb25Ob2Rlc1tpXSkgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5hdmlnYXRpb25Ob2Rlc1tqXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJvdGggbm9kZXMgaGF2ZSB0aGUgc2FtZSByb2xlIEFORFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbaV0gPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2pdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggaGF2ZSB0aGUgc2FtZSAoY29tcHV0ZWQpIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tpXSA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kLnB1c2goXCJGYWlsXzBcIik7IC8vIEZhaWwgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHBhcmVudHMgJiYgc2FtZSBub2RlIHJvbGVzIEJVVCBkaWZmZXJlbnQgY29tcHV0ZWQgYXJpYS1sYWJlbC9hcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhdCBsZWFzdCBhIFBhc3NfMC4gQnV0IHdlIG5lZWQgdG8gY2hlY2sgYWxsIG5vZGVzIHRvIHNlZSBpZiBhbm90aGVyIG9uZSBmYWlscy4gU28gc2V0IGEgZmxhZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc18wX2ZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwYXJlbnRzIGJ1dCBkaWZmZXJlbnQgbm9kZSByb2xlcyAvLyBOb3QgYXBwbGljYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tpXSA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tqXSA9PT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBsb29raW5nIGF0IGEgc2luZ2xlIHJvb3Qgbm9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlmIHN0YXRlbWVudCBmb2N1cyBvbiB0aGUgY2FzZSB3aGVyZSB0aGUgcGFyZW50IGxhbmRtYXJrIGlzIE5PVCBudWxsXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIERPTVV0aWwuc2FtZU5vZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzW2pdXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0aGUgc2FtZSBwYXJlbnQtbGFuZG1hcmsgQU5EXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5hdmlnYXRpb25Ob2Rlc1tpXSkgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKG5hdmlnYXRpb25Ob2Rlc1tqXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJvdGggbm9kZXMgaGF2ZSB0aGUgc2FtZSByb2xlIEFORFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbaV0gPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2pdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggaGF2ZSB0aGUgc2FtZSAoY29tcHV0ZWQpIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tpXSA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kLnB1c2goXCJGYWlsXzBcIik7IC8vIEZhaWwgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHBhcmVudHMgJiYgc2FtZSBub2RlIHJvbGVzIEJVVCBkaWZmZXJlbnQgY29tcHV0ZWQgYXJpYS1sYWJlbC9hcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhdCBsZWFzdCBhIFBhc3NfMC4gQnV0IHdlIG5lZWQgdG8gY2hlY2sgYWxsIG5vZGVzIHRvIHNlZSBpZiBhbm90aGVyIG9uZSBmYWlscy4gU28gc2V0IGEgZmxhZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc18wX2ZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwYXJlbnRzIGJ1dCBkaWZmZXJlbnQgbm9kZSByb2xlcyAvLyBOb3QgYXBwbGljYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlmZmVyZW50IHBhcmVudHMgLy8gTm90IGFwcGxpY2FibGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoRm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NfMF9mbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kLnB1c2goXCJQYXNzXzBcIik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kLnB1c2goXCJudWxsXCIpOyAvLyBUaGlzIGlzIG5vdCB0aGUga2V5d29yZCBudWxsIG9uIHB1cnBvc2UuIEl0IGlzIGEgc3BhY2Vob2xkZXIgaW4gdGhlIGFycmF5IHNvIGluZGV4ZXMgbWF0Y2ggdXAuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHMgPVxuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzO1xuICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2RlcyA9IG5hdmlnYXRpb25Ob2RlcztcbiAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNQYXJlbnRzID0gbmF2aWdhdGlvbk5vZGVzUGFyZW50cztcbiAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kID0gbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZDtcbiAgICAgICAgICAgIHNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZm9ybUNhY2hlXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBUT0RPIEFkZCB2YWxpZGF0aW9uIHRoYXQgYWxsIDMgYXJyYXlzIGFyZSB0aGUgc2FtZSBsZW5ndGhcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiLS0tLS0tLS0tLS0tLUVuZCBmb3JtQ2FjaGVcIilcbiAgICAgICAgfSAvLyBFbmQgZm9ybUNhY2hlXG5cbiAgICAgICAgbGV0IGluZGV4VG9DaGVjayA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5pc1NhbWVOb2RlKGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgaW5kZXhUb0NoZWNrID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXhUb0NoZWNrID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kW2luZGV4VG9DaGVja10gPT09IFwiUGFzc18wXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc1tpbmRleFRvQ2hlY2tdXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZFtpbmRleFRvQ2hlY2tdID09PSBcIkZhaWxfMFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzBcIixcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNbaW5kZXhUb0NoZWNrXVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbaW5kZXhUb0NoZWNrXSxcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuXG5leHBvcnQgbGV0IGFyaWFfbWFpbl9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9tYWluX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTptYWluXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZU1haW5zUmVxdWlyZUxhYmVsX0ltcGxpY2l0XzJcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX21haW5fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9tYWluX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9tYWluX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcIm1haW5cXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnRzIHdpdGggXFxcIm1haW5cXFwiIHJvbGUgbXVzdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGNvbnRleHRMYWJlbCA9IFJQVFV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcblxuICAgICAgICBsZXQgcGFyZW50RG9jUm9sZSA9IFJQVFV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0LFxuICAgICAgICAgICAgXCJkb2N1bWVudFwiLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBsZXQgbWFpbnMgPSBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwibWFpblwiLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFpbnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChtYWluc1tpXSA9PT0gcnVsZUNvbnRleHQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcmVzdWx0ID0gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICBsZXQgdGhpc1BhcmVudERvY1JvbGUgPSBSUFRVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoXG4gICAgICAgICAgICAgICAgbWFpbnNbaV0sXG4gICAgICAgICAgICAgICAgXCJkb2N1bWVudFwiLFxuICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodGhpc1BhcmVudERvY1JvbGUgPT09IHBhcmVudERvY1JvbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoUlBUVXRpbC5nZXRBcmlhTGFiZWwobWFpbnNbaV0pID09PSBjb250ZXh0TGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9tYWluX2xhYmVsX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9tYWluX2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbTpib2R5XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZU1haW5zVmlzaWJsZUxhYmVsX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9tYWluX2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX21haW5fbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9tYWluX2xhYmVsX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJtYWluXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSB2aXNpYmxlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJtYWluXFxcIiByb2xlIHNob3VsZCBoYXZlIGEgdW5pcXVlIHZpc2libGUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICAvL2NhbGwgZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4gd2l0aCBjb25zaWRlckltcGxpY2l0IGZsYWcgYXMgdHJ1ZVxuICAgICAgICAvL3NvIHRoYXQgdGhlIG1ldGhvZCByZXR1cnMgPG1haW4+IGVsZW1lbnRzXG4gICAgICAgIGxldCBsYW5kbWFya3MgPSBSUFRVdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwibWFpblwiLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gUlBUVXRpbC5oYXNVbmlxdWVBcmlhTGFiZWxsZWRieShsYW5kbWFya3MpO1xuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOm5hdmlnYXRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlTmF2aWdhdGlvbkxhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwibmF2aWdhdGlvblxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcIm5hdmlnYXRpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICBsZXQgbGFuZG1hcmtzID0gUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcIm5hdmlnYXRpb25cIixcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGR1cGVzID0gZ2V0Q2FjaGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZHVwZXMpIHtcbiAgICAgICAgICAgIGR1cGVzID0gUlBUVXRpbC5maW5kQXJpYUxhYmVsRHVwZXMobGFuZG1hcmtzKTtcbiAgICAgICAgICAgIHNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG15TGFiZWwgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgbXlMYWJlbCAhPT0gXCJcIiAmJiAoIShteUxhYmVsIGluIGR1cGVzKSB8fCBkdXBlc1tteUxhYmVsXSA8PSAxKTtcblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIHJ1bGVDb250ZXh0LCAnJywgJycsIFsgbXlMYWJlbCBdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfcGFyZW50X3JlcXVpcmVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfcGFyZW50X3JlcXVpcmVkXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9SZXF1aXJlZFBhcmVudF9OYXRpdmVfSG9zdF9TZW1hdGljc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfcGFyZW50X3JlcXVpcmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9wYXJlbnRfcmVxdWlyZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX3BhcmVudF9yZXF1aXJlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gZWxlbWVudCB3aXRoIGFuIGltcGxpY2l0IG9yIGV4cGxpY2l0IHJvbGUgbXVzdCBiZSBjb250YWluZWQgd2l0aGluIGEgdmFsaWQgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgZWxlbWVudCB3aXRoIHJvbGUgXFxcInswfVxcXCIgaXMgbm90IGNvbnRhaW5lZCBpbiBvciBvd25lZCBieSBhbiBlbGVtZW50IHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgcm9sZXM6IFxcXCJ7MX1cXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgLy8gVE9ETzogQUNUOiBDaGVjayBGYWlsIDNcbiAgICBhY3Q6IFwiZmY4OWM5XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBSUFRVdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIGEgcHJlc2VudGF0aW9uYWwgY2hpbGQgb2YgYW4gZWxlbWVudFxuICAgICAgICBpZiAoUlBUVXRpbC5zaG91bGRCZVByZXNlbnRhdGlvbmFsQ2hpbGQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGVzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50IGNvbnRhaW5zIG5vbmUgb3IgcHJlc2VudGF0aW9uIHJvbGVcbiAgICAgICAgbGV0IHByZXNlbnRhdGlvblJvbGVzID0gW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXTtcbiAgICAgICAgY29uc3QgZm91bmQgPSByb2xlcy5zb21lKHI9PiBwcmVzZW50YXRpb25Sb2xlcy5pbmNsdWRlcyhyKSk7XG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgbGV0IHJvbGVOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBjb250YWluZXJSb2xlcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgdGVzdGVkQ29udGFpbmVyID0gMDtcblxuICAgICAgICBsZXQgYW5jZXN0b3JSb2xlcyA9IGNvbnRleHRIaWVyYXJjaGllc1tcImFyaWFcIl0ubWFwKGluZm8gPT4gaW5mby5yb2xlKTtcbiAgICAgICAgbGV0IHBhcmVudFJvbGUgPSBhbmNlc3RvclJvbGVzW2FuY2VzdG9yUm9sZXMubGVuZ3RoIC0gMl07XG4gICAgICAgIGxldCBjb3VudCA9IDI7XG4gICAgICAgIHdoaWxlIChwYXJlbnRSb2xlID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICBwYXJlbnRSb2xlID0gYW5jZXN0b3JSb2xlc1thbmNlc3RvclJvbGVzLmxlbmd0aCAtIGNvdW50XTtcblxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGogPSAwLCBsZW5ndGggPSByb2xlcy5sZW5ndGg7IGogPCBsZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXSAmJiBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0uY29udGFpbmVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0ZXN0ZWRDb250YWluZXIrKztcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb250YWluZXJSb2xlcyA9IGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXS5jb250YWluZXI7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGNvbnRhaW5lcnNMZW5ndGggPSBjb250YWluZXJSb2xlcy5sZW5ndGg7ICFwYXNzZWQgJiYgaSA8IGNvbnRhaW5lcnNMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBwYXJlbnRSb2xlID09PSBjb250YWluZXJSb2xlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXNzZWQgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIucHVzaChyb2xlc1tqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4xLnB1c2gocm9sZU5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjIucHVzaChjb250YWluZXJSb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtyZXRUb2tlbjEsIHJldFRva2VuMl0pO1xuICAgICAgICBpZiAodGVzdGVkQ29udGFpbmVyID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbcmV0VG9rZW4xLnRvU3RyaW5nKCksIHJldFRva2VuMi50b1N0cmluZygpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpyZWdpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlUmVnaW9uc1VuaXF1ZUxhYmVsX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJyZWdpb25cXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIGEgXFxcInJlZ2lvblxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gUGVyIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE3L05PVEUtd2FpLWFyaWEtcHJhY3RpY2VzLTEuMS0yMDE3MTIxNC9leGFtcGxlcy9sYW5kbWFya3MvSFRNTDUuaHRtbFxuICAgICAgICAvLyBmb3JtIGVsZW1lbnQgc2hvdWxkIG9ubHkgYmUgY29uc2lkZXJlZCBpZiBpdCBoYXMgYW4gYXJpYSBsYWJlbCBvciB0aXRsZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpID09PSBcInJlZ2lvblwiIHx8XG4gICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpIHx8XG4gICAgICAgICAgICAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpICYmICFSUFRVdGlsLmlzSWRSZWZlclRvU2VsZihydWxlQ29udGV4dCwgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSkgfHxcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gQ29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgdGhhdCBpcyBzZXQgYnkgdGhlIHJ1bGVzXG4gICAgICAgICAgICAvLyBBbHNvLCBjb25zaWRlciBJbXBsaWNpdCByb2xlIGNoZWNraW5nLlxuICAgICAgICAgICAgbGV0IGxhbmRtYXJrcyA9IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcInJlZ2lvblwiLFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChsYW5kbWFya3MubGVuZ3RoID09PSAwIHx8IGxhbmRtYXJrcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGR1cGVzID0gZ2V0Q2FjaGUoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBcImFyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICAgICAgZHVwZXMgPSBSUFRVdGlsLmZpbmRBcmlhTGFiZWxEdXBlcyhsYW5kbWFya3MpO1xuICAgICAgICAgICAgICAgIHNldENhY2hlKFxuICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgICAgICBcImFyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgICAgICBkdXBlc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbXlMYWJlbCA9IFJQVFV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgICAgIG15TGFiZWwgIT09IFwiXCIgJiZcbiAgICAgICAgICAgICAgICAoIShteUxhYmVsIGluIGR1cGVzKSB8fCBkdXBlc1tteUxhYmVsXSA8PSAxKTtcbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtteUxhYmVsXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX3JlZ2lvbl9sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3JlZ2lvbl9sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpyZWdpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1JlZ2lvbkxhYmVsX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfcmVnaW9uX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IHdpdGggYSBcXFwicmVnaW9uXFxcIiByb2xlIGRvZXMgbm90IGhhdmUgYW4gYWNjZXNzaWJsZSBuYW1lXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSBlbGVtZW50IHdpdGggXFxcInJlZ2lvblxcXCIgcm9sZSBpcyBub3QgbGFiZWxlZCB3aXRoIGFuICdhcmlhLWxhYmVsJyBvciAnYXJpYS1sYWJlbGxlZGJ5J1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJyZWdpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGFuIGFjY2Vzc2libGUgbmFtZSB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBnZXRSb2xlc1VuZGVmaW5lZEJ5QXJpYSB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX3JvbGVfYWxsb3dlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3JvbGVfYWxsb3dlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1ZhbGlkUm9sZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX3JvbGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcmlhX3JvbGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IGBhcmlhX3JvbGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYGFyaWFfcm9sZV9hbGxvd2VkLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnRzIG11c3QgaGF2ZSBhIHZhbGlkICdyb2xlJyBwZXIgQVJJQSBzcGVjaWZpY2F0aW9uXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSByb2xlICd7MH0nIGRlZmluZWQgb24gdGhlIGVsZW1lbnQgaXMgbm90IHZhbGlkIHBlciBBUklBIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJTb21lIG9mIHRoZSByb2xlcywgJ3swfScsIGRlZmluZWQgb24gdGhlIGVsZW1lbnQgYXJlIG5vdCB2YWxpZCBwZXIgQVJJQSBzcGVjaWZpY2F0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCJdLFxuICAgICAgICBudW06IFwiNC4xLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IFJlY2hlY2tcbiAgICBhY3Q6IFwiNjc0YjEwXCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHJvbGVTdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAocm9sZVN0ci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKS50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaW52YWxpZFJvbGVzID0gZ2V0Um9sZXNVbmRlZmluZWRCeUFyaWEocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGlmICghaW52YWxpZFJvbGVzIHx8IGludmFsaWRSb2xlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJvbGVzID0gcm9sZVN0ci5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgaWYgKGludmFsaWRSb2xlcy5sZW5ndGggPT09IHJvbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBbaW52YWxpZFJvbGVzLmpvaW4oXCIsXCIpXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGludmFsaWRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiLCBbaW52YWxpZFJvbGVzLmpvaW4oXCIsXCIpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IGlzVGFibGVEZXNjZW5kYW50LCBhcmVSb2xlc0RlZmluZWQgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBsZXQgYXJpYV9yb2xlX3JlZHVuZGFudDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3JvbGVfcmVkdW5kYW50XCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX3JvbGVfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9yZWR1bmRhbnRcIjogXCJhcmlhX3JvbGVfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3JvbGVfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIkFuIGV4cGxpY2l0bHktYXNzaWduZWQgQVJJQSByb2xlIGlzIG5vdCByZWR1bmRhbnQgd2l0aCB0aGUgaW1wbGljaXQgcm9sZSBvZiB0aGUgZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJmYWlsX3JlZHVuZGFudFwiOiBcIlRoZSBleHBsaWNpdGx5LWFzc2lnbmVkIEFSSUEgcm9sZSBcXFwiezB9XFxcIiBpcyByZWR1bmRhbnQgd2l0aCB0aGUgaW1wbGljaXQgcm9sZSBvZiB0aGUgZWxlbWVudCA8ezF9PlwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGV4cGxpY2l0bHktYXNzaWduZWQgQVJJQSByb2xlIHNob3VsZCBub3QgYmUgcmVkdW5kYW50IHdpdGggdGhlIGltcGxpY2l0IHJvbGUgb2YgdGhlIGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBlbGVtTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBhcmlhUm9sZXMgPSBSUFRVdGlsLmdldFJvbGVzKHJ1bGVDb250ZXh0LCBmYWxzZSk7XG4gICAgICAgIGlmICghYXJpYVJvbGVzIHx8IGFyaWFSb2xlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICAvLyB0aGUgaW52YWxpZCByb2xlIGNhc2U6IGhhbmRsZWQgYnkgUnB0X0FyaWFfVmFsaWRSb2xlLiBJZ25vcmUgdG8gYXZvaWQgZHVwbGljYXRlZCByZXBvcnRcbiAgICAgICAgbGV0IHJvbGVfZGVmaW5lZCA9IGFyZVJvbGVzRGVmaW5lZChhcmlhUm9sZXMpO1xuICAgICAgICBpZiAoIXJvbGVfZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGRlcGVuZGVuY3kgY2hlY2s6IGlmIGl0J3MgYWxyZWFkeSBmYWlsZWQgaW4gdGhlIHBhcmVudCByZWxhdGlvbiwgdGhlbiBza2lwIHRoaXMgY2hlY2tcbiAgICAgICAgaWYgKFtcInRkXCIsIFwidGhcIiwgXCJ0clwiXS5pbmNsdWRlcyhlbGVtTmFtZSkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRSb2xlID0gaXNUYWJsZURlc2NlbmRhbnQoY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnRSb2xlICE9PSBudWxsICYmIHBhcmVudFJvbGUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpbXBsaWNpdFJvbGVzID0gUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWltcGxpY2l0Um9sZXMgfHwgaW1wbGljaXRSb2xlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcblxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJpYVJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWltcGxpY2l0Um9sZXMuaW5jbHVkZXMoYXJpYVJvbGVzW2ldKSkgIFxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgICAgICBlbHNlICAgICBcbiAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbChcImZhaWxfcmVkdW5kYW50XCIsIFthcmlhUm9sZXNbaV0sIGVsZW1OYW1lXSkpO1xuICAgICAgICB9ICBcbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKSAgXG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICByZXR1cm4gbnVsbDsgICAgXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IGdldENhY2hlLCBzZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6c2VhcmNoXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZVNlYXJjaExhbmRtYXJrc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwic2VhcmNoXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwic2VhcmNoXFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIENvbnNpZGVyIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHRoYXQgaXMgc2V0IGJ5IHRoZSBydWxlc1xuICAgICAgICBsZXQgbGFuZG1hcmtzID0gUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcInNlYXJjaFwiLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxhbmRtYXJrcy5sZW5ndGggPT09IDAgfHwgbGFuZG1hcmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZHVwZXMgPSBnZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICBkdXBlcyA9IFJQVFV0aWwuZmluZEFyaWFMYWJlbER1cGVzKGxhbmRtYXJrcyk7XG4gICAgICAgICAgICBzZXRDYWNoZShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwiYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZHVwZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG15TGFiZWwgPSBSUFRVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgbXlMYWJlbCAhPT0gXCJcIiAmJiAoIShteUxhYmVsIGluIGR1cGVzKSB8fCBkdXBlc1tteUxhYmVsXSA8PSAxKTtcblxuICAgICAgICAvLyByZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBydWxlQ29udGV4dCwgJycsICcnLCBbIG15TGFiZWwgXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMsIGFyZVJvbGVzRGVmaW5lZCwgaXNUYWJsZURlc2NlbmRhbnQsIGdldEludmFsaWRSb2xlcywgZ2V0RGVwcmVjYXRlZEFyaWFSb2xlcywgZ2V0RGVwcmVjYXRlZEFyaWFBdHRyaWJ1dGVzLCBnZXRSb2xlc1VuZGVmaW5lZEJ5QXJpYSB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX3JvbGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9yb2xlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImFyaWFfc2VtYW50aWNzX3JvbGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfcm9sZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfcm9sZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImFyaWFfcm9sZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9yb2xlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIEFSSUEgcm9sZSAnezB9JyBpcyBub3QgdmFsaWQgZm9yIHRoZSBlbGVtZW50IDx7MX0+XCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSBBUklBIHJvbGUgJ3swfScgaXMgbm90IHZhbGlkIGZvciB0aGUgZWxlbWVudCA8ezF9PiBhbmQgbWF5IGJlIGlnbm9yZWQgYnkgdGhlIGJyb3dzZXIgc2luY2UgdGhlIGVsZW1lbnQgaXMgZm9jdXNhYmxlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQVJJQSByb2xlcyBtdXN0IGJlIHZhbGlkIGZvciB0aGUgZWxlbWVudCB0byB3aGljaCB0aGV5IGFyZSBhc3NpZ25lZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHRhZ05hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIG9ubHkgY2hlayBlbGVtZW50ICgxKSBhbmQgZnJhZ21lbnQgbm9kZXMgKDExKVxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgLy8gdGhlIGludmFsaWQgcm9sZSBjYXNlOiBoYW5kbGVkIGJ5IGFyaWFfcm9sZV9hbGxvd2VkLiBJZ25vcmUgdG8gYXZvaWQgZHVwbGljYXRlZCByZXBvcnRcbiAgICAgICAgY29uc3QgdW5kZWZpbmVkUm9sZXMgPSBnZXRSb2xlc1VuZGVmaW5lZEJ5QXJpYShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICh1bmRlZmluZWRSb2xlcyAmJiB1bmRlZmluZWRSb2xlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZFJvbGVzID0gZ2V0RGVwcmVjYXRlZEFyaWFSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXByZWNhdGVkUm9sZXMgJiYgZGVwcmVjYXRlZFJvbGVzLmxlbmd0aCA+IDApIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBkZXByZWNhdGVkQXR0cmlidXRlcyA9IGdldERlcHJlY2F0ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXByZWNhdGVkQXR0cmlidXRlcyAmJiBkZXByZWNhdGVkQXR0cmlidXRlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBkZXBlbmRlbmN5IGNoZWNrOiBpZiBpdCdzIGFscmVhZHkgZmFpbGVkLCB0aGVuIHNraXBcbiAgICAgICAgaWYgKFtcInRkXCIsIFwidGhcIiwgXCJ0clwiXS5pbmNsdWRlcyh0YWdOYW1lKSkge1xuICAgICAgICAgICAgbGV0IHBhcmVudFJvbGUgPSBpc1RhYmxlRGVzY2VuZGFudChjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAgICAgaWYgKHBhcmVudFJvbGUgIT09IG51bGwgJiYgcGFyZW50Um9sZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRvbVJvbGVzOiBzdHJpbmdbXSA9IFJQVFV0aWwuZ2V0VXNlckRlZmluZWRSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghZG9tUm9sZXMgfHwgZG9tUm9sZXMubGVuZ3RoID09PTApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBjaGVjayB0aGUgJ2dlbmVyaWMnIHJvbGUgZmlyc3RcbiAgICAgICAgaWYgKGRvbVJvbGVzLmluY2x1ZGVzKCdnZW5lcmljJykpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW1wiZ2VuZXJpY1wiLCB0YWdOYW1lXSk7XG4gICAgICAgIFxuICAgICAgICBsZXQgaW52YWxpZFJvbGVzID0gZ2V0SW52YWxpZFJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGludmFsaWRSb2xlcyA9PT0gbnVsbCB8fCBpbnZhbGlkUm9sZXMubGVuZ3RoID09PTApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIiwgW2RvbVJvbGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZV0pO1xuXG4gICAgICAgIGlmIChpbnZhbGlkUm9sZXMuaW5jbHVkZXMoXCJwcmVzZW50YXRpb25cIikgfHwgaW52YWxpZFJvbGVzLmluY2x1ZGVzKFwibm9uZVwiKSAmJiBSUFRVdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtpbnZhbGlkUm9sZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lXSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoaW52YWxpZFJvbGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW2ludmFsaWRSb2xlcy5qb2luKFwiLCBcIiksIHRhZ05hbWVdKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChkb21Sb2xlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFtkb21Sb2xlcy5qb2luKFwiLCBcIiksIHRhZ05hbWVdKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuLy8gVGhpcyBydWxlIGlzIGluIHRoZSBzYW1lIGZpbGUgYmVjYXVzZSB0aGVyZSBpcyBhIGRlcGVuZGVuY3kgdGhhdCBhcmlhX3JvbGVfdmFsaWQgcnVucyBmaXJzdCxcbi8vIGFuZCB0aGUgaW5mbyBpcyBwYXNzZWQgYnkgY2FjaGUsIGJ1dCB0aGVyZSBpc24ndCBhIGRlcGVuZGVuY3kgaW4gdGhlIEZhaWxfMiBzY2VuYXJpbywgc28gcmVndWxhclxuLy8gZGVwZW5kZW5jeSBjYW5ub3QgYmUgdXNlZFxuZXhwb3J0IGxldCBhcmlhX2F0dHJpYnV0ZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICAvLyBUaGUgdGhlIEFSSUEgcm9sZSBpcyBjb21wbGV0ZWx5IGludmFsaWQsIHNraXAgdGhpcyBjaGVja1xuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZFwiLCBcImFyaWFfcm9sZV92YWxpZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImFyaWFfYXR0cmlidXRlX2FsbG93ZWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiUGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCI6IFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfaW1wbGljaXRfcm9sZV9hdHRyXCI6IFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfaW1wbGljaXRfcm9sZV9hdHRyXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFSSUEgYXR0cmlidXRlcyBtdXN0IGJlIHZhbGlkIGZvciB0aGUgZWxlbWVudCBhbmQgQVJJQSByb2xlIHRvIHdoaWNoIHRoZXkgYXJlIGFzc2lnbmVkXCIsXG4gICAgICAgICAgICBcIlBhc3NcIjogXCJBUklBIGF0dHJpYnV0ZXMgYXJlIHZhbGlkIGZvciB0aGUgZWxlbWVudCBhbmQgQVJJQSByb2xlXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIjogXCJUaGUgQVJJQSBhdHRyaWJ1dGVzIFxcXCJ7MH1cXFwiIGFyZSBub3QgdmFsaWQgZm9yIHRoZSBlbGVtZW50IDx7MX0+IHdpdGggQVJJQSByb2xlIFxcXCJ7Mn1cXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9pbXBsaWNpdF9yb2xlX2F0dHJcIjogXCJUaGUgQVJJQSBhdHRyaWJ1dGVzIFxcXCJ7MH1cXFwiIGFyZSBub3QgdmFsaWQgZm9yIHRoZSBlbGVtZW50IDx7MX0+IHdpdGggaW1wbGljaXQgQVJJQSByb2xlIFxcXCJ7Mn1cXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXCI1YzAxZWFcIiwgeyBcIjQ2Y2E3ZlwiOiB7IFwiUGFzc1wiOiBcInBhc3NcIiwgXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCI6IFwiZmFpbFwiLCBcIkZhaWxfaW52YWxpZF9pbXBsaWNpdF9yb2xlX2F0dHJcIjogXCJmYWlsXCJ9fV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gb25seSBjaGVrIGVsZW1lbnQgKDEpXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGlnbm9yZSBpZiBubyBhcmlhIGF0dHJpYnV0ZVxuICAgICAgICBsZXQgYXJpYUF0dHJpYnV0ZXM6c3RyaW5nW10gPSBSUFRVdGlsLmdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoYXJpYUF0dHJpYnV0ZXMgPT09IG51bGwgfHwgYXJpYUF0dHJpYnV0ZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgXG4gICAgICAgIGxldCByb2xlczogc3RyaW5nW10gPSBSUFRVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgZXhwbGljaXQgPSB0cnVlO1xuICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gdGhlIGludmFsaWQgcm9sZSBjYXNlOiBoYW5kbGVkIGJ5IFJwdF9BcmlhX1ZhbGlkUm9sZS4gSWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgcmVwb3J0XG4gICAgICAgICAgICBpZiAoIWFyZVJvbGVzRGVmaW5lZChyb2xlcykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL25vIGV4cGxpY2l0IHJvbGUgZGVmaW5lZFxuICAgICAgICAgICAgcm9sZXMgPSAgUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgZXhwbGljaXQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHRhZ05hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBmYWlsZWRBdHRyaWJ1dGVzID0gZ2V0SW52YWxpZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFmYWlsZWRBdHRyaWJ1dGVzIHx8IGZhaWxlZEF0dHJpYnV0ZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiLCBbYXJpYUF0dHJpYnV0ZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lLCByb2xlcy5qb2luKFwiLCBcIildKTtcblxuICAgICAgICBpZiAocm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKGV4cGxpY2l0KVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIiwgW2ZhaWxlZEF0dHJpYnV0ZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lLCByb2xlcy5qb2luKFwiLCBcIildKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX2ludmFsaWRfaW1wbGljaXRfcm9sZV9hdHRyXCIsIFtmYWlsZWRBdHRyaWJ1dGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZSwgcm9sZXMuam9pbihcIiwgXCIpXSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIiwgW2ZhaWxlZEF0dHJpYnV0ZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lLCBcIm5vbmVcIl0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBhcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6dG9vbGJhclwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVUb29sYmFyVW5pcXVlTGFiZWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIHRvb2xiYXIgY29tcG9uZW50cyBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQWxsIHRvb2xiYXIgY29tcG9uZW50cyBvbiBhIHBhZ2UgbXVzdCBoYXZlIHVuaXF1ZSBsYWJlbHMgc3BlY2lmaWVkXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IFJQVFV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJ0b29sYmFyXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkdXBlcyA9IGdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWR1cGVzKSB7XG4gICAgICAgICAgICBkdXBlcyA9IFJQVFV0aWwuZmluZEFyaWFMYWJlbER1cGVzKGxhbmRtYXJrcyk7XG4gICAgICAgICAgICBzZXRDYWNoZShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBteUxhYmVsID0gUlBUVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcGFzc2VkID1cbiAgICAgICAgICAgIG15TGFiZWwgIT09IFwiXCIgJiYgKCEobXlMYWJlbCBpbiBkdXBlcykgfHwgZHVwZXNbbXlMYWJlbF0gPD0gMSk7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbbXlMYWJlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG5leHBvcnQgbGV0IGFyaWFfd2lkZ2V0X2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfd2lkZ2V0X2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfV2lkZ2V0TGFiZWxzX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV93aWRnZXRfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3dpZGdldF9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfd2lkZ2V0X2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbnRlcmFjdGl2ZSBjb21wb25lbnQgbXVzdCBoYXZlIGEgcHJvZ3JhbW1hdGljYWxseSBhc3NvY2lhdGVkIG5hbWVcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiSW50ZXJhY3RpdmUgY29tcG9uZW50IHdpdGggQVJJQSByb2xlICd7MH0nIGRvZXMgbm90IGhhdmUgYSBwcm9ncmFtbWF0aWNhbGx5IGFzc29jaWF0ZWQgbmFtZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCJtNmIxcTNcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvKiByZW1vdmVkIHRoZSByb2xlIGNoZWNrIHJvbGU9IHByZXNlbnRhdGlvbiBhbmQgcm9sZT1ub25lIHNpbmNlIHRoZXNlIDIgcm9sZXMgYXJlIG5vdCBpbiB0aGUgbGlzdCBvZiB3aWRnZXQgdHlwZSByb2xlcyAqL1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSAmJlxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiaGlkZGVuXCIpIHx8XG4gICAgICAgICAgICAoUlBUVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImNvbWJvYm94XCIpICYmXG4gICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwidGV4dGJveFwiKSB8fFxuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJzZWFyY2hib3hcIilcbiAgICAgICAgICAgICAgICApKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZGlhZ25vc2UgdGhhdCBhIGNvbWJvYm94IGlucHV0IHRleHRib3ggaGFzIGEgbGFiZWwoZ2l0aHViIGlzc3VlICMxMTA0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZWxlbVJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gSGFuZGxlZCBieSBpbnB1dF9sYWJlbF9leGlzdHNcbiAgICAgICAgbGV0IHNraXBSb2xlcyA9IFtcbiAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICBcImNoZWNrYm94XCIsXG4gICAgICAgICAgICBcImNvbWJvYm94XCIsXG4gICAgICAgICAgICBcImxpc3Rib3hcIixcbiAgICAgICAgICAgIFwibWVudWl0ZW1jaGVja2JveFwiLFxuICAgICAgICAgICAgXCJtZW51aXRlbXJhZGlvXCIsXG4gICAgICAgICAgICBcInJhZGlvXCIsXG4gICAgICAgICAgICBcInNlYXJjaGJveFwiLFxuICAgICAgICAgICAgXCJzbGlkZXJcIixcbiAgICAgICAgICAgIFwic3BpbmJ1dHRvblwiLFxuICAgICAgICAgICAgXCJzd2l0Y2hcIixcbiAgICAgICAgICAgIFwidGV4dGJveFwiLFxuICAgICAgICAgICAgXCJwcm9ncmVzc2JhclwiLFxuICAgICAgICAgICAgXCJsaW5rXCIsXG4gICAgICAgIF07XG4gICAgICAgIGlmIChza2lwUm9sZXMuaW5jbHVkZXMoZWxlbVJvbGUpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGFnTmFtZSA9PT0gXCJvdXRwdXRcIiB8fFxuICAgICAgICAgICAgKHRhZ05hbWUgPT09IFwiaW5wdXRcIiAmJlxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiZmlsZVwiKVxuICAgICAgICApIHtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIC8vIEZvcm0vaW5wdXQgZWxlbWVudHMgYXJlIGNoZWNrZWQgYnkgRzQxLCB3ZSBza2lwIHRoZW0gZnJvbSB0aGlzIHJ1bGUuIEdpdGh1YiBpc3N1ZSA0NDlcbiAgICAgICAgICAgIGxldCBza2lwRWxlbWVudHMgPSBbXG4gICAgICAgICAgICAgICAgXCJpbnB1dFwiLFxuICAgICAgICAgICAgICAgIFwidGV4dGFyZWFcIixcbiAgICAgICAgICAgICAgICBcInNlbGVjdFwiLFxuICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgXCJkYXRhbGlzdFwiLFxuICAgICAgICAgICAgICAgIFwib3B0Z3JvdXBcIixcbiAgICAgICAgICAgICAgICBcIm9wdGlvblwiLFxuICAgICAgICAgICAgICAgIFwia2V5Z2VuXCIsXG4gICAgICAgICAgICAgICAgXCJvdXRwdXRcIixcbiAgICAgICAgICAgICAgICBcInByb2dyZXNzXCIsXG4gICAgICAgICAgICAgICAgXCJtZXRlclwiLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBza2lwRWxlbWVudHMuaW5kZXhPZihydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSAhPVxuICAgICAgICAgICAgICAgIC0xXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGF2b2lkIGRpYWdub3NpbmcgdGhlIHBvcHVwIGxpc3Qgb2YgYSBjb21ib2JveC5cbiAgICAgICAgbGV0IHJvbGVzVG9DaGVjayA9IFtcImxpc3Rib3hcIiwgXCJ0cmVlXCIsIFwiZ3JpZFwiLCBcImRpYWxvZ1wiXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlc1RvQ2hlY2subGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChSUFRVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgcm9sZXNUb0NoZWNrW2pdKSkge1xuICAgICAgICAgICAgICAgIGxldCBjb21ib2JveGVzID0gUlBUVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgICAgICAgICAgXCJjb21ib2JveFwiLFxuICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvbWJvYm94ZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbWJvYm94ID0gY29tYm9ib3hlc1trXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFyaWFfb3ducyA9IFJQVFV0aWwuZ2V0RWxlbWVudEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJvYm94LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhcmlhLW93bnNcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJpYV9vd25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3ducyA9IFJQVFV0aWwubm9ybWFsaXplU3BhY2luZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhX293bnMudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgICAgICApLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3ducy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25lZCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duc1tpXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHByb2hpYml0ZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGRlc2lnblBhdHRlcm5zID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zO1xuICAgICAgICAvL2dldCBhdHRyaWJ1dGUgcm9sZXMgYXMgd2VsbCBhcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgICAgbGV0IHJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIGxldCBudW1XaWRnZXRzVGVzdGVkID0gMDtcbiAgICAgICAgbGV0IGludGVyYWN0aXZlUm9sZVR5cGVzID0gW1wid2lkZ2V0XCIsIFwibGl2ZVJlZ2lvblwiLCBcIndpbmRvd1wiXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHJvbGVzLmxlbmd0aDsgcGFzc2VkICYmIGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbGV0IHBhdHRlcm4gPSBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tpXV07XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBwYXR0ZXJuICYmXG4gICAgICAgICAgICAgICAgcGF0dGVybi5uYW1lUmVxdWlyZWQgJiZcbiAgICAgICAgICAgICAgICBwYXR0ZXJuLnJvbGVUeXBlICYmXG4gICAgICAgICAgICAgICAgaW50ZXJhY3RpdmVSb2xlVHlwZXMuaW5jbHVkZXMocGF0dGVybi5yb2xlVHlwZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICsrbnVtV2lkZ2V0c1Rlc3RlZDtcblxuICAgICAgICAgICAgICAgIC8vIEFsbCB3aWRnZXRzIG1heSBoYXZlIGFuIGF1dGhvciBzdXBwbGllZCBhY2Nlc3NpYmxlIG5hbWUuXG4gICAgICAgICAgICAgICAgLy8gVGl0bGUgaXMgbGVnYWwsIGJ1dCBkb24ndCBhZHZlcnRpc2UgaXRzIHVzZSBpbiBkb2N1bWVudGF0aW9uLlxuICAgICAgICAgICAgICAgIC8vIEVuY291cmFnZSB1c2Ugb2YgYXJpYS1sYWJlbCwgYXJpYS1sYWJlbGxlZGJ5IG9yIGh0bWwgbGFiZWwgZWxlbWVudC5cbiAgICAgICAgICAgICAgICBwYXNzZWQgPVxuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHxcbiAgICAgICAgICAgICAgICAgICAgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKSB8fFxuICAgICAgICAgICAgICAgICAgICBSUFRVdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICFwYXNzZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5uYW1lRnJvbSAmJlxuICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLm5hbWVGcm9tLmluZGV4T2YoXCJjb250ZW50c1wiKSA+PSAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlZSBpZiB3aWRnZXQncyBhY2Nlc3NpYmxlIG5hbWUgaXMgc3VwcGxpZWQgYnkgZWxlbWVudCdzIGlubmVyIHRleHRcbiAgICAgICAgICAgICAgICAgICAgLy8gbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuaGFzSW5uZXJDb250ZW50T3JBbHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGhhcyBpbXBsaWNpdCBsYWJlbCwgbGlrZSA8bGFiZWw+PGlucHV0IC4uLi4+YWJjIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IFJQVFV0aWwuaGFzSW1wbGljaXRMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhcGFzc2VkICYmXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJlxuICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIERPTVV0aWwuY2xlYW5XaGl0ZXNwYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgKS50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5uYW1lRnJvbS5pbmRleE9mKFwicHJvaGliaXRlZFwiKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2hpYml0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChudW1XaWRnZXRzVGVzdGVkID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW2VsZW1Sb2xlXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL1RPRE9cbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGlmIChwcm9oaWJpdGVkKSB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgYXNjaWlhcnRfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhc2NpaWFydF9hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206cHJlLCBkb206bGlzdGluZywgZG9tOnhtcCwgZG9tOnBsYWludGV4dFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1ByZV9BU0NJSUFydFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhc2NpaWFydF9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJhc2NpaWFydF9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhc2NpaWFydF9hbHRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCBBU0NJSSBhcnQgaGFzIGEgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFTQ0lJIGFydCBtdXN0IGhhdmUgYSB0ZXh0IGFsdGVybmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIEZpeCBmb3IgSURXQiB3cml0ZXJzLiBEb24ndCB0cmlnZ2VyIGlmIGNvbnRlbnQgaXMgaW4gYSBjb2RlIGVsZW1lbnQuICBUaGUgY29kZSBlbGVtZW50IGlzIHNlYXJjaGVkIGZvclxuICAgICAgICAvLyBpbiB2YXJpb3VzIHBsYWNlcyBiZWNhdXNlIG9mIHRoZSB3ZWlyZCB3YXkgdmFyaW91cyBicm93c2VycyByZW5kZXIgPGNvZGU+PHByZT48L3ByZT48L2NvZGUuICBGaXJlZm94LFxuICAgICAgICAvLyBIdG1sVW5pdCBhbmQgQ2hyb21lIGFsbCByZW5kZXIgZGlmZmVyZW50bHkuICBGaXJlZm94OiA8Y29kZT48L2NvZGU+PHByZT48L3ByZT4gIEh0bWxVbml0OiA8L2NvZGU+PHByZT48Y29kZT48L2NvZGU+PC9wcmU+XG4gICAgICAgIC8vIFNlZSB1bml0IHRlc3QgQ29kZUVsZW1lbnRBYm92ZVByZUVsZW1lbnQuaHRtbC4gIERvbid0IGtub3cgaG93IFJQVCByZW5kZXJzLCBzbyBjb3ZlciBhbGwgdGhlIGJhc2VzLlxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcInByZVwiKSB7XG4gICAgICAgICAgICBpZiAoKHJ1bGVDb250ZXh0LnByZXZpb3VzU2libGluZyAmJiBydWxlQ29udGV4dC5wcmV2aW91c1NpYmxpbmcubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImNvZGVcIikgfHxcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNvZGVcIikubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgICAgIFJQVFV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiY29kZVwiKSkge1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCB0eHRWYWx1ZSA9IFJQVFV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IG5vbkFscGhhTnVtZXJpY05vclNwYWNlQ291bnQgPSAwO1xuICAgICAgICBsZXQgYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCA9IDA7XG4gICAgICAgIGxldCBsYXN0Q2hhcmFjdGVyID0gXCJcIjtcblxuICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHRleHQgY29udGVudFxuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBwYXNzZWQgJiYgKGlkeCA8IHR4dFZhbHVlLmxlbmd0aCk7ICsraWR4KSB7XG4gICAgICAgICAgICBsZXQgY2hTdHIgPSB0eHRWYWx1ZS5zdWJzdHIoaWR4LCAxKTtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0IGlzIGFscGhhbnVtZXJpYyBvciBwdW5jdHVhdGlvblxuICAgICAgICAgICAgaWYgKC9bXFx3IUAjJCUmXFwqKCkuLD9cXFtcXF17fTw+PVwiOlxcL1xcXFwtXS8udGVzdChjaFN0cikpIHtcbiAgICAgICAgICAgICAgICAvLyBEZXRlY3Qgc2FtZSBjaGFyYWN0ZXIgc2VxdWVuY2VcbiAgICAgICAgICAgICAgICBpZiAobGFzdENoYXJhY3RlciA9PSBjaFN0cikge1xuICAgICAgICAgICAgICAgICAgICBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID0gYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCArIDE7O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoL1xccy8udGVzdChjaFN0cikpIHtcbiAgICAgICAgICAgICAgICBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9uQWxwaGFOdW1lcmljTm9yU3BhY2VDb3VudCA9IG5vbkFscGhhTnVtZXJpY05vclNwYWNlQ291bnQgKyAxO1xuICAgICAgICAgICAgICAgIGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdENoYXJhY3RlciA9IGNoU3RyO1xuXG4gICAgICAgICAgICAvLyBNYWtlIHRoZSBkZWNpc2lvblxuICAgICAgICAgICAgaWYgKG5vbkFscGhhTnVtZXJpY05vclNwYWNlQ291bnQgPj0gNSB8fCBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID49IDQpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgYmxpbmtfY3NzX3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJibGlua19jc3NfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbToqW3N0eWxlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0JsaW5rX0NTU1RyaWdnZXIxXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYmxpbmtfY3NzX3Jldmlldy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBibGlua19jc3NfcmV2aWV3Lmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgYmxpbmtfY3NzX3Jldmlldy5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJEbyBub3QgdXNlIHRoZSBcXFwiYmxpbmtcXFwiIHZhbHVlIG9mIHRoZSAndGV4dC1kZWNvcmF0aW9uJyBwcm9wZXJ0eSBmb3IgbG9uZ2VyIHRoYW4gZml2ZSBzZWNvbmRzXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ2hlY2sgdGhlIFxcXCJibGlua1xcXCIgdmFsdWUgb2YgdGhlIENTUyAndGV4dC1kZWNvcmF0aW9uJyBwcm9wZXJ0eSBpcyBub3QgdXNlZCBmb3IgbW9yZSB0aGFuIHRoYW4gZml2ZSBzZWNvbmRzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIl0sXG4gICAgICAgIG51bTogXCIyLjIuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHRleHRWYWx1ZSA9IFJQVFV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZSgnc3R5bGUnKSkge1xuICAgICAgICAgICAgdGV4dFZhbHVlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRleHRWYWx1ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJ0ZXh0LWRlY29yYXRpb246YmxpbmtcIikgPT0gLTE7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgYmxpbmtfZWxlbV9kZXByZWNhdGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImJsaW5rX2VsZW1fZGVwcmVjYXRlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmJsaW5rXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQmxpbmtfQWx3YXlzVHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYmxpbmtfZWxlbV9kZXByZWNhdGVkLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGJsaW5rX2VsZW1fZGVwcmVjYXRlZC5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IGBibGlua19lbGVtX2RlcHJlY2F0ZWQuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ29udGVudCB0aGF0IGJsaW5rcyBwZXJzaXN0ZW50bHkgbXVzdCBub3QgYmUgdXNlZFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJDb250ZW50IGZvdW5kIHRoYXQgYmxpbmtzIHBlcnNpc3RlbnRseVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiXSxcbiAgICAgICAgbnVtOiBcIjIuMi4yXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgfVxufVxuICAgICIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBibG9ja3F1b3RlX2NpdGVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpibG9ja3F1b3RlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfQmxvY2txdW90ZV9IYXNDaXRlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IDxibG9ja3F1b3RlPiBzaG91bGQgbm90IGJlIHVzZWQgb25seSBmb3IgcXVvdGF0aW9ucywgbm90IGluZGVudGF0aW9uXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVXNlIDxibG9ja3F1b3RlPiBvbmx5IGZvciBxdW90YXRpb25zLCBub3QgaW5kZW50YXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiY2l0ZVwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGxldCBjaXRlRWxlbXMgPSBSUFRVdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwiY2l0ZVwiKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IGNpdGVFbGVtcyAhPSBudWxsICYmIGNpdGVFbGVtcy5sZW5ndGggPiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkOiBSdWxlID0ge1xuICAgIGlkOiBcImNhbnZhc19jb250ZW50X2Rlc2NyaWJlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmNhbnZhc1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19DYW52YXNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJjYW52YXNfY29udGVudF9kZXNjcmliZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNhbnZhc19jb250ZW50X2Rlc2NyaWJlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiVmVyaWZ5IGFjY2Vzc2liaWxpdHkgb2YgdGhlIDxjYW52YXM+IGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgPGNhbnZhcz4gZWxlbWVudCBtYXkgbm90IGJlIGFjY2Vzc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCIsIFwiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHJ1bGVDb250ZXh0LmlubmVySFRNTC50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgY2FwdGlvbl90cmFja19leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY2FwdGlvbl90cmFja19leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTp2aWRlb1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19WaWRlb19IYXNOb1RyYWNrXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImNhcHRpb25fdHJhY2tfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJjYXB0aW9uX3RyYWNrX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY2FwdGlvbl90cmFja19leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IGNhcHRpb25zIGFyZSBhdmFpbGFibGUgZm9yIGFueSBtZWFuaW5nZnVsIGF1ZGlvIG9yIHByb3ZpZGUgYSBjYXB0aW9uIHRyYWNrIGZvciB0aGUgPHZpZGVvPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8dmlkZW8+IGVsZW1lbnQgbXVzdCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZSBmb3IgYW55IG1lYW5pbmdmdWwgYXVkaW8gY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4yLjFcIiwgXCIxLjIuMlwiLCBcIjEuMi40XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxWaWRlb0VsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBpZ25vcmUgZGVjb3JhdGl2ZSB2aWRlbyBpZiB1c2VyIHVzZXMgYXJpYS1oaWRkZW5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdHJhY2tzID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0cmFja1wiKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyYWNrcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgcGFzc2VkID0gcGFzc2VkIHx8IHRyYWNrc1tpXS5nZXRBdHRyaWJ1dGUoXCJraW5kXCIpID09PSAnY2FwdGlvbnMnO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrcyBmb3IgYWRkaXRpb24gb2YgZHluYW1pYyB0cmFja3NcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnRleHRUcmFja3MgJiYgcnVsZUNvbnRleHQudGV4dFRyYWNrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJ1bGVDb250ZXh0LnRleHRUcmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBwYXNzZWQgfHwgcnVsZUNvbnRleHQudGV4dFRyYWNrc1tpXS5raW5kID09PSAnY2FwdGlvbnMnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IE5vZGVXYWxrZXIsIFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IGdldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmV4cG9ydCBsZXQgY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVwiXSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX21pc3NpbmdcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfbm90X2luX3BvcHVwXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2FjdGl2ZV9yb2xlX2ludmFsaWRcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfYWN0aXZlX25vdF9zZWxlY3RlZFwiOiBcImNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCInYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBpcyB1c2VkIGFwcHJvcHJpYXRlbHkgZm9yIHRoaXMgY29tYm9ib3hcIixcbiAgICAgICAgICAgIFwiRmFpbF9taXNzaW5nXCI6IFwiVGhlIGVsZW1lbnQgcmVmZXJlbmNlZCBieSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBcXFwiezB9XFxcIiBkb2VzIG5vdCBleGlzdFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vdF9pbl9wb3B1cFwiOiBcIlRoZSBlbGVtZW50IHJlZmVyZW5jZWQgYnkgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgXFxcInswfVxcXCIgZG9lcyBub3QgZXhpc3Qgd2l0aGluIHRoZSBwb3B1cCByZWZlcmVuY2VkIGJ5ICdpZCcgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9hY3RpdmVfcm9sZV9pbnZhbGlkXCI6IFwiVGhlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIFxcXCJ7MH1cXFwiIHJlZmVyZW5jZXMgYW4gZWxlbWVudCB3aXRoIHRoZSByb2xlcyBcXFwiezF9XFxcIiwgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIHZhbGlkIEFSSUEgcm9sZSBvZiAnb3B0aW9uJywgJ2dyaWRjZWxsJywgJ3JvdycsIG9yICd0cmVlaXRlbSdcIixcbiAgICAgICAgICAgIFwiRmFpbF9hY3RpdmVfbm90X3NlbGVjdGVkXCI6IFwiVGhlICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIFxcXCJ7MH1cXFwiIHJlZmVyZW5jZXMgYW4gZWxlbWVudCB0aGF0IGRvZXMgbm90IGhhdmUgJ2FyaWEtc2VsZWN0ZWQnIHNldCB0byB0cnVlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgbXVzdCBiZSB1c2VkIHRvIGRlZmluZSBmb2N1cyB3aXRoaW4gdGhlIGNvbWJvYm94IHBvcHVwLCBleGNlcHQgd2hlbiB1c2luZyBhIGRpYWxvZyBwb3B1cFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGNhY2hlID0gZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgIGxldCBjYWNoZWRFbGVtID0gY2FjaGVbY29udGV4dFtcImRvbVwiXS5yb2xlUGF0aF07XG4gICAgICAgIGlmICghY2FjaGVkRWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHsgcG9wdXBFbGVtZW50LCBwb3B1cElkIH0gPSBjYWNoZWRFbGVtO1xuICAgICAgICAvLyBJZiB0aGlzIGlzbid0IGRlZmluZWQsIHRoZSBjb21ib2JveCBpcyBwcm9iYWJseSBjb2xsYXBzZWQuIEEgcmVmZXJlbmNlIGVycm9yIGlzXG4gICAgICAgIC8vIGRldGVjdGVkIGluIGNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVxuICAgICAgICBpZiAoIXBvcHVwRWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gVGhpcyBydWxlIG9ubHkgYXBwbGllcyBpZiB0aGUgYWN0aXZlZGVzY2VuZGFudCBpcyBzcGVjaWZpZWRcbiAgICAgICAgbGV0IGFjdGl2ZUlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpO1xuICAgICAgICBpZiAoIWFjdGl2ZUlkIHx8IGFjdGl2ZUlkLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFjdGl2ZUVsZW0gPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgYWN0aXZlSWQpO1xuICAgICAgICBpZiAoIWFjdGl2ZUVsZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfbWlzc2luZ1wiLCBbYWN0aXZlSWRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIGV4YW1pbmUgdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChwb3B1cEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBOb2RlV2Fsa2VyKHBvcHVwRWxlbWVudCk7XG4gICAgICAgICAgICB3aGlsZSAoIWZvdW5kICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBwb3B1cEVsZW1lbnQgJiYgbncubm9kZSAhPSBwb3B1cEVsZW1lbnQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBudy5lbGVtKCkuZ2V0QXR0cmlidXRlKFwiaWRcIikgPT09IGFjdGl2ZUlkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcblxuICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlUGFzcyhcIkZhaWxfbm90X2luX3BvcHVwXCIsIFthY3RpdmVJZCwgcG9wdXBJZF0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhY3RpdmVSb2xlcyA9IFJQVFV0aWwuZ2V0Um9sZXMoYWN0aXZlRWxlbSwgdHJ1ZSk7XG4gICAgICAgIGxldCB2YWxpZFJvbGVzID0gW1wib3B0aW9uXCIsIFwiZ3JpZGNlbGxcIiwgXCJyb3dcIiwgXCJ0cmVlaXRlbVwiXS5maWx0ZXIoKHZhbGlkUm9sZSkgPT4gYWN0aXZlUm9sZXMuaW5jbHVkZXModmFsaWRSb2xlKSk7XG4gICAgICAgIGlmICh2YWxpZFJvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZUZhaWwoXCJGYWlsX2FjdGl2ZV9yb2xlX2ludmFsaWRcIiwgW2FjdGl2ZUlkLCBhY3RpdmVSb2xlcy5qb2luKFwiLFwiKV0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3RpdmVFbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIikgIT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlRmFpbChcIkZhaWxfYWN0aXZlX25vdF9zZWxlY3RlZFwiLCBbYWN0aXZlSWRdKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBOb2RlV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBjb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJjb21ib2JveF9hdXRvY29tcGxldGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiUGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbmxpbmVcIjogXCJGYWlsX2lubGluZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImNvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImNvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW5saW5lXCI6IFwiY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiVGhlIGNvbWJvYm94IGRvZXMgbm90IHVzZSAnYXJpYS1hdXRvY29tcGxldGUnIHZhbHVlICdcXFwiaW5saW5lXFxcIicgbm9yIGRvZXMgaXQgaGF2ZSAnYXJpYS1hdXRvY29tcGxldGUnIGRlZmluZWQgd2l0aGluIHRoZSBwb3B1cFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgY29tYm9ib3ggaGFzIHRoZSAnYXJpYS1hdXRvY29tcGxldGUnIGF0dHJpYnV0ZSBpbmNvcnJlY3RseSBzZXQgb24gYW4gZWxlbWVudCB3aXRoaW4gdGhlIHBvcHVwIHJlZmVyZW5jZWQgYnkgXFxcInswfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbmxpbmVcIjogXCJUaGUgY29tYm9ib3ggZG9lcyBub3Qgc3VwcG9ydCBhbiAnYXJpYS1hdXRvY29tcGxldGUnIGF0dHJpYnV0ZSB2YWx1ZSBzZXQgdG8gJ1xcXCJpbmxpbmVcXFwiJyBcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIGNvbWJvYm94IHRoYXQgc3VwcG9ydHMgYXV0b2NvbXBsZXRpb24gYmVoYXZpb3IgbXVzdCBoYXZlIHRoZSAnYXJpYS1hdXRvY29tcGxldGUnIGF0dHJpYnV0ZSBvbmx5IG9uIGl0cyB0ZXh0IGlucHV0IGVsZW1lbnQgd2l0aCBhIHZhbGlkIHZhbHVlOyBhIHZhbHVlIG9mICdcXFwiaW5saW5lXFxcIicgaXMgbm90IHN1cHBvcnRlZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgY2FjaGUgPSBnZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIHt9KTtcbiAgICAgICAgbGV0IGNhY2hlZEVsZW0gPSBjYWNoZVtjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoXTtcbiAgICAgICAgaWYgKCFjYWNoZWRFbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBwb3B1cElkLCBwb3B1cEVsZW1lbnQgfSA9IGNhY2hlZEVsZW07XG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtYXV0b2NvbXBsZXRlXCIpID09PSBcImlubGluZVwiKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlRmFpbChcIkZhaWxfaW5saW5lXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlOyBcbiAgICAgICAgLy8gZXhhbWluZSB0aGUgY2hpbGRyZW5cbiAgICAgICAgaWYgKHBvcHVwRWxlbWVudCAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUocG9wdXBFbGVtZW50KSkge1xuICAgICAgICAgICAgLy8gaWYgcG9wdXBFbGVtZW50IGl0c2VsZiBoYXMgXCJhcmlhLWF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICBwYXNzZWQgPSAhcG9wdXBFbGVtZW50Lmhhc0F0dHJpYnV0ZShcImFyaWEtYXV0b2NvbXBsZXRlXCIpO1xuICAgICAgICAgICAgLy8gaWYgYW55IGNoaWxkIG9mIHBvcHVwRWxlbWVudCBoYXMgXCJhcmlhLWF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICBpZiAocGFzc2VkICYmIHBvcHVwRWxlbWVudC5jaGlsZHJlbiAmJiBwb3B1cEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBOb2RlV2Fsa2VyKHBvcHVwRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiBudy5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gIW53LmVsZW0oKS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWF1dG9jb21wbGV0ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudy5iRW5kVGFnICYmIG53Lm5vZGUgPT09IHBvcHVwRWxlbWVudC5sYXN0RWxlbWVudENoaWxkKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlRmFpbChcIkZhaWxfMVwiLCBbcG9wdXBJZF0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXRWYWwubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5cbmZ1bmN0aW9uIHBhdHRlcm5EZXRlY3QoZWxlbTogRWxlbWVudCk6IFN0cmluZyB7XG4gICAgLy8gY2hlY2sgJ2V4cGxpY2l0JyByb2xlIGNvbWJvYm94IGFuZCB0aGF0IGl0IGlzIG5vdCA8c2VsZWN0Pi4gXG4gICAgaWYgKGVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNlbGVjdFwiICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKSAhPT0gXCJjb21ib2JveFwiKSB7XG4gICAgICAgIHJldHVybiBcImltcGxpY2l0XCI7XG4gICAgfSBlbHNlIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIlxuICAgICAgICAmJiAoIWVsZW0uaGFzQXR0cmlidXRlKFwidHlwZVwiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwidGV4dFwiKVxuICAgICAgICAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSAmJiAhZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpKSB7XG4gICAgICAgIC8vIExvb2tzIGxpa2UgdGhpcyBpcyBhbiBBUklBIDEuMCBwYXR0ZXJuLCB3aGljaCB0aGUgQVJJQSAxLjIgc3BlYyBzYXlzIHRvIGNvbnRpbnVlIHRvIGFsbG93XG4gICAgICAgIHJldHVybiBcIjEuMFwiO1xuICAgIH0gZWxzZSBpZiAoZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcImlucHV0XCJcbiAgICAgICAgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikgJiYgIWVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKSkge1xuICAgICAgICAvLyBMb29rcyBsaWtlIHRoaXMgaXMgYW4gQVJJQSAxLjEgcGF0dGVybiwgd2hpY2ggdGhlIEFSSUEgMS4yIHNwZWMgc2F5cyBpcyBub3cgaW52YWxpZFxuICAgICAgICByZXR1cm4gXCIxLjFcIjtcbiAgICB9XG4gICAgLy8gQXNzdW1lIHRoZXkncmUgdHJ5aW5nIHRvIGRvIHRoZSBsYXRlc3QsIDEuMiBwYXR0ZXJuXG4gICAgcmV0dXJuIFwiMS4yXCI7XG59XG5cbmV4cG9ydCBsZXQgY29tYm9ib3hfZGVzaWduX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImNvbWJvYm94X2Rlc2lnbl92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21ib2JveFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiY29tYm9ib3hfdmVyc2lvblwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMS4wXCI6IFwiUGFzc18xLjBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjFcIjogXCJGYWlsXzEuMVwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMlwiOiBcIlBhc3NfMS4yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzEuMFwiOiBcImNvbWJvYm94X2Rlc2lnbl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4xXCI6IFwiY29tYm9ib3hfZGVzaWduX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJcIjogXCJjb21ib2JveF9kZXNpZ25fdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNvbWJvYm94X2Rlc2lnbl92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMS4wXCI6IFwiVGhlIGNvbWJvYm94IGRlc2lnbiBwYXR0ZXJuIGlzIGRldGVjdGVkIGFzIEFSSUEgMS4wLCB3aGljaCBpcyBhbGxvd2VkIGJ5IEFSSUEgMS4yXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4xXCI6IFwiVGhlIGNvbWJvYm94IGRlc2lnbiBwYXR0ZXJuIGlzIGRldGVjdGVkIGFzIEFSSUEgMS4xLCB3aGljaCBpcyBub3QgYWxsb3dlZCBieSBBUklBIDEuMlwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMlwiOiBcIlRoZSBjb21ib2JveCBkZXNpZ24gcGF0dGVybiBpcyBkZXRlY3RlZCBhcyBBUklBIDEuMlwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBjb21ib2JveCBkZXNpZ24gcGF0dGVybiBtdXN0IGJlIHZhbGlkIGZvciBBUklBIDEuMlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXR0ZXJuID0gcGF0dGVybkRldGVjdChydWxlQ29udGV4dCk7XG5cbiAgICAgICAgLy8gV2UgZG9uJ3QgYXNzZXNzIG5hdGl2ZSBzZWxlY3QgZWxlbWVudHMgaGVyZVxuICAgICAgICBpZiAocGF0dGVybiA9PT0gXCJpbXBsaWNpdFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgZXhwYW5kZWQgPSAoUlBUVXRpbC5nZXRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtZXhwYW5kZWRcIikgfHwgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xuICAgICAgICBsZXQgZWRpdGFibGUgPSB0YWdOYW1lID09PSBcImlucHV0XCIgJiYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpIHx8IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKSA9PT0gXCJ0ZXh0XCIpO1xuXG4gICAgICAgIGxldCBrZXkgPSBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBsZXQgY2FjaGUgPSBnZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIHt9KTtcbiAgICAgICAgICAgIGNhY2hlW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgXCJpbnB1dEVsZW1lbnRcIjogZWRpdGFibGUgPyBydWxlQ29udGV4dCA6IG51bGwsXG4gICAgICAgICAgICAgICAgXCJwYXR0ZXJuXCI6IHBhdHRlcm4sXG4gICAgICAgICAgICAgICAgXCJleHBhbmRlZFwiOiBleHBhbmRlZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwgY2FjaGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm8geHBhdGg/XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXR0ZXJuID09PSBcIjEuMFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMFwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09PSBcIjEuMVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzEuMVwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09PSBcIjEuMlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMlwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IE5vZGVXYWxrZXIsIFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBnZXRDYWNoZSB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuXG5leHBvcnQgbGV0IGNvbWJvYm94X2ZvY3VzYWJsZV9lbGVtZW50czogUnVsZSA9IHtcbiAgICBpZDogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHNcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVwiXSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9ub3RfdGFiYmFibGVcIjogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX3RhYmJhYmxlX2NoaWxkXCI6IFwiY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiRE9NIGZvY3VzIGlzIGFsbG93ZWQgb25seSBvbiB0aGUgY29tYm9ib3ggZWxlbWVudCBhcyByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vdF90YWJiYWJsZVwiOiBcIlRoZSBjb21ib2JveCBlbGVtZW50IGRvZXMgbm90IGFsbG93IERPTSBmb2N1cyBhcyByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJGYWlsX3RhYmJhYmxlX2NoaWxkXCI6IFwiVGhlIHBvcHVwIG9mIHRoZSBjb21ib2JveCBoYXMgRE9NIGZvY3VzIG9yIGhhcyAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBkZWZpbmVkLCB3aGljaCBpcyBub3QgYWxsb3dlZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRhYmJhYmxlIGZvY3VzIGZvciB0aGUgY29tYm9ib3ggbXVzdCBiZSBhbGxvd2VkIG9ubHkgb24gdGhlIHRleHQgaW5wdXQsIGV4Y2VwdCB3aGVuIHVzaW5nIGEgZGlhbG9nIHBvcHVwXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSwgXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBjYWNoZSA9IGdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwge30pO1xuICAgICAgICBsZXQgY2FjaGVkRWxlbSA9IGNhY2hlW2NvbnRleHRbXCJkb21cIl0ucm9sZVBhdGhdO1xuICAgICAgICBpZiAoIWNhY2hlZEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IHBvcHVwRWxlbWVudCwgZXhwYW5kZWQgfSA9IGNhY2hlZEVsZW07XG4gICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgZGVmaW5lZCwgdGhlIGNvbWJvYm94IGlzIHByb2JhYmx5IGNvbGxhcHNlZC4gQSByZWZlcmVuY2UgZXJyb3IgaXNcbiAgICAgICAgLy8gZGV0ZWN0ZWQgaW4gY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXG4gICAgICAgIGlmICghcG9wdXBFbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBwb3B1cFJvbGUgPSBSUFRVdGlsLmdldFJvbGVzKHBvcHVwRWxlbWVudCwgdHJ1ZSlbMF07XG5cbiAgICAgICAgbGV0IHJldFZhbCA9IFtdXG4gICAgICAgIGlmICghUlBUVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZUZhaWwoXCJGYWlsX25vdF90YWJiYWJsZVwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbmx5IG1ha2VzIHNlbnNlIHRvIGNoZWNrIHRoZSBwb3B1cCB3aGVuIGV4cGFuZGVkXG4gICAgICAgIC8vIHRoaXMgZG9lcyBub3QgYXBwbHkgdG8gZGlhbG9ncywgcmV0dXJuIHBhc3Mgc2luY2UgdGhlIG1haW4gZWxlbWVudCB3YXMgZm9jdXNhYmxlIGFib3ZlXG4gICAgICAgIGlmIChleHBhbmRlZCA9PT0gZmFsc2UgfHwgcG9wdXBSb2xlID09PSBcImRpYWxvZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gZXhhbWluZSB0aGUgY2hpbGRyZW5cbiAgICAgICAgaWYgKHBvcHVwRWxlbWVudCAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKHBvcHVwRWxlbWVudCkpIHtcbiAgICAgICAgICAgIC8vIGlmIHBvcHVwRWxlbWVudCBpdHNlbGYgaGFzIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCJcbiAgICAgICAgICAgIHBhc3NlZCA9ICFSUFRVdGlsLmlzVGFiYmFibGUocG9wdXBFbGVtZW50KSAmJiAhUlBUVXRpbC5nZXRBcmlhQXR0cmlidXRlKHBvcHVwRWxlbWVudCwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7O1xuICAgICAgICAgICAgLy8gaWYgYW55IGNoaWxkIG9mIHBvcHVwRWxlbWVudCBoYXMgXCJhcmlhLWF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICBpZiAocGFzc2VkICYmIHBvcHVwRWxlbWVudC5jaGlsZHJlbiAmJiBwb3B1cEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBOb2RlV2Fsa2VyKHBvcHVwRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiBudy5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gIVJQVFV0aWwuaXNUYWJiYWJsZShudy5ub2RlKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFSUFRVdGlsLmdldEFyaWFBdHRyaWJ1dGUobncubm9kZSwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobncuYkVuZFRhZyAmJiBudy5ub2RlID09PSBwb3B1cEVsZW1lbnQubGFzdEVsZW1lbnRDaGlsZCkgYnJlYWs7ICAgIFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF90YWJiYWJsZV9jaGlsZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGxldCBjb21ib2JveF9oYXNwb3B1cF92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJjb21ib2JveF9oYXNwb3B1cF92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21ib2JveFwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiY29tYm9ib3hfaGFzcG9wdXBcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiUGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsX3BvcHVwX3JvbGVfaW52YWxpZFwiOiBcIkZhaWxfcG9wdXBfcm9sZV9pbnZhbGlkXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfcG9wdXBfcm9sZV9taXNtYXRjaFwiOiBcIkZhaWxfY29tYm9ib3hfcG9wdXBfcm9sZV9taXNtYXRjaFwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImNvbWJvYm94X2hhc3BvcHVwX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9wb3B1cF9yb2xlX2ludmFsaWRcIjogXCJjb21ib2JveF9oYXNwb3B1cF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfcG9wdXBfcm9sZV9taXNtYXRjaFwiOiBcImNvbWJvYm94X2hhc3BvcHVwX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9oYXNwb3B1cF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJUaGUgJ2FyaWEtY29udHJvbHMnIChBUklBIDEuMikgb3IgJ2FyaWEtb3ducycgKEFSSUEgMS4wKSBhcHByb3ByaWF0ZWx5IHJlZmVyZW5jZXMgYSB2YWxpZCBwb3B1cCAnaWQnIHZhbHVlXCIsXG4gICAgICAgICAgICBcIkZhaWxfcG9wdXBfcm9sZV9pbnZhbGlkXCI6IFwiVGhlICdyb2xlJyB2YWx1ZSBcXFwiezB9XFxcIiBvZiB0aGUgcG9wdXAgZWxlbWVudCBcXFwiezF9XFxcIiBzaG91bGQgYmUgb25lIG9mIFxcXCJsaXN0Ym94XFxcIiwgXFxcImdyaWRcXFwiLCBcXFwidHJlZVxcXCIgb3IgXFxcImRpYWxvZ1xcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9wb3B1cF9yb2xlX21pc21hdGNoXCI6IFwiVGhlIHZhbHVlIG9mIHRoZSBjb21ib2JveCAnYXJpYS1oYXNwb3B1cCcgYXR0cmlidXRlIFxcXCJ7MH1cXFwiIGRvZXMgbm90IG1hdGNoIHRoZSAncm9sZScgdmFsdWUgb2YgdGhlIHBvcHVwIGVsZW1lbnQgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgY29tYm9ib3ggYXR0cmlidXRlICdhcmlhLWhhc3BvcHVwJyB2YWx1ZSBtdXN0IGJlIGFwcHJvcHJpYXRlIGZvciB0aGUgcm9sZSBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2VkIGJ5ICdhcmlhLWNvbnRyb2xzJyAoQVJJQSAxLjIpIG9yICdhcmlhLW93bnMnIChBUklBIDEuMClcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgY29uc3QgY2FjaGUgPSBnZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIHt9KTtcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoO1xuICAgICAgICBjb25zdCBjYWNoZWRFbGVtID0gY2FjaGVbY2FjaGVLZXldO1xuICAgICAgICBpZiAoIWNhY2hlZEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IHBvcHVwRWxlbWVudCwgcG9wdXBJZCB9ID0gY2FjaGVkRWxlbTtcbiAgICAgICAgLy8gSWYgdGhpcyBpc24ndCBkZWZpbmVkLCB0aGUgY29tYm9ib3ggaXMgcHJvYmFibHkgY29sbGFwc2VkLiBBIHJlZmVyZW5jZSBlcnJvciBpc1xuICAgICAgICAvLyBkZXRlY3RlZCBpbiBjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcbiAgICAgICAgaWYgKCFwb3B1cEVsZW1lbnQpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBDaGVjayB0aGF0IHBvcHVwIHJvbGUgaXMgbGlzdGJveCwgZ3JpZCwgdHJlZSwgb3IgZGlhbG9nIGFuZCB0aGF0IGl0IG1hdGNoZXMgdGhlIGNvbWJvYm94XG4gICAgICAgIGxldCBwb3B1cFJvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhwb3B1cEVsZW1lbnQsIHRydWUpO1xuICAgICAgICBsZXQgdmFsaWRSb2xlcyA9IFtcImxpc3Rib3hcIiwgXCJncmlkXCIsIFwidHJlZVwiLCBcImRpYWxvZ1wiXS5maWx0ZXIoKHZhbGlkUm9sZSkgPT4gcG9wdXBSb2xlcy5pbmNsdWRlcyh2YWxpZFJvbGUpKTtcbiAgICAgICAgaWYgKHZhbGlkUm9sZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX3BvcHVwX3JvbGVfaW52YWxpZFwiLCBbcG9wdXBSb2xlcy5qb2luKFwiLFwiKSwgcG9wdXBJZF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHBvcHVwUm9sZSA9IHZhbGlkUm9sZXNbMF07XG4gICAgICAgICAgICBsZXQgaGFzcG9wdXBWYWwgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhhc3BvcHVwXCIpIHx8IFwibGlzdGJveFwiO1xuICAgICAgICAgICAgLy8gUG9wdXAgcm9sZSBtdXN0IG1hdGNoIGFyaWEtaGFzcG9wdXAgdW5sZXNzIHBvcHVwUm9sZSBpcyBsaXN0Ym94LCB0aGVuIGFyaWEtaGFzcG9wdXAgc2hvdWxkIG5vdCBiZSBkZWZpbmVkICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGhhc3BvcHVwVmFsICE9PSBwb3B1cFJvbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAocG9wdXBSb2xlICE9PSBcImxpc3Rib3hcIiB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWhhc3BvcHVwXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfY29tYm9ib3hfcG9wdXBfcm9sZV9taXNtYXRjaFwiLCBbaGFzcG9wdXBWYWwsIHBvcHVwUm9sZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgZ2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBjb21ib2JveF9wb3B1cF9yZWZlcmVuY2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJjb21ib2JveF9kZXNpZ25fdmFsaWRcIl0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMF9leHBhbmRlZFwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2NvbGxhcHNlZFwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2V4cGFuZGVkXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfY29sbGFwc2VkXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjBfbWlzc2luZ19vd25zXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfbWlzc2luZ19jb250cm9sc1wiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4wX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfY29sbGFwc2VkX3Zpc2libGVcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSAnYXJpYS1jb250cm9scycgKGZvciBBUklBIDEuMikgb3IgdGhlICdhcmlhLW93bnMnIChmb3IgQVJJQSAxLjApIGF0dHJpYnV0ZSBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggbXVzdCByZWZlcmVuY2UgYSB2YWxpZCBwb3B1cCAnaWQnIHZhbHVlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2V4cGFuZGVkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIHJlZmVyZW5jZWQgYnkgJ2FyaWEtb3ducycgKEFSSUEgMS4wKSBleGlzdHMgYW5kIGlzIHZpc2libGVcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjBfY29sbGFwc2VkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIGluIGl0cyBjb2xsYXBzZWQgc3RhdGUgZG9lcyBub3QgcmVmZXJlbmNlIGFueSB2aXNpYmxlIHBvcHVwIGFzIHJlcXVpcmVkXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2V4cGFuZGVkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIHJlZmVyZW5jZWQgYnkgJ2FyaWEtY29udHJvbHMnIChBUklBIDEuMikgZXhpc3RzIGFuZCBpcyB2aXNpYmxlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2NvbGxhcHNlZFwiOiBcIlRoZSBjb21ib2JveCBwb3B1cCBpbiBpdHMgY29sbGFwc2VkIHN0YXRlIGRvZXMgbm90IHJlZmVyZW5jZSBhbnkgdmlzaWJsZSBwb3B1cCBhcyByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMF9taXNzaW5nX293bnNcIjogXCJUaGUgJ2FyaWEtb3ducycgYXR0cmlidXRlIG9mIHRoZSBleHBhbmRlZCBjb21ib2JveCBpcyBtaXNzaW5nXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX21pc3NpbmdfY29udHJvbHNcIjogXCJUaGUgJ2FyaWEtY29udHJvbHMnIGF0dHJpYnV0ZSBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggaXMgbWlzc2luZ1wiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMF9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiOiBcIlRoZSAnYXJpYS1vd25zJyBhdHRyaWJ1dGUgXFxcInswfVxcXCIgb2YgdGhlIGV4cGFuZGVkIGNvbWJvYm94IGRvZXMgbm90IHJlZmVyZW5jZSBhIHZhbGlkIHBvcHVwICdpZCcgdmFsdWVcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJUaGUgJ2FyaWEtY29udHJvbHMnIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggZG9lcyBub3QgcmVmZXJlbmNlIGEgdmFsaWQgcG9wdXAgJ2lkJyB2YWx1ZVwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiOiBcIlRoZSBjb21ib2JveCAnYXJpYS1leHBhbmRlZCcgYXR0cmlidXRlIGlzIHRydWUsIGJ1dCB0aGUgY29tYm9ib3ggcG9wdXAgaXMgbm90IHZpc2libGVcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9jb2xsYXBzZWRfdmlzaWJsZVwiOiBcIlRoZSBjb21ib2JveCAnYXJpYS1leHBhbmRlZCcgYXR0cmlidXRlIGlzIGZhbHNlLCBidXQgdGhlIGNvbWJvYm94IHBvcHVwIGlzIHZpc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiNGU4YWI2XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xLjBfZXhwYW5kZWRcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2NvbGxhcHNlZFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfZXhwYW5kZWRcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2NvbGxhcHNlZFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjBfbWlzc2luZ19vd25zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX21pc3NpbmdfY29udHJvbHNcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4wX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2NvbGxhcHNlZF92aXNpYmxlXCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gY29udGV4dFtcImRvbVwiXS5yb2xlUGF0aDtcbiAgICAgICAgY29uc3QgY2FjaGVkRWxlbSA9IGNhY2hlW2NhY2hlS2V5XTtcbiAgICAgICAgaWYgKCFjYWNoZWRFbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBwYXR0ZXJuLCBleHBhbmRlZCB9ID0gY2FjaGVkRWxlbTtcblxuICAgICAgICBsZXQgcG9wdXBJZDtcbiAgICAgICAgbGV0IHBvcHVwRWxlbWVudDtcbiAgICAgICAgaWYgKHBhdHRlcm4gPT09IFwiMS4wXCIpIHtcbiAgICAgICAgICAgIGlmICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbWJvYm94IGlzbid0IGV4cGFuZGVkLCB0aGlzIGF0dHJpYnV0ZSBpc24ndCByZXF1aXJlZFxuICAgICAgICAgICAgICAgIHJldHVybiAhZXhwYW5kZWQgPyBudWxsIDogUnVsZUZhaWwoXCJGYWlsXzEuMF9taXNzaW5nX293bnNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3B1cElkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1vd25zXCIpO1xuICAgICAgICAgICAgcG9wdXBFbGVtZW50ID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIHBvcHVwSWQpO1xuICAgICAgICAgICAgaWYgKCFwb3B1cEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29tYm9ib3ggaXNuJ3QgZXhwYW5kZWQsIHRoaXMgYXR0cmlidXRlIGlzbid0IHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuICFleHBhbmRlZCA/IG51bGwgOiBSdWxlRmFpbChcIkZhaWxfMS4wX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCIsIFtwb3B1cElkXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGF0dGVybiA9PT0gXCIxLjJcIikge1xuICAgICAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbWJvYm94IGlzbid0IGV4cGFuZGVkLCB0aGlzIGF0dHJpYnV0ZSBpc24ndCByZXF1aXJlZFxuICAgICAgICAgICAgICAgIHJldHVybiAhZXhwYW5kZWQgPyBudWxsIDogUnVsZUZhaWwoXCJGYWlsXzEuMl9taXNzaW5nX2NvbnRyb2xzXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9wdXBJZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIik7XG4gICAgICAgICAgICBwb3B1cEVsZW1lbnQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgcG9wdXBJZCk7XG4gICAgICAgICAgICBpZiAoIXBvcHVwRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb21ib2JveCBpc24ndCBleHBhbmRlZCwgdGhpcyBhdHRyaWJ1dGUgaXNuJ3QgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gIWV4cGFuZGVkID8gbnVsbCA6IFJ1bGVGYWlsKFwiRmFpbF8xLjJfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIiwgW3BvcHVwSWRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgaGF2ZSBhbiBlbGVtZW50LCBzdGljayBpdCBpbiB0aGUgY2FjaGUgYW5kIHRoZW4gY2hlY2sgaXRzIHJvbGVcbiAgICAgICAgY2FjaGVkRWxlbS5wb3B1cElkID0gcG9wdXBJZDtcbiAgICAgICAgY2FjaGVkRWxlbS5wb3B1cEVsZW1lbnQgPSBwb3B1cEVsZW1lbnQ7XG5cblxuICAgICAgICBpZiAoZXhwYW5kZWQgJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShwb3B1cEVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiKTtcbiAgICAgICAgfSBlbHNlIGlmICghZXhwYW5kZWQgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKHBvcHVwRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfY29tYm9ib3hfY29sbGFwc2VkX3Zpc2libGVcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0dGVybiA9PT0gXCIxLjBcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKGV4cGFuZGVkID8gXCJQYXNzXzEuMF9leHBhbmRlZFwiIDogXCJQYXNzXzEuMF9jb2xsYXBzZWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoZXhwYW5kZWQgPyBcIlBhc3NfMS4yX2V4cGFuZGVkXCIgOiBcIlBhc3NfMS4yX2NvbGxhcHNlZFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGxldCBkZWJ1Z19wYXRoczogUnVsZSA9IHtcbiAgICBpZDogXCJkZWJ1Z19wYXRoc1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIkRFQlVHXCJdLFxuICAgICAgICBudW06IFwiMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LklORk9STUFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgcnVsZUNvbnRleHQuc2V0QXR0cmlidXRlKFwiZG9tUGF0aFwiLCBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoKTtcbiAgICAgICAgcnVsZUNvbnRleHQuc2V0QXR0cmlidXRlKFwiYXJpYVBhdGhcIiwgY29udGV4dFtcImFyaWFcIl0ucm9sZVBhdGgpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgZGV0ZWN0b3JfdGFiYmFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZGV0ZWN0b3JfdGFiYmFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJFWFRFTlNJT05TXCJdLFxuICAgICAgICBudW06IFwiMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LklORk9STUFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKCFSUFRVdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaGllckNvbnRleHQgPSBjb250ZXh0SGllcmFyY2hpZXMuYXJpYVtjb250ZXh0SGllcmFyY2hpZXMuYXJpYS5sZW5ndGggLSAxXTtcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsIFtdLCBbe1xuICAgICAgICAgICAgbmFtZTogaGllckNvbnRleHQuYXR0cmlidXRlcy5uYW1lLFxuICAgICAgICAgICAgcm9sZTogaGllckNvbnRleHQucm9sZSxcbiAgICAgICAgICAgIHRhYmluZGV4OiBwYXJzZUludChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fCBcIjBcIilcbiAgICAgICAgfV0pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBkaXJfYXR0cmlidXRlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImRpcl9hdHRyaWJ1dGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2Rpcl1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlZhbGVyaWVfRWxlbV9EaXJWYWxpZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImRpcl9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJkaXJfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJkaXJfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiSW52YWxpZCB2YWx1ZSB1c2VkIGZvciB0aGUgJ2RpcicgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiJ2RpcicgYXR0cmlidXRlIHZhbHVlIG11c3QgYmUgXFxcImx0clxcXCIsIFxcXCJydGxcXFwiLCBvciBcXFwiYXV0b1xcXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGRpclN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImRpclwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gZGlyU3RyID09IFwibHRyXCIgfHwgZGlyU3RyID09IFwicnRsXCIgfHwgZGlyU3RyID09IFwiYXV0b1wiO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBkb3dubG9hZF9rZXlib2FyZF9jb250cm9sbGFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206YVtocmVmXSxkb206YXJlYVtocmVmXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19NZWRpYV9Eb2N1bWVudFRyaWdnZXIyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImRvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJkb3dubG9hZF9rZXlib2FyZF9jb250cm9sbGFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSBmaWxlIGRvd25sb2FkIG1lY2hhbmlzbSBkb2VzIG5vdCBjYXVzZSBhIGtleWJvYXJkIHRyYXBcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJGaWxlIGRvd25sb2FkIG1lY2hhbmlzbXMgc2hvdWxkIGJlIGtleWJvYXJkLW9wZXJhYmxlIGFuZCBwcmVzZXJ2ZSBwYWdlIGZvY3VzIGxvY2F0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGhyZWYgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICBsZXQgZXh0ID0gUlBUVXRpbC5nZXRGaWxlRXh0KGhyZWYpO1xuICAgICAgICBsZXQgcGFzc2VkID0gIVtcIi5kb2N4XCIsIFwiLmRvY1wiLCBcIi5wZGZcIiwgXCIub2R0XCJdLmluY2x1ZGVzKGV4dCk7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgbGV0IGVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlthY2Nlc3NrZXldXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FjY2Vzc2tleV9OZWVkTGFiZWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVGhlIEhUTUwgZWxlbWVudCB3aXRoIGFuIGFzc2lnbmVkICdhY2Nlc3NrZXknIGF0dHJpYnV0ZSBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBIVE1MIGVsZW1lbnQgd2l0aCBhbiBhc3NpZ25lZCAnYWNjZXNza2V5JyBhdHRyaWJ1dGUgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgbGFiZWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsXCIpKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKFJQVFV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKHJ1bGVDb250ZXh0LCB0cnVlKSkgeyAvLyBpZ25vcmUgaGlkZGVuXG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKFJQVFV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG4gICAgICAgICAgICAvLyBhc3N1bWUgdGhlIHZhbGlkaXR5IG9mIHRoZSBpZCAob2YgYXJpYS1sYWJlbGxlZGJ5KSBpcyBjaGVja2VkIGJ5IGEgZGlmZmVyZW50IHJ1bGVcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiXG4gICAgICAgICAgICAmJiBET01XYWxrZXIucGFyZW50Tm9kZShydWxlQ29udGV4dCkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJsYWJlbFwiKSB7XG4gICAgICAgICAgICAvLyBhc3N1bWUgdGhlIHZhbGlkaXR5IG9mIHRoZSBsYWJlbCwgZS5nLiBlbXB0eSBsYWJlbCwgaXMgY2hlY2tlZCBieSBhIGRpZmZlcmVudCBydWxlXG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGdldENhY2hlIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBsZXQgZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYWNjZXNza2V5XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0VsZW1fVW5pcXVlQWNjZXNzS2V5XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2FjY2Vzc2tleV91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCInYWNjZXNza2V5JyBhdHRyaWJ1dGUgdmFsdWUgb24gdGhlIGVsZW1lbnQgaXMgbm90IHVuaXF1ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIidhY2Nlc3NrZXknIGF0dHJpYnV0ZSB2YWx1ZXMgb24gZWFjaCBlbGVtZW50IG11c3QgYmUgdW5pcXVlIGZvciB0aGUgcGFnZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbWFwID0gZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJlbGVtZW50X2FjY2Vzc2tleV91bmlxdWVcIiwge30pO1xuXG4gICAgICAgIGxldCBrZXkgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhY2Nlc3NrZXlcIik7XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9ICEoa2V5IGluIG1hcCk7XG4gICAgICAgIG1hcFtrZXldID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmNvbnN0IERFUFJFQ0FURURfRUxFTUVOVFMgPSBbXG4gICAgLyoqIG9yaWdpbmFsICovXG4gICAgXCJhcHBsZXRcIiwgXCJiYXNlZm9udFwiLCBcImNlbnRlclwiLCBcImRpclwiLCBcImZvbnRcIiwgXCJpc2luZGV4XCIsIFwibGlzdGluZ1wiLFxuICAgIFwicGxhaW50ZXh0XCIsIFwic3BhY2VyXCIsIFwic1wiLCBcInN0cmlrZVwiLCBcInVcIiwgXCJ4bXBcIixcbiAgICAvKiogYWRkZWQgZnJvbSBodHRwczovL2Rldi53My5vcmcvaHRtbDUvcGYtc3VtbWFyeS9vYnNvbGV0ZS5odG1sICovXG4gICAgXCJhY3JvbnltXCIsIFwiZnJhbWVcIiwgXCJmcmFtZXNldFwiLCBcIm5vZnJhbWVzXCIsIFwibm9lbWJlZFwiLCBcImJpZ1wiLCBcImJsaW5rXCIsIFwibWFycXVlZVwiLCBcInR0XCIsXG5cbl1cblxuY29uc3QgREVQUkVDQVRFRF9IVE1MX0dMT0JBTF9BVFRSSUJVVEVTID0gW1xuICAgIC8qKiBvcmlnaW5hbCAqL1xuICAgIFwiYWxpZ25cIiwgXCJsaW5rXCIsIFwiYXJjaGl2ZVwiLCBcImJhY2tncm91bmRcIiwgXCJiZ2NvbG9yXCIsIFwiY2xlYXJcIiwgXCJjb2RlXCIsIFwiY29sb3JcIixcbiAgICBcImNvbXBhY3RcIiwgXCJmYWNlXCIsIFwiaHNwYWNlXCIsIFwibGFuZ3VhZ2VcIiwgXCJsaW5rXCIsIFwibm9zaGFkZVwiLCBcIm5vd3JhcFwiLCBcIm9iamVjdFwiLFxuICAgIFwicHJvbXB0XCIsIFwic3RhcnRcIiwgXCJ0ZXh0XCIsIFwidmVyc2lvblwiLCBcInZsaW5rXCIsIFwidnNwYWNlXCJcbl1cblxuY29uc3QgREVQUkVDQVRFRF9FTEVNRU5UX0FUVFJJQlVURVMgPSB7XG4gICAgLyoqIG9yaWdpbmFsICovXG4gICAgXCJ0ZFwiOiBbXCJoZWlnaHRcIiwgXCJ3aWR0aFwiLCBcImFiYnJcIiwgXCJheGlzXCIsIFwiY2hhclwiLCBcImNoYXJvZmZcIiwgXCJoZWlnaHRcIiwgXCJub3dyYXBcIiwgXCJ2YWxpZ25cIiwgXCJ3aWR0aFwiLCBcImFsaWduXCIsIFwiYmdjb2xvclwiXSxcbiAgICBcInRoXCI6IFtcImhlaWdodFwiLCBcIndpZHRoXCIsIFwiYWJiclwiLCBcImF4aXNcIiwgXCJjaGFyb2ZmXCIsIFwiaGVpZ2h0XCIsIFwiYmdjb2xvclwiLCBcImFsaWduXCIsIFwibm93cmFwXCIsIFwiY2hhclwiLCBcInZhbGlnblwiLCBcIndpZHRoXCJdLFxuICAgIFwibGlcIjogW1widHlwZVwiLCBcInZhbHVlXCIsIFwidHlwZVwiXSxcbiAgICBcInVsXCI6IFtcInR5cGVcIiwgXCJjb21wYWN0XCJdLFxuICAgIFwicHJlXCI6IFtcIndpZHRoXCJdLFxuXG4gICAgLyoqIGFkZGVkIGZyb20gaHR0cHM6Ly9kZXYudzMub3JnL2h0bWw1L3BmLXN1bW1hcnkvb2Jzb2xldGUuaHRtbCAqL1xuICAgIFwibWV0YVwiOiBbXCJodHRwLWVxdWl2XCJdLFxuICAgIFwiYVwiOiBbXCJjaGFyc2V0XCIsIFwiY29vcmRzXCIsIFwic2hhcGVcIiwgXCJyZXZcIiwgXCJzY2hlbWVcIl0sXG4gICAgXCJsaW5rXCI6IFtcInJldlwiLCBcImNoYXJzZXRcIiwgXCJ0YXJnZXRcIl0sXG4gICAgXCJpbWdcIjogW1wibmFtZVwiLCBcImxvbmdkZXNjXCIsIFwiYWxpZ25cIiwgXCJoc3BhY2VcIiwgXCJ2c3BhY2VcIiwgXCJib3JkZXJcIl0sXG4gICAgXCJhcmVhXCI6IFtcIm5vaHJlZlwiXSxcbiAgICBcImhlYWRcIjogW1wicHJvZmlsZVwiXSxcbiAgICBcImh0bWxcIjogW1widmVyc2lvblwiXSxcbiAgICBcImlmcmFtZVwiOiBbXCJsb25nZGVzY1wiLCBcImFsaWduXCIsIFwiZnJhbWVib3JkZXJcIiwgXCJtYXJnaW5oZWlnaHRcIiwgXCJtYXJnaW53aWR0aFwiLCBcInNjcm9sbGluZ1wiXSxcbiAgICBcIm9iamVjdFwiOiBbXCJhcmNoaXZlXCIsIFwiY29kZVwiLCBcImNvZGViYXNlXCIsIFwiY29kZXR5cGVcIiwgXCJkZWNsYXJlXCIsIFwic3RhbmRieVwiLCBcImFsaWduXCIsIFwiaHNwYWNlXCIsIFwidnNwYWNlXCIsIFwiYm9yZGVyXCJdLFxuICAgIFwicGFyYW1cIjogW1widHlwZVwiLCBcInZhbHVldHlwZVwiXSxcbiAgICBcInNjcmlwdFwiOiBbXCJsYW5ndWFnZVwiXSxcbiAgICBcImJvZHlcIjogW1wiYWxpbmtcIiwgXCJiYWNrZ3JvdW5kXCIsIFwiYmdjb2xvclwiLCBcImxpbmtcIiwgXCJ0ZXh0XCIsIFwidmxpbmtcIl0sXG4gICAgXCJiclwiOiBbXCJjbGVhclwiXSxcbiAgICBcImNhcHRpb25cIjogW1wiYWxpZ25cIl0sXG4gICAgXCJjb2xcIjogW1wiYWxpZ25cIiwgXCJjaGFyXCIsIFwiY2hhcm9mZlwiLCBcInZhbGlnblwiLCBcIndpZHRoXCJdLFxuICAgIFwiZGl2XCI6IFtcImFsaWduXCJdLFxuICAgIFwiZGxcIjogW1wiY29tcGFjdFwiXSxcbiAgICBcImhyXCI6IFtcImFsaWduXCIsIFwibm9zaGFkZVwiLCBcInNpemVcIiwgXCJ3aWR0aFwiLCBcImFsaWduXCJdLFxuICAgIFwiaDJcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJoM1wiOiBbXCJhbGlnblwiXSxcbiAgICBcImg0XCI6IFtcImFsaWduXCJdLFxuICAgIFwiaDVcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJoNlwiOiBbXCJhbGlnblwiXSxcbiAgICBcImlucHV0XCI6IFtcImFsaWduXCIsIFwidXNlbWFwXCJdLFxuICAgIFwibGVnZW5kXCI6IFtcImFsaWduXCJdLFxuICAgIFwibWVudVwiOiBbXCJjb21wYWN0XCJdLFxuICAgIFwib2xcIjogW1wiY29tcGFjdFwiLCBcInR5cGVcIiwgXCJ0eXBlXCJdLFxuICAgIFwicFwiOiBbXCJhbGlnblwiXSxcbiAgICBcInRhYmxlXCI6IFtcImJnY29sb3JcIiwgXCJjZWxscGFkZGluZ1wiLCBcImNlbGxzcGFjaW5nXCIsIFwiZnJhbWVcIiwgXCJydWxlc1wiLCBcIndpZHRoXCIsIFwiYWxpZ25cIl0sXG4gICAgXCJ0Ym9keVwiOiBbXCJhbGlnblwiLCBcImNoYXJcIiwgXCJ2YWxpZ25cIiwgXCJjaGFyb2ZmXCJdLFxuICAgIFwidGZvb3RcIjogW1wiYWxpZ25cIiwgXCJjaGFyb2ZmXCIsIFwiY2hhclwiLCBcInZhbGlnblwiXSxcbiAgICBcInRoZWFkXCI6IFtcImNoYXJcIiwgXCJjaGFyb2ZmXCIsIFwidmFsaWduXCIsIFwiYWxpZ25cIl0sXG4gICAgXCJ0clwiOiBbXCJhbGlnblwiLCBcImJnY29sb3JcIiwgXCJjaGFyXCIsIFwiY2hhcm9mZlwiLCBcInZhbGlnblwiXVxufVxuXG5mdW5jdGlvbiBhcnJheVRvQ29udGV4dFN0cihvYmosIHR5cGUpIHtcbiAgICBsZXQgc3RyID0gXCJcIjtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2Ygb2JqKSB7XG4gICAgICAgIGlmIChzdHIgIT09ICcnICYmICFzdHIuZW5kc1dpdGgoJywgJykpIHN0ciArPSBcIiwgXCI7XG4gICAgICAgIGlmICh0eXBlID09PSAnSFRNTF9FTEVNRU5UUycpXG4gICAgICAgICAgICBzdHIgKz0gJ2RvbTonICsgcHJvcDtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ0hUTUxfQVRUUklCVVRFUycpXG4gICAgICAgICAgICBzdHIgKz0gJ2RvbToqWycgKyBwcm9wICsgXCJdXCI7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5cbmZ1bmN0aW9uIG9ialRvQ29udGV4dFN0cihvYmosIHR5cGU6IHN0cmluZykge1xuICAgIGxldCBzdHIgPSBcIlwiO1xuICAgIGZvciAoY29uc3QgcHJvcCBpbiBvYmopIHtcbiAgICAgICAgaWYgKHN0ciAhPT0gJycgJiYgIXN0ci5lbmRzV2l0aCgnLCAnKSkgc3RyICs9IFwiLCBcIjtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdIVE1MX0VMRU1FTlRfQVRUUklCVVRFUycpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBvYmpbcHJvcF0gYXMgU3RyaW5nW10pIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RyICE9PSAnJyAmJiAhc3RyLmVuZHNXaXRoKFwiLCBcIikpIHN0ciArPSBcIiwgXCI7XG4gICAgICAgICAgICAgICAgc3RyICs9ICdkb206JyArIHByb3AgKyAnWycgKyBpdGVtICsgJ10nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IFxuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuXG5leHBvcnQgbGV0IGVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFwcGxldCwgZG9tOmJhc2Vmb250LCBkb206Y2VudGVyLCBkb206ZGlyLCBkb206Zm9udCwgZG9tOmlzaW5kZXgsIGRvbTpsaXN0aW5nLCBkb206bWVudSwgZG9tOnBsYWludGV4dCwgZG9tOnNwYWNlciwgZG9tOnMsIGRvbTpzdHJpa2UsIGRvbTp1LCBkb206eG1wLCBkb206YWNyb255bSwgZG9tOmZyYW1lLCBkb206ZnJhbWVzZXQsIGRvbTpub2ZyYW1lcywgZG9tOm5vZW1iZWQsIGRvbTpiaWcsIGRvbTpibGluaywgZG9tOm1hcnF1ZWUsIGRvbTp0dE5hTmRvbToqW2FsaWduXSwgZG9tOipbbGlua10sIGRvbToqW2FyY2hpdmVdLCBkb206KltiYWNrZ3JvdW5kXSwgZG9tOipbYmdjb2xvcl0sIGRvbToqW2NsZWFyXSwgZG9tOipbY29kZV0sIGRvbToqW2NvbG9yXSwgZG9tOipbY29tcGFjdF0sIGRvbToqW2ZhY2VdLCBkb206Kltoc3BhY2VdLCBkb206KltsYW5ndWFnZV0sIGRvbToqW2xpbmtdLCBkb206Kltub3NoYWRlXSwgZG9tOipbbm93cmFwXSwgZG9tOipbb2JqZWN0XSwgZG9tOipbcHJvbXB0XSwgZG9tOipbc3RhcnRdLCBkb206Klt0ZXh0XSwgZG9tOipbdmVyc2lvbl0sIGRvbToqW3ZsaW5rXSwgZG9tOipbdnNwYWNlXU5hTmRvbTp0ZFtoZWlnaHRdLCBkb206dGRbd2lkdGhdLCBkb206dGRbYWJicl0sIGRvbTp0ZFtheGlzXSwgZG9tOnRkW2NoYXJdLCBkb206dGRbY2hhcm9mZl0sIGRvbTp0ZFtoZWlnaHRdLCBkb206dGRbbm93cmFwXSwgZG9tOnRkW3ZhbGlnbl0sIGRvbTp0ZFt3aWR0aF0sIGRvbTp0ZFthbGlnbl0sIGRvbTp0ZFtiZ2NvbG9yXSwgZG9tOnRoW2hlaWdodF0sIGRvbTp0aFt3aWR0aF0sIGRvbTp0aFthYmJyXSwgZG9tOnRoW2F4aXNdLCBkb206dGhbY2hhcm9mZl0sIGRvbTp0aFtoZWlnaHRdLCBkb206dGhbYmdjb2xvcl0sIGRvbTp0aFthbGlnbl0sIGRvbTp0aFtub3dyYXBdLCBkb206dGhbY2hhcl0sIGRvbTp0aFt2YWxpZ25dLCBkb206dGhbd2lkdGhdLCBkb206bGlbdHlwZV0sIGRvbTpsaVt2YWx1ZV0sIGRvbTpsaVt0eXBlXSwgZG9tOnVsW3R5cGVdLCBkb206dWxbY29tcGFjdF0sIGRvbTpwcmVbd2lkdGhdLCBkb206bWV0YVtodHRwLWVxdWl2XSwgZG9tOmFbY2hhcnNldF0sIGRvbTphW2Nvb3Jkc10sIGRvbTphW3NoYXBlXSwgZG9tOmFbcmV2XSwgZG9tOmFbc2NoZW1lXSwgZG9tOmxpbmtbcmV2XSwgZG9tOmxpbmtbY2hhcnNldF0sIGRvbTpsaW5rW3RhcmdldF0sIGRvbTppbWdbbmFtZV0sIGRvbTppbWdbbG9uZ2Rlc2NdLCBkb206aW1nW2FsaWduXSwgZG9tOmltZ1toc3BhY2VdLCBkb206aW1nW3ZzcGFjZV0sIGRvbTppbWdbYm9yZGVyXSwgZG9tOmFyZWFbbm9ocmVmXSwgZG9tOmhlYWRbcHJvZmlsZV0sIGRvbTpodG1sW3ZlcnNpb25dLCBkb206aWZyYW1lW2xvbmdkZXNjXSwgZG9tOmlmcmFtZVthbGlnbl0sIGRvbTppZnJhbWVbZnJhbWVib3JkZXJdLCBkb206aWZyYW1lW21hcmdpbmhlaWdodF0sIGRvbTppZnJhbWVbbWFyZ2lud2lkdGhdLCBkb206aWZyYW1lW3Njcm9sbGluZ10sIGRvbTpvYmplY3RbYXJjaGl2ZV0sIGRvbTpvYmplY3RbY29kZV0sIGRvbTpvYmplY3RbY29kZWJhc2VdLCBkb206b2JqZWN0W2NvZGV0eXBlXSwgZG9tOm9iamVjdFtkZWNsYXJlXSwgZG9tOm9iamVjdFtzdGFuZGJ5XSwgZG9tOm9iamVjdFthbGlnbl0sIGRvbTpvYmplY3RbaHNwYWNlXSwgZG9tOm9iamVjdFt2c3BhY2VdLCBkb206b2JqZWN0W2JvcmRlcl0sIGRvbTpwYXJhbVt0eXBlXSwgZG9tOnBhcmFtW3ZhbHVldHlwZV0sIGRvbTpzY3JpcHRbbGFuZ3VhZ2VdLCBkb206Ym9keVthbGlua10sIGRvbTpib2R5W2JhY2tncm91bmRdLCBkb206Ym9keVtiZ2NvbG9yXSwgZG9tOmJvZHlbbGlua10sIGRvbTpib2R5W3RleHRdLCBkb206Ym9keVt2bGlua10sIGRvbTpicltjbGVhcl0sIGRvbTpjYXB0aW9uW2FsaWduXSwgZG9tOmNvbFthbGlnbl0sIGRvbTpjb2xbY2hhcl0sIGRvbTpjb2xbY2hhcm9mZl0sIGRvbTpjb2xbdmFsaWduXSwgZG9tOmNvbFt3aWR0aF0sIGRvbTpkaXZbYWxpZ25dLCBkb206ZGxbY29tcGFjdF0sIGRvbTpoclthbGlnbl0sIGRvbTpocltub3NoYWRlXSwgZG9tOmhyW3NpemVdLCBkb206aHJbd2lkdGhdLCBkb206aHJbYWxpZ25dLCBkb206aDJbYWxpZ25dLCBkb206aDNbYWxpZ25dLCBkb206aDRbYWxpZ25dLCBkb206aDVbYWxpZ25dLCBkb206aDZbYWxpZ25dLCBkb206aW5wdXRbYWxpZ25dLCBkb206aW5wdXRbdXNlbWFwXSwgZG9tOmxlZ2VuZFthbGlnbl0sIGRvbTptZW51W2NvbXBhY3RdLCBkb206b2xbY29tcGFjdF0sIGRvbTpvbFt0eXBlXSwgZG9tOm9sW3R5cGVdLCBkb206cFthbGlnbl0sIGRvbTp0YWJsZVtiZ2NvbG9yXSwgZG9tOnRhYmxlW2NlbGxwYWRkaW5nXSwgZG9tOnRhYmxlW2NlbGxzcGFjaW5nXSwgZG9tOnRhYmxlW2ZyYW1lXSwgZG9tOnRhYmxlW3J1bGVzXSwgZG9tOnRhYmxlW3dpZHRoXSwgZG9tOnRhYmxlW2FsaWduXSwgZG9tOnRib2R5W2FsaWduXSwgZG9tOnRib2R5W2NoYXJdLCBkb206dGJvZHlbdmFsaWduXSwgZG9tOnRib2R5W2NoYXJvZmZdLCBkb206dGZvb3RbYWxpZ25dLCBkb206dGZvb3RbY2hhcm9mZl0sIGRvbTp0Zm9vdFtjaGFyXSwgZG9tOnRmb290W3ZhbGlnbl0sIGRvbTp0aGVhZFtjaGFyXSwgZG9tOnRoZWFkW2NoYXJvZmZdLCBkb206dGhlYWRbdmFsaWduXSwgZG9tOnRoZWFkW2FsaWduXSwgZG9tOnRyW2FsaWduXSwgZG9tOnRyW2JnY29sb3JdLCBkb206dHJbY2hhcl0sIGRvbTp0cltjaGFyb2ZmXSwgZG9tOnRyW3ZhbGlnbl1cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfZWxlbVwiOiBcImVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2F0dHJcIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbGVtX2F0dHJcIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxfZWxlbVwiOiBcIlRoZSA8ezB9PiBlbGVtZW50IGlzIGRlcHJlY2F0ZWQgaW4gSFRNTCA1XCIsXG4gICAgICAgICAgICBcImZhaWxfYXR0clwiOiBcIlRoZSBIVE1MIGF0dHJpYnV0ZShzKSBcXFwiezB9XFxcIiBpcyBkZXByZWNhdGVkIGluIEhUTUwgNVwiLFxuICAgICAgICAgICAgXCJmYWlsX2VsZW1fYXR0clwiOiBcIlRoZSBIVE1MIGF0dHJpYnV0ZShzKSBcXFwiezB9XFxcIiBpcyBkZXByZWNhdGVkIGZvciB0aGUgPHsxfT4gZWxlbWVudCBpbiBIVE1MIDVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdm9pZCB1c2Ugb2Ygb2Jzb2xldGUgZmVhdHVyZXMgaWYgcG9zc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjFcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIEhUTUxVbml0IGF1dG8gYWRkcyBhIHRib2R5W2FsaWduPWxlZnRdIHRvIHRhYmxlcyBpZiB0Ym9keSBpcyBtaXNzaW5nIVxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0Ym9keVwiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFsaWduXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS5pbmNsdWRlcyhcIi1cIikpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSB3ZWJjb21wb25lbnQgZWxlbWVudCwgSFRNTCBkb2Vzbid0IGRlZmluZSB3aGF0J3MgZGVwcmVjYXRlZFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICAvLyBjaGVjayBpZiBpdCdzIGEgZGVwcmVjYXRlZCBlbGVtZW50XG4gICAgICAgIGlmIChERVBSRUNBVEVEX0VMRU1FTlRTLmluY2x1ZGVzKG5vZGVOYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9lbGVtXCIsIFtub2RlTmFtZV0pO1xuXG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBpZiBpdCdzIGEgZGVwcmVjYXRlZCBIVE1MIGdsb2JhbCBhdHRyaWJ1dGVcbiAgICAgICAgY29uc3QgYXR0cnMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGVOYW1lcygpO1xuICAgICAgICBsZXQgdmlvbGF0aW9ucyA9ICcnO1xuICAgICAgICBmb3IgKGNvbnN0IGF0dHIgb2YgYXR0cnMpIHtcbiAgICAgICAgICAgIGlmIChERVBSRUNBVEVEX0hUTUxfR0xPQkFMX0FUVFJJQlVURVMuaW5jbHVkZXMoYXR0cikpIHtcbiAgICAgICAgICAgICAgICBpZiAodmlvbGF0aW9ucyAhPT0gJycpIHZpb2xhdGlvbnMgKz0gJywgJztcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zICs9IGF0dHI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZpb2xhdGlvbnMgIT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2F0dHJcIiwgW3Zpb2xhdGlvbnNdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIGl0J3MgYSBkZXByZWNhdGVkIEhUTUwgZWxlbWVudCAmIGF0dHJpYnV0ZVxuICAgICAgICB2aW9sYXRpb25zID0gJyc7XG4gICAgICAgIGlmIChub2RlTmFtZSBpbiBERVBSRUNBVEVEX0VMRU1FTlRfQVRUUklCVVRFUykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhdHRyIG9mIGF0dHJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKERFUFJFQ0FURURfRUxFTUVOVF9BVFRSSUJVVEVTW25vZGVOYW1lXSAmJiBERVBSRUNBVEVEX0VMRU1FTlRfQVRUUklCVVRFU1tub2RlTmFtZV0uaW5jbHVkZXMoYXR0cikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZpb2xhdGlvbnMgIT09ICcnKSB2aW9sYXRpb25zICs9ICcsICc7XG4gICAgICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMgKz0gYXR0cjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmlvbGF0aW9ucyAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2VsZW1fYXR0clwiLCBbdmlvbGF0aW9ucywgbm9kZU5hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuXG5leHBvcnQgbGV0IGVsZW1lbnRfaWRfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfaWRfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJkb206KltpZF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9FbGVtX1VuaXF1ZUlkXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfaWRfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9pZF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJlbGVtZW50X2lkX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImVsZW1lbnRfaWRfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50ICdpZCcgYXR0cmlidXRlIHZhbHVlcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBkb2N1bWVudFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPHswfT4gZWxlbWVudCBoYXMgdGhlIGlkIFxcXCJ7MX1cXFwiIHRoYXQgaXMgZW1wdHlcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgaGFzIHRoZSBpZCBcXFwiezF9XFxcIiB0aGF0IGlzIGFscmVhZHkgaW4gdXNlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiM2VhMGM4XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gSkNIIC0gTk8gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImlkXCIpO1xuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgaWQgaXMgZW1wdHkgd2Ugc2hvdWxkIHRyaWdnZXIgYSB2aW9sYXRpb24gcmlnaHQgYXdheSB3aXRoIG91dCBjaGVja2luZyBcbiAgICAgICAgLy8gZm9yIHVuaXF1ZW5lc3MuXG4gICAgICAgIGlmIChpZCA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQoZmFsc2UsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIGlkXSk7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIGlkXSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZWxlbWVudCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBpZCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBlbGVtZW50ID09PSBydWxlQ29udGV4dDtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIHBhc3NlZCA9PSB0cnVlID8gW10gOiBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgaWRdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgaWRdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHksIGVSdWxlQ29uZmlkZW5jZSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgTGFuZ1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGFuZ1wiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5cbmNvbnN0IHZhbGlkYXRlTGFuZyA9IChjb250ZXh0OiBSdWxlQ29udGV4dCk6IG51bWJlciA9PiB7XG4gICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJsYW5nXCIpKSB7XG4gICAgICAgIGlmIChub2RlTmFtZSAhPT0gXCJodG1sXCIgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibGFuZ1wiKSA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy8gSXQncyBva2F5IHRvIGhhdmUgYSBsYW5nPVwiXCIgaWYgbm90IG9uIGh0bWxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsYW5nU3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibGFuZ1wiKTtcbiAgICAgICAgICAgIGlmICghTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nU3RyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC5pc0JjcDQ3KGxhbmdTdHIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInhtbDpsYW5nXCIpKSB7XG4gICAgICAgIGlmIChub2RlTmFtZSAhPT0gXCJodG1sXCIgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwieG1sOmxhbmdcIikgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIC8vIEl0J3Mgb2theSB0byBoYXZlIGEgbGFuZz1cIlwiIGlmIG5vdCBvbiBodG1sXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGFuZ1N0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpO1xuICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmdTdHIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIUxhbmdVdGlsLmlzQmNwNDcobGFuZ1N0cikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGxldCBodG1sX2xhbmdfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaHRtbF9sYW5nX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206aHRtbFtsYW5nXSwgZG9tOmh0bWxbeG1sOmxhbmddXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJMYW5nIGhhcyBhIHZhbGlkIHByaW1hcnkgbGFuZyBhbmQgY29uZm9ybXMgdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlNwZWNpZmllZCAnbGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGluY2x1ZGUgYSB2YWxpZCBwcmltYXJ5IGxhbmd1YWdlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlNwZWNpZmllZCAnbGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGNvbmZvcm0gdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlNwZWNpZmllZCAneG1sOmxhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBpbmNsdWRlIGEgdmFsaWQgcHJpbWFyeSBsYW5ndWFnZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJTcGVjaWZpZWQgJ3htbDpsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgY29uZm9ybSB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgZGVmYXVsdCBodW1hbiBsYW5ndWFnZSBvZiB0aGUgcGFnZSBtdXN0IGJlIHZhbGlkIGFuZCBzcGVjaWZpZWQgaW4gYWNjb3JkYW5jZSB3aXRoIEJDUCA0N1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCJiNWMzZjhcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9LFxuICAgICAgICBcImJmMDUxYVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAgLy8gVE9ETzogQUNUOiBNaXNtYXRjaCBiZWNhdXNlIHRoZXkgZG9uJ3QgY2hlY2sgdGhlIGh0bWwgZWxlbWVudCBpbiB0aGUgc2FtZSBydWxlXG4gICAgICAgIC8vIFwiZGU0NmU0XCI6IHtcbiAgICAgICAgLy8gICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzFcIjogXCJmYWlsXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMlwiOiBcInBhc3NcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfNFwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIC8vIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBsZXQgcmVhc29uQ29kZSA9IHZhbGlkYXRlTGFuZyhjb250ZXh0KTtcbiAgICAgICAgLy8gVGhpcyBpcyBkb25lIGhlcmUgaW5zdGVhZCBvZiBpbiB2YWxpZGF0ZUxhbmcgc28gdGhhdCB0aGUgZ2VuSGVscCBjb2RlIHdpbGwgcGljayBpdCB1cFxuICAgICAgICBsZXQgcmV0QXJyID0gW1xuICAgICAgICAgICAgUnVsZVBhc3MoXCJQYXNzXzBcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfMVwiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF8yXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzNcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfNFwiKVxuICAgICAgICBdXG4gICAgICAgIHJldHVybiByZXRBcnJbcmVhc29uQ29kZV07XG4gICAgfVxufVxuXG5leHBvcnQgbGV0IGVsZW1lbnRfbGFuZ192YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X2xhbmdfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2xhbmddLCBkb206Klt4bWw6bGFuZ11cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJlbGVtZW50X2xhbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfbGFuZ192YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkxhbmcgaGFzIGEgdmFsaWQgcHJpbWFyeSBsYW5nIGFuZCBjb25mb3JtcyB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiU3BlY2lmaWVkICdsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgaW5jbHVkZSBhIHZhbGlkIHByaW1hcnkgbGFuZ3VhZ2VcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiU3BlY2lmaWVkICdsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgY29uZm9ybSB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiU3BlY2lmaWVkICd4bWw6bGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGluY2x1ZGUgYSB2YWxpZCBwcmltYXJ5IGxhbmd1YWdlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIlNwZWNpZmllZCAneG1sOmxhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBjb25mb3JtIHRvIEJDUCA0N1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBjaGFuZ2UgaW4gbGFuZ3VhZ2Ugb2Ygc3BlY2lmaWMgY29udGVudCBtdXN0IGJlIHZhbGlkIGFuZCBzcGVjaWZpZWQgaW4gYWNjb3JkYW5jZSB3aXRoIEJDUCA0N1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICAvLyBcImI1YzNmOFwiOiB7XG4gICAgICAgIC8vICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfNFwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIC8vIH0sXG4gICAgICAgIC8vIFwiYmYwNTFhXCI6IHtcbiAgICAgICAgLy8gICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzFcIjogXCJmYWlsXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMlwiOiBcInBhc3NcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8zXCI6IFwiZmFpbFwiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICAvLyB9LFxuICAgICAgICAvLyBUT0RPOiBBQ1Q6IE1pc21hdGNoIGJlY2F1c2UgdGhleSBkb24ndCBjaGVjayB0aGUgaHRtbCBlbGVtZW50IGluIHRoZSBzYW1lIHJ1bGVcbiAgICAgICAgXCJkZTQ2ZTRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIC8vIElmIGl0J3MgdGhlIEhUTUwgbm9kZSwgdGhhdCdzIGhhbmRsZWQgYnkgaHRtbF9sYW5nX3ZhbGlkXG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJodG1sXCIpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcmVhc29uQ29kZSA9IHZhbGlkYXRlTGFuZyhjb250ZXh0KTtcbiAgICAgICAgLy8gVGhpcyBpcyBkb25lIGhlcmUgaW5zdGVhZCBvZiBpbiB2YWxpZGF0ZUxhbmcgc28gdGhhdCB0aGUgZ2VuSGVscCBjb2RlIHdpbGwgcGljayBpdCB1cFxuICAgICAgICBsZXQgcmV0QXJyID0gW1xuICAgICAgICAgICAgUnVsZVBhc3MoXCJQYXNzXzBcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfMVwiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF8yXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzNcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfNFwiKVxuICAgICAgICBdXG4gICAgICAgIGxldCByZXRWYWwgPSByZXRBcnJbcmVhc29uQ29kZV07XG4gICAgICAgIGlmIChyZXRWYWwudmFsdWVbMV0gIT09IGVSdWxlQ29uZmlkZW5jZS5QQVNTKSB7XG4gICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGVyZSdzIGFjdHVhbGx5IGNvbnRlbnQgb2YgdGhpcyBlbGVtZW50IC0gc2tpcCBzdWJ0cmVlcyB0aGF0IGhhdmUgb3RoZXIgbGFuZyBhdHRyaWJ1dGVzXG4gICAgICAgICAgICBsZXQgaGFzQ29udGVudCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoIWhhc0NvbnRlbnQgJiYgbncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBudy5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50KSB8fCBlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImxhbmdcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IGhhc0NvbnRlbnQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJiBBUklBTWFwcGVyLmNvbXB1dGVOYW1lKGVsZW1lbnQpLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IGhhc0NvbnRlbnQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbncubm9kZS5ub2RlVHlwZSA9PT0gMyAmJiBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaGFzQ29udGVudCkgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbb25kYmxjbGlja10sIGRvbToqW29ubW91c2Vtb3ZlXSwgZG9tOipbb25tb3VzZWRvd25dLCBkb206Kltvbm1vdXNldXBdLCBkb206Kltvbm1vdXNlb3Zlcl0sIGRvbToqW29ubW91c2VvdXRdLCBkb206KltvbmNsaWNrXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0VsZW1fRXZlbnRNb3VzZUFuZEtleVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmQuaHRtbFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcImVsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJDb25maXJtIHRoZSA8ezB9PiBlbGVtZW50IHdpdGggbW91c2UgZXZlbnQgaGFuZGxlcihzKSAnezF9JyBoYXMgYSBjb3JyZXNwb25kaW5nIGtleWJvYXJkIGhhbmRsZXIocylcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbGwgaW50ZXJhY3RpdmUgY29udGVudCB3aXRoIG1vdXNlIGV2ZW50IGhhbmRsZXJzIG11c3QgaGF2ZSBlcXVpdmFsZW50IGtleWJvYXJkIGFjY2Vzc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSB8fFxuICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmRibGNsaWNrXCIpICYmXG4gICAgICAgICAgICAgICAgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2Vtb3ZlXCIpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlZG93blwiKSB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNldXBcIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXl1cFwiKSkgJiZcbiAgICAgICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2VvdmVyXCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uZm9jdXNcIikpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3V0XCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uYmx1clwiKSkgJiZcbiAgICAgICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uY2xpY2tcIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSB8fFxuICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSA9PSBcImFcIiB8fCBub2RlTmFtZSA9PSBcImJ1dHRvblwiKSk7XG5cbiAgICAgICAgbGV0IGZhaWxlZE1vdXNlRXZlbnRzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvL3N0b3JlIGFuZCBkaXNwbGF5IGV2ZW50IG5hbWUgYW5kIG5vZGUgbmFtZSBpbiB0aGUgdG9rZW5zXG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25kYmxjbGlja1wiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbmRibGNsaWNrXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2Vtb3ZlXCIpKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9ubW91c2Vtb3ZlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2Vkb3duXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleWRvd25cIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25tb3VzZWRvd25cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZXVwXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleXVwXCIpKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9ubW91c2V1cFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3ZlclwiKSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25mb2N1c1wiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbm1vdXNlb3ZlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3V0XCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmJsdXJcIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25tb3VzZW91dFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmNsaWNrXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmtleXByZXNzXCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEobm9kZU5hbWUgPT0gXCJhXCIgfHwgbm9kZU5hbWUgPT0gXCJidXR0b25cIikpXG4gICAgICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbmNsaWNrXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiLCBbbm9kZU5hbWUsIGZhaWxlZE1vdXNlRXZlbnRzLmpvaW4oXCIsIFwiKV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGdldERlZmluZWRTdHlsZXMsIHNlbGVjdG9yTWF0Y2hlc0VsZW0sIGdldE1lZGlhT3JpZW50YXRpb25UcmFuc2Zvcm0sIGdldFJvdGF0aW9uRGVncmVlfSBmcm9tIFwiLi4vdXRpbC9DU1NVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9WaXNVdGlsXCI7XG5pbXBvcnQgeyBnZXRDYWNoZSwgc2V0Q2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBlbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xvY2tlZFwiOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgaXMgbm90IHJlc3RyaWN0ZWQgdG8gZWl0aGVyIGxhbmRzY2FwZSBvciBwb3J0cmFpdCBvcmllbnRhdGlvbiB1c2luZyBDU1MgdHJhbnNmb3JtIHByb3BlcnR5XCIsXG4gICAgICAgICAgICBcImZhaWxfbG9ja2VkXCI6IFwiVGhlIGVsZW1lbnQgPHswfT4gaXMgcmVzdHJpY3RlZCB0byBlaXRoZXIgbGFuZHNjYXBlIG9yIHBvcnRyYWl0IG9yaWVudGF0aW9uIHVzaW5nIENTUyB0cmFuc2Zvcm0gcHJvcGVydHlcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50cyBzaG91bGQgbm90IGJlIHJlc3RyaWN0ZWQgdG8gZWl0aGVyIGxhbmRzY2FwZSBvciBwb3J0cmFpdCBvcmllbnRhdGlvbiB1c2luZyBDU1MgdHJhbnNmb3JtIHByb3BlcnR5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuNFwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbJ2IzM2VmZiddLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCBpbnZpc2libGUgZWxlbWVudFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCBlbGVtZW50c1xuICAgICAgICBpZiAoUlBUVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wic2NyaXB0XCIsIFwibWV0YVwiLCBcInRpdGxlXCJdKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsgICAgXG4gICAgICAgIFxuICAgICAgICAvLyBjYWNoZSB0aGUgb3JpZW50YXRpb24gcmVzdWx0IGZvciBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBwYWdlXG4gICAgICAgIGxldCBkb2MgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChydWxlQ29udGV4dCkgYXMgYW55O1xuICAgICAgICBsZXQgb3JpZW50YXRpb25UcmFuc2Zvcm1zID0gZ2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfTUVESUFfT1JJRU5UQVRJT05fVFJBTlNGUk9NXCIsIG51bGwpO1xuICAgICAgICBpZiAoIW9yaWVudGF0aW9uVHJhbnNmb3Jtcykge1xuICAgICAgICAgICAgb3JpZW50YXRpb25UcmFuc2Zvcm1zID0gZ2V0TWVkaWFPcmllbnRhdGlvblRyYW5zZm9ybShkb2MpO1xuICAgICAgICAgICAgc2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfTUVESUFfT1JJRU5UQVRJT05fVFJBTlNGUk9NXCIsIG9yaWVudGF0aW9uVHJhbnNmb3Jtcyk7XG4gICAgICAgIH0gXG4gICAgICAgIFxuICAgICAgICAvLyBmaW5kIGlmIHRoZSBlbGVtZW50IG1hdGNoZXMgb3JpZW50YXRpb24gc2VsZWN0b3IocylcbiAgICAgICAgbGV0IG1lZGlhX3RyYW5zZm9ybXMgPSBbXTtcbiAgICAgICAgT2JqZWN0LmtleXMob3JpZW50YXRpb25UcmFuc2Zvcm1zKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhvcmllbnRhdGlvblRyYW5zZm9ybXNba2V5XSkuZm9yRWFjaCh0YWcgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhvcmllbnRhdGlvblRyYW5zZm9ybXNba2V5XVt0YWddKS5sZW5ndGggPiAwICYmIHNlbGVjdG9yTWF0Y2hlc0VsZW0ocnVsZUNvbnRleHQsIHRhZykpXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhX3RyYW5zZm9ybXMucHVzaChvcmllbnRhdGlvblRyYW5zZm9ybXNba2V5XVt0YWddLnRyYW5zZm9ybSk7ICAgIFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIG5vIG1hdGNoLCB0aGUgZWxlbWVudCBpcyBub3QgaW4gbWVkaWEgb3JpZW50YXRpb24gdHJhbnNmb3JtXG4gICAgICAgIGlmIChtZWRpYV90cmFuc2Zvcm1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG1lZGlhX3RyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG1lZGlhX3RyYW5zZm9ybSA9IG1lZGlhX3RyYW5zZm9ybXNbaV07XG4gICAgICAgICAgICBsZXQgY29udGFpbnNSb3RhdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgWydyb3RhdGUnLCAncm90YXRlM2QnLCAncm90YXRlWicsICdtYXRyaXgnLCAnbWF0cml4M2QnXS5mb3JFYWNoKHJvdGF0aW9uID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobWVkaWFfdHJhbnNmb3JtLmluY2x1ZGVzKHJvdGF0aW9uKSkgY29udGFpbnNSb3RhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIG5vIHJvdGF0aW9uIHRyYW5zZm9ybSwgc2tpcFxuICAgICAgICAgICAgaWYgKCFjb250YWluc1JvdGF0aW9uKSBjb250aW51ZTtcblxuICAgICAgICAgICAgbGV0IGRlZ3JlZSA9IGdldFJvdGF0aW9uRGVncmVlKG1lZGlhX3RyYW5zZm9ybSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIG5vIG9yIDM2MG4gZGVncmVlIHJvdGF0aW9uIFxuICAgICAgICAgICAgaWYgKGRlZ3JlZSA9PT0gMCkgeyBcbiAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBjYWxjdWxhdGUgdGhlIG9yaWdpbmFsIHBhZ2Ugcm90YXRpb24gdHJhbnNmb3JtYXRpb24sIGV4YW1wbGVcbiAgICAgICAgICAgICAqICBodG1sIHsgdHJhbnNmb3JtOiByb3RhdGUoMi41ZGVnKTsgfVxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGRlZmluZWRTdHlsZSA9IGdldERlZmluZWRTdHlsZXMocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvKiogXG4gICAgICAgICAgICAgKiBjb21wZW5zYXRlIHRoZSBtZWRpYSBvcmllbnRhdGlvbiB3aXRoIHRoZSBwYWdlIG9yaWVudGF0aW9uXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChkZWZpbmVkU3R5bGVbJ3RyYW5zZm9ybSddKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZV9kZWdyZWUgPSBnZXRSb3RhdGlvbkRlZ3JlZShkZWZpbmVkU3R5bGVbJ3RyYW5zZm9ybSddKTtcbiAgICAgICAgICAgICAgICBkZWdyZWUgLT0gcGFnZV9kZWdyZWU7XG4gICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBhbGxvdyAxIGRlZ3JlZSBmbG9hdGluZyByYW5nZSBmb3IgdGhlIHJpZ2h0IGFuZ2xlXG4gICAgICAgICAgICBpZiAoKGRlZ3JlZSA+IDg5ICYmIGRlZ3JlZSA8IDkxKSB8fCAoZGVncmVlID4gLTkxICYmIGRlZ3JlZSA8IC04OSkpXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX2xvY2tlZFwiLCBbbm9kZU5hbWVdKSk7XG4gICAgICAgICAgICBlbHNlIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKSAgXG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICByZXR1cm4gbnVsbDsgXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcbmltcG9ydCB7IGdldENvbXB1dGVkU3R5bGUsIGdldFBpeGVsc0Zyb21TdHlsZSB9IGZyb20gXCIuLi8vdXRpbC9DU1NVdGlsXCI7XG5cbmV4cG9ydCBsZXQgZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc190YWJiYWJsZVwiOiBcImVsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NfaW50ZXJhY3RpdmVcIjogXCJlbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3Njcm9sbGFibGVcIjogXCJlbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNjcm9sbGFibGUgZWxlbWVudHMgc2hvdWxkIGJlIHRhYmJhYmxlIG9yIGNvbnRhaW4gdGFiYmFibGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJwYXNzX3RhYmJhYmxlXCI6IFwiVGhlIHNjcm9sbGFibGUgZWxlbWVudCBpcyB0YWJiYWJsZVwiLFxuICAgICAgICAgICAgXCJwYXNzX2ludGVyYWN0aXZlXCI6IFwiVGhlIHNjcm9sbGFibGUgZWxlbWVudCBoYXMgdGFiYmFibGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJmYWlsX3Njcm9sbGFibGVcIjogXCJUaGUgc2Nyb2xsYWJsZSBlbGVtZW50IDx7MH0+IHdpdGggbm9uLWludGVyYWN0aXZlIGNvbnRlbnQgaXMgbm90IHRhYmJhYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIl0sXG4gICAgICAgIG51bTogW1wiMi4xLjFcIl0sXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtcIm9zc3c5a1wiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8IFJQVFV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIGVsZW1lbnRzXG4gICAgICAgIGlmIChSUFRVdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJpZnJhbWVcIiwgXCJzdmdcIiwgXCJzY3JpcHRcIiwgXCJtZXRhXCJdKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vc2tpcCBpZiBubyB2aXNpYmxlIGNvbnRlbnRcbiAgICAgICAgaWYgKCFSUFRVdGlsLmhhc0lubmVyQ29udGVudChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUocnVsZUNvbnRleHQpO1xuICAgICAgICAvLyBub3Qgc2Nyb2xsYWJsZSwgaW5hcHBsaWNhYmxlXG4gICAgICAgIGlmICgoc3R5bGVzLm92ZXJmbG93WCA9PT0gJ3Zpc2libGUnIHx8IHN0eWxlcy5vdmVyZmxvd1ggPT09ICdoaWRkZW4nKVxuICAgICAgICAgICAgJiYgKHN0eWxlcy5vdmVyZmxvd1kgPT09ICd2aXNpYmxlJyB8fCBzdHlsZXMub3ZlcmZsb3dZID09PSAnaGlkZGVuJykpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIG92ZXJhbGwgc2Nyb2xsYWJsZSBlbGVtZW50IChjbGllbnRXaWR0aCArIHNjcm9sbGJhcldpZHRoIGFuZCBjbGllbnRIZWlnaHQgKyBzY3JvbGxiYXJIZWlnaHQpIGlzIHRvbyBzbWFsbCB0byBiZSB2aXNpYmxlIG9uIHNjcmVlblxuICAgICAgICBpZiAoTWF0aC5tYXgocnVsZUNvbnRleHQub2Zmc2V0V2lkdGgsIHJ1bGVDb250ZXh0Lm9mZnNldEhlaWdodCkgPCAzMCB8fCBNYXRoLm1pbihydWxlQ29udGV4dC5vZmZzZXRXaWR0aCwgcnVsZUNvbnRleHQub2Zmc2V0SGVpZ2h0KSA8IDE1KSAgXG4gICAgICAgICAgIHJldHVybiBudWxsOyBcblxuICAgICAgICAvLyBpZ25vcmUgaWYgYm90aCB4IGFuZCB5IHNjcm9sbCBkaXN0YW5jZXMgPCBlbGVtZW50J3MgaG9yaXpvbnRhbC92ZXJ0aWNhbCBwYWRkaW5nXG4gICAgICAgIGNvbnN0IHBhZGRpbmdfeCA9IGdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ0xlZnQsIHJ1bGVDb250ZXh0KSArIGdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ1JpZ2h0LCBydWxlQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdfeSA9IGdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ1RvcCwgcnVsZUNvbnRleHQpICsgZ2V0UGl4ZWxzRnJvbVN0eWxlKHN0eWxlcy5wYWRkaW5nQm90dG9tLCBydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5zY3JvbGxXaWR0aCAtICBydWxlQ29udGV4dC5jbGllbnRXaWR0aCA8IDEgKyBwYWRkaW5nX3ggXG4gICAgICAgICAgICAmJiBydWxlQ29udGV4dC5zY3JvbGxIZWlnaHQgLSAgcnVsZUNvbnRleHQuY2xpZW50SGVpZ2h0IDwgMSsgcGFkZGluZ195KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBwYXNzIGlmcmFtZSBlbGVtZW50IGhhcyBhIHRhYmluZGV4IGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGlzIG5vdCBuZWdhdGl2ZVxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikgJiYgcGFyc2VJbnQocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIikpID49IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX3RhYmJhYmxlXCIpO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmIGVsZW1lbnQgY29udGVudCBpcyB0YWJiYWJsZVxuICAgICAgICBjb25zdCBjb3VudCA9IFJQVFV0aWwuZ2V0VGFiYmFibGVDaGlsZHJlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChjb3VudCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2ludGVyYWN0aXZlXCIpO1xuXG4gICAgICAgIC8vIGlnbm9yZSBpbiBGaXJlZm94IGlmIG5vIHRhYmluZGV4IGF0IGFsbCAobm90IHRlc3RlZCBpbiBlbWJlZGRlZCBvciBhbnkgc2ltdWxhdG9yKVxuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRhYmluZGV4XCIpICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihcIkZpcmVmb3hcIikgPiAtMSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfc2Nyb2xsYWJsZVwiLCBbbm9kZU5hbWVdKTsgICAgXG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBnZXREZWZpbmVkU3R5bGVzIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkXCIsXG4gICAgY29udGV4dDpcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImVsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZF9yb2xlXCI6IFwiZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIHRhYmJhYmxlIGVsZW1lbnQgaGFzIGEgd2lkZ2V0IHJvbGVcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkX3JvbGVcIjogXCJUaGUgdGFiYmFibGUgZWxlbWVudCdzIHJvbGUgJ3swfScgaXMgbm90IGEgd2lkZ2V0IHJvbGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIHRhYmJhYmxlIGVsZW1lbnQgbXVzdCBoYXZlIGEgdmFsaWQgd2lkZ2V0IHJvbGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIl0sXG4gICAgICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJpZFwiOiBbXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICAgICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGlmIChSUFRVdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSB8fCBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBpZiB0aGUgZWxlbWVudCBpcyB0YWJiYWJsZSBieSBkZWZhdWx0IHdpdGggb3Igd2l0aG91dCB0YWJpbmRleCwgbGV0IHRoZSBvdGhlciBydWxlcyAoc3VjaCBhcyB3aWRnZXRfdGFiYmFibGVfc2luZ2xlKSB0byBoYW5kbGUgaXRcbiAgICAgICAgaWYgKG5vZGVOYW1lIGluIFJQVFV0aWwudGFiVGFnTWFwICkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gUlBUVXRpbC50YWJUYWdNYXBbbm9kZU5hbWVdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBpZiAodmFsdWUpIHJldHVybiBudWxsO1xuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjYXNlOiBubyB0YWJpbmRleCBvciB0YWJpbmRleCA8IDBcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fCBwYXJzZUludChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgZWxlbWVudHMgd2l0aCBDU1Mgb3ZlcmZsb3c6IHNjcm9sbCBvciBhdXRvXG4gICAgICAgIGxldCBzdHlsZXMgPSBnZXREZWZpbmVkU3R5bGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHN0eWxlc1snb3ZlcmZsb3cteCddID09PSAnc2Nyb2xsJyB8fCBzdHlsZXNbJ292ZXJmbG93LXknXSA9PT0gJ3Njcm9sbCcgXG4gICAgICAgICAgICB8fCBzdHlsZXNbJ292ZXJmbG93LXgnXSA9PT0gJ2F1dG8nIHx8IHN0eWxlc1snb3ZlcmZsb3cteSddID09PSAnYXV0bycpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgcm9sZXMgPSBSUFRVdGlsLmdldFJvbGVzKHJ1bGVDb250ZXh0LCBmYWxzZSk7XG4gICAgICAgIC8vIGlnbm9yZSAnYXBwbGljYXRpb24nIHJvbGUgdGhhdCBjb250YWlucyBvbmUgb3IgbW9yZSBmb2N1c2FibGUgZWxlbWVudHMgdGhhdCBkbyBub3QgZm9sbG93IGEgc3RhbmRhcmQgaW50ZXJhY3Rpb24gcGF0dGVybiBzdXBwb3J0ZWQgYnkgYSB3aWRnZXQgcm9sZTpodHRwczovL3d3dy53My5vcmcvVFIvMjAyMy9QUi1XQUktQVJJQS0xLjItMjAyMzAzMjgvI2FwcGxpY2F0aW9uIFxuICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMuaW5jbHVkZXMoXCJhcHBsaWNhdGlvblwiKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gZWxlbWVudHMgd2hvc2Ugcm9sZXMgYWxsb3cgbm8gZGVzY2VuZGFudHMgdGhhdCBhcmUgaW50ZXJhY3RpdmUgb3Igd2l0aCBhIHRhYmluZGV4ID49IDAgXG4gICAgICAgIC8vIHRoaXMgY2FzZSBzaG91bGQgYmUgaGFuZGxlZCBpbiB3aWRnZXRfdGFiYmFibGVfc2luZ2xlIGFuZCBhcmlhX2NoaWxkX3RhYmJhYmxlXG4gICAgICAgIGNvbnN0IHJvbGVzX25vX2ludGVyYWN0aXZlX2NoaWxkID1bXCJidXR0b25cIiwgXCJjaGVja2JveFwiLCBcImltZ1wiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIl07XG5cbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJvbGVzID0gUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY29uc3QgcGFyZW50X3JvbGVzID0gUlBUVXRpbC5nZXRSb2xlcyhwYXJlbnQgYXMgRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgb25lIG9mIHRoZSBwYXJlbnQgcm9sZXMgaXMgaW4gcm9sZXNfbm9faW50ZXJhY3RpdmVfY2hpbGRcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgcGFyZW50X3JvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocm9sZXNfbm9faW50ZXJhY3RpdmVfY2hpbGQuaW5jbHVkZXMocGFyZW50X3JvbGVzW2ldKSlcbiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYW5kbGUgdGhlIGNhc2U6IHRhYmluZGV4ID49IDAgdG8gZXhhbWluZSB3aGV0aGVyIGEgd2lkZ2V0IHJvbGUgaXMgc2V0dXAgb3Igbm90IFxuICAgICAgICAvLyBwYXNzIGlmIG9uZSBvZiB0aGUgcm9sZXMgaXMgYSB3aWRnZXQgdHlwZVxuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCByb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gUm93IGlzIHdlaXJkLiBJdCdzIHN0cnVjdHVyZSwgYnV0IGNhbiBhbHNvIGJlIHdpZGdldFxuICAgICAgICAgICAgaWYgKHJvbGVzW2ldID09PSBcInJvd1wiIHx8IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1tpXV0ucm9sZVR5cGUgPT09ICd3aWRnZXQnKSB7XG4gICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBGb2N1c2FibGUgc2VwYXJhdG9ycyBhcmUgd2lkZ2V0c1xuICAgICAgICAgICAgaWYgKHJvbGVzW2ldID09PSBcInNlcGFyYXRvclwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW52YWxpZF9yb2xlXCIsIFtyb2xlcy5sZW5ndGggPT09IDAgPyAnbm9uZScgOiByb2xlcy5qb2luKCcsICcpXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgZ2V0RGVmaW5lZFN0eWxlcywgZ2V0Q29tcHV0ZWRTdHlsZSB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5LCBSdWxlUG90ZW50aWFsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBsZXQgZWxlbWVudF90YWJiYWJsZV92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfdGFiYmFibGVfdmlzaWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF90YWJiYWJsZV92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImVsZW1lbnRfdGFiYmFibGVfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF92aXNpYmxlXCI6IFwiZWxlbWVudF90YWJiYWJsZV92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIHRhYmJhYmxlIGVsZW1lbnQgc2hvdWxkIGJlIHZpc2libGUgb24gdGhlIHNjcmVlbiB3aGVuIGl0IGhhcyBrZXlib2FyZCBmb2N1c1wiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIHRhYmJhYmxlIGVsZW1lbnQgaXMgdmlzaWJsZSBvbiB0aGUgc2NyZWVuXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF92aXNpYmxlXCI6IFwiQ29uZmlybSB0aGUgZWxlbWVudCBzaG91bGQgYmUgdGFiYmFibGUsIGFuZCBpcyB2aXNpYmxlIG9uIHRoZSBzY3JlZW4gd2hlbiBpdCBoYXMga2V5Ym9hcmQgZm9jdXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgbnVtOiBbXCIyLjQuN1wiXSxcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghUlBUVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpOyBcbiAgICAgICAgY29uc3QgYm91bmRzID0gY29udGV4dFtcImRvbVwiXS5ib3VuZHM7XG4gICAgICAgIC8vaW4gY2FzZSB0aGUgYm91bmRzIG5vdCBhdmFpbGFibGVcbiAgICAgICAgaWYgKCFib3VuZHMpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gZGVmaW5lZCBzdHlsZXMgb25seSBnaXZlIHRoZSBzdHlsZXMgdGhhdCBjaGFuZ2VkXG4gICAgICAgIGNvbnN0IGRlZmluZWRfc3R5bGVzID0gZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IG9uZm9jdXNfc3R5bGVzID0gZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCwgXCI6Zm9jdXNcIik7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgIGlmIChib3VuZHNbJ2hlaWdodCddID09PSAwIHx8IGJvdW5kc1snd2lkdGgnXSA9PT0gMCBcbiAgICAgICAgICAgIHx8IChkZWZpbmVkX3N0eWxlc1sncG9zaXRpb24nXT09PSdhYnNvbHV0ZScgJiYgZGVmaW5lZF9zdHlsZXNbJ2NsaXAnXSAmJiBkZWZpbmVkX3N0eWxlc1snY2xpcCddLnJlcGxhY2VBbGwoJyAnLCAnJyk9PT0ncmVjdCgwcHgsMHB4LDBweCwwcHgpJ1xuICAgICAgICAgICAgICAmJiAhb25mb2N1c19zdHlsZXNbJ2NsaXAnXSkpXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF92aXNpYmxlXCIsIFtdKTtcblxuICAgICAgICBpZiAoYm91bmRzWyd0b3AnXSA+PSAwICYmIGJvdW5kc1snbGVmdCddID49IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgZGVmYXVsdF9zdHlsZXMgPSBnZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIGxldCB0b3AgPSBib3VuZHNbJ3RvcCddO1xuICAgICAgICBsZXQgbGVmdCA9IGJvdW5kc1snbGVmdCddOyAgICAgXG4gICAgICAgXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhvbmZvY3VzX3N0eWxlcykubGVuZ3RoID09PSAwICkge1xuICAgICAgICAgICAgLy8gbm8gb25mb2N1cyBwb3NpdGlvbiBjaGFuZ2UsIGJ1dCBjb3VsZCBiZSBjaGFuZ2VkIGZyb20ganMgXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF92aXNpYmxlXCIsIFtdKTtcbiAgICAgICAgfSBlbHNlIHsgICBcbiAgICAgICAgICAgIC8vIHdpdGggb25mb2N1cyBwb3NpdGlvbiBjaGFuZ2VcbiAgICAgICAgICAgIHZhciBwb3NpdGlvbnMgPSBbJ2Fic29sdXRlJywgJ2ZpeGVkJ107XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uZm9jdXNfc3R5bGVzWyd0b3AnXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25zLmluY2x1ZGVzKG9uZm9jdXNfc3R5bGVzWydwb3NpdGlvbiddKSB8fCAodHlwZW9mIG9uZm9jdXNfc3R5bGVzWydwb3NpdGlvbiddID09PSAndW5kZWZpbmVkJyAmJiBwb3NpdGlvbnMuaW5jbHVkZXMoZGVmYXVsdF9zdHlsZXNbJ3Bvc2l0aW9uJ10pKSkge1xuICAgICAgICAgICAgICAgICAgICB0b3AgPSBvbmZvY3VzX3N0eWxlc1sndG9wJ10ucmVwbGFjZSgvXFxEL2csJycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7IFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcG9zaXRpb24gaXMgdW5kZWZpbmVkIGFuZCB0aGUgcGFyZW50J3MgcG9zaXRpb24gaXMgJ3JlbGF0aXZlJ1xuICAgICAgICAgICAgICAgICAgICB0b3AgPSBOdW1iZXIuTUlOX1ZBTFVFOyAgIFxuICAgICAgICAgICAgICAgIH0gICAgIFxuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25mb2N1c19zdHlsZXNbJ2xlZnQnXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25zLmluY2x1ZGVzKG9uZm9jdXNfc3R5bGVzWydwb3NpdGlvbiddKSB8fCAodHlwZW9mIG9uZm9jdXNfc3R5bGVzWydwb3NpdGlvbiddID09PSAndW5kZWZpbmVkJyAmJiBwb3NpdGlvbnMuaW5jbHVkZXMoZGVmYXVsdF9zdHlsZXNbJ3Bvc2l0aW9uJ10pKSkge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gb25mb2N1c19zdHlsZXNbJ2xlZnQnXS5yZXBsYWNlKC9cXEQvZywnJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwb3NpdGlvbiBpcyB1bmRlZmluZWQgYW5kIHRoZSBwYXJlbnQncyBwb3NpdGlvbiBpcyAncmVsYXRpdmUnXG4gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBOdW1iZXIuTUlOX1ZBTFVFOyAgIFxuICAgICAgICAgICAgICAgIH0gICAgIFxuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHRvcCA+PSAwICYmIGxlZnQgPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3Zpc2libGVcIiwgW10pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGxldCBlbWJlZF9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImVtYmVkX2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTplbWJlZFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0VtYmVkX0hhc0FsdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlbWJlZF9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJlbWJlZF9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbWJlZF9hbHRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0aGUgPGVtYmVkPiBlbGVtZW50IGhhcyBhbHRlcm5hdGl2ZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUHJvdmlkZSBhbHRlcm5hdGl2ZSBjb250ZW50IGZvciA8ZW1iZWQ+IGVsZW1lbnRzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9GT1VSXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFsdFwiKTtcbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5cbmV4cG9ydCBsZXQgZW1iZWRfbm9lbWJlZF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZW1iZWRfbm9lbWJlZF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTplbWJlZFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0VtYmVkX0hhc05vRW1iZWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZW1iZWRfbm9lbWJlZF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImVtYmVkX25vZW1iZWRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbWJlZF9ub2VtYmVkX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIDxlbWJlZD4gZWxlbWVudCBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIG5vbi1lbWJlZGRlZCBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPGVtYmVkPiBlbGVtZW50cyBzaG91bGQgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBub24tZW1iZWRkZWQgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwibm9lbWJlZFwiKS5sZW5ndGggPiAwO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgbGV0IHdhbGtOb2RlID0gcnVsZUNvbnRleHQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiB3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwibm9lbWJlZFwiKVxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdhbGtOb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCIjdGV4dFwiICYmIHdhbGtOb2RlLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAod2Fsa05vZGUubm9kZVR5cGUgPT0gMSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgUlBUVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sZWdhY3lcIjtcblxuZXhwb3J0IGxldCBlbW90aWNvbnNfYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJlbW90aWNvbnNfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9UZXh0X0Vtb3RpY29uc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJlbW90aWNvbnNfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZW1vdGljb25zX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVtb3RpY29uc19hbHRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCBlbW90aWNvbnMgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbW90aWNvbnMgbXVzdCBoYXZlIGEgc2hvcnQgdGV4dCBhbHRlcm5hdGl2ZSB0aGF0IGRlc2NyaWJlcyB0aGVpciBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/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+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTFRhYmxlRWxlbWVudDtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGxheW91dCB0YWJsZSBvciB0aGVyZSBhcmUgbm8gcm93cywgdGhlIHJ1bGUgZG9lcyBub3QgYXBwbHkuXG4gICAgICAgIGxldCByb3dzID0gcnVsZUNvbnRleHQucm93cztcbiAgICAgICAgaWYgKCFSUFRVdGlsLmlzRGF0YVRhYmxlKHJ1bGVDb250ZXh0KSB8fCByb3dzID09IG51bGwgfHwgcm93cy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBwYXNzZWQgPSBSUFRVdGlsLmlzVGFibGVIZWFkZXJJbkZpcnN0Um93T3JDb2x1bW4ocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBSUFRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xlZ2FjeVwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vVmlzVXRpbFwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcblxuZXhwb3J0IGxldCB0YWJsZV9oZWFkZXJzX3JlZl92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRkW2hlYWRlcnNdLCBkb206dGhbaGVhZGVyc11cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcInRhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSAnaGVhZGVycycgYXR0cmlidXRlIHZhbHVlIFxcXCJ7MH1cXFwiIGRvZXMgbm90IHJlZmVyZW5jZSBhIHZhbGlkICdpZCcgaW4gdGhpcyBkb2N1bWVudFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSB2YWx1ZSBcXFwiezB9XFxcIiByZWZlcnMgdG8gaXRzZWxmXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlRoZSAnaGVhZGVycycgYXR0cmlidXRlIHZhbHVlIFxcXCJ7MH1cXFwiIGRvZXMgbm90IHJlZmVyIHRvIGEgY2VsbCBpbiB0aGUgc2FtZSB0YWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSB2YWx1ZSBcXFwiezB9XFxcIiBkb2VzIG5vdCByZWZlciB0byBhIGNlbGwgaW5kaWNhdGVkIHdpdGggPHRoPiBvciBhIHJvbGUgb2YgXFxcImNvbHVtbmhlYWRlclxcXCIgb3IgXFxcInJvd2hlYWRlclxcXCJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSBzaG91bGQgcmVmZXIgdG8gYSB2YWxpZCBjZWxsIGluIHRoZSBzYW1lIHRhYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXCJhMjVmNDVcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/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/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgUlBUVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBhIHByZXNlbnRhdGlvbmFsIGNoaWxkIG9mIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKFJQVFV0aWwuc2hvdWxkQmVQcmVzZW50YXRpb25hbENoaWxkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIGxldCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgaWYgKFJQVFV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICsrY291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm9kZSBoYXMgY2hpbGRyZW4sIGxvb2sgZm9yIHRhYiBzdG9wcyBpbiB0aGUgY2hpbGRyZW5cbiAgICAgICAgLy9za2lwIHRoZSBjb3VudCBpZiB0aGUgZWxlbWVudCByZXF1aXJlcyBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiBvbmx5XG4gICAgICAgIGlmIChjb3VudCA8IDIgJiYgIVJQVFV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShydWxlQ29udGV4dCkgJiYgcnVsZUNvbnRleHQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IE5vZGVXYWxrZXIocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgd2hpbGUgKGNvdW50IDwgMiAmJiBudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PSAxICYmICFudy5iRW5kVGFnICYmIFJQVFV0aWwuaXNUYWJiYWJsZShudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICArK2NvdW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFzc2VkID0gY291bnQgPCAyO1xuICAgICAgICBpZiAoIXBhc3NlZClcbiAgICAgICAgICAgIHNldENhY2hlKHJ1bGVDb250ZXh0LCBcIndpZGdldF90YWJiYWJsZV9zaW5nbGVcIiwgXCJmYWlsX211bHRpcGxlX3RhYmJhYmxlXCIpO1xuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJwYXNzXCIpIDogUnVsZVBvdGVudGlhbChcImZhaWxfbXVsdGlwbGVfdGFiYmFibGVcIiwgW3JvbGVdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlc2V0IH0gZnJvbSBcIi4vY2hlY2tlci9DaGVja2VyXCI7XG5pbXBvcnQgeyBlUnVsZUNhdGVnb3J5LCBlUnVsZXNldFR5cGUgfSBmcm9tIFwiLi4vdjIvYXBpL0lFbmdpbmVcIjtcbi8vIFRoaXMgZmlsZSBjb21lcyBmcm9tIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hY3QtcnVsZXMvYWN0LXRvb2xzL21haW4vc3JjL2RhdGEvc2MtdXJscy5qc29uXG5pbXBvcnQgKiBhcyBTQ1VSTHMgZnJvbSBcIi4vc2MtdXJscy5qc29uXCJcbmNvbnN0IFNDcyA9IFtdO1xuZm9yIChjb25zdCBrZXkgaW4gU0NVUkxzKSB7XG4gICAgU0NzLnB1c2goU0NVUkxzW2tleV0pO1xufVxuXG5jb25zdCBzdW1tYXJpZXMgPSB7XG4gICAgXCIxLjEuMVwiOiBcIkFsbCBub24tdGV4dCBjb250ZW50IHRoYXQgaXMgcHJlc2VudGVkIHRvIHRoZSB1c2VyIGhhcyBhIHRleHQgYWx0ZXJuYXRpdmUgdGhhdCBzZXJ2ZXMgdGhlIGVxdWl2YWxlbnQgcHVycG9zZS5cIixcbiAgICBcIjEuMi4xXCI6IFwiRm9yIHByZXJlY29yZGVkIGF1ZGlvLW9ubHkgb3IgdmlkZW8tb25seSBtZWRpYSwgYW4gYWx0ZXJuYXRpdmUgcHJvdmlkZXMgZXF1aXZhbGVudCBpbmZvcm1hdGlvbi5cIixcbiAgICBcIjEuMi4yXCI6IFwiQ2FwdGlvbnMgYXJlIHByb3ZpZGVkIGZvciBhbGwgcHJlcmVjb3JkZWQgYXVkaW8gY29udGVudCBpbiBzeW5jaHJvbml6ZWQgbWVkaWEuXCIsXG4gICAgXCIxLjIuM1wiOiBcIkFuIGFsdGVybmF0aXZlIGZvciB0aW1lLWJhc2VkIG1lZGlhIG9yIGF1ZGlvIGRlc2NyaXB0aW9uIG9mIHRoZSBwcmVyZWNvcmRlZCB2aWRlbyBjb250ZW50IGlzIHByb3ZpZGVkIGZvciBzeW5jaHJvbml6ZWQgbWVkaWEuXCIsXG4gICAgXCIxLjIuNFwiOiBcIkNhcHRpb25zIGFyZSBwcm92aWRlZCBmb3IgYWxsIGxpdmUgYXVkaW8gY29udGVudCBpbiBzeW5jaHJvbml6ZWQgbWVkaWEuXCIsXG4gICAgXCIxLjIuNVwiOiBcIkF1ZGlvIGRlc2NyaXB0aW9uIGlzIHByb3ZpZGVkIGZvciBhbGwgcHJlcmVjb3JkZWQgdmlkZW8gY29udGVudCBpbiBzeW5jaHJvbml6ZWQgbWVkaWEuXCIsXG4gICAgXCIxLjMuMVwiOiBcIkluZm9ybWF0aW9uLCBzdHJ1Y3R1cmUsIGFuZCByZWxhdGlvbnNoaXBzIGNvbnZleWVkIHRocm91Z2ggcHJlc2VudGF0aW9uIGNhbiBiZSBwcm9ncmFtbWF0aWNhbGx5IGRldGVybWluZWQgb3IgYXJlIGF2YWlsYWJsZSBpbiB0ZXh0LlwiLFxuICAgIFwiMS4zLjJcIjogXCJXaGVuIHRoZSBzZXF1ZW5jZSBpbiB3aGljaCBjb250ZW50IGlzIHByZXNlbnRlZCBhZmZlY3RzIGl0cyBtZWFuaW5nLCBhIGNvcnJlY3QgcmVhZGluZyBzZXF1ZW5jZSBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMS4zLjNcIjogXCJJbnN0cnVjdGlvbnMgcHJvdmlkZWQgZm9yIHVuZGVyc3RhbmRpbmcgYW5kIG9wZXJhdGluZyBjb250ZW50IGRvIG5vdCByZWx5IHNvbGVseSBvbiBzZW5zb3J5IGNoYXJhY3RlcmlzdGljcyBvZiBjb21wb25lbnRzIHN1Y2ggYXMgc2hhcGUsIHNpemUsIHZpc3VhbCBsb2NhdGlvbiwgb3JpZW50YXRpb24sIG9yIHNvdW5kLlwiLFxuICAgIFwiMS4zLjRcIjogXCJDb250ZW50IGRvZXMgbm90IHJlc3RyaWN0IGl0cyB2aWV3IGFuZCBvcGVyYXRpb24gdG8gYSBzaW5nbGUgZGlzcGxheSBvcmllbnRhdGlvbiwgc3VjaCBhcyBwb3J0cmFpdCBvciBsYW5kc2NhcGUuXCIsXG4gICAgXCIxLjMuNVwiOiBcIlRoZSBwdXJwb3NlIG9mIGVhY2ggaW5wdXQgZmllbGQgdGhhdCBjb2xsZWN0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlciBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkIHdoZW4gdGhlIGZpZWxkIHNlcnZlcyBhIGNvbW1vbiBwdXJwb3NlLlwiLFxuICAgIFwiMS40LjFcIjogXCJDb2xvciBpcyBub3QgdXNlZCBhcyB0aGUgb25seSB2aXN1YWwgbWVhbnMgb2YgY29udmV5aW5nIGluZm9ybWF0aW9uLCBpbmRpY2F0aW5nIGFuIGFjdGlvbiwgcHJvbXB0aW5nIGEgcmVzcG9uc2UsIG9yIGRpc3Rpbmd1aXNoaW5nIGEgdmlzdWFsIGVsZW1lbnQuXCIsXG4gICAgXCIxLjQuMlwiOiBcIklmIGFueSBhdWRpbyBwbGF5cyBhdXRvbWF0aWNhbGx5IGZvciBtb3JlIHRoYW4gMyBzZWNvbmRzLCBlaXRoZXIgYSBtZWNoYW5pc20gaXMgYXZhaWxhYmxlIHRvIHBhdXNlIG9yIHN0b3AgdGhlIGF1ZGlvLCBvciBhIG1lY2hhbmlzbSBpcyBhdmFpbGFibGUgdG8gY29udHJvbCBhdWRpbyB2b2x1bWUgaW5kZXBlbmRlbnRseSBmcm9tIHRoZSBvdmVyYWxsIHN5c3RlbSB2b2x1bWUgbGV2ZWwuXCIsXG4gICAgXCIxLjQuM1wiOiBcIlRoZSB2aXN1YWwgcHJlc2VudGF0aW9uIG9mIHRleHQgYW5kIGltYWdlcyBvZiB0ZXh0IGhhcyBhIGNvbnRyYXN0IHJhdGlvIG9mIGF0IGxlYXN0IDQuNToxLCB3aXRoIGEgMzoxIHJhdGlvIGZvciBsYXJnZS1zY2FsZSB0ZXh0LlwiLFxuICAgIFwiMS40LjRcIjogXCJUZXh0IGNhbiBiZSByZXNpemVkIHdpdGhvdXQgYXNzaXN0aXZlIHRlY2hub2xvZ3kgdXAgdG8gMjAwIHBlcmNlbnQgd2l0aG91dCBsb3NzIG9mIGNvbnRlbnQgb3IgZnVuY3Rpb25hbGl0eS5cIixcbiAgICBcIjEuNC41XCI6IFwiSWYgdGhlIHRlY2hub2xvZ2llcyBiZWluZyB1c2VkIGNhbiBhY2hpZXZlIHRoZSB2aXN1YWwgcHJlc2VudGF0aW9uLCB0ZXh0IHNob3VsZCBub3QgYmUgdXNlZCB0byBjb252ZXkgaW5mb3JtYXRpb24gcmF0aGVyIHRoYW4gaW1hZ2VzIG9mIHRleHQuXCIsXG4gICAgXCIxLjQuMTBcIjogXCJDb250ZW50IGNhbiByZWZsb3cgd2l0aG91dCBsb3NzIG9mIGluZm9ybWF0aW9uIG9yIGZ1bmN0aW9uYWxpdHksIGFuZCB3aXRob3V0IHJlcXVpcmluZyBzY3JvbGxpbmcgaW4gdHdvIGRpbWVuc2lvbnMuXCIsXG4gICAgXCIxLjQuMTFcIjogXCJUaGUgcGFydHMgb2YgZ3JhcGhpY2FsIG9iamVjdHMgcmVxdWlyZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udGVudCwgYW5kIHRoZSB2aXN1YWwgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gaWRlbnRpZnkgVUkgY29tcG9uZW50cyBhbmQgc3RhdGVzLCBoYXZlIGEgY29udHJhc3QgcmF0aW8gb2YgYXQgbGVhc3QgMzoxIGFnYWluc3QgYWRqYWNlbnQgY29sb3JzLlwiLFxuICAgIFwiMS40LjEyXCI6IFwiTm8gbG9zcyBvZiBjb250ZW50IG9yIGZ1bmN0aW9uYWxpdHkgb2NjdXJzIHdoZW4gdXNlcnMgY2hhbmdlIGxldHRlciwgd29yZCBhbmQgcGFyYWdyYXBoIHNwYWNpbmcsIGFzIHdlbGwgYXMgbGluZSBoZWlnaHQuXCIsXG4gICAgXCIxLjQuMTNcIjogXCJXaGVyZSBob3ZlciBvciBmb2N1cyBhY3Rpb25zIGNhdXNlIGFkZGl0aW9uYWwgY29udGVudCB0byBiZWNvbWUgdmlzaWJsZSBhbmQgaGlkZGVuLCB0aGUgYWRkaXRpb25hbCBjb250ZW50IGlzIGRpc21pc3NhYmxlLCBob3ZlcmFibGUgYW5kIHBlcnNpc3RlbnQuXCIsXG4gICAgXCIyLjEuMVwiOiBcIkFsbCBmdW5jdGlvbmFsaXR5IG9mIHRoZSBjb250ZW50IGlzIG9wZXJhYmxlIHRocm91Z2ggYSBrZXlib2FyZCBpbnRlcmZhY2Ugd2l0aG91dCByZXF1aXJpbmcgc3BlY2lmaWMgdGltaW5ncyBmb3IgaW5kaXZpZHVhbCBrZXlzdHJva2VzLlwiLFxuICAgIFwiMi4xLjJcIjogXCJJZiBrZXlib2FyZCBmb2N1cyBjYW4gYmUgbW92ZWQgdG8gYSBjb21wb25lbnQgdXNpbmcgYSBrZXlib2FyZCBpbnRlcmZhY2UsIHRoZW4gZm9jdXMgY2FuIGJlIG1vdmVkIGF3YXkgZnJvbSB0aGF0IGNvbXBvbmVudCB1c2luZyBvbmx5IGEga2V5Ym9hcmQgaW50ZXJmYWNlLCBhbmQsIGlmIGl0IHJlcXVpcmVzIG1vcmUgdGhhbiB1bm1vZGlmaWVkIGFycm93IG9yIHRhYiBrZXlzIG9yIG90aGVyIHN0YW5kYXJkIGV4aXQgbWV0aG9kcywgdGhlIHVzZXIgaXMgYWR2aXNlZCBvZiB0aGUgbWV0aG9kIGZvciBtb3ZpbmcgZm9jdXMgYXdheS5cIixcbiAgICBcIjIuMS40XCI6IFwiSWYgYSBrZXlib2FyZCBzaG9ydGN1dCBpcyBpbXBsZW1lbnRlZCB1c2luZyBvbmx5IGxldHRlciwgcHVuY3R1YXRpb24sIG51bWJlciBvciBzeW1ib2wgY2hhcmFjdGVycywgdGhlbiB0aGUgc2hvcnRjdXQgY2FuIGJlIHR1cm5lZCBvZmYsIHJlbWFwcGVkIG9yIGFjdGl2YXRlZCBvbmx5IG9uIGZvY3VzLlwiLFxuICAgIFwiMi4yLjFcIjogXCJGb3IgZWFjaCB0aW1lIGxpbWl0IHRoYXQgaXMgc2V0IGJ5IHRoZSBjb250ZW50LCB0aGUgdXNlciBjYW4gdHVybiBvZmYsIGFkanVzdCwgb3IgZXh0ZW5kIHRoZSBsaW1pdC5cIixcbiAgICBcIjIuMi4yXCI6IFwiRm9yIG1vdmluZywgYmxpbmtpbmcsIHNjcm9sbGluZywgb3IgYXV0by11cGRhdGluZyBpbmZvcm1hdGlvbiwgdGhlIHVzZXIgY2FuIHBhdXNlLCBzdG9wLCBoaWRlIG9yIGFkanVzdCB0aGUgaW5mb3JtYXRpb24uXCIsXG4gICAgXCIyLjMuMVwiOiBcIkNvbnRlbnQgZG9lcyBub3QgY29udGFpbiBhbnl0aGluZyB0aGF0IGZsYXNoZXMgbW9yZSB0aGFuIHRocmVlIHRpbWVzIGluIGFueSBvbmUgc2Vjb25kIHBlcmlvZCwgb3IgdGhlIGZsYXNoIGlzIGJlbG93IHRoZSBnZW5lcmFsIGZsYXNoIGFuZCByZWQgZmxhc2ggdGhyZXNob2xkcy5cIixcbiAgICBcIjIuNC4xXCI6IFwiQSBtZWNoYW5pc20gaXMgYXZhaWxhYmxlIHRvIGJ5cGFzcyBibG9ja3Mgb2YgY29udGVudCB0aGF0IGFyZSByZXBlYXRlZCBvbiBtdWx0aXBsZSBXZWIgcGFnZXMuXCIsXG4gICAgXCIyLjQuMlwiOiBcIldlYiBwYWdlcywgbm9uLXdlYiBkb2N1bWVudHMsIGFuZCBzb2Z0d2FyZSBoYXZlIHRpdGxlcyB0aGF0IGRlc2NyaWJlIHRvcGljIG9yIHB1cnBvc2UuXCIsXG4gICAgXCIyLjQuM1wiOiBcIklmIGNvbnRlbnQgY2FuIGJlIG5hdmlnYXRlZCBzZXF1ZW50aWFsbHkgYW5kIHRoZSBuYXZpZ2F0aW9uIHNlcXVlbmNlcyBhZmZlY3QgbWVhbmluZyBvciBvcGVyYXRpb24sIGZvY3VzYWJsZSBjb21wb25lbnRzIHJlY2VpdmUgZm9jdXMgaW4gYW4gb3JkZXIgdGhhdCBwcmVzZXJ2ZXMgbWVhbmluZyBhbmQgb3BlcmFiaWxpdHkuXCIsXG4gICAgXCIyLjQuNFwiOiBcIlRoZSBwdXJwb3NlIG9mIGVhY2ggbGluayBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBsaW5rIHRleHQgYWxvbmUgb3IgZnJvbSB0aGUgbGluayB0ZXh0IHRvZ2V0aGVyIHdpdGggaXRzIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZCBsaW5rIGNvbnRlbnQuXCIsXG4gICAgXCIyLjQuNVwiOiBcIk1vcmUgdGhhbiBvbmUgd2F5IGlzIGF2YWlsYWJsZSB0byBsb2NhdGUgYSBXZWIgcGFnZSB3aXRoaW4gYSBzZXQgb2YgV2ViIHBhZ2VzLCBleGNlcHQgd2hlcmUgdGhlIFdlYiBQYWdlIGlzIHRoZSByZXN1bHQgb2YsIG9yIGEgc3RlcCBpbiwgYSBwcm9jZXNzLlwiLFxuICAgIFwiMi40LjZcIjogXCJIZWFkaW5ncyBhbmQgbGFiZWxzIGRlc2NyaWJlIHRvcGljIG9yIHB1cnBvc2UuXCIsXG4gICAgXCIyLjQuN1wiOiBcIkFueSBrZXlib2FyZCBvcGVyYWJsZSB1c2VyIGludGVyZmFjZSBoYXMgYSBtb2RlIG9mIG9wZXJhdGlvbiB3aGVyZSB0aGUga2V5Ym9hcmQgZm9jdXMgaW5kaWNhdG9yIGlzIHZpc2libGUuXCIsXG4gICAgXCIyLjUuMVwiOiBcIkFsbCBmdW5jdGlvbmFsaXR5IHRoYXQgdXNlcyBtdWx0aXBvaW50IG9yIHBhdGgtYmFzZWQgZ2VzdHVyZXMgZm9yIG9wZXJhdGlvbiBjYW4gYmUgb3BlcmF0ZWQgd2l0aCBhIHNpbmdsZSBwb2ludGVyIHdpdGhvdXQgYSBwYXRoLWJhc2VkIGdlc3R1cmUuXCIsXG4gICAgXCIyLjUuMlwiOiBcIkZvciBmdW5jdGlvbmFsaXR5IHRoYXQgY2FuIGJlIG9wZXJhdGVkIHVzaW5nIGEgc2luZ2xlIHBvaW50ZXIsIGNvbXBsZXRpb24gb2YgdGhlIGZ1bmN0aW9uIGlzIG9uIHRoZSB1cC1ldmVudCB3aXRoIGFuIGFiaWxpdHkgdG8gYWJvcnQsIHVuZG8gb3IgcmV2ZXJzZSB0aGUgb3V0Y29tZS5cIixcbiAgICBcIjIuNS4zXCI6IFwiRm9yIHVzZXIgaW50ZXJmYWNlIGNvbXBvbmVudHMgd2l0aCBsYWJlbHMgdGhhdCBpbmNsdWRlIHRleHQgb3IgaW1hZ2VzIG9mIHRleHQsIHRoZSBhY2Nlc3NpYmxlIG5hbWUgY29udGFpbnMgdGhlIHRleHQgdGhhdCBpcyBwcmVzZW50ZWQgdmlzdWFsbHkuXCIsXG4gICAgXCIyLjUuNFwiOiBcIkZ1bmN0aW9uYWxpdHkgdGhhdCBjYW4gYmUgb3BlcmF0ZWQgYnkgbW90aW9uIGNhbiBhbHNvIGJlIG9wZXJhdGVkIGJ5IHVzZXIgaW50ZXJmYWNlIGNvbXBvbmVudHMsIGFuZCB0aGUgbW90aW9uIHRyaWdnZXIgY2FuIGJlIGRpc2FibGVkLlwiLFxuICAgIFwiMy4xLjFcIjogXCJUaGUgZGVmYXVsdCBodW1hbiBsYW5ndWFnZSBvZiBXZWIgcGFnZXMsIG5vbi1XZWIgZG9jdW1lbnRzLCBvciBzb2Z0d2FyZSBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMy4xLjJcIjogXCJUaGUgaHVtYW4gbGFuZ3VhZ2Ugb2YgZWFjaCBwYXNzYWdlIG9yIHBocmFzZSBpbiB0aGUgY29udGVudCBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMy4yLjFcIjogXCJXaGVuIGFueSBjb21wb25lbnQgcmVjZWl2ZXMgZm9jdXMsIGl0IGRvZXMgbm90IGluaXRpYXRlIGEgY2hhbmdlIG9mIGNvbnRleHQuXCIsXG4gICAgXCIzLjIuMlwiOiBcIkNoYW5naW5nIHRoZSBzZXR0aW5nIG9mIGFueSB1c2VyIGludGVyZmFjZSBjb21wb25lbnQgZG9lcyBub3QgYXV0b21hdGljYWxseSBjYXVzZSBhIGNoYW5nZSBvZiBjb250ZXh0IHVubGVzcyB0aGUgdXNlciBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBiZWhhdmlvciBiZWZvcmUgdXNpbmcgdGhlIGNvbXBvbmVudC5cIixcbiAgICBcIjMuMi4zXCI6IFwiTmF2aWdhdGlvbmFsIG1lY2hhbmlzbXMgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzIHdpdGhpbiBhIHNldCBvZiBXZWIgcGFnZXMgb2NjdXIgaW4gdGhlIHNhbWUgcmVsYXRpdmUgb3JkZXIgZWFjaCB0aW1lIHRoZXkgYXJlIHJlcGVhdGVkLCB1bmxlc3MgYSBjaGFuZ2UgaXMgaW5pdGlhdGVkIGJ5IHRoZSB1c2VyLlwiLFxuICAgIFwiMy4yLjRcIjogXCJDb21wb25lbnRzIHRoYXQgaGF2ZSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IHdpdGhpbiBhIHNldCBvZiBXZWIgcGFnZXMgYXJlIGlkZW50aWZpZWQgY29uc2lzdGVudGx5LlwiLFxuICAgIFwiMy4zLjFcIjogXCJJZiBhbiBpbnB1dCBlcnJvciBpcyBhdXRvbWF0aWNhbGx5IGRldGVjdGVkLCB0aGUgaXRlbSB0aGF0IGlzIGluIGVycm9yIGlzIGlkZW50aWZpZWQgYW5kIHRoZSBlcnJvciBpcyBkZXNjcmliZWQgdG8gdGhlIHVzZXIgaW4gdGV4dC5cIixcbiAgICBcIjMuMy4yXCI6IFwiTGFiZWxzIG9yIGluc3RydWN0aW9ucyBhcmUgcHJvdmlkZWQgd2hlbiBjb250ZW50IHJlcXVpcmVzIHVzZXIgaW5wdXQuXCIsXG4gICAgXCIzLjMuM1wiOiBcIklmIGFuIGlucHV0IGVycm9yIGlzIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgYW5kIHN1Z2dlc3Rpb25zIGZvciBjb3JyZWN0aW9uIGFyZSBrbm93biwgdGhlbiB0aGUgc3VnZ2VzdGlvbnMgYXJlIHByb3ZpZGVkIHRvIHRoZSB1c2VyLCB1bmxlc3MgaXQgd291bGQgamVvcGFyZGl6ZSB0aGUgc2VjdXJpdHkgb3IgcHVycG9zZSBvZiB0aGUgY29udGVudC5cIixcbiAgICBcIjMuMy40XCI6IFwiRm9yIGNvbnRlbnQgdGhhdCBjYXVzZSBsZWdhbCBjb21taXRtZW50cyBvciBmaW5hbmNpYWwgdHJhbnNhY3Rpb25zIGZvciB0aGUgdXNlciB0byBvY2N1ciwgdGhhdCBtb2RpZnkgb3IgZGVsZXRlIHVzZXItY29udHJvbGxhYmxlIGRhdGEgaW4gZGF0YSBzdG9yYWdlIHN5c3RlbXMsIG9yIHRoYXQgc3VibWl0IHVzZXIgdGVzdCByZXNwb25zZXMsIHRoZSB1c2VyIGNhbiByZXZlcnNlLCBjb3JyZWN0LCBvciBjb25maXJtIHRoZSBhY3Rpb24uXCIsXG4gICAgXCI0LjEuMVwiOiBcIkluIGNvbnRlbnQgaW1wbGVtZW50ZWQgdXNpbmcgbWFya3VwIGxhbmd1YWdlcywgZWxlbWVudHMgaGF2ZSBjb21wbGV0ZSBzdGFydCBhbmQgZW5kIHRhZ3MsIGVsZW1lbnRzIGFyZSBuZXN0ZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHNwZWNpZmljYXRpb25zLCBlbGVtZW50cyBkbyBub3QgY29udGFpbiBkdXBsaWNhdGUgYXR0cmlidXRlcywgYW5kIGFueSBJRHMgYXJlIHVuaXF1ZSwgZXhjZXB0IHdoZXJlIHRoZSBzcGVjaWZpY2F0aW9ucyBhbGxvdyB0aGVzZSBmZWF0dXJlcy5cIixcbiAgICBcIjQuMS4yXCI6IFwiRm9yIGFsbCB1c2VyIGludGVyZmFjZSBjb21wb25lbnRzIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZm9ybSBlbGVtZW50cywgbGlua3MgYW5kIGNvbXBvbmVudHMgZ2VuZXJhdGVkIGJ5IHNjcmlwdHMpLCB0aGUgbmFtZSBhbmQgcm9sZSBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkOyBzdGF0ZXMsIHByb3BlcnRpZXMsIGFuZCB2YWx1ZXMgdGhhdCBjYW4gYmUgc2V0IGJ5IHRoZSB1c2VyIGNhbiBiZSBwcm9ncmFtbWF0aWNhbGx5IHNldDsgYW5kIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2VzIHRvIHRoZXNlIGl0ZW1zIGlzIGF2YWlsYWJsZSB0byB1c2VyIGFnZW50cywgaW5jbHVkaW5nIGFzc2lzdGl2ZSB0ZWNobm9sb2dpZXMuXCIsXG4gICAgXCI0LjEuM1wiOiBcIkluIGNvbnRlbnQgaW1wbGVtZW50ZWQgdXNpbmcgbWFya3VwIGxhbmd1YWdlcywgc3RhdHVzIG1lc3NhZ2VzIGNhbiBiZSBwcm9ncmFtbWF0aWNhbGx5IGRldGVybWluZWQgdGhyb3VnaCByb2xlIG9yIHByb3BlcnRpZXMgc3VjaCB0aGF0IHRoZXkgY2FuIGJlIHByZXNlbnRlZCB0byB0aGUgdXNlciBieSBhc3Npc3RpdmUgdGVjaG5vbG9naWVzIHdpdGhvdXQgcmVjZWl2aW5nIGZvY3VzLlwiLFxufVxuXG5leHBvcnQgbGV0IGExMXlSdWxlc2V0czogUnVsZXNldFtdID0gW1xuICAgIC8vIHtcbiAgICAvLyAgICAgaWQ6IFwiREVCVUdcIixcbiAgICAvLyAgICAgbmFtZTogXCJERUJVRyBSdWxlc1wiLFxuICAgIC8vICAgICBjYXRlZ29yeTogZVJ1bGVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgIC8vICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgZGVidWdnaW5nXCIsXG4gICAgLy8gICAgIGNoZWNrcG9pbnRzOiBbe1xuICAgIC8vICAgICAgICAgbnVtOiBcIjFcIixcbiAgICAvLyAgICAgICAgIG5hbWU6IFwiRGVidWcgQ1AgMVwiLFxuICAgIC8vICAgICAgICAgd2NhZ0xldmVsOiBcIkFcIixcbiAgICAvLyAgICAgICAgIHN1bW1hcnk6IFwiUnVsZXMgZm9yIERlYnVnXCJcbiAgICAvLyAgICAgfV1cbiAgICAvLyB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiRVhURU5TSU9OU1wiLFxuICAgICAgICBuYW1lOiBcIkV4dGVuc2lvbiBSdWxlc1wiLFxuICAgICAgICBjYXRlZ29yeTogZVJ1bGVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgZW5hYmxpbmcgdGhlIGJyb3dzZXIgZXh0ZW5zaW9uc1wiLFxuICAgICAgICB0eXBlOiBlUnVsZXNldFR5cGUuRVhURU5TSU9OLFxuICAgICAgICBjaGVja3BvaW50czogW3tcbiAgICAgICAgICAgIG51bTogXCIxXCIsXG4gICAgICAgICAgICBuYW1lOiBcIkV4dGVuc2lvbiBDUCAxXCIsXG4gICAgICAgICAgICB3Y2FnTGV2ZWw6IFwiQVwiLFxuICAgICAgICAgICAgc3VtbWFyeTogXCJSdWxlcyBmb3IgRXh0ZW5zaW9uXCJcbiAgICAgICAgfV1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiSUJNX0FjY2Vzc2liaWxpdHlcIixcbiAgICAgICAgbmFtZTogXCJJQk0gQWNjZXNzaWJpbGl0eVwiLFxuICAgICAgICBjYXRlZ29yeTogZVJ1bGVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjEgQUEgcGx1cyBhZGRpdGlvbmFsIElCTSBjaGVja2xpc3Qgc3VwcGxlbWVudGFsIHJlcXVpcmVtZW50cy5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGFuZCAyLjEgY2hlY2twb2ludHMgdGhhdCBhcmUgQSBvciBBQVxuICAgICAgICBjaGVja3BvaW50czogU0NzXG4gICAgICAgICAgICAuZmlsdGVyKHNjID0+IChzYy5sZXZlbCA9PT0gXCJBXCIgfHwgc2MubGV2ZWwgPT09IFwiQUFcIikgJiYgKHNjLndjYWdUeXBlID09PSBcIjIuMFwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMVwiKSlcbiAgICAgICAgICAgIC5tYXAoc2MgPT4gKHtcbiAgICAgICAgICAgICAgICBudW06IHNjLm51bSxcbiAgICAgICAgICAgICAgICBzY0lkOiBzYy5zY0lkLFxuICAgICAgICAgICAgICAgIG5hbWU6IHNjLmhhbmRsZSxcbiAgICAgICAgICAgICAgICB3Y2FnTGV2ZWw6IHNjLmxldmVsLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHN1bW1hcmllc1tzYy5udW1dXG4gICAgICAgICAgICB9KSlcbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiV0NBR18yXzFcIixcbiAgICAgICAgbmFtZTogXCJXQ0FHIDIuMSAoQSwgQUEpXCIsXG4gICAgICAgIGNhdGVnb3J5OiBlUnVsZUNhdGVnb3J5LkFDQ0VTU0lCSUxJVFksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlJ1bGVzIGZvciBXQ0FHIDIuMSBBQS4gVGhpcyBpcyB0aGUgY3VycmVudCBXM0MgcmVjb21tZW5kYXRpb24uIENvbnRlbnQgdGhhdCBjb25mb3JtcyB0byBXQ0FHIDIuMSBhbHNvIGNvbmZvcm1zIHRvIFdDQUcgMi4wLlwiLFxuICAgICAgICAvLyBUaGlzIHJ1bGVzZXQgaGFzIGFsbCAyLjAgYW5kIDIuMSBjaGVja3BvaW50cyB0aGF0IGFyZSBBIG9yIEFBXG4gICAgICAgIGNoZWNrcG9pbnRzOiBTQ3NcbiAgICAgICAgICAgIC5maWx0ZXIoc2MgPT4gKHNjLmxldmVsID09PSBcIkFcIiB8fCBzYy5sZXZlbCA9PT0gXCJBQVwiKSAmJiAoc2Mud2NhZ1R5cGUgPT09IFwiMi4wXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4xXCIpKVxuICAgICAgICAgICAgLm1hcChzYyA9PiAoe1xuICAgICAgICAgICAgICAgIG51bTogc2MubnVtLFxuICAgICAgICAgICAgICAgIHNjSWQ6IHNjLnNjSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogc2MuaGFuZGxlLFxuICAgICAgICAgICAgICAgIHdjYWdMZXZlbDogc2MubGV2ZWwsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogc3VtbWFyaWVzW3NjLm51bV1cbiAgICAgICAgICAgIH0pKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZDogXCJXQ0FHXzJfMFwiLFxuICAgICAgICBuYW1lOiBcIldDQUcgMi4wIChBLCBBQSlcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVSdWxlQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIFdDQUcgMi4wIEFBLiBSZWZlcmVuY2VkIGJ5IFVTIFNlY3Rpb24gNTA4LCBidXQgbm90IHRoZSBsYXRlc3QgVzNDIHJlY29tbWVuZGF0aW9uLlwiLFxuICAgICAgICAvLyBUaGlzIHJ1bGVzZXQgaGFzIGFsbCAyLjAgY2hlY2twb2ludHMgdGhhdCBhcmUgQSBvciBBQVxuICAgICAgICBjaGVja3BvaW50czogU0NzXG4gICAgICAgICAgICAuZmlsdGVyKHNjID0+IChzYy5sZXZlbCA9PT0gXCJBXCIgfHwgc2MubGV2ZWwgPT09IFwiQUFcIikgJiYgKHNjLndjYWdUeXBlID09PSBcIjIuMFwiKSlcbiAgICAgICAgICAgIC5tYXAoc2MgPT4gKHtcbiAgICAgICAgICAgICAgICBudW06IHNjLm51bSxcbiAgICAgICAgICAgICAgICBzY0lkOiBzYy5zY0lkLFxuICAgICAgICAgICAgICAgIG5hbWU6IHNjLmhhbmRsZSxcbiAgICAgICAgICAgICAgICB3Y2FnTGV2ZWw6IHNjLmxldmVsLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHN1bW1hcmllc1tzYy5udW1dXG4gICAgICAgICAgICB9KSlcbiAgICB9XG5dXG5cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgZ2V0Q2FjaGUsIHNldENhY2hlIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5cbnR5cGUgUHNldWRvQ2xhc3MgPSBcIjpob3ZlclwiIHwgXCI6YWN0aXZlXCIgfCBcIjpmb2N1c1wiIHwgXCI6Zm9jdXMtdmlzaWJsZVwiIHwgXCI6Zm9jdXMtd2l0aGluXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3Rvck1hdGNoZXNFbGVtKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHNlbGVjdG9yLnRyaW0oKSA9PT0gXCJcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQubWF0Y2hlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQubWF0Y2hlcyhzZWxlY3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQubWF0Y2hlc1NlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5tYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTmF0aXZlIGZ1bmN0aW9ucyBub3QgdGhlcmUsIGZhbGxiYWNrXG4gICAgICAgIGxldCBtYXRjaGVzID0gKGVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudC5vd25lckRvY3VtZW50KS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICAgICAgbGV0IGkgPSAwO1xuXG4gICAgICAgIHdoaWxlIChpIDwgbWF0Y2hlcy5sZW5ndGggJiYgbWF0Y2hlc1tpXSAhPT0gZWxlbWVudCkge1xuICAgICAgICAgICAgKytpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGkgPCBtYXRjaGVzLmxlbmd0aDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gQmFkIHNlbGVjdG9yPyBEb2Vzbid0IG1hdGNoIHRoZW4uLi5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzdHlsZSBjb21wdXRlZCBmb3IgdGhpcyBlbGVtZW50XG4gKiBAcGFyYW0gZWxlbSBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXB1dGVkU3R5bGUoZWxlbTogSFRNTEVsZW1lbnQsIHBzZXVkb0VsdD86IFBzZXVkb0NsYXNzKSB7XG4gICAgY29uc3QgZG9jID0gZWxlbS5vd25lckRvY3VtZW50O1xuICAgIGNvbnN0IHdpbiA9IGRvYy5kZWZhdWx0VmlldztcbiAgICByZXR1cm4gd2luLmdldENvbXB1dGVkU3R5bGUoZWxlbSwgcHNldWRvRWx0KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzdHlsZSBkZWZpbmVkIGZvciB0aGlzIGVsZW1lbnRcbiAqIFxuICogVGhpcyBkaWZmZXJzIGZyb20gdGhlIGNvbXB1dGVkIHN0eWxlIGluIHRoYXQgdGhlIGNvbXB1dGVkIHN0eWxlIHdpbGwgcmV0dXJuXG4gKiBzdHlsZXMgZGVmaW5lZCBieSB0aGUgdXNlciBhZ2VudC4gVGhpcyB3aWxsIG9ubHkgcmV0dXJuIHN0eWxlcyBkZWZpbmVkIGJ5IHRoZVxuICogYXBwbGljYXRpb25cbiAqIGlmIHJvdGF0aW9uIHRyYW5zZm9ybSBpcyB1c2VkLCB0aGUgY29tcHV0ZWQgc3R5bGUgcmV0dXJucyB0aGUgcmVzb2x2ZWQgbWF0cml4XG4gKiAgd2hpbGUgdGhlIGRlZmluZWQgc3R5bGUgcmV0dXJuIHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb24ocykgXG4gKiBmb3IgZXhhbXBsZSwgZm9yICd0cmFuc2Zvcm06IHJvdGF0ZSgyLjVkZWcpOycsIHRoZSBjb21wdXRlZCBzdHlsZSByZXR1cm5zICdtYXRyaXgoLTAuMDQzNjE5NCwgMC45OTkwNDgsIC0wLjk5OTA0OCwgLTAuMDQzNjE5NCwgMCwgMCknIFxuICogIGFuZCB0aGUgZGVmaW5lZCBzdHlsZSByZXR1cm5zICdyb3RhdGUoMi41ZGVnKScgIFxuICogXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtIFxuICogQHBhcmFtIHtzdHJpbmd9IFtwc2V1ZG9DbGFzc10gSWYgc3BlY2lmaWVkLCB3aWxsIHJldHVybiB2YWx1ZXMgdGhhdCBhcmUgZGlmZmVyZW50XG4gKiB0aGFuIHdoZW4gdGhlIHBzZXVkb0NsYXNzIGRvZXMgbm90IG1hdGNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmaW5lZFN0eWxlcyhlbGVtOiBIVE1MRWxlbWVudCwgcHNldWRvQ2xhc3M/OiBQc2V1ZG9DbGFzcykge1xuICAgIC8vIGNvbnNvbGUubG9nKFwiRnVuY3Rpb246IGdldERlZmluZWRTdHlsZXNcIik7XG4gICAgbGV0IGRlZmluZWRTdHlsZXMgPSB7fTtcbiAgICBsZXQgZGVmaW5lZFN0eWxlUHNldWRvID0ge307XG4gICAgXG4gICAgZnVuY3Rpb24gZmlsbFN0eWxlKG1hcHMsIHN0eWxlKSB7XG4gICAgICAgIGZvciAobGV0IHNJbmRleD0wOyBzSW5kZXggPCBzdHlsZS5sZW5ndGg7ICsrc0luZGV4KSB7XG4gICAgICAgICAgICBpZiAoc3R5bGVbc0luZGV4XSA9PT0gXCJhbGxcIiAmJiBzdHlsZVtzdHlsZVtzSW5kZXhdXSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbWFwIG9mIG1hcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbWFwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgbWFwW2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHN0eWxlW3NJbmRleF07XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXAgb2YgbWFwcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJpb3JpdHkgPSBzdHlsZS5nZXRQcm9wZXJ0eVByaW9yaXR5KGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgaW4gbWFwICYmIG1hcFtrZXldLmVuZHNXaXRoKFwiIWltcG9ydGFudFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmlvcml0eSA9PT0gJ2ltcG9ydGFudCcgJiYgIW1hcFtrZXldLnN0YXJ0c1dpdGgoXCJpbmhlcml0XCIpICYmICFtYXBba2V5XS5zdGFydHNXaXRoKFwidW5zZXRcIikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9vdmVycmlkZSAhaW1wb3J0YW50IG9ubHkgaWYgaXQgaXMgYWxzbyAhaW1wb3J0YW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwW2tleV0gPSBzdHlsZVtrZXldICsgXCIgIWltcG9ydGFudFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kb24ndCBvdmVycmlkZSAhaW1wb3J0YW50IGlmIGl0IGlzIG5vdCAhaW1wb3J0YW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jcmVhdGUvb3ZlcmlkZSBhbnl3YXlcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcFtrZXldID0gc3R5bGVba2V5XSArIChwcmlvcml0eSA9PT0gJ2ltcG9ydGFudCcgPyBcIiAhaW1wb3J0YW50XCIgOiBcIlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IFxuXG4gICAgbGV0IHN0b3JlZFN0eWxlcyA9IGdldENhY2hlKGVsZW0sIFwiUlBUVXRpbF9EZWZpbmVkU3R5bGVzXCIsIG51bGwpO1xuICAgIGlmICghcHNldWRvQ2xhc3MgJiYgc3RvcmVkU3R5bGVzICE9PSBudWxsKSAge1xuICAgICAgICBkZWZpbmVkU3R5bGVzID0gc3RvcmVkU3R5bGVzW1wiZGVmaW5lZFN0eWxlc1wiXTtcbiAgICAgICAgZGVmaW5lZFN0eWxlUHNldWRvID0gc3RvcmVkU3R5bGVzW1wiZGVmaW5lZFN0eWxlUHNldWRvXCJdO1xuICAgIH0gZWxzZSB7ICBcbiAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgc3R5bGVzaGVldHMgYW5kIHJ1bGVzXG4gICAgICAgIGZvciAobGV0IHNzSW5kZXggPSAwOyBzc0luZGV4IDwgZWxlbS5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgKytzc0luZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBzaGVldCA9IGVsZW0ub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQuY3NzUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJHb3Qgc2hlZXRcIik7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IHNoZWV0LmNzc1J1bGVzLmxlbmd0aDsgKytySW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiR290IHJ1bGU6IFwiLCBzaGVldC5jc3NSdWxlc1tySW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bGUgPSBzaGVldC5jc3NSdWxlc1tySW5kZXhdIGFzIENTU1N0eWxlUnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxSdWxlU2VsZWN0b3IgPSBydWxlLnNlbGVjdG9yVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdWxsUnVsZVNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHNldWRvTWF0Y2ggPSBmdWxsUnVsZVNlbGVjdG9yLm1hdGNoKC9eKC4qKSg6W2EtekEtWi1dKikkLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzUHNldWRvQ2xhc3MgPSAhIXBzZXVkb01hdGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxNYWluID0gaGFzUHNldWRvQ2xhc3MgPyBwc2V1ZG9NYXRjaFsxXSA6IGZ1bGxSdWxlU2VsZWN0b3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsUHNldWRvID0gaGFzUHNldWRvQ2xhc3MgPyBwc2V1ZG9NYXRjaFsyXSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2FtZVBzZXVkb0NsYXNzID0gc2VsUHNldWRvID09PSBwc2V1ZG9DbGFzcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHNldWRvQ2xhc3MgJiYgcHNldWRvQ2xhc3MgPT09IFwiOmZvY3VzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBlbGVtZW50IGhhcyBmb2N1cywgcmVtb3ZlIGZvY3VzLXdpdGhpbiBmcm9tIHBhcmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsTWFpbiA9IHNlbE1haW4ucmVwbGFjZSgvKFsgPl1bXit+ID5dKyk6Zm9jdXMtd2l0aGluL2csIFwiJDFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHN0eWxlcyBvZiBub24tcHNldWRvIHNlbGVjdG9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzUHNldWRvQ2xhc3MgJiYgc2VsZWN0b3JNYXRjaGVzRWxlbShlbGVtLCBzZWxNYWluKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsU3R5bGUoW2RlZmluZWRTdHlsZXMsIGRlZmluZWRTdHlsZVBzZXVkb10sIHJ1bGUuc3R5bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYW1lUHNldWRvQ2xhc3MgJiYgc2VsZWN0b3JNYXRjaGVzRWxlbShlbGVtLCBzZWxNYWluKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsU3R5bGUoW2RlZmluZWRTdHlsZVBzZXVkb10sIHJ1bGUuc3R5bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVyci50b1N0cmluZygpLmluY2x1ZGVzKFwiQ2Fubm90IGFjY2VzcyBydWxlc1wiKSAmJiAhZXJyLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJTZWN1cml0eUVycm9yOlwiKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vXG5cbiAgICAgICAgLy8gSGFuZGxlZCB0aGUgc3R5bGVzaGVldHMsIG5vdyBoYW5kbGUgdGhlIGVsZW1lbnQgZGVmaW5lZCBzdHlsZXNcbiAgICAgICAgZmlsbFN0eWxlKFtkZWZpbmVkU3R5bGVzLCBkZWZpbmVkU3R5bGVQc2V1ZG9dLCBlbGVtLnN0eWxlKTtcbiAgICAgICAgc2V0Q2FjaGUoZWxlbSwgXCJSUFRVdGlsX0RlZmluZWRTdHlsZXNcIiwge2RlZmluZWRTdHlsZXMsIGRlZmluZWRTdHlsZVBzZXVkb30pO1xuICAgIH0gICAgXG4gICAgLyoqXG4gICAgICogJ2luaXRpYWwnIHNldHMgdGhlIHN0eWxlIGJhY2sgdG8gZGVmYXVsdFxuICAgIGZvciAoY29uc3Qga2V5IGluIGRlZmluZWRTdHlsZXMpIHtcbiAgICAgICAgaWYgKGRlZmluZWRTdHlsZXNba2V5XSA9PT0gXCJpbml0aWFsXCIpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBkZWZpbmVkU3R5bGVzW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGVmaW5lZFN0eWxlUHNldWRvKSB7XG4gICAgICAgIGlmIChkZWZpbmVkU3R5bGVQc2V1ZG9ba2V5XSA9PT0gXCJpbml0aWFsXCIpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBkZWZpbmVkU3R5bGVQc2V1ZG9ba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAqL1xuICAgICAgICBcbiAgICBpZiAoIXBzZXVkb0NsYXNzKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW0RFQlVHOiBDU1NVdGlsOjpnZXREZWZpbmVkU3R5bGVzXVwiLCBlbGVtLm5vZGVOYW1lLCBwc2V1ZG9DbGFzcywgSlNPTi5zdHJpbmdpZnkoZGVmaW5lZFN0eWxlcywgbnVsbCwgMikpO1xuICAgICAgICByZXR1cm4gZGVmaW5lZFN0eWxlcztcbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkZWZpbmVkU3R5bGVQc2V1ZG8pIHtcbiAgICAgICAgICAgIGlmIChkZWZpbmVkU3R5bGVQc2V1ZG9ba2V5XSA9PT0gZGVmaW5lZFN0eWxlc1trZXldKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGRlZmluZWRTdHlsZVBzZXVkb1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW0RFQlVHOiBDU1NVdGlsOjpnZXREZWZpbmVkU3R5bGVzXVwiLCBlbGVtLm5vZGVOYW1lLCBwc2V1ZG9DbGFzcywgSlNPTi5zdHJpbmdpZnkoZGVmaW5lZFN0eWxlUHNldWRvLCBudWxsLCAyKSk7XG4gICAgICAgIHJldHVybiBkZWZpbmVkU3R5bGVQc2V1ZG87XG4gICAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG1lZGlhIHF1ZXJ5IGRlZmluZWQgZm9yIHRoZSBkb2N1bWVudFxuICogXG4gKiBcbiAqIEBwYXJhbSB7RG9jdW1lbnR9IGRvYyBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1lZGlhT3JpZW50YXRpb25UcmFuc2Zvcm0oZG9jOiBEb2N1bWVudCkge1xuICAgIGxldCBvcmllbnRhdGlvblRyYW5zZm9ybXMgPSB7fVxuICAgIFxuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgb2YgdGhlIHN0eWxlc2hlZXRzIGFuZCBydWxlc1xuICAgIGZvciAobGV0IHNzSW5kZXggPSAwOyBzc0luZGV4IDwgZG9jLnN0eWxlU2hlZXRzLmxlbmd0aDsgKytzc0luZGV4KSB7XG4gICAgICAgIGNvbnN0IHNoZWV0ID0gZG9jLnN0eWxlU2hlZXRzW3NzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQuY3NzUnVsZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBySW5kZXggPCBzaGVldC5jc3NSdWxlcy5sZW5ndGg7ICsrckluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoZWV0UnVsZSA9IHNoZWV0LmNzc1J1bGVzW3JJbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGlmICg0IC8qIENTU1J1bGUuTUVESUFfUlVMRSAqLyA9PT0gc2hlZXRSdWxlLk1FRElBX1JVTEUpIHsgXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBydWxlID0gc2hlZXRSdWxlIGFzIENTU01lZGlhUnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlICYmIHJ1bGUubWVkaWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYUxpc3QgPSBydWxlLm1lZGlhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVkaWFMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbGVtX3RyYW5zZm9ybXMgPSBvcmllbnRhdGlvblRyYW5zZm9ybXNbbWVkaWFMaXN0Lml0ZW0oaSkudG9Mb2NhbGVMb3dlckNhc2UoKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZWxlbV90cmFuc2Zvcm1zKSBlbGVtX3RyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZXMgPSBydWxlLmNzc1J1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0eWxlUnVsZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxIC8qIENTU1J1bGUuU1RZTEVfUlVMRSAqLyA9PT0gc3R5bGVSdWxlc1tpXS5TVFlMRV9SVUxFKSB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlUnVsZSA9IHN0eWxlUnVsZXNbaV0gYXMgQ1NTU3R5bGVSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gc3R5bGVSdWxlLnNlbGVjdG9yVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0gc3R5bGVSdWxlLnN0eWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzPTA7IHMgPCBzdHlsZXMubGVuZ3RoOyArK3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHN0eWxlc1tzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJ0cmFuc2Zvcm1cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IFwiYWxsXCIgJiYgc3R5bGVzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRyYW5zZm9ybXNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3Jtc1trZXldID0gc3R5bGVzW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1fdHJhbnNmb3Jtc1tzZWxlY3Rvcl0gPSB0cmFuc2Zvcm1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvblRyYW5zZm9ybXNbbWVkaWFMaXN0Lml0ZW0oaSkudG9Mb2NhbGVMb3dlckNhc2UoKV0gPSBlbGVtX3RyYW5zZm9ybXM7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKCFlcnIudG9TdHJpbmcoKS5pbmNsdWRlcyhcIkNhbm5vdCBhY2Nlc3MgcnVsZXNcIikgJiYgIWVyci50b1N0cmluZygpLmluY2x1ZGVzKFwiU2VjdXJpdHlFcnJvcjpcIikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9yaWVudGF0aW9uVHJhbnNmb3Jtcztcbn1cblxuLyoqXG4gKiBjb252ZXJ0IGdpdmVuIHJvdGF0aW9uIHRyYW5zZm9ybSBmdW5jdGlvbnMgdG8gdGhlIGRlZ3JlZSB0cmFuc2Zvcm1lZC4gXG4gKiBJZiBtdWx0aXBsZSBmdW5jdGlvbnMgYXJlIGdpdmVuLCB0aGVuIHRoZSBmdW5jdGlvbnMgYXJlIGFwcGxpZWQgbGluZWFybHkgaW4gdGhlIG9yZGVyLiBcbiAqICAgcm90YXRpb25fdHJhbnNmb3JtIGZ1bmN0aW9uIGV4YW1wbGU6ICByb3RhdGUoNDVkZWcpLCByb3RhdGUoMnR1cm4pLCByb3RhdGUoMnJhZCksIHJvdGF0ZTNkKDEsIDEsIDEsIDQ1ZGVnKSxcbiAqICAgICAgICByb3RhdGUoMnJhZCkgcm90YXRlM2QoMSwgMSwgMSwgNDVkZWcpXG4gKiBAcGFyYW0gcm90YXRpb25fdHJhbnNmb3JtIFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um90YXRpb25EZWdyZWUocm90YXRpb25fdHJhbnNmb3JtKSB7XG4gICAgbGV0IGRlZ3JlZSA9IDA7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKCFyb3RhdGlvbl90cmFuc2Zvcm0pIHJldHVybiBkZWdyZWU7XG4gICAgICAgIC8vIG5vcm1hbGl6ZSB0aGUgcm90YXRpb25fdHJhbnNmb3JtXG4gICAgICAgIHJvdGF0aW9uX3RyYW5zZm9ybSA9IHJvdGF0aW9uX3RyYW5zZm9ybS5yZXBsYWNlQWxsKFwiLCBcIiwgXCIsXCIpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1fZnVuY3Rpb25zID0gcm90YXRpb25fdHJhbnNmb3JtLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9MDsgaSA8IHRyYW5zZm9ybV9mdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybV9mdW5jdGlvbiA9IHRyYW5zZm9ybV9mdW5jdGlvbnNbaV0udHJpbSgpO1xuICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbiA9PT0gJycpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwicm90YXRlM2RcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBleGFtcGxlOiByb3RhdGUzZCgxLCAxLCAxLCA0NWRlZyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVmdCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKFwiKTtcbiAgICAgICAgICAgICAgICBjb25zdCByaWdodCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKVwiKTtcbiAgICAgICAgICAgICAgICBpZiAobGVmdCAhPT0gLTEgJiYgcmlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXRyaXggPSB0cmFuc2Zvcm1fZnVuY3Rpb24uc3Vic3RyaW5nKGxlZnQrMSwgcmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF0cml4KSB2YWx1ZXMgPSBtYXRyaXguc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzICYmIHZhbHVlcy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3RhdGlvbiA9IHZhbHVlc1szXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcm90YXRpb24pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb24gPSByb3RhdGlvbi50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm90YXRpb24uZW5kc1dpdGgoXCJ0dXJuXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZygwLCByb3RhdGlvbi5sZW5ndGggLSA0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSBkZWdyZWUgPSBudW0gKiAzNjA7IFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcInJhZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoMCwgcm90YXRpb24ubGVuZ3RoIC0gMyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlID0gbnVtICogMTgwL01hdGguUEk7IFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcImRlZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoMCwgcm90YXRpb24ubGVuZ3RoIC0gMyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlICs9IG51bTsgXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFuc2Zvcm1fZnVuY3Rpb24uc3RhcnRzV2l0aChcInJvdGF0ZVwiKSB8fCB0cmFuc2Zvcm1fZnVuY3Rpb24uc3RhcnRzV2l0aChcInJvdGF0ZVpcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBleGFtcGxlOiByb3RhdGUoNDVkZWcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIihcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmlnaHQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIilcIik7XG4gICAgICAgICAgICAgICAgaWYgKGxlZnQgIT09IC0xICYmIHJpZ2h0ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm90YXRpb24gPSB0cmFuc2Zvcm1fZnVuY3Rpb24uc3Vic3RyaW5nKGxlZnQrMSwgcmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJvdGF0aW9uKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgcm90YXRpb24gPSByb3RhdGlvbi50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcInR1cm5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoMCwgcm90YXRpb24ubGVuZ3RoIC0gNCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGRlZ3JlZSA9IG51bSAqIDM2MDsgXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocm90YXRpb24uZW5kc1dpdGgoXCJyYWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoMCwgcm90YXRpb24ubGVuZ3RoIC0gMyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGRlZ3JlZSA9IG51bSAqIDE4MC9NYXRoLlBJOyBcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcImRlZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZygwLCByb3RhdGlvbi5sZW5ndGggLSAzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IHBhcnNlRmxvYXQobnVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlICs9IG51bTsgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwibWF0cml4M2RcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIHRocmVlIEV1bGVyIGFuZ2xlc1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIihcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmlnaHQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIilcIik7XG4gICAgICAgICAgICAgICAgaWYgKGxlZnQgIT09IC0xICYmIHJpZ2h0ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF0cml4ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLnN1YnN0cmluZyhsZWZ0KzEsIHJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRyaXgpIHZhbHVlcyA9IG1hdHJpeC5zcGxpdChcIixcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHpfYW5nbGUgPSBNYXRoLmF0YW4yKHZhbHVlc1s0XSwgdmFsdWVzWzVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JlZSArPSBNYXRoLnJvdW5kKE1hdGgucm91bmQoel9hbmdsZSAqIDE4MC9NYXRoLlBJKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhbnNmb3JtX2Z1bmN0aW9uLnN0YXJ0c1dpdGgoXCJtYXRyaXhcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIHRocmVlIEV1bGVyIGFuZ2xlc1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIihcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmlnaHQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIilcIik7XG4gICAgICAgICAgICAgICAgaWYgKGxlZnQgIT09IC0xICYmIHJpZ2h0ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF0cml4ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLnN1YnN0cmluZyhsZWZ0KzEsIHJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRyaXgpIHZhbHVlcyA9IG1hdHJpeC5zcGxpdChcIixcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHpfYW5nbGUgPSBNYXRoLmF0YW4yKHZhbHVlc1sxXSwgdmFsdWVzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZ3JlZSArPSBNYXRoLnJvdW5kKE1hdGgucm91bmQoel9hbmdsZSAqIDE4MC9NYXRoLlBJKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB3aGlsZSAoZGVncmVlID49IDM2MCkgZGVncmVlIC09IDM2MDtcbiAgICAgICAgXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiQ2Fubm90IHJldHJpZXZlIHJvdGF0aW9uIGRlZ3JlZTogXCIgKyBlcnIpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfSBcbiAgICByZXR1cm4gZGVncmVlOyBcbn1cblxuLyoqXG4gKiBDb252ZXJ0IENTUyBzdHlsZSBzdHJpbmcgdmFsdWVzIHRvIHBpeGVscy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgc3R5bGUgdmFsdWUgaW4gc3RyaW5nLCBzdWNoIGFzIDNyZW0sIDIzMHB4IGV0Yy5cbiAqIEBwYXJhbSB0YXJnZXQgZWxlbWVudC5cbiAqIEByZXR1cm4gdmFsdWUgaW4gcGl4ZWxzXG4gKi9cbiBleHBvcnQgZnVuY3Rpb24gZ2V0UGl4ZWxzRnJvbVN0eWxlKHZhbHVlLCBlbGVtICkge1xuICAgIGlmICghdmFsdWUpIHJldHVybiAwO1xuICAgIGNvbnN0IHJlZ2V4ID0gLygtP1tcXGQuXSspKFthLXolXSopLztcbiAgICBsZXQgcGFyc2VkID0gdmFsdWUudHJpbSgpLm1hdGNoKHJlZ2V4KTtcbiAgICBpZiAocGFyc2VkWzJdID09PSAnJyB8fCBwYXJzZWRbMV0gPT09IDApIFxuICAgICAgIC8vbm8gemVybyB2YWx1ZSB3aXRob3V0IHVuaXQgd2hpY2ggaXMgY29uc2lkZXJlZCBhcyBlcnJvciwgc28gaW1wbGljYWJsZVxuICAgICAgIHJldHVybiAwO1xuICAgIFxuICAgIGNvbnN0IHBpeGVscyA9IGNvbnZlcnRWYWx1ZTJQaXhlbHMocGFyc2VkWzJdLCBwYXJzZWRbMV0sIGVsZW0pO1xuICAgIHJldHVybiBwaXhlbHMgPT09IG51bGwgPyBwaXhlbHMgOiBwYXJzZUZsb2F0KHBpeGVscyk7XG59XG5cbi8qKlxuICogQ29udmVydCBhYnNvbHV0ZSBDU1MgbnVtZXJpY2FsIHZhbHVlcyB0byBwaXhlbHMuXG4gKlxuICogQHBhcmFtIHVuaXRWYWx1ZSBpbiBzdHJpbmdcbiAqIEBwYXJhbSB0YXJnZXQgZWxlbWVudC5cbiAqIEByZXR1cm4gdmFsdWUgaW4gcGl4ZWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VmFsdWUyUGl4ZWxzKHVuaXQsIHVuaXRWYWx1ZSwgZWxlbSApIHtcbiAgICBpZiAodW5pdFZhbHVlID09IDApIHJldHVybiAwO1xuICAgIGNvbnN0IHN1cHBvcnRlZFVuaXRzID0ge1xuICAgICAgICAvLyBhYnNvbHV0ZSB1bml0XG4gICAgICAgICdweCc6IHZhbHVlID0+IHZhbHVlLFxuICAgICAgICAnY20nOiB2YWx1ZSA9PiB2YWx1ZSAqIDM3LjgsXG4gICAgICAgICdtbSc6IHZhbHVlID0+IHZhbHVlICogMy43OCxcbiAgICAgICAgJ3EnOiB2YWx1ZSA9PiB2YWx1ZSAqIDAuOTUsXG4gICAgICAgICdpbic6IHZhbHVlID0+IHZhbHVlICogOTYsXG4gICAgICAgICdwYyc6IHZhbHVlID0+IHZhbHVlICogMTYsXG4gICAgICAgICdwdCc6IHZhbHVlID0+IHZhbHVlICogMS4zMyxcbiAgICAgICAgXG4gICAgICAgIC8vIHJlbGF0aXZlIHVuaXRcbiAgICAgICAgJ3JlbSc6IHZhbHVlID0+IHZhbHVlICogcGFyc2VGbG9hdCggZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCdmb250LXNpemUnKSApLFxuICAgICAgICAnZW0nOiB2YWx1ZSA9PiB2YWx1ZSAqIHBhcnNlRmxvYXQoIGdldENvbXB1dGVkU3R5bGUoZWxlbSkuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udC1zaXplJykpLFxuICAgICAgICAndncnOiB2YWx1ZSA9PiB2YWx1ZSAvIDEwMCAqIGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5pbm5lcldpZHRoLFxuICAgICAgICAndmgnOiB2YWx1ZSA9PiB2YWx1ZSAvIDEwMCAqIGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5pbm5lckhlaWdodCxcbiAgICAgICAgJyUnOiAgdmFsdWUgPT4gdmFsdWUgLyAxMDAgKiBwYXJzZUZsb2F0KCBnZXRDb21wdXRlZFN0eWxlKGVsZW0pLmdldFByb3BlcnR5VmFsdWUoJ2ZvbnQtc2l6ZScpKVxuICAgIH07XG5cbiAgICBpZiAoIHVuaXQgaW4gc3VwcG9ydGVkVW5pdHMgKVxuICAgICAgICByZXR1cm4gc3VwcG9ydGVkVW5pdHNbIHVuaXQgXSggdW5pdFZhbHVlICk7XG4gICAgXG4gICAgcmV0dXJuIG51bGw7XG59XG4gLypcbiAqIFJldHVybnMgaWYgdGhlIGZvbnQgZm9yIHZpc2libGUgdGV4dCBvZiB0aGUgZWxlbWVudCBpcyBkZWZpbmVkIGJ5IG1hdGVyaWFsIGljb25zXG4gKiAgXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtIFxuICovXG4gZXhwb3J0IGZ1bmN0aW9uIGlzTWF0ZXJpYWxJY29uRm9udChlbGVtOiBIVE1MRWxlbWVudCkge1xuICAgIC8vIFRPRE86IGNoZWNrIHRoZSBleGlzdGVuY2UgbWF0ZXJpYWwgaWNvbnMgdXNpbmcgZmV0Y2ggaW4gbm9kZSAxOCtcbiAgICAvLyBmb3Igbm93IChub2RlIDE2KSBqdXN0IGRlcnRlcm1pbmUgaWYgdGhlIHN0eWxlc2hlZXQgZm9yIHRoZSAnTWF0ZXJpYWwgSWNvbnMnIGV4aXN0cyBzdGF0aWNhbGx5LiBub3RlIHRoYXQgdGhlIGxvYWRpbmcgb2YgdGhlIGZvbnQgc3R5bGVzaGVldCBvY2N1cnMgYXQgcnVuIHRpbWUuXG4gICAgLy9saXN0IG9mIGtub3duIG1hdGVyaWFsIGljb25zIGFuZCBzdHlsZXNoZWV0IGxpbmtcbiAgICBjb25zdCBrbm93bl9pY29ucyA9IHtcbiAgICAgICAgJ01hdGVyaWFsIEljb25zJyA6IFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9pY29uP2ZhbWlseT1NYXRlcmlhbCtJY29uc1wiXG4gICAgfTtcbiAgICBjb25zdCBrbm93bl9jc3NfY2xhc3NlcyA9IHtcbiAgICAgICAgJ21hdGVyaWFsLWljb25zJyA6IFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9pY29uP2ZhbWlseT1NYXRlcmlhbCtJY29uc1wiXG4gICAgfTtcblxuICAgIC8vIG1hdGVyaWFsIGljb24gZm9udCBjYW4gYmUgZGVmaW5lZCBlaXRoZXIgYnkgZm9udC1mYW1pbHk6ICdNYXRlcmlhbCBJY29ucycgb3IgYnkgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiXG4gICAgbGV0IHN0eWxlcyA9IGdldERlZmluZWRTdHlsZXMoZWxlbSk7XG4gICAgbGV0IGZvbnRGYW1pbHkgPSBzdHlsZXNbJ2ZvbnQtZmFtaWx5J107XG4gICAgXG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgLy8gZm9udC1mYW1pbHkgc3BlY2lmaWVzIGEgcHJpb3JpdGl6ZWQgbGlzdCBvZiBvbmUgb3IgbW9yZSBmb250IGZhbWlseSBuYW1lcyBcbiAgICBpZiAoZm9udEZhbWlseSAmJiBmb250RmFtaWx5LnNwbGl0KFwiLFwiKVswXS5yZXBsYWNlKC9bJ1wiXSsvZywgJycpLnRyaW0oKSBpbiBrbm93bl9pY29ucylcbiAgICAgICAgZm91bmQgPSB0cnVlO1xuXG4gICAgaWYgKCFmb3VuZCkge1xuICAgICAgIGxldCBsaXN0ID0gIGVsZW0uY2xhc3NMaXN0O1xuICAgICAgIGZvciAobGV0IGNzc19jbGFzcyBpbiBrbm93bl9jc3NfY2xhc3Nlcykge1xuICAgICAgICAgICBpZiAobGlzdC5jb250YWlucyhjc3NfY2xhc3MpKSB7XG4gICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgfSBcbiAgICAgICB9XG4gICAgfSAgICBcbiAgICBpZiAoIWZvdW5kKSByZXR1cm4gZmFsc2U7XG4gICAgXG4gICAgbGV0IHBhc3NlZCA9IGZhbHNlO1xuICAgIC8vIGNoZWNrIGlmIHRoZSBzdHlsZXNoZWV0IGZvciB0aGUgJ01hdGVyaWFsIEljb25zJyBleGlzdHMgc3RhdGljYWxseVxuICAgIGxldCBzaGVldHMgPSBlbGVtLm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHM7XG4gICAgZm9yIChsZXQgcyA9IDA7IHMgPCBzaGVldHMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgaWYgKHNoZWV0cyAmJiBzaGVldHMubGVuZ3RoID4gMCAmJiBPYmplY3QudmFsdWVzKGtub3duX2ljb25zKS5pbmRleE9mKHNoZWV0c1tzXS5ocmVmKSA+IC0xKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gXG4gICAgfSAgICAgICBcbiAgICByZXR1cm4gcGFzc2VkO1xuIH1cblxuIGV4cG9ydCBmdW5jdGlvbiBnZXRXZWlnaHROdW1iZXIoc3R5bGVWYWwpIHtcbiAgICBsZXQgbWFwID0ge1xuICAgICAgICBcImxpZ2h0XCI6IDEwMCxcbiAgICAgICAgXCJib2xkXCI6IDcwMFxuICAgIH07XG4gICAgbGV0IHJldFZhbCA9IHBhcnNlSW50KHN0eWxlVmFsKTtcbiAgICBpZiAocmV0VmFsKSByZXR1cm4gcmV0VmFsO1xuICAgIGlmIChzdHlsZVZhbCBpbiBtYXApXG4gICAgICAgIHJldHVybiBtYXBbc3R5bGVWYWxdO1xuICAgIHJldHVybiA0MDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb250SW5QaXhlbHMoc3R5bGVWYWwsIGVsZW0pIHtcbiAgICBsZXQgbWFwID0ge1xuICAgICAgICBcInh4LXNtYWxsXCI6IDE2LFxuICAgICAgICBcIngtc21hbGxcIjogMTAsXG4gICAgICAgIFwic21hbGxcIjogMTMsXG4gICAgICAgIFwibWVkaXVtXCI6IDE2LFxuICAgICAgICBcImxhcmdlXCI6IDE4LFxuICAgICAgICBcIngtbGFyZ2VcIjogMjQsXG4gICAgICAgIFwieHgtbGFyZ2VcIjogMzJcbiAgICB9O1xuICAgIGxldCB2YWx1ZSA9IHBhcnNlRmxvYXQoc3R5bGVWYWwpO1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG1hcFtzdHlsZVZhbF07XG4gICAgfVxuICAgIGxldCB1bml0cyA9IHN0eWxlVmFsLnN1YnN0cmluZygoXCJcIiArIHZhbHVlKS5sZW5ndGgpO1xuICAgIC8qKlxuICAgICAgICBpZiAodW5pdHMgPT09IFwiXCIgfHwgdW5pdHMgPT09IFwicHhcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgICBpZiAodW5pdHMgPT09IFwiZW1cIikgcmV0dXJuIHZhbHVlICogMTY7XG4gICAgICAgIGlmICh1bml0cyA9PT0gXCIlXCIpIHJldHVybiB2YWx1ZSAvIDEwMCAqIDE2O1xuICAgICAgICBpZiAodW5pdHMgPT09IFwicHRcIikgcmV0dXJuIHZhbHVlICogNCAvIDM7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICAqL1xuICAgIHJldHVybiBjb252ZXJ0VmFsdWUyUGl4ZWxzKHVuaXRzLCB2YWx1ZSwgZWxlbSApO1xuICAgXG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENTU1N0eWxlKGVsZW1lbnQpIHtcbiAgICBsZXQgc3R5bGVUZXh0ID0gXCJcIjtcbiAgICBpZiAoZWxlbWVudCA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuICAgIGlmIChlbGVtZW50LklCTV9DU1NfVEhCKSByZXR1cm4gZWxlbWVudC5JQk1fQ1NTX1RIQjtcbiAgICBsZXQgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIpIHtcbiAgICAgICAgc3R5bGVUZXh0ID0gZWxlbWVudC5pbm5lclRleHQ7XG4gICAgICAgIGlmIChzdHlsZVRleHQgPT09IHVuZGVmaW5lZCB8fCBzdHlsZVRleHQudHJpbSgpID09PSBcIlwiKVxuICAgICAgICAgICAgc3R5bGVUZXh0ID0gZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFwic3R5bGVcIikpIHtcbiAgICAgICAgc3R5bGVUZXh0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKTtcbiAgICB9IGVsc2UgcmV0dXJuIFtdO1xuICAgIGlmIChzdHlsZVRleHQgPT09IG51bGwgfHwgc3R5bGVUZXh0LnRyaW0oKS5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICAvL3JlbW92ZSBjb21tZW50IGJsb2Nrc1xuICAgIGxldCByZSA9IC8oXFwvXFwqKyg/Oig/Oig/OlteXFwqXSkrKXwoPzpbXFwqXSsoPyFcXC8pKSlbKl0rXFwvKXxcXC9cXC8uKi9nO1xuICAgIGxldCBzdWJzdCA9ICcgJztcbiAgICBzdHlsZVRleHQgPSBzdHlsZVRleHQucmVwbGFjZShyZSwgc3Vic3QpO1xuICAgIC8vIEZpbmQgYWxsIFwia2V5IDogdmFsO1wiIHBhaXJzIHdpdGggdmFyaW91cyB3aGl0ZXNwYWNlIGluYmV0d2VlblxuICAgIGxldCByS2V5VmFscyA9IC9cXHMqKFteOlxcc10rKVxccyo6XFxzKihbXjskfV0rKVxccyooO3wkKS9nO1xuICAgIC8vIEZpbmQgYWxsIFwic2VsZWN0b3IgeyBjc3NrZXl2YWxzIH0gd2l0aCB2YXJpb3VzIHdoaXRlc3BhY2UgaW5iZXR3ZWVuXG4gICAgbGV0IHJTZWxlY3RvcnMgPSAvXFxzKihbXntdKil7KFtefV0qKX0vZztcbiAgICBpZiAoc3R5bGVUZXh0LmluZGV4T2YoXCJ7XCIpID09PSAtMSkge1xuXG4gICAgICAgIGxldCBrZXlWYWxzID0ge307XG4gICAgICAgIGxldCBtO1xuICAgICAgICB3aGlsZSAoKG0gPSByS2V5VmFscy5leGVjKHN0eWxlVGV4dCkpICE9IG51bGwpIHtcbiAgICAgICAgICAgIGtleVZhbHNbbVsxXV0gPSBtWzJdLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRWYWwgPSBbe1xuICAgICAgICAgICAgc2VsZWN0b3I6IG51bGwsXG4gICAgICAgICAgICB2YWx1ZXM6IGtleVZhbHNcbiAgICAgICAgfV07XG4gICAgICAgIGVsZW1lbnQuSUJNX0NTU19USEIgPSByZXRWYWw7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuICAgICAgICBsZXQgbTtcbiAgICAgICAgbGV0IG0yO1xuICAgICAgICB3aGlsZSAoKG0gPSByU2VsZWN0b3JzLmV4ZWMoc3R5bGVUZXh0KSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGtleVZhbHMgPSB7fVxuICAgICAgICAgICAgbGV0IHNlbEtleSA9IG1bMV07XG4gICAgICAgICAgICBsZXQgc2VsVmFsID0gbVsyXTtcblxuICAgICAgICAgICAgd2hpbGUgKChtMiA9IHJLZXlWYWxzLmV4ZWMoc2VsVmFsKSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGtleVZhbHNbbTJbMV1dID0gbTJbMl0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXRWYWwucHVzaCh7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbEtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IGtleVZhbHNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnQuSUJNX0NTU19USEIgPSByZXRWYWw7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVEb2N1bWVudCBleHRlbmRzIERvY3VtZW50IHtcbiAgICBhY2VDYWNoZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDYWNoZUVsZW1lbnQgZXh0ZW5kcyBFbGVtZW50IHtcbiAgICBhY2VDYWNoZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfVxufVxuXG4vKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBnaXZlbiBnbG9iYWwgdmFyaWFibGVcbiAgICAgKiB3aXRoIGl0cyBpbml0aWFsIHZhbHVlIGFzIGdpdmVuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGUoY2FjaGVTcG90OiBFbGVtZW50IHwgRG9jdW1lbnQgfCBEb2N1bWVudEZyYWdtZW50LCBrZXlOYW1lLCBpbml0VmFsdWUpIHtcbiAgICBsZXQgY2FjaGVPYmogPSAoY2FjaGVTcG90Lm5vZGVUeXBlID09PSA5IC8qIE5vZGUuRE9DVU1FTlRfTk9ERSAqLyB8fCBjYWNoZVNwb3Qubm9kZVR5cGUgPT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAqLykgPyBjYWNoZVNwb3QgYXMgQ2FjaGVEb2N1bWVudCA6IGNhY2hlU3BvdCBhcyBDYWNoZUVsZW1lbnQ7XG4gICAgaWYgKGNhY2hlT2JqLmFjZUNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2FjaGVPYmouYWNlQ2FjaGUgPSB7fVxuICAgIH1cbiAgICBpZiAoY2FjaGVPYmouYWNlQ2FjaGVba2V5TmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXSA9IGluaXRWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlT2JqLmFjZUNhY2hlW2tleU5hbWVdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRDYWNoZShjYWNoZVNwb3Q6IERvY3VtZW50IHwgRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQgfCBTaGFkb3dSb290LCBnbG9iYWxOYW1lLCB2YWx1ZSkgOiBhbnkge1xuICAgIGxldCBjYWNoZU9iaiA9IChjYWNoZVNwb3Qubm9kZVR5cGUgPT09IDkgLyogTm9kZS5ET0NVTUVOVF9OT0RFICovIHx8IGNhY2hlU3BvdC5ub2RlVHlwZSA9PT0gMTEgLyogTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFICovKSA/IGNhY2hlU3BvdCBhcyBDYWNoZURvY3VtZW50IDogY2FjaGVTcG90IGFzIENhY2hlRWxlbWVudDtcbiAgICBpZiAoY2FjaGVPYmouYWNlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjYWNoZU9iai5hY2VDYWNoZSA9IHt9XG4gICAgfVxuICAgIGNhY2hlT2JqLmFjZUNhY2hlW2dsb2JhbE5hbWVdID0gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNhY2hlcyhjYWNoZVJvb3QgOiBOb2RlKSA6IHZvaWQge1xuICAgIGRlbGV0ZSAoY2FjaGVSb290Lm93bmVyRG9jdW1lbnQgYXMgQ2FjaGVEb2N1bWVudCkuYWNlQ2FjaGU7XG4gICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihjYWNoZVJvb3QpO1xuICAgIGRvIHtcbiAgICAgICAgZGVsZXRlIChudy5ub2RlIGFzIENhY2hlRWxlbWVudCkuYWNlQ2FjaGU7XG4gICAgICAgIG53Lm5vZGUub3duZXJEb2N1bWVudCAmJiBkZWxldGUgKG53Lm5vZGUub3duZXJEb2N1bWVudCBhcyBDYWNoZURvY3VtZW50KS5hY2VDYWNoZTtcbiAgICB9IHdoaWxlIChudy5uZXh0Tm9kZSgpKTtcbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHtSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFJQVFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGVnYWN5XCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcblxuLyogXG4gKiBjaGVjayBpZiBhbnkgZXhwbGljaXQgcm9sZSBzcGVjaWZpZWQgZm9yIHRoZSBlbGVtZW50IGlzIGEgdmFsaWQgQVJJQSByb2xlXG4gKiByZXR1cm46IG51bGwgaWYgbm8gZXhwbGljaXQgcm9sZSBpcyBkZWZpbmVkLCBcbiAqICAgICAgICAgdHJ1ZSBpZiB0aGUgcm9sZShzKSBhcmUgZGVmaW5lZCBpbiBBUklBXG4gKiAgICAgICAgIGZhbHNlIGlmIGFueSByb2xlIGlzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiovXG5leHBvcnQgZnVuY3Rpb24gYXJlUm9sZXNEZWZpbmVkKHJvbGVzOiBzdHJpbmdbXSkge1xuICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PTApIHJldHVybiBudWxsO1xuICAgIFxuICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICBmb3IgKGNvbnN0IHJvbGUgb2Ygcm9sZXMpIFxuICAgICAgICBpZiAoIShyb2xlLnRvTG93ZXJDYXNlKCkgaW4gZGVzaWduUGF0dGVybnMpKSBcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vKiBcbiAqIGNoZWNrIGlmIGFueSBleHBsaWNpdCByb2xlIHNwZWNpZmllZCBmb3IgdGhlIGVsZW1lbnQgaXMgYSB2YWxpZCBBUklBIHJvbGVcbiAqIHJldHVybjogbnVsbCBpZiBubyBleHBsaWNpdCByb2xlIGlzIGRlZmluZWQsIFxuICogICAgICAgICB0cnVlIGlmIHRoZSByb2xlKHMpIGFyZSBkZWZpbmVkIGluIEFSSUFcbiAqICAgICAgICAgZmFsc2UgaWYgYW55IHJvbGUgaXMgbm90IGRlZmluZWQgaW4gQVJJQVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnZhbGlkUm9sZXMocnVsZUNvbnRleHQ6IEVsZW1lbnQpIHtcbiAgICBsZXQgZG9tUm9sZXM6IHN0cmluZ1tdID0gUlBUVXRpbC5nZXRVc2VyRGVmaW5lZFJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICBcbiAgICBpZiAoIWRvbVJvbGVzIHx8IGRvbVJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBjaGVjayB0aGUgJ2dlbmVyaWMnIHJvbGUgZmlyc3RcbiAgICBpZiAoZG9tUm9sZXMgJiYgZG9tUm9sZXMuaW5jbHVkZXMoJ2dlbmVyaWMnKSlcbiAgICAgICAgcmV0dXJuIFtcImdlbmVyaWNcIl07XG4gICAgXG4gICAgLy8gRmFpbGluZyByb2xlc1xuICAgIGxldCBmYWlsUm9sZVRva2VucyA9IFtdO1xuICAgIC8vIFBhc3Npbmcgcm9sZXNcbiAgICBsZXQgcGFzc1JvbGVUb2tlbnMgPSBbXTtcblxuICAgIGxldCB0YWdQcm9wZXJ0eSA9IFJQVFV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShydWxlQ29udGV4dCk7XG4gICAgbGV0IGFsbG93ZWRSb2xlcyA9IFJQVFV0aWwuZ2V0QWxsb3dlZEFyaWFSb2xlcyhydWxlQ29udGV4dCwgdGFnUHJvcGVydHkpO1xuICAgIGlmICghYWxsb3dlZFJvbGVzICYmIGFsbG93ZWRSb2xlcy5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiBkb21Sb2xlcztcbiAgICBcbiAgICBsZXQgaW52YWxpZFJvbGVzID0gW107XG5cbiAgICBpZiAoYWxsb3dlZFJvbGVzICYmIGFsbG93ZWRSb2xlcy5pbmNsdWRlcygnYW55JykpXG4gICAgICAgIHJldHVybiBbXTtcbiAgICBcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbVJvbGVzLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoIWFsbG93ZWRSb2xlcy5pbmNsdWRlcyhkb21Sb2xlc1tpXSkgJiYgIWludmFsaWRSb2xlcy5pbmNsdWRlcyhkb21Sb2xlc1tpXSkpXG4gICAgICAgICAgICBpbnZhbGlkUm9sZXMucHVzaChkb21Sb2xlc1tpXSk7XG5cbiAgICByZXR1cm4gaW52YWxpZFJvbGVzOyAgICAgICAgXG59XG5cbi8qIFxuICogY2hlY2sgaWYgYW55IGV4cGxpY2l0IHJvbGUgc3BlY2lmaWVkIGZvciB0aGUgZWxlbWVudCBpcyBub3QgZGVmaW5lZCBpbiBBUklBXG4gKiByZXR1cm46IGxpc3Qgb2Ygc3BlY2lmaWVkIHJvbGVzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um9sZXNVbmRlZmluZWRCeUFyaWEoZWxlbWVudDogRWxlbWVudCkge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCByb2xlcyA9IFJQVFV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgIGxldCB1bmRlZmluZWRSb2xlcyA9IFtdO1xuICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCEocm9sZXNbaV0gaW4gZGVzaWduUGF0dGVybnMpKSB7XG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkUm9sZXMucHVzaChyb2xlc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9ICAgIFxuICAgIHJldHVybiB1bmRlZmluZWRSb2xlczsgICAgICAgIFxufVxuXG4vKiBcbiAqIHRoaXMgbWV0aG9kIGZpcnN0IGNoZWNrcyBleHBsaWNpdCByb2xlcywgaWYgbm8gZXhwbGljaXQgcm9sZSwgaXQgd2lsbCBjaGVjayB0aGUgaW1wbGljaXQgcm9sZVxuICogcmV0dXJuOiBudWxsIGlmIGFueSBleHBsaWNpdCByb2xlIGlzIGludmFsaWQsIFxuICogICAgICAgICBhIGxpc3Qgb2YgaW52YWxpZCBhdHRyaWJ1dGVzXG4gKiAgICAgICAgIGVtcHR5IGxpc3QgaWYgYWxsIGF0dHJpYnV0ZXMgYXJlIHZhbGlkLCBvciBubyBhcmlhIGF0dHJpYnV0ZXMgYXJlIHNwZWNpZmllZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW52YWxpZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0OiBFbGVtZW50KTogc3RyaW5nW10ge1xuICAgIGxldCByb2xlcyA9IFJQVFV0aWwuZ2V0VXNlckRlZmluZWRSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgXG4gICAgLy8gdGhlIGludmFsaWQgcm9sZSBjYXNlOiBoYW5kbGVkIGJ5IFJwdF9BcmlhX1ZhbGlkUm9sZS4gSWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgcmVwb3J0XG4gICAgLy8gZm9yIG11dGlwbGUgcm9sZXMsIHNraXAgaWYgYW55IHJvbGUgaXMgaW52YWxpZFxuICAgIGxldCBkZWZpbmVkID0gYXJlUm9sZXNEZWZpbmVkKHJvbGVzKTtcbiAgICBpZiAoZGVmaW5lZCAhPT1udWxsICYmICFkZWZpbmVkKSBcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgXG4gICAgbGV0IGF0dHJzID0gW107XG4gICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT0gMClcbiAgICAgICAgcm9sZXMgPSAgUlBUVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgIFxuICAgIGxldCBhcmlhX2F0dHJzOiBzdHJpbmdbXSA9IFJQVFV0aWwuZ2V0VXNlckRlZmluZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCk7ICBcbiAgICBcbiAgICBsZXQgdGFnUHJvcGVydHkgPSBSUFRVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuICAgIC8vIEF0dHJpYnV0ZXMgYWxsb3dlZCBvbiB0aGlzIG5vZGVcbiAgICBsZXQgYWxsb3dlZEF0dHJpYnV0ZXMgPSBSUFRVdGlsLmdldEFsbG93ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCwgcm9sZXMsIHRhZ1Byb3BlcnR5KTtcbiAgICBcbiAgICBpZiAoYXJpYV9hdHRycykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyaWFfYXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGFyaWFfYXR0cnNbaV0udHJpbSgpLnRvTG93ZXJDYXNlKCk7IFxuICAgICAgICAgICAgaWYgKCFhbGxvd2VkQXR0cmlidXRlcy5pbmNsdWRlcyhhdHRyTmFtZSkgJiYgIWF0dHJzLmluY2x1ZGVzKGF0dHJOYW1lKSlcbiAgICAgICAgICAgICAgICBhdHRycy5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXR0cnM7XG59XG5cbi8qIFxuICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICogcmV0dXJuOiBhIGxpc3Qgb2YgQXJpYSBhbmQgSHRtbCBhdHRyaWJ1dGUgcGFpcnMgdGhhdCBhcmUgY29uZmxpY3RcbiovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmxpY3RBcmlhQW5kSHRtbEF0dHJpYnV0ZXMoZWxlbTogRWxlbWVudCkge1xuICAgIFxuICAgIGxldCBhcmlhQXR0cnMgPSBSUFRVdGlsLmdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXJzKGVsZW0pO1xuICAgIGxldCBodG1sQXR0cnMgPSBSUFRVdGlsLmdldFVzZXJEZWZpbmVkSHRtbEF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXJzKGVsZW0pO1xuICAgIFxuICAgIGxldCByZXQgPSBbXTtcbiAgICBpZiAoYXJpYUF0dHJzICYmIGFyaWFBdHRycy5sZW5ndGggPiAwICYmIGh0bWxBdHRycyAmJiBodG1sQXR0cnMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyaWFBdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZXhhbWluZWRIdG1sQXRyTmFtZXMgPSBSUFRVdGlsLmdldENvbmZsaWN0T3JPdmVybGFwcGluZ0h0bWxBdHRyaWJ1dGUoYXJpYUF0dHJzW2ldLCBodG1sQXR0cnMsICdjb25mbGljdCcpO1xuICAgICAgICAgICAgaWYgKGV4YW1pbmVkSHRtbEF0ck5hbWVzID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgIGV4YW1pbmVkSHRtbEF0ck5hbWVzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1bJ3Jlc3VsdCddID09PSAnRmFpbGVkJykgLy9mYWlsZWRcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goeydhcmlhQXR0cic6IGFyaWFBdHRyc1tpXVsnbmFtZSddLCAnaHRtbEF0dHInOiBpdGVtWydhdHRyJ119KTtcbiAgICAgICAgICAgIH0pOyAgICBcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufVxuXG4vKiBcbiAqIGdldCBjb25mbGljdCBBcmlhIGFuZCBIdG1sIGF0dHJpYnV0ZXNcbiAqIHJldHVybjogYSBsaXN0IG9mIEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlIHBhaXJzIHRoYXQgYXJlIGNvbmZsaWN0XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KSB7XG4gICAgaWYgKCFjb250ZXh0SGllcmFyY2hpZXMpIHJldHVybiBudWxsO1xuICAgIFxuICAgIHJldHVybiBjb250ZXh0SGllcmFyY2hpZXNbXCJhcmlhXCJdLmZpbHRlcihoaWVyID0+IFtcInRhYmxlXCIsIFwiZ3JpZFwiLCBcInRyZWVncmlkXCJdLmluY2x1ZGVzKGhpZXIucm9sZSkpO1xufVxuXG4vKiBcbiAqIGdldCBkZXByZWNhdGVkIEFyaWEgcm9sZXNcbiAqIHJldHVybjogYSBsaXN0IG9mIGRlcHJlY2F0ZWQgQXJpYSByb2xlc1xuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXByZWNhdGVkQXJpYVJvbGVzKGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3Qgcm9sZXMgPSBSUFRVdGlsLmdldFJvbGVzKGVsZW1lbnQsIGZhbHNlKTtcbiAgICBsZXQgcmV0ID0gW107XG4gICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZ2xvYmFsRGVwcmVjYXRlZFJvbGVzID0gQVJJQURlZmluaXRpb25zLmdsb2JhbERlcHJlY2F0ZWRSb2xlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGdsb2JhbERlcHJlY2F0ZWRSb2xlcy5pbmNsdWRlcyhyb2xlc1tpXSkpXG4gICAgICAgICAgICAgICAgcmV0LnB1c2gocm9sZXNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59XG5cbi8qIFxuICogZ2V0IGRlcHJlY2F0ZWQgQXJpYSByb2xlLWF0dHJpYnV0ZXNcbiAqIHJldHVybjogYSBsaXN0IG9mIGRlcHJlY2F0ZWQgQXJpYSByb2xlLWF0dHJpYnV0ZXMgcGFyaXNcbiAqICAgICAgICAgZm9yIGdsb2JhbCB0aGUgcm9sZSBpcyBtYXJrZWQgYXMgJ2FueSdcbiovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVwcmVjYXRlZEFyaWFBdHRyaWJ1dGVzKGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgbGV0IGRvbUF0dHJpYnV0ZXMgPSBlbGVtZW50LmF0dHJpYnV0ZXM7XG4gICAgbGV0IGFyaWFBdHRycyA9IFtdO1xuICAgIGlmIChkb21BdHRyaWJ1dGVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gZG9tQXR0cmlidXRlc1tpXS5uYW1lOyBcbiAgICAgICAgICAgIGlmIChhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLScpIFxuICAgICAgICAgICAgICAgIGFyaWFBdHRycy5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYXJpYUF0dHJzLmxlbmd0aCA9PT0wKSByZXR1cm4gW107XG5cbiAgICBsZXQgcmV0ID0gW107XG4gICAgY29uc3QgZ2xvYmFsRGVwcmVjYXRlZEF0dHJpYnV0ZXMgPSBBUklBRGVmaW5pdGlvbnMuZ2xvYmFsRGVwcmVjYXRlZFByb3BlcnRpZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGdsb2JhbERlcHJlY2F0ZWRBdHRyaWJ1dGVzLmluY2x1ZGVzKGFyaWFBdHRyc1tpXSkpXG4gICAgICAgICAgICByZXQucHVzaCh7XCJyb2xlXCI6XCJhbnlcIiwgXCJhdHRyaWJ1dGVcIjphcmlhQXR0cnNbaV19KTtcbiAgICB9XG4gICAgY29uc3Qgcm9sZXMgPSBSUFRVdGlsLmdldFJvbGVzKGVsZW1lbnQsIGZhbHNlKTtcbiAgICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByb2xlV2l0aERlcHJlY2F0ZWRBdHRyaWJ1dGVzID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzW2ldXTtcbiAgICAgICAgICAgIGlmIChyb2xlV2l0aERlcHJlY2F0ZWRBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRlZEF0dHJpTmFtZXMgPSByb2xlV2l0aERlcHJlY2F0ZWRBdHRyaWJ1dGVzWydkZXByZWNhdGVkUHJvcHMnXTtcbiAgICAgICAgICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpTmFtZXMgJiYgZGVwcmVjYXRlZEF0dHJpTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFyaWFBdHRycy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlcHJlY2F0ZWRBdHRyaU5hbWVzLmluY2x1ZGVzKGFyaWFBdHRyc1tqXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goeyBcInJvbGVcIjpyb2xlc1tpXSwgIFwiYXR0cmlidXRlXCI6IGFyaWFBdHRyc1tqXX0gKTtcbiAgICAgICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDsgXG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4vdjIvY29tbW9uL0NvbnRleHRcIlxuLy8gaW1wb3J0IHsgU2ltdWxhdG9yIH0gZnJvbSBcIi4vdjIvc2ltdWxhdG9yXCJcbmltcG9ydCB7IENoZWNrZXIgfSBmcm9tIFwiLi92NC9jaGVja2VyL0NoZWNrZXJcIlxuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSBcIi4vdjIvY29uZmlnL0NvbmZpZ1wiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5TdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggPSBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggfHwgZnVuY3Rpb24gKHN0cikge1xuICAgIHJldHVybiB0aGlzLmluZGV4T2Yoc3RyKSA9PT0gMDtcbn1cblN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMgPSBTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzIHx8IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleE9mKHN0cikgIT09IC0xO1xufVxuQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzID0gQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzIHx8IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleE9mKHN0cikgIT09IC0xO1xufVxuLypcbmZ1bmN0aW9uIHNpbURlbW8odGltZW91dD86IG51bWJlcikge1xuICAgIGlmICghdGltZW91dCkgdGltZW91dCA9IDA7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgbGV0IHNpbSA9IG5ldyBTaW11bGF0b3IoKTtcbiAgICAgICAgbGV0IHMgPSBzaW0ucmVuZGVySXRlbShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgICBjb25zb2xlLmdyb3VwKFwiLS0tIEl0ZW0gVmlldyAtLS1cIik7XG4gICAgICAgIGNvbnNvbGUubG9nKHMpO1xuICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIGNvbnNvbGUuZ3JvdXAoXCItLS0gTGluayBWaWV3IC0tLVwiKTtcbiAgICAgICAgcyA9IHNpbS5yZW5kZXJMaW5rKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGNvbnNvbGUubG9nKHMpO1xuICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgfSwgdGltZW91dCk7XG59XG4qL1xuZnVuY3Rpb24gY2hlY2tEZW1vKHRpbWVvdXQ/OiBudW1iZXIpIHtcbiAgICBpZiAoIXRpbWVvdXQpIHRpbWVvdXQgPSAwO1xuICAgIGxldCBjaGVja2VyID0gbmV3IENoZWNrZXIoKTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICBjaGVja2VyLmNoZWNrKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fRGVzaWduXCJdKVxuICAgICAgICAudGhlbihmdW5jdGlvbihyZXBvcnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcG9ydCk7XG4gICAgICAgICAgICBjb25zdCB2YWxzID0ge1xuICAgICAgICAgICAgICAgIFwiRkFJTFwiOiAwLFxuICAgICAgICAgICAgICAgIFwiUE9URU5USUFMXCI6IDEsXG4gICAgICAgICAgICAgICAgXCJNQU5VQUxcIjogMixcbiAgICAgICAgICAgICAgICBcIlBBU1NcIjogM1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxyZXBvcnQucmVzdWx0cy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcG9ydC5yZXN1bHRzW2lkeF0udmFsdWVbMV0gPT09IFwiUEFTU1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcG9ydC5yZXN1bHRzLnNwbGljZShpZHgtLSwxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXBvcnQucmVzdWx0cy5zb3J0KChhLGIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYS5jYXRlZ29yeSAhPSBiLmNhdGVnb3J5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmNhdGVnb3J5LmxvY2FsZUNvbXBhcmUoYi5jYXRlZ29yeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhLnBhdGhbXCJhcmlhXCJdID09PSBiLnBhdGhbXCJhcmlhXCJdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxzW2EudmFsdWVbMV1dLXZhbHNbYi52YWx1ZVsxXV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhLnBhdGhbXCJhcmlhXCJdLmxvY2FsZUNvbXBhcmUoYi5wYXRoW1wiYXJpYVwiXSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgbGV0IGxhc3RQYXRoID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBjYXRlZ29yeSA9IG51bGw7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXBvcnQucmVzdWx0cykge1xuICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yeSAhPT0gcmVzdWx0LmNhdGVnb3J5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yeSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFBhdGggPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5ID0gcmVzdWx0LmNhdGVnb3J5O1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwKHJlc3VsdC5jYXRlZ29yeSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5wYXRoW1wiYXJpYVwiXSAhPSBsYXN0UGF0aCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFBhdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsYXN0UGF0aCA9IHJlc3VsdC5wYXRoW1wiYXJpYVwiXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RQYXRoID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwKFwicGFnZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXAobGFzdFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC52YWx1ZSwgcmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICB9KTtcbiAgICB9LCB0aW1lb3V0KTtcbn1cblxuZXhwb3J0IHsgQ2hlY2tlciwgQ29udGV4dCwgQVJJQU1hcHBlciwgY2hlY2tEZW1vLCBDb25maWcvKiwgc2ltRGVtbyovLCBET01XYWxrZXIgfTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
diff --git a/rule-server/src/static/archives/2023.08.09/js/ace-node-debug.js b/rule-server/src/static/archives/2023.08.09/js/ace-node-debug.js
new file mode 100644
index 000000000..3799dedd0
--- /dev/null
+++ b/rule-server/src/static/archives/2023.08.09/js/ace-node-debug.js
@@ -0,0 +1,28646 @@
+/*!
+ * 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__ = ({
+
+/***/ 9077:
+/***/ ((__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.RuleManual = exports.RulePotential = exports.RuleFail = exports.RuleRender = exports.RulePass = exports.eRulesetType = exports.eRuleCategory = exports.eToolkitLevel = 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 = {}));
+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 eRuleCategory;
+(function (eRuleCategory) {
+ eRuleCategory["ACCESSIBILITY"] = "Accessibility";
+ eRuleCategory["DESIGN"] = "Design";
+ eRuleCategory["OTHER"] = "Other";
+})(eRuleCategory = exports.eRuleCategory || (exports.eRuleCategory = {}));
+var eRulesetType;
+(function (eRulesetType) {
+ eRulesetType["DEFAULT"] = "default";
+ eRulesetType["EXTENSION"] = "extension";
+})(eRulesetType = exports.eRulesetType || (exports.eRulesetType = {}));
+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;
+
+
+/***/ }),
+
+/***/ 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.isTableHeaderInFirstRowOrColumn(table);
+ }
+ }
+ table.RPTUtil_isComplexDataTable = isComplexTable;
+ return isComplexTable;
+ };
+ // Return true if a table's header is in the first row or column
+ RPTUtil.isTableHeaderInFirstRowOrColumn = function (ruleContext) {
+ var passed = false;
+ var rows = ruleContext.rows;
+ // Check if the first row is all TH's
+ if (rows != null && rows.length > 0) {
+ var firstRow = rows[0];
+ passed = firstRow.cells.length > 0 && RPTUtil.getChildByTagHidden(firstRow, "td", false, true).length === 0;
+ // If the first row isn't a header row, try the first column
+ if (!passed) {
+ // Assume that the first column has all TH's unless we find a TD in the first column.
+ passed = true;
+ for (var i = 0; passed && i < rows.length; ++i) {
+ // If no cells in this row, that's okay too.
+ passed = !rows[i].cells ||
+ rows[i].cells.length === 0 ||
+ rows[i].cells[0].nodeName.toLowerCase() != "td";
+ }
+ }
+ if (!passed) {
+ // Special case - both first row and first column are headers, but they did not use
+ // a th for the upper-left cell
+ passed = true;
+ for (var i = 1; passed && i < firstRow.cells.length; ++i) {
+ passed = firstRow.cells[i].nodeName.toLowerCase() != "td";
+ }
+ for (var i = 1; passed && i < rows.length; ++i) {
+ // If no cells in this row, that's okay too.
+ passed = !rows[i].cells ||
+ rows[i].cells.length === 0 ||
+ rows[i].cells[0].nodeName.toLowerCase() != "td";
+ }
+ }
+ }
+ return passed;
+ };
+ 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 IEngine_1 = __webpack_require__(9077);
+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 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] === IEngine_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 (var _c = 0, _d = depRule.rule.prereqs; _c < _d.length; _c++) {
+ var depId = _d[_c];
+ 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;
+
+
+/***/ }),
+
+/***/ 4377:
+/***/ ((__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.RuleManual = exports.RulePotential = exports.RuleFail = exports.RuleRender = exports.RulePass = exports.eRulesetType = exports.eRuleCategory = exports.eToolkitLevel = 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 = {}));
+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 eRuleCategory;
+(function (eRuleCategory) {
+ eRuleCategory["ACCESSIBILITY"] = "Accessibility";
+ eRuleCategory["DESIGN"] = "Design";
+ eRuleCategory["OTHER"] = "Other";
+})(eRuleCategory = exports.eRuleCategory || (exports.eRuleCategory = {}));
+var eRulesetType;
+(function (eRulesetType) {
+ eRulesetType["DEFAULT"] = "default";
+ eRulesetType["EXTENSION"] = "extension";
+})(eRulesetType = exports.eRulesetType || (exports.eRulesetType = {}));
+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;
+
+
+/***/ }),
+
+/***/ 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 IEngine_1 = __webpack_require__(9077);
+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 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,
+ level: rsSection.level,
+ toolkitLevel: rsSection.toolkitLevel
+ });
+ }
+ }
+ }
+ }
+ }
+ }
+}
+_initialize();
+var Checker = /** @class */ (function () {
+ function Checker() {
+ this.rulesets = [];
+ 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);
+ }
+ }
+ Checker.prototype.addRuleset = function (rs) {
+ this.rulesets.push(rs);
+ this.rulesetIds.push(rs.id);
+ var ruleIds = [];
+ for (var _i = 0, _a = rs.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];
+ ruleIds.push(rule.id);
+ this.ruleLevels[rule.id] = this.ruleLevels[rule.id] || {};
+ this.ruleLevels[rule.id][rs.id] = rule.level;
+ this.ruleCategory[rule.id] = this.ruleCategory[rule.id] || {};
+ this.ruleCategory[rule.id][rs.id] = rs.category;
+ }
+ }
+ this.rulesetRules[rs.id] = ruleIds;
+ };
+ Checker.prototype.check = function (node, rsIds) {
+ // Determine which rules to run
+ var ruleIds = [];
+ // Fix the input
+ if (!rsIds) {
+ ruleIds = this.engine.getRulesIds();
+ }
+ else {
+ if (typeof rsIds === "string") {
+ rsIds = [rsIds];
+ }
+ for (var _i = 0, rsIds_1 = rsIds; _i < rsIds_1.length; _i++) {
+ var rsId = rsIds_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(rsIds, result.ruleId);
+ result.category = myThis.getCategory(rsIds, result.ruleId);
+ delete result.path.css;
+ }
+ return report;
+ });
+ };
+ Checker.prototype.getLevel = function (rsIds, ruleId) {
+ if (!rsIds)
+ return IEngine_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_2 = rsIds; _i < rsIds_2.length; _i++) {
+ var rsId = rsIds_2[_i];
+ if (rsId in rsInfo) {
+ if (rsInfo[rsId] === IEngine_1.eRulePolicy.VIOLATION) {
+ retVal = IEngine_1.eRulePolicy.VIOLATION;
+ }
+ else if (rsInfo[rsId] === IEngine_1.eRulePolicy.RECOMMENDATION && retVal === null) {
+ retVal = IEngine_1.eRulePolicy.RECOMMENDATION;
+ }
+ else if (retVal === null) {
+ retVal = IEngine_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 IEngine_1.eRuleCategory.OTHER;
+ }
+ if (!rsIds) {
+ rsIds = this.rulesetIds;
+ }
+ for (var _i = 0, rsIds_3 = rsIds; _i < rsIds_3.length; _i++) {
+ var rsId = rsIds_3[_i];
+ if (rsId in rsInfo) {
+ return rsInfo[rsId];
+ }
+ }
+ return IEngine_1.eRuleCategory.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;
+ }
+ //check if the attribute 'aria-activedescendant' is valid for the role of the element
+ // 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", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.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 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", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.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 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 IRule_2 = __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"
+ }
+ },
+ 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: [],
+ 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", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.1"],
+ "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", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.1"],
+ "level": IRule_2.eRulePolicy.RECOMMENDATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE
+ }],
+ 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", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["4.1.1"],
+ "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 IRule_2 = __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"
+ }
+ },
+ rulesets: [{
+ "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0"],
+ "num": ["1.1.1"],
+ "level": IRule_2.eRulePolicy.VIOLATION,
+ "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO
+ }],
+ 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