UNPKG

angular-xml-editor

Version:
171 lines (170 loc) 18.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { XmlCursorPos, XMLCursorPositions } from '../cursor/xmlCursorPos.class'; import { Xml2html } from '../xml-html-converter/xml2html.class'; var XmlEditRuleCheckElements = /** @class */ (function () { function XmlEditRuleCheckElements(xsdNodes) { this.xsdNodes = xsdNodes; } /** * @param {?} cursorPosToCheck * @return {?} */ XmlEditRuleCheckElements.prototype.ElementsAllowedAtThisCursorPos = /** * @param {?} cursorPosToCheck * @return {?} */ function (cursorPosToCheck) { if (!cursorPosToCheck) { return []; } /** @type {?} */ var parentNode = this.getRelevantParentNodeForCursorPos(cursorPosToCheck); /** @type {?} */ var parentName = Xml2html.getTagNameFromNode(parentNode); /** @type {?} */ var xsdNode = this.xsdNodes.get(parentName); if (xsdNode) { /** @type {?} */ var result = this.getSubElementNames(xsdNode, []); return result; } else { // console.warn('element "' + parentName + '" not found'); return []; } }; /** * @param {?} cursorPosToCheck * @return {?} */ XmlEditRuleCheckElements.prototype.getRelevantParentNodeForCursorPos = /** * @param {?} cursorPosToCheck * @return {?} */ function (cursorPosToCheck) { if (cursorPosToCheck) { /** @type {?} */ var parentNode = cursorPosToCheck.ActualNode; switch (parentNode.nodeType) { case Node.COMMENT_NODE: case Node.TEXT_NODE: parentNode = parentNode.parentElement; break; case Node.ELEMENT_NODE: switch (cursorPosToCheck.PosAtNode) { case XMLCursorPositions.CursorInEmptyNode: case XMLCursorPositions.CursorInsideTextNode: break; case XMLCursorPositions.CursorBehindNode: case XMLCursorPositions.CursorInFrontOfNode: case XMLCursorPositions.CursorOnCompleteNode: parentNode = parentNode.parentElement; break; default: throw new Error("unhandled cursorPosToCheck.PosAmNode \"" + cursorPosToCheck.PosAtNode + "\"/" + XmlCursorPos.getXmlCursorPositionDebugName(cursorPosToCheck.PosAtNode) + "\" "); } break; default: throw new Error("unhandled parentNode.nodeType \"" + parentNode.nodeType + "\""); } return parentNode; } }; /** * @param {?} xsdNode * @param {?} alreadyAddedElementNames * @param {?=} depth * @return {?} */ XmlEditRuleCheckElements.prototype.getSubElementNames = /** * @param {?} xsdNode * @param {?} alreadyAddedElementNames * @param {?=} depth * @return {?} */ function (xsdNode, alreadyAddedElementNames, depth) { var _this = this; if (depth === void 0) { depth = 0; } /** @type {?} */ var elementNames = []; /** @type {?} */ var elementName; if (xsdNode.nodeType === Node.ELEMENT_NODE) { /** @type {?} */ var asElem = /** @type {?} */ (xsdNode); if (asElem) { if (asElem.localName === 'element') { elementName = asElem.getAttribute('name'); } } } if (elementName) { // console.warn('found: ' + JSON.stringify(elementName) + ' depth: ' + depth); if (alreadyAddedElementNames.length !== 0) { if (alreadyAddedElementNames.indexOf(elementName) !== -1) { return elementNames; // element recursion detected } if (depth === 0) { // is the parent element itself - skip! } else { elementNames = elementNames.concat(elementName); return elementNames; } } alreadyAddedElementNames.push(elementName); } /** @type {?} */ var childNodes = /** @type {?} */ (Array.prototype.slice.call(xsdNode.childNodes)); depth++; childNodes.forEach(function (child) { if (child.nodeType === Node.ELEMENT_NODE) { /** @type {?} */ var childElem = /** @type {?} */ (child); if (childElem) { switch (childElem.localName) { case 'complexType': case 'sequence': case 'choice': case 'simpleContent': case 'extension': elementNames = elementNames.concat(_this.getSubElementNames(child, alreadyAddedElementNames, depth)); break; case 'element': /** @type {?} */ var refname = childElem.attributes.getNamedItem('ref'); if (refname) { /** @type {?} */ var referedNode = _this.xsdNodes.get(refname.value); if (referedNode) { elementNames = elementNames.concat(_this.getSubElementNames(referedNode, alreadyAddedElementNames, depth)); } else { throw new Error(" refered element \"" + refname + "\" for element \"" + childElem.outerHTML + "\" not found"); } } else { elementNames = elementNames.concat(_this.getSubElementNames(child, alreadyAddedElementNames, depth)); } break; case 'attribute': break; default: throw new Error("unknown childElem.localname \"" + childElem.localName + "\"/" + childElem.outerHTML); } } } }); return elementNames; }; return XmlEditRuleCheckElements; }()); export { XmlEditRuleCheckElements }; if (false) { /** @type {?} */ XmlEditRuleCheckElements.prototype.xsdNodes; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sRWRpdFJ1bGVDaGVja0VsZW1lbnRzLmNsYXNzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci14bWwtZWRpdG9yLyIsInNvdXJjZXMiOlsibGliL2NvZGUveG1sLXJ1bGVzLWNoZWNrL3htbEVkaXRSdWxlQ2hlY2tFbGVtZW50cy5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVoRSxJQUFBO0lBQ0Usa0NBQW9CLFFBQThCO1FBQTlCLGFBQVEsR0FBUixRQUFRLENBQXNCO0tBQUk7Ozs7O0lBRXRELGlFQUE4Qjs7OztJQUE5QixVQUErQixnQkFBOEI7UUFDM0QsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3JCLE9BQU8sRUFBRSxDQUFDO1NBQ1g7O1FBQ0QsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLGdCQUFnQixDQUFDLENBQUM7O1FBQzVFLElBQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQzs7UUFDM0QsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUMsSUFBSSxPQUFPLEVBQUU7O1lBQ1gsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNwRCxPQUFPLE1BQU0sQ0FBQztTQUNmO2FBQU07O1lBRUwsT0FBTyxFQUFFLENBQUM7U0FDWDtLQUNGOzs7OztJQUVELG9FQUFpQzs7OztJQUFqQyxVQUFrQyxnQkFBOEI7UUFDOUQsSUFBSSxnQkFBZ0IsRUFBRTs7WUFDcEIsSUFBSSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDO1lBRTdDLFFBQVEsVUFBVSxDQUFDLFFBQVEsRUFBRTtnQkFDM0IsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDO2dCQUN2QixLQUFLLElBQUksQ0FBQyxTQUFTO29CQUNqQixVQUFVLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQztvQkFDdEMsTUFBTTtnQkFFUixLQUFLLElBQUksQ0FBQyxZQUFZO29CQUNwQixRQUFRLGdCQUFnQixDQUFDLFNBQVMsRUFBRTt3QkFDbEMsS0FBSyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQzt3QkFDMUMsS0FBSyxrQkFBa0IsQ0FBQyxvQkFBb0I7NEJBQzFDLE1BQU07d0JBRVIsS0FBSyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQzt3QkFDekMsS0FBSyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQzt3QkFDNUMsS0FBSyxrQkFBa0IsQ0FBQyxvQkFBb0I7NEJBQzFDLFVBQVUsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDOzRCQUN0QyxNQUFNO3dCQUVSOzRCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTBDLGdCQUFnQixDQUFDLFNBQVMsV0FBSyxZQUFZLENBQUMsNkJBQTZCLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFFBQUksQ0FBQyxDQUFDO3FCQUN4SztvQkFDRCxNQUFNO2dCQUVSO29CQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQW1DLFVBQVUsQ0FBQyxRQUFRLE9BQUcsQ0FBQyxDQUFDO2FBQzlFO1lBQ0QsT0FBTyxVQUFVLENBQUM7U0FDbkI7S0FDRjs7Ozs7OztJQUVNLHFEQUFrQjs7Ozs7O2NBQUMsT0FBYSxFQUFFLHdCQUFrQyxFQUFFLEtBQWlCOztRQUFqQixzQkFBQSxFQUFBLFNBQWlCOztRQUM1RixJQUFJLFlBQVksR0FBYSxFQUFFLENBQUM7O1FBQ2hDLElBQUksV0FBVyxDQUFTO1FBRXhCLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFOztZQUMxQyxJQUFNLE1BQU0scUJBQUcsT0FBa0IsRUFBQztZQUNsQyxJQUFJLE1BQU0sRUFBRTtnQkFDVixJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFO29CQUNsQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDM0M7YUFDRjtTQUNGO1FBRUQsSUFBSSxXQUFXLEVBQUU7O1lBRWYsSUFBSSx3QkFBd0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUN6QyxJQUFJLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDeEQsT0FBTyxZQUFZLENBQUM7aUJBQ3JCO2dCQUNELElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTs7aUJBRWhCO3FCQUFNO29CQUNMLFlBQVksR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUNoRCxPQUFPLFlBQVksQ0FBQztpQkFDckI7YUFDRjtZQUNELHdCQUF3QixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM1Qzs7UUFFRCxJQUFNLFVBQVUscUJBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQVcsRUFBQztRQUU1RSxLQUFLLEVBQUUsQ0FBQztRQUVSLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBQSxLQUFLO1lBQ3RCLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFOztnQkFDeEMsSUFBTSxTQUFTLHFCQUFHLEtBQWdCLEVBQUM7Z0JBQ25DLElBQUksU0FBUyxFQUFFO29CQUNiLFFBQVEsU0FBUyxDQUFDLFNBQVMsRUFBRTt3QkFDM0IsS0FBSyxhQUFhLENBQUM7d0JBQ25CLEtBQUssVUFBVSxDQUFDO3dCQUNoQixLQUFLLFFBQVEsQ0FBQzt3QkFDZCxLQUFLLGVBQWUsQ0FBQzt3QkFDckIsS0FBSyxXQUFXOzRCQUNkLFlBQVksR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQzs0QkFDcEcsTUFBTTt3QkFFUixLQUFLLFNBQVM7OzRCQUNaLElBQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUN6RCxJQUFJLE9BQU8sRUFBRTs7Z0NBQ1gsSUFBTSxXQUFXLEdBQUcsS0FBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dDQUNyRCxJQUFJLFdBQVcsRUFBRTtvQ0FDZixZQUFZLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7aUNBQzNHO3FDQUFNO29DQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXFCLE9BQU8seUJBQWtCLFNBQVMsQ0FBQyxTQUFTLGlCQUFhLENBQUMsQ0FBQztpQ0FDakc7NkJBQ0Y7aUNBQU07Z0NBQ0wsWUFBWSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDOzZCQUNyRzs0QkFDRCxNQUFNO3dCQUVSLEtBQUssV0FBVzs0QkFDZCxNQUFNO3dCQUVSOzRCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQWdDLFNBQVMsQ0FBQyxTQUFTLFdBQUssU0FBUyxDQUFDLFNBQVcsQ0FBQyxDQUFDO3FCQUNsRztpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsT0FBTyxZQUFZLENBQUM7O21DQTlIeEI7SUFnSUMsQ0FBQTtBQTdIRCxvQ0E2SEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBYbWxDdXJzb3JQb3MsIFhNTEN1cnNvclBvc2l0aW9ucyB9IGZyb20gJy4uL2N1cnNvci94bWxDdXJzb3JQb3MuY2xhc3MnO1xyXG5pbXBvcnQgeyBYbWwyaHRtbCB9IGZyb20gJy4uL3htbC1odG1sLWNvbnZlcnRlci94bWwyaHRtbC5jbGFzcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgWG1sRWRpdFJ1bGVDaGVja0VsZW1lbnRzIHtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHhzZE5vZGVzOiBNYXA8c3RyaW5nLCBFbGVtZW50Pikge31cclxuXHJcbiAgRWxlbWVudHNBbGxvd2VkQXRUaGlzQ3Vyc29yUG9zKGN1cnNvclBvc1RvQ2hlY2s6IFhtbEN1cnNvclBvcyk6IHN0cmluZ1tdIHtcclxuICAgIGlmICghY3Vyc29yUG9zVG9DaGVjaykge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5nZXRSZWxldmFudFBhcmVudE5vZGVGb3JDdXJzb3JQb3MoY3Vyc29yUG9zVG9DaGVjayk7XHJcbiAgICBjb25zdCBwYXJlbnROYW1lID0gWG1sMmh0bWwuZ2V0VGFnTmFtZUZyb21Ob2RlKHBhcmVudE5vZGUpO1xyXG4gICAgY29uc3QgeHNkTm9kZSA9IHRoaXMueHNkTm9kZXMuZ2V0KHBhcmVudE5hbWUpO1xyXG4gICAgaWYgKHhzZE5vZGUpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXRTdWJFbGVtZW50TmFtZXMoeHNkTm9kZSwgW10pO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gY29uc29sZS53YXJuKCdlbGVtZW50IFwiJyArIHBhcmVudE5hbWUgKyAnXCIgbm90IGZvdW5kJyk7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFJlbGV2YW50UGFyZW50Tm9kZUZvckN1cnNvclBvcyhjdXJzb3JQb3NUb0NoZWNrOiBYbWxDdXJzb3JQb3MpOiBOb2RlIHtcclxuICAgIGlmIChjdXJzb3JQb3NUb0NoZWNrKSB7XHJcbiAgICAgIGxldCBwYXJlbnROb2RlID0gY3Vyc29yUG9zVG9DaGVjay5BY3R1YWxOb2RlO1xyXG5cclxuICAgICAgc3dpdGNoIChwYXJlbnROb2RlLm5vZGVUeXBlKSB7XHJcbiAgICAgICAgY2FzZSBOb2RlLkNPTU1FTlRfTk9ERTpcclxuICAgICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFOlxyXG4gICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOlxyXG4gICAgICAgICAgc3dpdGNoIChjdXJzb3JQb3NUb0NoZWNrLlBvc0F0Tm9kZSkge1xyXG4gICAgICAgICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JJbkVtcHR5Tm9kZTpcclxuICAgICAgICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5zaWRlVGV4dE5vZGU6XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JCZWhpbmROb2RlOlxyXG4gICAgICAgICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JJbkZyb250T2ZOb2RlOlxyXG4gICAgICAgICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JPbkNvbXBsZXRlTm9kZTpcclxuICAgICAgICAgICAgICBwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuaGFuZGxlZCAgY3Vyc29yUG9zVG9DaGVjay5Qb3NBbU5vZGUgXCIke2N1cnNvclBvc1RvQ2hlY2suUG9zQXROb2RlfVwiLyR7WG1sQ3Vyc29yUG9zLmdldFhtbEN1cnNvclBvc2l0aW9uRGVidWdOYW1lKGN1cnNvclBvc1RvQ2hlY2suUG9zQXROb2RlKX1cIiBgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmhhbmRsZWQgIHBhcmVudE5vZGUubm9kZVR5cGUgXCIke3BhcmVudE5vZGUubm9kZVR5cGV9XCJgKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcGFyZW50Tm9kZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRTdWJFbGVtZW50TmFtZXMoeHNkTm9kZTogTm9kZSwgYWxyZWFkeUFkZGVkRWxlbWVudE5hbWVzOiBzdHJpbmdbXSwgZGVwdGg6IG51bWJlciA9IDApOiBzdHJpbmdbXSB7XHJcbiAgICBsZXQgZWxlbWVudE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgbGV0IGVsZW1lbnROYW1lOiBzdHJpbmc7XHJcblxyXG4gICAgaWYgKHhzZE5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XHJcbiAgICAgIGNvbnN0IGFzRWxlbSA9IHhzZE5vZGUgYXMgRWxlbWVudDtcclxuICAgICAgaWYgKGFzRWxlbSkge1xyXG4gICAgICAgIGlmIChhc0VsZW0ubG9jYWxOYW1lID09PSAnZWxlbWVudCcpIHtcclxuICAgICAgICAgIGVsZW1lbnROYW1lID0gYXNFbGVtLmdldEF0dHJpYnV0ZSgnbmFtZScpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChlbGVtZW50TmFtZSkge1xyXG4gICAgICAvLyBjb25zb2xlLndhcm4oJ2ZvdW5kOiAnICsgSlNPTi5zdHJpbmdpZnkoZWxlbWVudE5hbWUpICsgJyBkZXB0aDogJyArIGRlcHRoKTtcclxuICAgICAgaWYgKGFscmVhZHlBZGRlZEVsZW1lbnROYW1lcy5sZW5ndGggIT09IDApIHtcclxuICAgICAgICBpZiAoYWxyZWFkeUFkZGVkRWxlbWVudE5hbWVzLmluZGV4T2YoZWxlbWVudE5hbWUpICE9PSAtMSkge1xyXG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnROYW1lczsgLy8gZWxlbWVudCByZWN1cnNpb24gZGV0ZWN0ZWRcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XHJcbiAgICAgICAgICAvLyBpcyB0aGUgcGFyZW50IGVsZW1lbnQgaXRzZWxmIC0gc2tpcCFcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZWxlbWVudE5hbWVzID0gZWxlbWVudE5hbWVzLmNvbmNhdChlbGVtZW50TmFtZSk7XHJcbiAgICAgICAgICByZXR1cm4gZWxlbWVudE5hbWVzO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBhbHJlYWR5QWRkZWRFbGVtZW50TmFtZXMucHVzaChlbGVtZW50TmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2hpbGROb2RlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHhzZE5vZGUuY2hpbGROb2RlcykgYXMgTm9kZVtdO1xyXG5cclxuICAgIGRlcHRoKys7XHJcblxyXG4gICAgY2hpbGROb2Rlcy5mb3JFYWNoKGNoaWxkID0+IHtcclxuICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xyXG4gICAgICAgIGNvbnN0IGNoaWxkRWxlbSA9IGNoaWxkIGFzIEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKGNoaWxkRWxlbSkge1xyXG4gICAgICAgICAgc3dpdGNoIChjaGlsZEVsZW0ubG9jYWxOYW1lKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBsZXhUeXBlJzpcclxuICAgICAgICAgICAgY2FzZSAnc2VxdWVuY2UnOlxyXG4gICAgICAgICAgICBjYXNlICdjaG9pY2UnOlxyXG4gICAgICAgICAgICBjYXNlICdzaW1wbGVDb250ZW50JzpcclxuICAgICAgICAgICAgY2FzZSAnZXh0ZW5zaW9uJzpcclxuICAgICAgICAgICAgICBlbGVtZW50TmFtZXMgPSBlbGVtZW50TmFtZXMuY29uY2F0KHRoaXMuZ2V0U3ViRWxlbWVudE5hbWVzKGNoaWxkLCBhbHJlYWR5QWRkZWRFbGVtZW50TmFtZXMsIGRlcHRoKSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlICdlbGVtZW50JzpcclxuICAgICAgICAgICAgICBjb25zdCByZWZuYW1lID0gY2hpbGRFbGVtLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCdyZWYnKTtcclxuICAgICAgICAgICAgICBpZiAocmVmbmFtZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmZXJlZE5vZGUgPSB0aGlzLnhzZE5vZGVzLmdldChyZWZuYW1lLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZWZlcmVkTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZXMgPSBlbGVtZW50TmFtZXMuY29uY2F0KHRoaXMuZ2V0U3ViRWxlbWVudE5hbWVzKHJlZmVyZWROb2RlLCBhbHJlYWR5QWRkZWRFbGVtZW50TmFtZXMsIGRlcHRoKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCByZWZlcmVkIGVsZW1lbnQgXCIke3JlZm5hbWV9XCIgZm9yIGVsZW1lbnQgXCIke2NoaWxkRWxlbS5vdXRlckhUTUx9XCIgbm90IGZvdW5kYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lcyA9IGVsZW1lbnROYW1lcy5jb25jYXQodGhpcy5nZXRTdWJFbGVtZW50TmFtZXMoY2hpbGQsIGFscmVhZHlBZGRlZEVsZW1lbnROYW1lcywgZGVwdGgpKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlICdhdHRyaWJ1dGUnOlxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gY2hpbGRFbGVtLmxvY2FsbmFtZSBcIiR7Y2hpbGRFbGVtLmxvY2FsTmFtZX1cIi8ke2NoaWxkRWxlbS5vdXRlckhUTUx9YCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gZWxlbWVudE5hbWVzO1xyXG4gIH1cclxufVxyXG4iXX0=