UNPKG

@angular-devkit/schematics

Version:
325 lines 38.1 kB
"use strict"; /** * @license * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.UpdateBuffer2 = exports.UpdateBuffer = exports.UpdateBufferBase = exports.Chunk = exports.ContentCannotBeRemovedException = exports.IndexOutOfBoundException = void 0; const core_1 = require("@angular-devkit/core"); const magic_string_1 = __importDefault(require("magic-string")); const environment_options_1 = require("./environment-options"); const linked_list_1 = require("./linked-list"); class IndexOutOfBoundException extends core_1.BaseException { constructor(index, min, max = Infinity) { super(`Index ${index} outside of range [${min}, ${max}].`); } } exports.IndexOutOfBoundException = IndexOutOfBoundException; /** @deprecated Since v13.0 */ class ContentCannotBeRemovedException extends core_1.BaseException { constructor() { super(`User tried to remove content that was marked essential.`); } } exports.ContentCannotBeRemovedException = ContentCannotBeRemovedException; /** * A Chunk description, including left/right content that has been inserted. * If _left/_right is null, this means that content was deleted. If the _content is null, * it means the content itself was deleted. * * @see UpdateBuffer * @deprecated Since v13.0 */ class Chunk { constructor(start, end, originalContent) { this.start = start; this.end = end; this.originalContent = originalContent; this._left = Buffer.alloc(0); this._right = Buffer.alloc(0); this._assertLeft = false; this._assertRight = false; this.next = null; this._content = originalContent.slice(start, end); } get length() { return ((this._left ? this._left.length : 0) + (this._content ? this._content.length : 0) + (this._right ? this._right.length : 0)); } toString(encoding = 'utf-8') { return ((this._left ? this._left.toString(encoding) : '') + (this._content ? this._content.toString(encoding) : '') + (this._right ? this._right.toString(encoding) : '')); } slice(start) { if (start < this.start || start > this.end) { throw new IndexOutOfBoundException(start, this.start, this.end); } // Update _content to the new indices. const newChunk = new Chunk(start, this.end, this.originalContent); // If this chunk has _content, reslice the original _content. We move the _right so we are not // losing any data here. If this chunk has been deleted, the next chunk should also be deleted. if (this._content) { this._content = this.originalContent.slice(this.start, start); } else { newChunk._content = this._content; if (this._right === null) { newChunk._left = null; } } this.end = start; // Move _right to the new chunk. newChunk._right = this._right; this._right = this._right && Buffer.alloc(0); // Update essentials. if (this._assertRight) { newChunk._assertRight = true; this._assertRight = false; } // Update the linked list. newChunk.next = this.next; this.next = newChunk; return newChunk; } append(buffer, essential) { if (!this._right) { if (essential) { throw new ContentCannotBeRemovedException(); } return; } const outro = this._right; this._right = Buffer.alloc(outro.length + buffer.length); outro.copy(this._right, 0); buffer.copy(this._right, outro.length); if (essential) { this._assertRight = true; } } prepend(buffer, essential) { if (!this._left) { if (essential) { throw new ContentCannotBeRemovedException(); } return; } const intro = this._left; this._left = Buffer.alloc(intro.length + buffer.length); intro.copy(this._left, 0); buffer.copy(this._left, intro.length); if (essential) { this._assertLeft = true; } } assert(left, _content, right) { if (left && this._assertLeft) { throw new ContentCannotBeRemovedException(); } if (right && this._assertRight) { throw new ContentCannotBeRemovedException(); } } remove(left, content, right) { if (left) { if (this._assertLeft) { throw new ContentCannotBeRemovedException(); } this._left = null; } if (content) { this._content = null; } if (right) { if (this._assertRight) { throw new ContentCannotBeRemovedException(); } this._right = null; } } copy(target, start) { if (this._left) { this._left.copy(target, start); start += this._left.length; } if (this._content) { this._content.copy(target, start); start += this._content.length; } if (this._right) { this._right.copy(target, start); start += this._right.length; } return start; } } exports.Chunk = Chunk; /** * Base class for an update buffer implementation that allows buffers to be inserted to the _right * or _left, or deleted, while keeping indices to the original buffer. */ class UpdateBufferBase { constructor(_originalContent) { this._originalContent = _originalContent; } /** * Creates an UpdateBufferBase instance. Depending on the NG_UPDATE_BUFFER_V2 * environment variable, will either create an UpdateBuffer or an UpdateBuffer2 * instance. * * See: https://github.com/angular/angular-cli/issues/21110 * * @param originalContent The original content of the update buffer instance. * @returns An UpdateBufferBase instance. */ static create(originalContent) { return environment_options_1.updateBufferV2Enabled ? new UpdateBuffer2(originalContent) : new UpdateBuffer(originalContent); } } exports.UpdateBufferBase = UpdateBufferBase; /** * An utility class that allows buffers to be inserted to the _right or _left, or deleted, while * keeping indices to the original buffer. * * The constructor takes an original buffer, and keeps it into a linked list of chunks, smaller * buffers that keep track of _content inserted to the _right or _left of it. * * Since the Node Buffer structure is non-destructive when slicing, we try to use slicing to create * new chunks, and always keep chunks pointing to the original content. * * @deprecated Since v13.0 */ class UpdateBuffer extends UpdateBufferBase { constructor(originalContent) { super(originalContent); this._linkedList = new linked_list_1.LinkedList(new Chunk(0, originalContent.length, originalContent)); } _assertIndex(index) { if (index < 0 || index > this._originalContent.length) { throw new IndexOutOfBoundException(index, 0, this._originalContent.length); } } _slice(start) { let index; if (start >= this._originalContent.length) { index = start; } else if (start < 0) { index = this._originalContent.length + start; } else { index = this._getTextPosition(start); } this._assertIndex(index); // Find the chunk by going through the list. const h = this._linkedList.find((chunk) => index <= chunk.end); if (!h) { throw Error('Chunk cannot be found.'); } if (index == h.end && h.next !== null) { return [h, h.next]; } return [h, h.slice(index)]; } /** * Gets the position in the content based on the position in the string. * Some characters might be wider than one byte, thus we have to determine the position using * string functions. */ _getTextPosition(index) { return Buffer.from(this._originalContent.toString().substring(0, index)).length; } get length() { return this._linkedList.reduce((acc, chunk) => acc + chunk.length, 0); } get original() { return this._originalContent; } toString(encoding = 'utf-8') { return this._linkedList.reduce((acc, chunk) => acc + chunk.toString(encoding), ''); } generate() { const result = Buffer.allocUnsafe(this.length); let i = 0; this._linkedList.forEach((chunk) => { chunk.copy(result, i); i += chunk.length; }); return result; } insertLeft(index, content, assert = false) { this._slice(index)[0].append(content, assert); } insertRight(index, content, assert = false) { this._slice(index)[1].prepend(content, assert); } remove(index, length) { if (length === 0) { return; } const end = index + length; const first = this._slice(index)[1]; const last = this._slice(end)[1]; let curr; for (curr = first; curr && curr !== last; curr = curr.next) { curr.assert(curr !== first, curr !== last, curr === first); } for (curr = first; curr && curr !== last; curr = curr.next) { curr.remove(curr !== first, curr !== last, curr === first); } if (curr) { curr.remove(true, false, false); } } } exports.UpdateBuffer = UpdateBuffer; /** * An utility class that allows buffers to be inserted to the _right or _left, or deleted, while * keeping indices to the original buffer. */ class UpdateBuffer2 extends UpdateBufferBase { constructor() { super(...arguments); this._mutatableContent = new magic_string_1.default(this._originalContent.toString()); } _assertIndex(index) { if (index < 0 || index > this._originalContent.length) { throw new IndexOutOfBoundException(index, 0, this._originalContent.length); } } get length() { return this._mutatableContent.length(); } get original() { return this._originalContent; } toString() { return this._mutatableContent.toString(); } generate() { return Buffer.from(this.toString()); } insertLeft(index, content) { this._assertIndex(index); this._mutatableContent.appendLeft(index, content.toString()); } insertRight(index, content) { this._assertIndex(index); this._mutatableContent.appendRight(index, content.toString()); } remove(index, length) { this._assertIndex(index); this._mutatableContent.remove(index, index + length); } } exports.UpdateBuffer2 = UpdateBuffer2; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWJ1ZmZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXJfZGV2a2l0L3NjaGVtYXRpY3Mvc3JjL3V0aWxpdHkvdXBkYXRlLWJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7Ozs7QUFFSCwrQ0FBcUQ7QUFDckQsZ0VBQXVDO0FBQ3ZDLCtEQUE4RDtBQUM5RCwrQ0FBMkM7QUFFM0MsTUFBYSx3QkFBeUIsU0FBUSxvQkFBYTtJQUN6RCxZQUFZLEtBQWEsRUFBRSxHQUFXLEVBQUUsR0FBRyxHQUFHLFFBQVE7UUFDcEQsS0FBSyxDQUFDLFNBQVMsS0FBSyxzQkFBc0IsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDN0QsQ0FBQztDQUNGO0FBSkQsNERBSUM7QUFDRCw4QkFBOEI7QUFDOUIsTUFBYSwrQkFBZ0MsU0FBUSxvQkFBYTtJQUNoRTtRQUNFLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO0lBQ25FLENBQUM7Q0FDRjtBQUpELDBFQUlDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQWEsS0FBSztJQVVoQixZQUFtQixLQUFhLEVBQVMsR0FBVyxFQUFTLGVBQXVCO1FBQWpFLFVBQUssR0FBTCxLQUFLLENBQVE7UUFBUyxRQUFHLEdBQUgsR0FBRyxDQUFRO1FBQVMsb0JBQWUsR0FBZixlQUFlLENBQVE7UUFSNUUsVUFBSyxHQUFrQixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLFdBQU0sR0FBa0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV4QyxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUU3QixTQUFJLEdBQWlCLElBQUksQ0FBQztRQUd4QixJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMs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QyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQztJQUN2RCxDQUFDO0NBQ0Y7QUF0Q0Qsc0NBc0NDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7IEJhc2VFeGNlcHRpb24gfSBmcm9tICdAYW5ndWxhci1kZXZraXQvY29yZSc7XG5pbXBvcnQgTWFnaWNTdHJpbmcgZnJvbSAnbWFnaWMtc3RyaW5nJztcbmltcG9ydCB7IHVwZGF0ZUJ1ZmZlclYyRW5hYmxlZCB9IGZyb20gJy4vZW52aXJvbm1lbnQtb3B0aW9ucyc7XG5pbXBvcnQgeyBMaW5rZWRMaXN0IH0gZnJvbSAnLi9saW5rZWQtbGlzdCc7XG5cbmV4cG9ydCBjbGFzcyBJbmRleE91dE9mQm91bmRFeGNlcHRpb24gZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IoaW5kZXg6IG51bWJlciwgbWluOiBudW1iZXIsIG1heCA9IEluZmluaXR5KSB7XG4gICAgc3VwZXIoYEluZGV4ICR7aW5kZXh9IG91dHNpZGUgb2YgcmFuZ2UgWyR7bWlufSwgJHttYXh9XS5gKTtcbiAgfVxufVxuLyoqIEBkZXByZWNhdGVkIFNpbmNlIHYxMy4wICovXG5leHBvcnQgY2xhc3MgQ29udGVudENhbm5vdEJlUmVtb3ZlZEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihgVXNlciB0cmllZCB0byByZW1vdmUgY29udGVudCB0aGF0IHdhcyBtYXJrZWQgZXNzZW50aWFsLmApO1xuICB9XG59XG5cbi8qKlxuICogQSBDaHVuayBkZXNjcmlwdGlvbiwgaW5jbHVkaW5nIGxlZnQvcmlnaHQgY29udGVudCB0aGF0IGhhcyBiZWVuIGluc2VydGVkLlxuICogSWYgX2xlZnQvX3JpZ2h0IGlzIG51bGwsIHRoaXMgbWVhbnMgdGhhdCBjb250ZW50IHdhcyBkZWxldGVkLiBJZiB0aGUgX2NvbnRlbnQgaXMgbnVsbCxcbiAqIGl0IG1lYW5zIHRoZSBjb250ZW50IGl0c2VsZiB3YXMgZGVsZXRlZC5cbiAqXG4gKiBAc2VlIFVwZGF0ZUJ1ZmZlclxuICogQGRlcHJlY2F0ZWQgU2luY2UgdjEzLjBcbiAqL1xuZXhwb3J0IGNsYXNzIENodW5rIHtcbiAgcHJpdmF0ZSBfY29udGVudDogQnVmZmVyIHwgbnVsbDtcbiAgcHJpdmF0ZSBfbGVmdDogQnVmZmVyIHwgbnVsbCA9IEJ1ZmZlci5hbGxvYygwKTtcbiAgcHJpdmF0ZSBfcmlnaHQ6IEJ1ZmZlciB8IG51bGwgPSBCdWZmZXIuYWxsb2MoMCk7XG5cbiAgcHJpdmF0ZSBfYXNzZXJ0TGVmdCA9IGZhbHNlO1xuICBwcml2YXRlIF9hc3NlcnRSaWdodCA9IGZhbHNlO1xuXG4gIG5leHQ6IENodW5rIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHN0YXJ0OiBudW1iZXIsIHB1YmxpYyBlbmQ6IG51bWJlciwgcHVibGljIG9yaWdpbmFsQ29udGVudDogQnVmZmVyKSB7XG4gICAgdGhpcy5fY29udGVudCA9IG9yaWdpbmFsQ29udGVudC5zbGljZShzdGFydCwgZW5kKTtcbiAgfVxuXG4gIGdldCBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICh0aGlzLl9sZWZ0ID8gdGhpcy5fbGVmdC5sZW5ndGggOiAwKSArXG4gICAgICAodGhpcy5fY29udGVudCA/IHRoaXMuX2NvbnRlbnQubGVuZ3RoIDogMCkgK1xuICAgICAgKHRoaXMuX3JpZ2h0ID8gdGhpcy5fcmlnaHQubGVuZ3RoIDogMClcbiAgICApO1xuICB9XG4gIHRvU3RyaW5nKGVuY29kaW5nOiBCdWZmZXJFbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMuX2xlZnQgPyB0aGlzLl9sZWZ0LnRvU3RyaW5nKGVuY29kaW5nKSA6ICcnKSArXG4gICAgICAodGhpcy5fY29udGVudCA/IHRoaXMuX2NvbnRlbnQudG9TdHJpbmcoZW5jb2RpbmcpIDogJycpICtcbiAgICAgICh0aGlzLl9yaWdodCA/IHRoaXMuX3JpZ2h0LnRvU3RyaW5nKGVuY29kaW5nKSA6ICcnKVxuICAgICk7XG4gIH1cblxuICBzbGljZShzdGFydDogbnVtYmVyKSB7XG4gICAgaWYgKHN0YXJ0IDwgdGhpcy5zdGFydCB8fCBzdGFydCA+IHRoaXMuZW5kKSB7XG4gICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kRXhjZXB0aW9uKHN0YXJ0LCB0aGlzLnN0YXJ0LCB0aGlzLmVuZCk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIF9jb250ZW50IHRvIHRoZSBuZXcgaW5kaWNlcy5cbiAgICBjb25zdCBuZXdDaHVuayA9IG5ldyBDaHVuayhzdGFydCwgdGhpcy5lbmQsIHRoaXMub3JpZ2luYWxDb250ZW50KTtcblxuICAgIC8vIElmIHRoaXMgY2h1bmsgaGFzIF9jb250ZW50LCByZXNsaWNlIHRoZSBvcmlnaW5hbCBfY29udGVudC4gV2UgbW92ZSB0aGUgX3JpZ2h0IHNvIHdlIGFyZSBub3RcbiAgICAvLyBsb3NpbmcgYW55IGRhdGEgaGVyZS4gSWYgdGhpcyBjaHVuayBoYXMgYmVlbiBkZWxldGVkLCB0aGUgbmV4dCBjaHVuayBzaG91bGQgYWxzbyBiZSBkZWxldGVkLlxuICAgIGlmICh0aGlzLl9jb250ZW50KSB7XG4gICAgICB0aGlzLl9jb250ZW50ID0gdGhpcy5vcmlnaW5hbENvbnRlbnQuc2xpY2UodGhpcy5zdGFydCwgc3RhcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdDaHVuay5fY29udGVudCA9IHRoaXMuX2NvbnRlbnQ7XG4gICAgICBpZiAodGhpcy5fcmlnaHQgPT09IG51bGwpIHtcbiAgICAgICAgbmV3Q2h1bmsuX2xlZnQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmVuZCA9IHN0YXJ0O1xuXG4gICAgLy8gTW92ZSBfcmlnaHQgdG8gdGhlIG5ldyBjaHVuay5cbiAgICBuZXdDaHVuay5fcmlnaHQgPSB0aGlzLl9yaWdodDtcbiAgICB0aGlzLl9yaWdodCA9IHRoaXMuX3JpZ2h0ICYmIEJ1ZmZlci5hbGxvYygwKTtcblxuICAgIC8vIFVwZGF0ZSBlc3NlbnRpYWxzLlxuICAgIGlmICh0aGlzLl9hc3NlcnRSaWdodCkge1xuICAgICAgbmV3Q2h1bmsuX2Fzc2VydFJpZ2h0ID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2Fzc2VydFJpZ2h0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBsaW5rZWQgbGlzdC5cbiAgICBuZXdDaHVuay5uZXh0ID0gdGhpcy5uZXh0O1xuICAgIHRoaXMubmV4dCA9IG5ld0NodW5rO1xuXG4gICAgcmV0dXJuIG5ld0NodW5rO1xuICB9XG5cbiAgYXBwZW5kKGJ1ZmZlcjogQnVmZmVyLCBlc3NlbnRpYWw6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMuX3JpZ2h0KSB7XG4gICAgICBpZiAoZXNzZW50aWFsKSB7XG4gICAgICAgIHRocm93IG5ldyBDb250ZW50Q2Fubm90QmVSZW1vdmVkRXhjZXB0aW9uKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRybyA9IHRoaXMuX3JpZ2h0O1xuICAgIHRoaXMuX3JpZ2h0ID0gQnVmZmVyLmFsbG9jKG91dHJvLmxlbmd0aCArIGJ1ZmZlci5sZW5ndGgpO1xuICAgIG91dHJvLmNvcHkodGhpcy5fcmlnaHQsIDApO1xuICAgIGJ1ZmZlci5jb3B5KHRoaXMuX3JpZ2h0LCBvdXRyby5sZW5ndGgpO1xuXG4gICAgaWYgKGVzc2VudGlhbCkge1xuICAgICAgdGhpcy5fYXNzZXJ0UmlnaHQgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBwcmVwZW5kKGJ1ZmZlcjogQnVmZmVyLCBlc3NlbnRpYWw6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMuX2xlZnQpIHtcbiAgICAgIGlmIChlc3NlbnRpYWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbnRlbnRDYW5ub3RCZVJlbW92ZWRFeGNlcHRpb24oKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGludHJvID0gdGhpcy5fbGVmdDtcbiAgICB0aGlzLl9sZWZ0ID0gQnVmZmVyLmFsbG9jKGludHJvLmxlbmd0aCArIGJ1ZmZlci5sZW5ndGgpO1xuICAgIGludHJvLmNvcHkodGhpcy5fbGVmdCwgMCk7XG4gICAgYnVmZmVyLmNvcHkodGhpcy5fbGVmdCwgaW50cm8ubGVuZ3RoKTtcblxuICAgIGlmIChlc3NlbnRpYWwpIHtcbiAgICAgIHRoaXMuX2Fzc2VydExlZnQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGFzc2VydChsZWZ0OiBib29sZWFuLCBfY29udGVudDogYm9vbGVhbiwgcmlnaHQ6IGJvb2xlYW4pIHtcbiAgICBpZiAobGVmdCAmJiB0aGlzLl9hc3NlcnRMZWZ0KSB7XG4gICAgICB0aHJvdyBuZXcgQ29udGVudENhbm5vdEJlUmVtb3ZlZEV4Y2VwdGlvbigpO1xuICAgIH1cblxuICAgIGlmIChyaWdodCAmJiB0aGlzLl9hc3NlcnRSaWdodCkge1xuICAgICAgdGhyb3cgbmV3IENvbnRlbnRDYW5ub3RCZVJlbW92ZWRFeGNlcHRpb24oKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmUobGVmdDogYm9vbGVhbiwgY29udGVudDogYm9vbGVhbiwgcmlnaHQ6IGJvb2xlYW4pIHtcbiAgICBpZiAobGVmdCkge1xuICAgICAgaWYgKHRoaXMuX2Fzc2VydExlZnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbnRlbnRDYW5ub3RCZVJlbW92ZWRFeGNlcHRpb24oKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2xlZnQgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoY29udGVudCkge1xuICAgICAgdGhpcy5fY29udGVudCA9IG51bGw7XG4gICAgfVxuICAgIGlmIChyaWdodCkge1xuICAgICAgaWYgKHRoaXMuX2Fzc2VydFJpZ2h0KSB7XG4gICAgICAgIHRocm93IG5ldyBDb250ZW50Q2Fubm90QmVSZW1vdmVkRXhjZXB0aW9uKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9yaWdodCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgY29weSh0YXJnZXQ6IEJ1ZmZlciwgc3RhcnQ6IG51bWJlcikge1xuICAgIGlmICh0aGlzLl9sZWZ0KSB7XG4gICAgICB0aGlzLl9sZWZ0LmNvcHkodGFyZ2V0LCBzdGFydCk7XG4gICAgICBzdGFydCArPSB0aGlzLl9sZWZ0Lmxlbmd0aDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvbnRlbnQpIHtcbiAgICAgIHRoaXMuX2NvbnRlbnQuY29weSh0YXJnZXQsIHN0YXJ0KTtcbiAgICAgIHN0YXJ0ICs9IHRoaXMuX2NvbnRlbnQubGVuZ3RoO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcmlnaHQpIHtcbiAgICAgIHRoaXMuX3JpZ2h0LmNvcHkodGFyZ2V0LCBzdGFydCk7XG4gICAgICBzdGFydCArPSB0aGlzLl9yaWdodC5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXJ0O1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYW4gdXBkYXRlIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGFsbG93cyBidWZmZXJzIHRvIGJlIGluc2VydGVkIHRvIHRoZSBfcmlnaHRcbiAqIG9yIF9sZWZ0LCBvciBkZWxldGVkLCB3aGlsZSBrZWVwaW5nIGluZGljZXMgdG8gdGhlIG9yaWdpbmFsIGJ1ZmZlci5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFVwZGF0ZUJ1ZmZlckJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX29yaWdpbmFsQ29udGVudDogQnVmZmVyKSB7fVxuICBhYnN0cmFjdCBnZXQgbGVuZ3RoKCk6IG51bWJlcjtcbiAgYWJzdHJhY3QgZ2V0IG9yaWdpbmFsKCk6IEJ1ZmZlcjtcbiAgYWJzdHJhY3QgdG9TdHJpbmcoZW5jb2Rpbmc/OiBzdHJpbmcpOiBzdHJpbmc7XG4gIGFic3RyYWN0IGdlbmVyYXRlKCk6IEJ1ZmZlcjtcbiAgYWJzdHJhY3QgaW5zZXJ0TGVmdChpbmRleDogbnVtYmVyLCBjb250ZW50OiBCdWZmZXIsIGFzc2VydD86IGJvb2xlYW4pOiB2b2lkO1xuICBhYnN0cmFjdCBpbnNlcnRSaWdodChpbmRleDogbnVtYmVyLCBjb250ZW50OiBCdWZmZXIsIGFzc2VydD86IGJvb2xlYW4pOiB2b2lkO1xuICBhYnN0cmFjdCByZW1vdmUoaW5kZXg6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIFVwZGF0ZUJ1ZmZlckJhc2UgaW5zdGFuY2UuIERlcGVuZGluZyBvbiB0aGUgTkdfVVBEQVRFX0JVRkZFUl9WMlxuICAgKiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgd2lsbCBlaXRoZXIgY3JlYXRlIGFuIFVwZGF0ZUJ1ZmZlciBvciBhbiBVcGRhdGVCdWZmZXIyXG4gICAqIGluc3RhbmNlLlxuICAgKlxuICAgKiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXItY2xpL2lzc3Vlcy8yMTExMFxuICAgKlxuICAgKiBAcGFyYW0gb3JpZ2luYWxDb250ZW50IFRoZSBvcmlnaW5hbCBjb250ZW50IG9mIHRoZSB1cGRhdGUgYnVmZmVyIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyBBbiBVcGRhdGVCdWZmZXJCYXNlIGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZShvcmlnaW5hbENvbnRlbnQ6IEJ1ZmZlcik6IFVwZGF0ZUJ1ZmZlckJhc2Uge1xuICAgIHJldHVybiB1cGRhdGVCdWZmZXJWMkVuYWJsZWRcbiAgICAgID8gbmV3IFVwZGF0ZUJ1ZmZlcjIob3JpZ2luYWxDb250ZW50KVxuICAgICAgOiBuZXcgVXBkYXRlQnVmZmVyKG9yaWdpbmFsQ29udGVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBbiB1dGlsaXR5IGNsYXNzIHRoYXQgYWxsb3dzIGJ1ZmZlcnMgdG8gYmUgaW5zZXJ0ZWQgdG8gdGhlIF9yaWdodCBvciBfbGVmdCwgb3IgZGVsZXRlZCwgd2hpbGVcbiAqIGtlZXBpbmcgaW5kaWNlcyB0byB0aGUgb3JpZ2luYWwgYnVmZmVyLlxuICpcbiAqIFRoZSBjb25zdHJ1Y3RvciB0YWtlcyBhbiBvcmlnaW5hbCBidWZmZXIsIGFuZCBrZWVwcyBpdCBpbnRvIGEgbGlua2VkIGxpc3Qgb2YgY2h1bmtzLCBzbWFsbGVyXG4gKiBidWZmZXJzIHRoYXQga2VlcCB0cmFjayBvZiBfY29udGVudCBpbnNlcnRlZCB0byB0aGUgX3JpZ2h0IG9yIF9sZWZ0IG9mIGl0LlxuICpcbiAqIFNpbmNlIHRoZSBOb2RlIEJ1ZmZlciBzdHJ1Y3R1cmUgaXMgbm9uLWRlc3RydWN0aXZlIHdoZW4gc2xpY2luZywgd2UgdHJ5IHRvIHVzZSBzbGljaW5nIHRvIGNyZWF0ZVxuICogbmV3IGNodW5rcywgYW5kIGFsd2F5cyBrZWVwIGNodW5rcyBwb2ludGluZyB0byB0aGUgb3JpZ2luYWwgY29udGVudC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBTaW5jZSB2MTMuMFxuICovXG5leHBvcnQgY2xhc3MgVXBkYXRlQnVmZmVyIGV4dGVuZHMgVXBkYXRlQnVmZmVyQmFzZSB7XG4gIHByb3RlY3RlZCBfbGlua2VkTGlzdDogTGlua2VkTGlzdDxDaHVuaz47XG5cbiAgY29uc3RydWN0b3Iob3JpZ2luYWxDb250ZW50OiBCdWZmZXIpIHtcbiAgICBzdXBlcihvcmlnaW5hbENvbnRlbnQpO1xuICAgIHRoaXMuX2xpbmtlZExpc3QgPSBuZXcgTGlua2VkTGlzdChuZXcgQ2h1bmsoMCwgb3JpZ2luYWxDb250ZW50Lmxlbmd0aCwgb3JpZ2luYWxDb250ZW50KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2Fzc2VydEluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gdGhpcy5fb3JpZ2luYWxDb250ZW50Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZEV4Y2VwdGlvbihpbmRleCwgMCwgdGhpcy5fb3JpZ2luYWxDb250ZW50Lmxlbmd0aCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9zbGljZShzdGFydDogbnVtYmVyKTogW0NodW5rLCBDaHVua10ge1xuICAgIGxldCBpbmRleDogbnVtYmVyO1xuXG4gICAgaWYgKHN0YXJ0ID49IHRoaXMuX29yaWdpbmFsQ29udGVudC5sZW5ndGgpIHtcbiAgICAgIGluZGV4ID0gc3RhcnQ7XG4gICAgfSBlbHNlIGlmIChzdGFydCA8IDApIHtcbiAgICAgIGluZGV4ID0gdGhpcy5fb3JpZ2luYWxDb250ZW50Lmxlbmd0aCArIHN0YXJ0O1xuICAgIH0gZWxzZSB7XG4gICAgICBpbmRleCA9IHRoaXMuX2dldFRleHRQb3NpdGlvbihzdGFydCk7XG4gICAgfVxuXG4gICAgdGhpcy5fYXNzZXJ0SW5kZXgoaW5kZXgpO1xuXG4gICAgLy8gRmluZCB0aGUgY2h1bmsgYnkgZ29pbmcgdGhyb3VnaCB0aGUgbGlzdC5cbiAgICBjb25zdCBoID0gdGhpcy5fbGlua2VkTGlzdC5maW5kKChjaHVuaykgPT4gaW5kZXggPD0gY2h1bmsuZW5kKTtcbiAgICBpZiAoIWgpIHtcbiAgICAgIHRocm93IEVycm9yKCdDaHVuayBjYW5ub3QgYmUgZm91bmQuJyk7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID09IGguZW5kICYmIGgubmV4dCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFtoLCBoLm5leHRdO1xuICAgIH1cblxuICAgIHJldHVybiBbaCwgaC5zbGljZShpbmRleCldO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHBvc2l0aW9uIGluIHRoZSBjb250ZW50IGJhc2VkIG9uIHRoZSBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nLlxuICAgKiBTb21lIGNoYXJhY3RlcnMgbWlnaHQgYmUgd2lkZXIgdGhhbiBvbmUgYnl0ZSwgdGh1cyB3ZSBoYXZlIHRvIGRldGVybWluZSB0aGUgcG9zaXRpb24gdXNpbmdcbiAgICogc3RyaW5nIGZ1bmN0aW9ucy5cbiAgICovXG4gIHByb3RlY3RlZCBfZ2V0VGV4dFBvc2l0aW9uKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh0aGlzLl9vcmlnaW5hbENvbnRlbnQudG9TdHJpbmcoKS5zdWJzdHJpbmcoMCwgaW5kZXgpKS5sZW5ndGg7XG4gIH1cblxuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2xpbmtlZExpc3QucmVkdWNlKChhY2MsIGNodW5rKSA9PiBhY2MgKyBjaHVuay5sZW5ndGgsIDApO1xuICB9XG4gIGdldCBvcmlnaW5hbCgpOiBCdWZmZXIge1xuICAgIHJldHVybiB0aGlzLl9vcmlnaW5hbENvbnRlbnQ7XG4gIH1cblxuICB0b1N0cmluZyhlbmNvZGluZzogQnVmZmVyRW5jb2RpbmcgPSAndXRmLTgnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbGlua2VkTGlzdC5yZWR1Y2UoKGFjYywgY2h1bmspID0+IGFjYyArIGNodW5rLnRvU3RyaW5nKGVuY29kaW5nKSwgJycpO1xuICB9XG4gIGdlbmVyYXRlKCk6IEJ1ZmZlciB7XG4gICAgY29uc3QgcmVzdWx0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKHRoaXMubGVuZ3RoKTtcbiAgICBsZXQgaSA9IDA7XG4gICAgdGhpcy5fbGlua2VkTGlzdC5mb3JFYWNoKChjaHVuaykgPT4ge1xuICAgICAgY2h1bmsuY29weShyZXN1bHQsIGkpO1xuICAgICAgaSArPSBjaHVuay5sZW5ndGg7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaW5zZXJ0TGVmdChpbmRleDogbnVtYmVyLCBjb250ZW50OiBCdWZmZXIsIGFzc2VydCA9IGZhbHNlKSB7XG4gICAgdGhpcy5fc2xpY2UoaW5kZXgpWzBdLmFwcGVuZChjb250ZW50LCBhc3NlcnQpO1xuICB9XG4gIGluc2VydFJpZ2h0KGluZGV4OiBudW1iZXIsIGNvbnRlbnQ6IEJ1ZmZlciwgYXNzZXJ0ID0gZmFsc2UpIHtcbiAgICB0aGlzLl9zbGljZShpbmRleClbMV0ucHJlcGVuZChjb250ZW50LCBhc3NlcnQpO1xuICB9XG5cbiAgcmVtb3ZlKGluZGV4OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKSB7XG4gICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVuZCA9IGluZGV4ICsgbGVuZ3RoO1xuICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5fc2xpY2UoaW5kZXgpWzFdO1xuICAgIGNvbnN0IGxhc3QgPSB0aGlzLl9zbGljZShlbmQpWzFdO1xuXG4gICAgbGV0IGN1cnI6IENodW5rIHwgbnVsbDtcbiAgICBmb3IgKGN1cnIgPSBmaXJzdDsgY3VyciAmJiBjdXJyICE9PSBsYXN0OyBjdXJyID0gY3Vyci5uZXh0KSB7XG4gICAgICBjdXJyLmFzc2VydChjdXJyICE9PSBmaXJzdCwgY3VyciAhPT0gbGFzdCwgY3VyciA9PT0gZmlyc3QpO1xuICAgIH1cbiAgICBmb3IgKGN1cnIgPSBmaXJzdDsgY3VyciAmJiBjdXJyICE9PSBsYXN0OyBjdXJyID0gY3Vyci5uZXh0KSB7XG4gICAgICBjdXJyLnJlbW92ZShjdXJyICE9PSBmaXJzdCwgY3VyciAhPT0gbGFzdCwgY3VyciA9PT0gZmlyc3QpO1xuICAgIH1cblxuICAgIGlmIChjdXJyKSB7XG4gICAgICBjdXJyLnJlbW92ZSh0cnVlLCBmYWxzZSwgZmFsc2UpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFuIHV0aWxpdHkgY2xhc3MgdGhhdCBhbGxvd3MgYnVmZmVycyB0byBiZSBpbnNlcnRlZCB0byB0aGUgX3JpZ2h0IG9yIF9sZWZ0LCBvciBkZWxldGVkLCB3aGlsZVxuICoga2VlcGluZyBpbmRpY2VzIHRvIHRoZSBvcmlnaW5hbCBidWZmZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBVcGRhdGVCdWZmZXIyIGV4dGVuZHMgVXBkYXRlQnVmZmVyQmFzZSB7XG4gIHByb3RlY3RlZCBfbXV0YXRhYmxlQ29udGVudDogTWFnaWNTdHJpbmcgPSBuZXcgTWFnaWNTdHJpbmcodGhpcy5fb3JpZ2luYWxDb250ZW50LnRvU3RyaW5nKCkpO1xuXG4gIHByb3RlY3RlZCBfYXNzZXJ0SW5kZXgoaW5kZXg6IG51bWJlcikge1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiB0aGlzLl9vcmlnaW5hbENvbnRlbnQubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kRXhjZXB0aW9uKGluZGV4LCAwLCB0aGlzLl9vcmlnaW5hbENvbnRlbnQubGVuZ3RoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX211dGF0YWJsZUNvbnRlbnQubGVuZ3RoKCk7XG4gIH1cbiAgZ2V0IG9yaWdpbmFsKCk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHRoaXMuX29yaWdpbmFsQ29udGVudDtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX211dGF0YWJsZUNvbnRlbnQudG9TdHJpbmcoKTtcbiAgfVxuXG4gIGdlbmVyYXRlKCk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHRoaXMudG9TdHJpbmcoKSk7XG4gIH1cblxuICBpbnNlcnRMZWZ0KGluZGV4OiBudW1iZXIsIGNvbnRlbnQ6IEJ1ZmZlcik6IHZvaWQge1xuICAgIHRoaXMuX2Fzc2VydEluZGV4KGluZGV4KTtcbiAgICB0aGlzLl9tdXRhdGFibGVDb250ZW50LmFwcGVuZExlZnQoaW5kZXgsIGNvbnRlbnQudG9TdHJpbmcoKSk7XG4gIH1cblxuICBpbnNlcnRSaWdodChpbmRleDogbnVtYmVyLCBjb250ZW50OiBCdWZmZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9hc3NlcnRJbmRleChpbmRleCk7XG4gICAgdGhpcy5fbXV0YXRhYmxlQ29udGVudC5hcHBlbmRSaWdodChpbmRleCwgY29udGVudC50b1N0cmluZygpKTtcbiAgfVxuXG4gIHJlbW92ZShpbmRleDogbnVtYmVyLCBsZW5ndGg6IG51bWJlcikge1xuICAgIHRoaXMuX2Fzc2VydEluZGV4KGluZGV4KTtcbiAgICB0aGlzLl9tdXRhdGFibGVDb250ZW50LnJlbW92ZShpbmRleCwgaW5kZXggKyBsZW5ndGgpO1xuICB9XG59XG4iXX0=