UNPKG

angular-xml-editor

Version:
263 lines (262 loc) 28.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { XmlToolbox } from '../xmlToolbox.class'; import { DomDummyNodeManager } from '../dummyNodes/domDummyNodeManager.class'; import { Xml2html } from '../xml-html-converter/xml2html.class'; export class XmlCursorPos { /** * @param {?} position * @return {?} */ static getXmlCursorPositionDebugName(position) { switch (position) { case XMLCursorPositions.CursorOnCompleteNode: return 'CursorOnCompleteNode'; case XMLCursorPositions.CursorBehindNode: return 'CursorBehindNode'; case XMLCursorPositions.CursorInEmptyNode: return 'CursorInEmptyNode'; case XMLCursorPositions.CursorInsideTextNode: return 'CursorInsideTextNode'; case XMLCursorPositions.CursorInFrontOfNode: return 'CursorInFrontOfNode'; default: return `unknown cursorPos ${position}`; } } /** * @param {?} pos * @return {?} */ static getSelectionForPos(pos) { if (DomDummyNodeManager.IsDummyNode(pos.ActualNode)) { throw new Error(`XmlCursorPos.getSelectionForPos: pos.AktNode ${pos.getDebugDescription()} is a dummy node!`); } if (DomDummyNodeManager.IsDummyNode(pos.ActualNode.parentElement)) { throw new Error(`XmlCursorPos.getSelectionForPos: pos.AktNode.parentElement ${pos.getDebugDescription()} is a dummy node!`); } switch (pos.PosAtNode) { case XMLCursorPositions.CursorOnCompleteNode: // (0) /** @type {?} */ let firstChild = pos.ActualNode.firstChild; if (DomDummyNodeManager.IsBeforeFirstTagDummyNode(firstChild)) { return { node: firstChild.firstChild, // text inside BeforeFirstTagDummyNod offset: 0 }; } else { return { node: pos.ActualNode, offset: 0 }; } case XMLCursorPositions.CursorInFrontOfNode: // (1) // (1) if (pos.ActualNode.nodeType === Node.TEXT_NODE) { /** @type {?} */ const dummyBefore = pos.ActualNode.previousSibling; if (DomDummyNodeManager.IsDummyNode(dummyBefore)) { return { node: dummyBefore.firstChild, // before text node offset: 1 }; } else { throw new Error('XMLCursorPositions.CursorInFrontOfNode (1):text node: is no dummy node: ' + pos.getDebugDescription()); } } else { // no text node firstChild = pos.ActualNode.firstChild; if (DomDummyNodeManager.IsBeforeFirstTagDummyNode(firstChild)) { return { node: firstChild.firstChild, // text inside BeforeFirstTagDummyNod offset: 1 }; } if (Xml2html.isNoClosingElement(pos.ActualNode) && DomDummyNodeManager.IsDummyNode(firstChild)) { return { node: firstChild.firstChild, offset: 1 }; } throw new Error('XMLCursorPositions.CursorInFrontOfNode (1):no text node: dont know what to do! '); } break; case XMLCursorPositions.CursorBehindNode: // (7, 11) /** @type {?} */ const dummyAfter = pos.ActualNode.nextSibling; if (DomDummyNodeManager.IsDummyNode(dummyAfter)) { return { node: dummyAfter.firstChild, // before text node offset: 0 }; } else { throw new Error(`XMLCursorPositionen.CursorBehindNode should only be set, when the element has no next sibling.`); } case XMLCursorPositions.CursorInEmptyNode: /** @type {?} */ const lastChild = pos.ActualNode.lastChild; if (!DomDummyNodeManager.IsDummyNode(firstChild) && !DomDummyNodeManager.IsBeforeFirstTagDummyNode(firstChild)) { return { node: lastChild.firstChild, // text inside DummyNode offset: 0 }; } break; case XMLCursorPositions.CursorInsideTextNode: return { node: pos.ActualNode, offset: pos.PosInTextnode }; } throw new Error(`showCursor.getSelectionForPos unknown CursorPos ${pos.getDebugDescription()}`); } constructor() { this.ActualNode = null; // no node selected this.PosAtNode = XMLCursorPositions.CursorOnCompleteNode; this.PosInTextnode = 0; } /** * @return {?} */ clone() { /** @type {?} */ const klon = new XmlCursorPos(); klon.SetCursor(this.ActualNode, this.PosAtNode, this.PosInTextnode); return klon; } /** * @param {?} otherPos * @return {?} */ equals(otherPos) { if (!otherPos) { return false; } if (otherPos.ActualNode !== this.ActualNode) { return false; } if (otherPos.PosAtNode !== this.PosAtNode) { return false; } if (this.PosAtNode === XMLCursorPositions.CursorInsideTextNode && this.PosInTextnode !== otherPos.PosInTextnode) { return false; } return true; } /** * @return {?} */ getDebugDescription() { return `node:${XmlToolbox.GetNodeDebugContext(this.ActualNode)}, pos:${XmlCursorPos.getXmlCursorPositionDebugName(this.PosAtNode)}, posInText:${this.PosInTextnode}`; } /** * @param {?} actualNode * @param {?} posAtNode * @param {?=} posInTextnode * @return {?} */ SetCursor(actualNode, posAtNode, posInTextnode = 0) { if (!actualNode) { throw new Error('actualNode is null'); } /** @type {?} */ let changed; if (actualNode !== this.ActualNode) { changed = true; } else { if (posAtNode !== this.PosAtNode) { changed = true; } else { if (posInTextnode !== this.PosInTextnode) { changed = true; } else { changed = false; } } } this.ActualNode = actualNode; this.PosAtNode = posAtNode; this.PosInTextnode = posInTextnode; // console.log(`SetCursor: ${this.getDebugDescription()}`); if (changed) { // PosChanged(EventArgs.Empty); // inform you that the cursor has now been changed } } /** * @param {?} node * @return {?} */ setCursorBehindNodeForDefaultOrRightMovement(node) { /** @type {?} */ const nextSibling = DomDummyNodeManager.getNextSibling(node); if (nextSibling) { this.SetCursor(nextSibling, XMLCursorPositions.CursorInFrontOfNode); } else { this.SetCursor(node, XMLCursorPositions.CursorBehindNode); } } /** * @param {?} node * @return {?} */ setCursorpBehindNodeForLeftMovement(node) { if (XmlToolbox.IsTextOrCommentNode(node)) { // For a text node, the cursor is placed after the last character. this.SetCursor(node, XMLCursorPositions.CursorInsideTextNode, Math.max(0, node.textContent.length - 1)); } else { /** @type {?} */ const childNodeCount = DomDummyNodeManager.getChildNodeCount(node); if (childNodeCount === 0) { // There are no children in the node. if (!Xml2html.isNoClosingElement(node)) { // If the cursor shows a close tag, then put it in the empty node this.SetCursor(node, XMLCursorPositions.CursorInEmptyNode); } else { // If the cursor does not display a close tag, then place it before the empty node. this.SetCursor(node, XMLCursorPositions.CursorInFrontOfNode); } } else { // There are children in node this.SetCursor(DomDummyNodeManager.getLastChild(node), XMLCursorPositions.CursorBehindNode); } } } } if (false) { /** @type {?} */ XmlCursorPos.prototype.ActualNode; /** @type {?} */ XmlCursorPos.prototype.PosAtNode; /** @type {?} */ XmlCursorPos.prototype.PosInTextnode; } /** @enum {number} */ const XMLCursorPositions = { CursorInFrontOfNode: 0, CursorOnCompleteNode: 1, CursorInEmptyNode: 2, CursorInsideTextNode: 3, CursorBehindNode: 4, }; export { XMLCursorPositions }; XMLCursorPositions[XMLCursorPositions.CursorInFrontOfNode] = 'CursorInFrontOfNode'; XMLCursorPositions[XMLCursorPositions.CursorOnCompleteNode] = 'CursorOnCompleteNode'; XMLCursorPositions[XMLCursorPositions.CursorInEmptyNode] = 'CursorInEmptyNode'; XMLCursorPositions[XMLCursorPositions.CursorInsideTextNode] = 'CursorInsideTextNode'; XMLCursorPositions[XMLCursorPositions.CursorBehindNode] = 'CursorBehindNode'; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sQ3Vyc29yUG9zLmNsYXNzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci14bWwtZWRpdG9yLyIsInNvdXJjZXMiOlsibGliL2NvZGUvY3Vyc29yL3htbEN1cnNvclBvcy5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWpELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVoRSxNQUFNOzs7OztJQUtKLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxRQUE0QjtRQUMvRCxRQUFRLFFBQVEsRUFBRTtZQUNoQixLQUFLLGtCQUFrQixDQUFDLG9CQUFvQjtnQkFDMUMsT0FBTyxzQkFBc0IsQ0FBQztZQUNoQyxLQUFLLGtCQUFrQixDQUFDLGdCQUFnQjtnQkFDdEMsT0FBTyxrQkFBa0IsQ0FBQztZQUM1QixLQUFLLGtCQUFrQixDQUFDLGlCQUFpQjtnQkFDdkMsT0FBTyxtQkFBbUIsQ0FBQztZQUM3QixLQUFLLGtCQUFrQixDQUFDLG9CQUFvQjtnQkFDMUMsT0FBTyxzQkFBc0IsQ0FBQztZQUNoQyxLQUFLLGtCQUFrQixDQUFDLG1CQUFtQjtnQkFDekMsT0FBTyxxQkFBcUIsQ0FBQztZQUMvQjtnQkFDRSxPQUFPLHFCQUFxQixRQUFRLEVBQUUsQ0FBQztTQUMxQztLQUNGOzs7OztJQUVELE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFpQjtRQUN6QyxJQUFJLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDbkQsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsR0FBRyxDQUFDLG1CQUFtQixFQUFFLG1CQUFtQixDQUFDLENBQUM7U0FDL0c7UUFFRCxJQUFJLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFB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bFRvb2xib3guY2xhc3MnO1xyXG5pbXBvcnQgeyBTZWxlY3Rpb25Qb3MgfSBmcm9tICcuL3htbEN1cnNvci5jbGFzcyc7XHJcbmltcG9ydCB7IERvbUR1bW15Tm9kZU1hbmFnZXIgfSBmcm9tICcuLi9kdW1teU5vZGVzL2RvbUR1bW15Tm9kZU1hbmFnZXIuY2xhc3MnO1xyXG5pbXBvcnQgeyBYbWwyaHRtbCB9IGZyb20gJy4uL3htbC1odG1sLWNvbnZlcnRlci94bWwyaHRtbC5jbGFzcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgWG1sQ3Vyc29yUG9zIHtcclxuICBwdWJsaWMgQWN0dWFsTm9kZTogTm9kZTsgLy8gdGhpcyBYTUxOb2RlIGFjdHVhbCBoYXMgdGhlIGVkaXRvciBmb2N1c1xyXG4gIHB1YmxpYyBQb3NBdE5vZGU6IFhNTEN1cnNvclBvc2l0aW9uczsgLy8gQXQgdGhpcyBwb3NpdGlvbiB0aGUgY3Vyc29yIGlzIC0gaW5zaWRlIG9kZXIgb3V0c2lkZSB0aGUgYWN0dWFsIGZvY3Vzc2VkIG5vZGVcclxuICBwdWJsaWMgUG9zSW5UZXh0bm9kZTogbnVtYmVyOyAvLyBUaGUgY3Vyc29yIHBvc2l0aW8gaW5zaWRlIGZsb2F0aW5nIHRleHQgd2hlbiBwb3MgIGlzIEN1cnNvcklubmVyaGFsYkRlc1RleHROb2Rlc1xyXG5cclxuICBzdGF0aWMgZ2V0WG1sQ3Vyc29yUG9zaXRpb25EZWJ1Z05hbWUocG9zaXRpb246IFhNTEN1cnNvclBvc2l0aW9ucyk6IHN0cmluZyB7XHJcbiAgICBzd2l0Y2ggKHBvc2l0aW9uKSB7XHJcbiAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvck9uQ29tcGxldGVOb2RlOlxyXG4gICAgICAgIHJldHVybiAnQ3Vyc29yT25Db21wbGV0ZU5vZGUnO1xyXG4gICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JCZWhpbmROb2RlOlxyXG4gICAgICAgIHJldHVybiAnQ3Vyc29yQmVoaW5kTm9kZSc7XHJcbiAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRW1wdHlOb2RlOlxyXG4gICAgICAgIHJldHVybiAnQ3Vyc29ySW5FbXB0eU5vZGUnO1xyXG4gICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JJbnNpZGVUZXh0Tm9kZTpcclxuICAgICAgICByZXR1cm4gJ0N1cnNvckluc2lkZVRleHROb2RlJztcclxuICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5Gcm9udE9mTm9kZTpcclxuICAgICAgICByZXR1cm4gJ0N1cnNvckluRnJvbnRPZk5vZGUnO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBgdW5rbm93biBjdXJzb3JQb3MgJHtwb3NpdGlvbn1gO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldFNlbGVjdGlvbkZvclBvcyhwb3M6IFhtbEN1cnNvclBvcyk6IFNlbGVjdGlvblBvcyB7XHJcbiAgICBpZiAoRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShwb3MuQWN0dWFsTm9kZSkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBYbWxDdXJzb3JQb3MuZ2V0U2VsZWN0aW9uRm9yUG9zOiBwb3MuQWt0Tm9kZSAke3Bvcy5nZXREZWJ1Z0Rlc2NyaXB0aW9uKCl9IGlzIGEgZHVtbXkgbm9kZSFgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShwb3MuQWN0dWFsTm9kZS5wYXJlbnRFbGVtZW50KSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFhtbEN1cnNvclBvcy5nZXRTZWxlY3Rpb25Gb3JQb3M6IHBvcy5Ba3ROb2RlLnBhcmVudEVsZW1lbnQgJHtwb3MuZ2V0RGVidWdEZXNjcmlwdGlvbigpfSBpcyBhIGR1bW15IG5vZGUhYCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoIChwb3MuUG9zQXROb2RlKSB7XHJcbiAgICAgIGNhc2UgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvck9uQ29tcGxldGVOb2RlOiAvLyAoMClcclxuICAgICAgICBsZXQgZmlyc3RDaGlsZCA9IHBvcy5BY3R1YWxOb2RlLmZpcnN0Q2hpbGQ7XHJcbiAgICAgICAgaWYgKERvbUR1bW15Tm9kZU1hbmFnZXIuSXNCZWZvcmVGaXJzdFRhZ0R1bW15Tm9kZShmaXJzdENoaWxkKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbm9kZTogZmlyc3RDaGlsZC5maXJzdENoaWxkLCAvLyB0ZXh0IGluc2lkZSBCZWZvcmVGaXJzdFRhZ0R1bW15Tm9kXHJcbiAgICAgICAgICAgIG9mZnNldDogMFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbm9kZTogcG9zLkFjdHVhbE5vZGUsXHJcbiAgICAgICAgICAgIG9mZnNldDogMFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JJbkZyb250T2ZOb2RlOiAvLyAoMSlcclxuICAgICAgICBpZiAocG9zLkFjdHVhbE5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgICAvLyB0ZXh0IG5vZGVcclxuICAgICAgICAgIGNvbnN0IGR1bW15QmVmb3JlID0gcG9zLkFjdHVhbE5vZGUucHJldmlvdXNTaWJsaW5nO1xyXG4gICAgICAgICAgaWYgKERvbUR1bW15Tm9kZU1hbmFnZXIuSXNEdW1teU5vZGUoZHVtbXlCZWZvcmUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgbm9kZTogZHVtbXlCZWZvcmUuZmlyc3RDaGlsZCwgLy8gYmVmb3JlIHRleHQgbm9kZVxyXG4gICAgICAgICAgICAgIG9mZnNldDogMVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5Gcm9udE9mTm9kZSAoMSk6dGV4dCBub2RlOiBpcyBubyBkdW1teSBub2RlOiAgJyArIHBvcy5nZXREZWJ1Z0Rlc2NyaXB0aW9uKCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBubyB0ZXh0IG5vZGVcclxuICAgICAgICAgIGZpcnN0Q2hpbGQgPSBwb3MuQWN0dWFsTm9kZS5maXJzdENoaWxkO1xyXG4gICAgICAgICAgaWYgKERvbUR1bW15Tm9kZU1hbmFnZXIuSXNCZWZvcmVGaXJzdFRhZ0R1bW15Tm9kZShmaXJzdENoaWxkKSkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIG5vZGU6IGZpcnN0Q2hpbGQuZmlyc3RDaGlsZCwgLy8gdGV4dCBpbnNpZGUgQmVmb3JlRmlyc3RUYWdEdW1teU5vZFxyXG4gICAgICAgICAgICAgIG9mZnNldDogMVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKFhtbDJodG1sLmlzTm9DbG9zaW5nRWxlbWVudChwb3MuQWN0dWFsTm9kZSkgJiYgRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShmaXJzdENoaWxkKSkge1xyXG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiBmaXJzdENoaWxkLmZpcnN0Q2hpbGQsIG9mZnNldDogMSB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5Gcm9udE9mTm9kZSAoMSk6bm8gdGV4dCBub2RlOiBkb250IGtub3cgd2hhdCB0byBkbyEgJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29yQmVoaW5kTm9kZTogLy8gKDcsIDExKVxyXG4gICAgICAgIGNvbnN0IGR1bW15QWZ0ZXIgPSBwb3MuQWN0dWFsTm9kZS5uZXh0U2libGluZztcclxuICAgICAgICBpZiAoRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShkdW1teUFmdGVyKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbm9kZTogZHVtbXlBZnRlci5maXJzdENoaWxkLCAvLyBiZWZvcmUgdGV4dCBub2RlXHJcbiAgICAgICAgICAgIG9mZnNldDogMFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYTUxDdXJzb3JQb3NpdGlvbmVuLkN1cnNvckJlaGluZE5vZGUgc2hvdWxkIG9ubHkgYmUgc2V0LCB3aGVuIHRoZSBlbGVtZW50IGhhcyBubyBuZXh0IHNpYmxpbmcuYCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgY2FzZSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5FbXB0eU5vZGU6XHJcbiAgICAgICAgY29uc3QgbGFzdENoaWxkID0gcG9zLkFjdHVhbE5vZGUubGFzdENoaWxkO1xyXG4gICAgICAgIGlmICghRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0R1bW15Tm9kZShmaXJzdENoaWxkKSAmJiAhRG9tRHVtbXlOb2RlTWFuYWdlci5Jc0JlZm9yZUZpcnN0VGFnRHVtbXlOb2RlKGZpcnN0Q2hpbGQpKSB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBub2RlOiBsYXN0Q2hpbGQuZmlyc3RDaGlsZCwgLy8gdGV4dCBpbnNpZGUgRHVtbXlOb2RlXHJcbiAgICAgICAgICAgIG9mZnNldDogMFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JJbnNpZGVUZXh0Tm9kZTpcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgbm9kZTogcG9zLkFjdHVhbE5vZGUsXHJcbiAgICAgICAgICBvZmZzZXQ6IHBvcy5Qb3NJblRleHRub2RlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHRocm93IG5ldyBFcnJvcihgc2hvd0N1cnNvci5nZXRTZWxlY3Rpb25Gb3JQb3MgdW5rbm93biBDdXJzb3JQb3MgJHtwb3MuZ2V0RGVidWdEZXNjcmlwdGlvbigpfWApO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLkFjdHVhbE5vZGUgPSBudWxsOyAvLyBubyBub2RlIHNlbGVjdGVkXHJcbiAgICB0aGlzLlBvc0F0Tm9kZSA9IFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JPbkNvbXBsZXRlTm9kZTtcclxuICAgIHRoaXMuUG9zSW5UZXh0bm9kZSA9IDA7XHJcbiAgfVxyXG5cclxuICBjbG9uZSgpOiBYbWxDdXJzb3JQb3Mge1xyXG4gICAgY29uc3Qga2xvbiA9IG5ldyBYbWxDdXJzb3JQb3MoKTtcclxuICAgIGtsb24uU2V0Q3Vyc29yKHRoaXMuQWN0dWFsTm9kZSwgdGhpcy5Qb3NBdE5vZGUsIHRoaXMuUG9zSW5UZXh0bm9kZSk7XHJcbiAgICByZXR1cm4ga2xvbjtcclxuICB9XHJcblxyXG4gIGVxdWFscyhvdGhlclBvczogWG1sQ3Vyc29yUG9zKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIW90aGVyUG9zKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChvdGhlclBvcy5BY3R1YWxOb2RlICE9PSB0aGlzLkFjdHVhbE5vZGUpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKG90aGVyUG9zLlBvc0F0Tm9kZSAhPT0gdGhpcy5Qb3NBdE5vZGUpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuUG9zQXROb2RlID09PSBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5zaWRlVGV4dE5vZGUgJiYgdGhpcy5Qb3NJblRleHRub2RlICE9PSBvdGhlclBvcy5Qb3NJblRleHRub2RlKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGVidWdEZXNjcmlwdGlvbigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGBub2RlOiR7WG1sVG9vbGJveC5HZXROb2RlRGVidWdDb250ZXh0KHRoaXMuQWN0dWFsTm9kZSl9LCBwb3M6JHtYbWxDdXJzb3JQb3MuZ2V0WG1sQ3Vyc29yUG9zaXRpb25EZWJ1Z05hbWUodGhpcy5Qb3NBdE5vZGUpfSwgcG9zSW5UZXh0OiR7dGhpcy5Qb3NJblRleHRub2RlfWA7XHJcbiAgfVxyXG5cclxuICBTZXRDdXJzb3IoYWN0dWFsTm9kZTogTm9kZSwgcG9zQXROb2RlOiBYTUxDdXJzb3JQb3NpdGlvbnMsIHBvc0luVGV4dG5vZGU6IG51bWJlciA9IDApIHtcclxuICAgIGlmICghYWN0dWFsTm9kZSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FjdHVhbE5vZGUgaXMgbnVsbCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBjaGFuZ2VkOiBib29sZWFuO1xyXG4gICAgaWYgKGFjdHVhbE5vZGUgIT09IHRoaXMuQWN0dWFsTm9kZSkge1xyXG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChwb3NBdE5vZGUgIT09IHRoaXMuUG9zQXROb2RlKSB7XHJcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHBvc0luVGV4dG5vZGUgIT09IHRoaXMuUG9zSW5UZXh0bm9kZSkge1xyXG4gICAgICAgICAgY2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLkFjdHVhbE5vZGUgPSBhY3R1YWxOb2RlO1xyXG4gICAgdGhpcy5Qb3NBdE5vZGUgPSBwb3NBdE5vZGU7XHJcbiAgICB0aGlzLlBvc0luVGV4dG5vZGUgPSBwb3NJblRleHRub2RlO1xyXG5cclxuICAgIC8vIGNvbnNvbGUubG9nKGBTZXRDdXJzb3I6ICR7dGhpcy5nZXREZWJ1Z0Rlc2NyaXB0aW9uKCl9YCk7XHJcblxyXG4gICAgaWYgKGNoYW5nZWQpIHtcclxuICAgICAgLy8gUG9zQ2hhbmdlZChFdmVudEFyZ3MuRW1wdHkpOyAvLyBpbmZvcm0geW91IHRoYXQgdGhlIGN1cnNvciBoYXMgbm93IGJlZW4gY2hhbmdlZFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0Q3Vyc29yQmVoaW5kTm9kZUZvckRlZmF1bHRPclJpZ2h0TW92ZW1lbnQobm9kZTogTm9kZSkge1xyXG4gICAgY29uc3QgbmV4dFNpYmxpbmcgPSBEb21EdW1teU5vZGVNYW5hZ2VyLmdldE5leHRTaWJsaW5nKG5vZGUpO1xyXG4gICAgaWYgKG5leHRTaWJsaW5nKSB7XHJcbiAgICAgIHRoaXMuU2V0Q3Vyc29yKG5leHRTaWJsaW5nLCBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29ySW5Gcm9udE9mTm9kZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLlNldEN1cnNvcihub2RlLCBYTUxDdXJzb3JQb3NpdGlvbnMuQ3Vyc29yQmVoaW5kTm9kZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRDdXJzb3JwQmVoaW5kTm9kZUZvckxlZnRNb3ZlbWVudChub2RlOiBOb2RlKSB7XHJcbiAgICBpZiAoWG1sVG9vbGJveC5Jc1RleHRPckNvbW1lbnROb2RlKG5vZGUpKSB7XHJcbiAgICAgIC8vICBGb3IgYSB0ZXh0IG5vZGUsIHRoZSBjdXJzb3IgaXMgcGxhY2VkIGFmdGVyIHRoZSBsYXN0IGNoYXJhY3Rlci5cclxuICAgICAgdGhpcy5TZXRDdXJzb3Iobm9kZSwgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluc2lkZVRleHROb2RlLCBNYXRoLm1heCgwLCBub2RlLnRleHRDb250ZW50Lmxlbmd0aCAtIDEpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGNoaWxkTm9kZUNvdW50ID0gRG9tRHVtbXlOb2RlTWFuYWdlci5nZXRDaGlsZE5vZGVDb3VudChub2RlKTtcclxuICAgICAgaWYgKGNoaWxkTm9kZUNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgLy8gVGhlcmUgYXJlIG5vIGNoaWxkcmVuIGluIHRoZSBub2RlLlxyXG4gICAgICAgIGlmICghWG1sMmh0bWwuaXNOb0Nsb3NpbmdFbGVtZW50KG5vZGUpKSB7XHJcbiAgICAgICAgICAvLyBJZiB0aGUgY3Vyc29yIHNob3dzIGEgY2xvc2UgdGFnLCB0aGVuIHB1dCBpdCBpbiB0aGUgZW1wdHkgbm9kZVxyXG4gICAgICAgICAgdGhpcy5TZXRDdXJzb3Iobm9kZSwgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckluRW1wdHlOb2RlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gSWYgdGhlIGN1cnNvciBkb2VzIG5vdCBkaXNwbGF5IGEgY2xvc2UgdGFnLCB0aGVuIHBsYWNlIGl0IGJlZm9yZSB0aGUgZW1wdHkgbm9kZS5cclxuICAgICAgICAgIHRoaXMuU2V0Q3Vyc29yKG5vZGUsIFhNTEN1cnNvclBvc2l0aW9ucy5DdXJzb3JJbkZyb250T2ZOb2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gVGhlcmUgYXJlIGNoaWxkcmVuIGluIG5vZGVcclxuICAgICAgICB0aGlzLlNldEN1cnNvcihEb21EdW1teU5vZGVNYW5hZ2VyLmdldExhc3RDaGlsZChub2RlKSwgWE1MQ3Vyc29yUG9zaXRpb25zLkN1cnNvckJlaGluZE5vZGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZW51bSBYTUxDdXJzb3JQb3NpdGlvbnMge1xyXG4gIEN1cnNvckluRnJvbnRPZk5vZGUgPSAwLFxyXG4gIEN1cnNvck9uQ29tcGxldGVOb2RlID0gMSxcclxuICBDdXJzb3JJbkVtcHR5Tm9kZSA9IDIsXHJcbiAgQ3Vyc29ySW5zaWRlVGV4dE5vZGUgPSAzLFxyXG4gIEN1cnNvckJlaGluZE5vZGUgPSA0XHJcbn1cclxuIl19