UNPKG

angular-xml-editor

Version:
218 lines (217 loc) 20.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { XmlCursorPos, XMLCursorPositions } from '../cursor/xmlCursorPos.class'; import { XmlRuleAttribut } from './xmlRuleAttribut.class'; import { Xml2html } from '../xml-html-converter/xml2html.class'; var XmlEditRuleCheckAttributes = /** @class */ (function () { function XmlEditRuleCheckAttributes(xmlSchema) { this.xmlSchema = xmlSchema; } /** * @param {?} cursorPosToCheck * @return {?} */ XmlEditRuleCheckAttributes.prototype.AttributesAllowedAtThisCursorPos = /** * @param {?} cursorPosToCheck * @return {?} */ function (cursorPosToCheck) { if (!cursorPosToCheck) { return []; } /** @type {?} */ var parentNode = this.getRelevantParentNodeForCursorPos(cursorPosToCheck); /** @type {?} */ var parentName = Xml2html.getTagNameFromNode(parentNode); return this.getAttributesForElementName(parentName); }; /** * @param {?} cursorPosToCheck * @return {?} */ XmlEditRuleCheckAttributes.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: case XMLCursorPositions.CursorOnCompleteNode: break; case XMLCursorPositions.CursorBehindNode: case XMLCursorPositions.CursorInFrontOfNode: 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 {?} elementName * @return {?} */ XmlEditRuleCheckAttributes.prototype.getAttributesForElementName = /** * @param {?} elementName * @return {?} */ function (elementName) { /** @type {?} */ var xsdNode = this.xmlSchema.findXsdNodeForTagName(elementName); return this.getAttributesForElement(xsdNode, new Set([xsdNode])); }; /** * @param {?} xsdNode * @param {?} alreadyAddedElements * @return {?} */ XmlEditRuleCheckAttributes.prototype.getAttributesForElement = /** * @param {?} xsdNode * @param {?} alreadyAddedElements * @return {?} */ function (xsdNode, alreadyAddedElements) { var _this = this; /** @type {?} */ var attributes = []; if (xsdNode) { alreadyAddedElements.add(xsdNode); /** @type {?} */ var childNodes = Array.prototype.slice.call(xsdNode.childNodes); childNodes.forEach(function (child) { if (xsdNode.nodeType === Node.ELEMENT_NODE) { /** @type {?} */ var childElem = /** @type {?} */ (child); if (childElem) { if (child.localName === 'attribute') { // is attribute attributes = attributes.concat([ new XmlRuleAttribut({ attribName: childElem.attributes.getNamedItem('name').value, required: _this.isRequiredAttribute(childElem), xsdRawNode: childElem, fixedValues: _this.getFixedValues(childElem), defaultValue: _this.getDefaultValue(childElem) }) ]); } else { // no attribute if (!alreadyAddedElements.has(child)) { /** @type {?} */ var subNodeAttributes = _this.getAttributesForElement(child, alreadyAddedElements); attributes = attributes.concat(subNodeAttributes); } else { // Element already added } } } } }); } return attributes; }; /** * the default value for this attribute * @param {?} childElem * @return {?} */ XmlEditRuleCheckAttributes.prototype.getDefaultValue = /** * the default value for this attribute * @param {?} childElem * @return {?} */ function (childElem) { /** @type {?} */ var attrib = childElem.attributes.getNamedItem('default'); if (attrib !== null) { return attrib.value; } return undefined; }; /** * is this attribute required? * @param {?} childElem * @return {?} */ XmlEditRuleCheckAttributes.prototype.isRequiredAttribute = /** * is this attribute required? * @param {?} childElem * @return {?} */ function (childElem) { /** @type {?} */ var attrib = childElem.attributes.getNamedItem('use'); /** @type {?} */ var value = attrib !== null && attrib.value === 'required'; return value; }; /** * get the allowes values for this attribute * @param {?} xsdNode * @param {?=} alreadyChecked * @return {?} */ XmlEditRuleCheckAttributes.prototype.getFixedValues = /** * get the allowes values for this attribute * @param {?} xsdNode * @param {?=} alreadyChecked * @return {?} */ function (xsdNode, alreadyChecked) { var _this = this; if (alreadyChecked === void 0) { alreadyChecked = []; } /** @type {?} */ var values = []; /** @type {?} */ var childNodes = Array.prototype.slice.call(xsdNode.childNodes); childNodes.forEach(function (child) { if (xsdNode.nodeType === Node.ELEMENT_NODE) { /** @type {?} */ var childElem = /** @type {?} */ (child); if (childElem) { if (child.localName === 'enumeration') { values = values.concat([childElem.attributes.getNamedItem('value').value]); } else { // no attribute if (alreadyChecked.indexOf(child) === -1) { /** @type {?} */ var subNodeAttributes = _this.getFixedValues(child, alreadyChecked); values = values.concat(subNodeAttributes); } else { // Element already added } } } } }); return values; }; return XmlEditRuleCheckAttributes; }()); export { XmlEditRuleCheckAttributes }; if (false) { /** @type {?} */ XmlEditRuleCheckAttributes.prototype.xmlSchema; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sRWRpdFJ1bGVDaGVja0F0dHJpYnV0ZXMuY2xhc3MuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLXhtbC1lZGl0b3IvIiwic291cmNlcyI6WyJsaWIvY29kZS94bWwtcnVsZXMtY2hlY2sveG1sRWRpdFJ1bGVDaGVja0F0dHJpYnV0ZXMuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRWhFLElBQUE7SUFDRSxvQ0FBb0IsU0FBb0I7UUFBcEIsY0FBUyxHQUFULFNBQVMsQ0FBVztLQUFJOzs7OztJQUU1QyxxRUFBZ0M7Ozs7SUFBaEMsVUFBaUMsZ0JBQThCO1FBQzdELElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUNyQixPQUFPLEVBQUUsQ0FBQztTQUNYOztRQUNELElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDOztRQUM1RSxJQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0QsT0FBTyxJQUFJLENBQUMsMkJBQTJCLENBQUMsVUFBVSxDQUFDLENBQUM7S0FDckQ7Ozs7O0lBRUQsc0VBQWlDOzs7O0lBQWpDLFVBQWtDLGdCQUE4QjtRQUM5RCxJQUFJLGdCQUFnQixFQUFFOztZQUNwQixJQUFJLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUM7WUFFN0MsUUFBUSxVQUFVLENBQUMsUUFBUSxFQUFFO2dCQUMzQixLQUFLLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQ3ZCLEtBQUssSUFBSSxDQUFDLFNBQVM7b0JBQ2pCLFVBQVUsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDO29C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QUFDLEVBQUU7OzRCQUN4QyxJQUFNLGlCQUFpQixHQUFHLEtBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDOzRCQUNyRSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO3lCQUMzQzs2QkFBTTs7eUJBRU47cUJBQ0Y7aUJBQ0Y7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBTSxDQUFDOztxQ0F4SWxCO0lBMElDLENBQUE7QUFySUQsc0NBcUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgWG1sQ3Vyc29yUG9zLCBYTUxDdXJzb3JQb3NpdGlvbnMgfSBmcm9tICcuLi9jdXJzb3IveG1sQ3Vyc29yUG9zLmNsYXNzJztcclxuaW1wb3J0IHsgWG1sUnVsZUF0dHJpYnV0IH0gZnJvbSAnLi94bWxSdWxlQXR0cmlidXQuY2xhc3MnO1xyXG5pbXBvcnQgeyBYbWxTY2hlbWEgfSBmcm9tICcuL3htbFNjaGVtYS5jbGFzcyc7XHJcbmltcG9ydCB7IFhtbDJodG1sIH0gZnJvbSAnLi4veG1sLWh0bWwtY29udmVydGVyL3htbDJodG1sLmNsYXNzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBYbWxFZGl0UnVsZUNoZWNrQXR0cmlidXRlcyB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB4bWxTY2hlbWE6IFhtbFNjaGVtYSkge31cclxuXHJcbiAgQXR0cmlidXRlc0FsbG93ZWRBdFRoaXNDdXJzb3JQb3MoY3Vyc29yUG9zVG9DaGVjazogWG1sQ3Vyc29yUG9zKTogWG1sUnVsZUF0dHJpYnV0W10ge1xyXG4gICAgaWYgKCFjdXJzb3JQb3NUb0NoZWNrKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLmdldFJlbGV2YW50UGFyZW50Tm9kZUZvckN1cnNvclBvcyhjdXJzb3JQb3NUb0NoZWNrKTtcclxuICAgIGNvbnN0IHBhcmVudE5hbWUgPSBYbWwyaHRtbC5nZXRUYWdOYW1lRnJvbU5vZGUocGFyZW50Tm9kZSk7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzRm9yRWxlbWVudE5hbWUocGFyZW50TmFtZSk7XHJcbiAgfVxyXG5cclxuICBnZXRSZWxldmFudFBhcmVudE5vZGVGb3JDdXJzb3JQb3MoY3Vyc29yUG9zVG9DaGVjazogWG1sQ3Vyc29yUG9zKTogTm9kZSB7XHJcbiAgICBpZiAoY3Vyc29yUG9zVG9DaGVjaykge1xyXG4gICAgICBsZXQgcGFyZW50Tm9kZSA9IGN1cnNvclBvc1RvQ2hlY2suQWN0dWFsTm9kZTtcclxuXHJcbiAgICAgIHN3aXRjaCAocGFyZW50Tm9kZS5ub2RlVHlwZSkge1xyXG4gICAgICAgIGNhc2UgTm9kZS5DT01NRU5UX05PREU6XHJcbiAgICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERTpcclxuICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpcclxuICAgICAgICAgIHN3aXRjaCAoY3Vyc29yUG9zVG9DaGVjay5Qb3NBdE5vZGUpIHtcclxuICAgICAgICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5FbXB0eU5vZGU6XHJcbiAgICAgICAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluc2lkZVRleHROb2RlOlxyXG4gICAgICAgICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JPbkNvbXBsZXRlTm9kZTpcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckJlaGluZE5vZGU6XHJcbiAgICAgICAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRnJvbnRPZk5vZGU6XHJcbiAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmhhbmRsZWQgY3Vyc29yUG9zVG9DaGVjay5Qb3NBbU5vZGUgXCIke2N1cnNvclBvc1RvQ2hlY2suUG9zQXROb2RlfVwiLyR7WG1sQ3Vyc29yUG9zLmdldFhtbEN1cnNvclBvc2l0aW9uRGVidWdOYW1lKGN1cnNvclBvc1RvQ2hlY2suUG9zQXROb2RlKX1cIiBgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmhhbmRsZWQgcGFyZW50Tm9kZS5ub2RlVHlwZSBcIiR7cGFyZW50Tm9kZS5ub2RlVHlwZX1cImApO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBwYXJlbnROb2RlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0QXR0cmlidXRlc0ZvckVsZW1lbnROYW1lKGVsZW1lbnROYW1lOiBzdHJpbmcpOiBYbWxSdWxlQXR0cmlidXRbXSB7XHJcbiAgICBjb25zdCB4c2ROb2RlID0gdGhpcy54bWxTY2hlbWEuZmluZFhzZE5vZGVGb3JUYWdOYW1lKGVsZW1lbnROYW1lKTtcclxuICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXNGb3JFbGVtZW50KHhzZE5vZGUsIG5ldyBTZXQoW3hzZE5vZGVdKSk7XHJcbiAgfVxyXG5cclxuICBnZXRBdHRyaWJ1dGVzRm9yRWxlbWVudCh4c2ROb2RlOiBOb2RlLCBhbHJlYWR5QWRkZWRFbGVtZW50czogU2V0PE5vZGU+KTogWG1sUnVsZUF0dHJpYnV0W10ge1xyXG4gICAgbGV0IGF0dHJpYnV0ZXM6IFhtbFJ1bGVBdHRyaWJ1dFtdID0gW107XHJcblxyXG4gICAgaWYgKHhzZE5vZGUpIHtcclxuICAgICAgYWxyZWFkeUFkZGVkRWxlbWVudHMuYWRkKHhzZE5vZGUpO1xyXG5cclxuICAgICAgY29uc3QgY2hpbGROb2RlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHhzZE5vZGUuY2hpbGROb2Rlcyk7XHJcblxyXG4gICAgICBjaGlsZE5vZGVzLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICAgIGlmICh4c2ROb2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xyXG4gICAgICAgICAgY29uc3QgY2hpbGRFbGVtID0gY2hpbGQgYXMgRWxlbWVudDtcclxuICAgICAgICAgIGlmIChjaGlsZEVsZW0pIHtcclxuICAgICAgICAgICAgaWYgKGNoaWxkLmxvY2FsTmFtZSA9PT0gJ2F0dHJpYnV0ZScpIHtcclxuICAgICAgICAgICAgICAvLyBpcyBhdHRyaWJ1dGVcclxuICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gYXR0cmlidXRlcy5jb25jYXQoW1xyXG4gICAgICAgICAgICAgICAgbmV3IFhtbFJ1bGVBdHRyaWJ1dCh7XHJcbiAgICAgICAgICAgICAgICAgIGF0dHJpYk5hbWU6IGNoaWxkRWxlbS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgnbmFtZScpLnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgICByZXF1aXJlZDogdGhpcy5pc1JlcXVpcmVkQXR0cmlidXRlKGNoaWxkRWxlbSksXHJcbiAgICAgICAgICAgICAgICAgIHhzZFJhd05vZGU6IGNoaWxkRWxlbSxcclxuICAgICAgICAgICAgICAgICAgZml4ZWRWYWx1ZXM6IHRoaXMuZ2V0Rml4ZWRWYWx1ZXMoY2hpbGRFbGVtKSxcclxuICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiB0aGlzLmdldERlZmF1bHRWYWx1ZShjaGlsZEVsZW0pXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIG5vIGF0dHJpYnV0ZVxyXG4gICAgICAgICAgICAgIGlmICghYWxyZWFkeUFkZGVkRWxlbWVudHMuaGFzKGNoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViTm9kZUF0dHJpYnV0ZXMgPSB0aGlzLmdldEF0dHJpYnV0ZXNGb3JFbGVtZW50KGNoaWxkLCBhbHJlYWR5QWRkZWRFbGVtZW50cyk7XHJcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gYXR0cmlidXRlcy5jb25jYXQoc3ViTm9kZUF0dHJpYnV0ZXMpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBFbGVtZW50IGFscmVhZHkgYWRkZWRcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhdHRyaWJ1dGVzO1xyXG4gIH1cclxuXHJcbiAgLyoqIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZSAqL1xyXG4gIHByaXZhdGUgZ2V0RGVmYXVsdFZhbHVlKGNoaWxkRWxlbTogRWxlbWVudCkge1xyXG4gICAgY29uc3QgYXR0cmliID0gY2hpbGRFbGVtLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCdkZWZhdWx0Jyk7XHJcbiAgICBpZiAoYXR0cmliICE9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBhdHRyaWIudmFsdWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqIGlzIHRoaXMgYXR0cmlidXRlIHJlcXVpcmVkPyAqL1xyXG4gIHByaXZhdGUgaXNSZXF1aXJlZEF0dHJpYnV0ZShjaGlsZEVsZW06IEVsZW1lbnQpIHtcclxuICAgIGNvbnN0IGF0dHJpYiA9IGNoaWxkRWxlbS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgndXNlJyk7XHJcbiAgICBjb25zdCB2YWx1ZSA9IGF0dHJpYiAhPT0gbnVsbCAmJiBhdHRyaWIudmFsdWUgPT09ICdyZXF1aXJlZCc7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKiogZ2V0IHRoZSBhbGxvd2VzIHZhbHVlcyBmb3IgdGhpcyBhdHRyaWJ1dGUgKi9cclxuICBwcml2YXRlIGdldEZpeGVkVmFsdWVzKHhzZE5vZGU6IEVsZW1lbnQsIGFscmVhZHlDaGVja2VkOiBOb2RlW10gPSBbXSk6IHN0cmluZ1tdIHtcclxuICAgIGxldCB2YWx1ZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgY29uc3QgY2hpbGROb2RlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHhzZE5vZGUuY2hpbGROb2Rlcyk7XHJcbiAgICBjaGlsZE5vZGVzLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICBpZiAoeHNkTm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcclxuICAgICAgICBjb25zdCBjaGlsZEVsZW0gPSBjaGlsZCBhcyBFbGVtZW50O1xyXG4gICAgICAgIGlmIChjaGlsZEVsZW0pIHtcclxuICAgICAgICAgIGlmIChjaGlsZC5sb2NhbE5hbWUgPT09ICdlbnVtZXJhdGlvbicpIHtcclxuICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdChbY2hpbGRFbGVtLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCd2YWx1ZScpLnZhbHVlXSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBubyBhdHRyaWJ1dGVcclxuICAgICAgICAgICAgaWYgKGFscmVhZHlDaGVja2VkLmluZGV4T2YoY2hpbGQpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHN1Yk5vZGVBdHRyaWJ1dGVzID0gdGhpcy5nZXRGaXhlZFZhbHVlcyhjaGlsZCwgYWxyZWFkeUNoZWNrZWQpO1xyXG4gICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQoc3ViTm9kZUF0dHJpYnV0ZXMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIEVsZW1lbnQgYWxyZWFkeSBhZGRlZFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdmFsdWVzO1xyXG4gIH1cclxufVxyXG4iXX0=