atom-languageclient
Version:
Integrate Language Servers with Atom
111 lines • 15.1 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const assert = require("assert");
const convert_1 = require("../convert");
const apply_edit_adapter_1 = require("./apply-edit-adapter");
const languageclient_1 = require("../languageclient");
class CodeActionAdapter {
/** @returns A {Boolean} indicating this adapter can adapt the server based on the given serverCapabilities. */
static canAdapt(serverCapabilities) {
return serverCapabilities.codeActionProvider === true;
}
/**
* Public: Retrieves code actions for a given editor, range, and context (diagnostics). Throws an error if
* codeActionProvider is not a registered capability.
*
* @param connection A {LanguageClientConnection} to the language server that provides highlights.
* @param serverCapabilities The {ServerCapabilities} of the language server that will be used.
* @param editor The Atom {TextEditor} containing the diagnostics.
* @param range The Atom {Range} to fetch code actions for.
* @param linterMessages An {Array<linter$Message>} to fetch code actions for. This is typically a list of messages
* intersecting `range`.
* @returns A {Promise} of an {Array} of {atomIde$CodeAction}s to display.
*/
static getCodeActions(connection, serverCapabilities, linterAdapter, editor, range, linterMessages, filterActions = (actions) => actions, onApply = () => Promise.resolve(true)) {
return __awaiter(this, void 0, void 0, function* () {
if (linterAdapter == null) {
return [];
}
assert(serverCapabilities.codeActionProvider, "Must have the textDocument/codeAction capability");
const params = createCodeActionParams(linterAdapter, editor, range, linterMessages);
const actions = filterActions(yield connection.codeAction(params));
if (actions === null) {
return [];
}
return actions.map((action) => CodeActionAdapter.createCodeAction(action, connection, onApply));
});
}
static createCodeAction(action, connection, onApply) {
return {
apply() {
return __awaiter(this, void 0, void 0, function* () {
if (!(yield onApply(action))) {
return;
}
if (languageclient_1.CodeAction.is(action)) {
CodeActionAdapter.applyWorkspaceEdit(action.edit);
yield CodeActionAdapter.executeCommand(action.command, connection);
}
else {
yield CodeActionAdapter.executeCommand(action, connection);
}
});
},
getTitle() {
return Promise.resolve(action.title);
},
dispose() { },
};
}
static applyWorkspaceEdit(edit) {
if (languageclient_1.WorkspaceEdit.is(edit)) {
apply_edit_adapter_1.default.onApplyEdit({ edit });
}
}
static executeCommand(command, connection) {
return __awaiter(this, void 0, void 0, function* () {
if (languageclient_1.Command.is(command)) {
yield connection.executeCommand({
command: command.command,
arguments: command.arguments,
});
}
});
}
}
exports.default = CodeActionAdapter;
function createCodeActionParams(linterAdapter, editor, range, linterMessages) {
let diagnostics;
if (linterMessages.length === 0) {
diagnostics = [];
}
else {
// TODO compile time dispatch using function names
diagnostics = areLinterMessages(linterMessages)
? linterAdapter.getLSDiagnosticsForMessages(linterMessages)
: linterAdapter.getLSDiagnosticsForIdeDiagnostics(linterMessages, editor);
}
return {
textDocument: convert_1.default.editorToTextDocumentIdentifier(editor),
range: convert_1.default.atomRangeToLSRange(range),
context: {
diagnostics,
},
};
}
function areLinterMessages(linterMessages) {
if ("excerpt" in linterMessages[0]) {
return true;
}
return false;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1hY3Rpb24tYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9hZGFwdGVycy9jb2RlLWFjdGlvbi1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBS0EsaUNBQWlDO0FBQ2pDLHdDQUFnQztBQUNoQyw2REFBbUQ7QUFDbkQsc0RBUTBCO0FBRzFCLE1BQXFCLGlCQUFpQjtJQUNwQywrR0FBK0c7SUFDeEcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxrQkFBc0M7UUFDM0QsT0FBTyxrQkFBa0IsQ0FBQyxrQkFBa0IsS0FBSyxJQUFJLENBQUE7SUFDdkQsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ksTUFBTSxDQUFPLGNBQWMsQ0FDaEMsVUFBb0MsRUFDcEMsa0JBQXNDLEVBQ3RDLGFBQXFFLEVBQ3JFLE1BQWtCLEVBQ2xCLEtBQVksRUFDWixjQUF1RCxFQUN2RCxnQkFBK0YsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFDbkgsVUFBOEQsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7O1lBRXpGLElBQUksYUFBYSxJQUFJLElBQUksRUFBRTtnQkFDekIsT0FBTyxFQUFFLENBQUE7YUFDVjtZQUNELE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsRUFBRSxrREFBa0QsQ0FBQyxDQUFBO1lBRWpHLE1BQU0sTUFBTSxHQUFHLHNCQUFzQixDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFBO1lBQ25GLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxNQUFNLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtZQUNsRSxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7Z0JBQ3BCLE9BQU8sRUFBRSxDQUFBO2FBQ1Y7WUFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtRQUNqRyxDQUFDO0tBQUE7SUFFTyxNQUFNLENBQUMsZ0JBQWdCLENBQzdCLE1BQTRCLEVBQzVCLFVBQW9DLEVBQ3BDLE9BQTJEO1FBRTNELE9BQU87WUFDQyxLQUFLOztvQkFDVCxJQUFJLENBQUMsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFO3dCQUM1QixPQUFNO3FCQUNQO29CQUNELElBQUksMkJBQVUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUU7d0JBQ3pCLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTt3QkFDakQsTUFBTSxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQTtxQkFDbkU7eUJBQU07d0JBQ0wsTUFBTSxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFBO3FCQUMzRDtnQkFDSCxDQUFDO2FBQUE7WUFDRCxRQUFRO2dCQUNOLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDdEMsQ0FBQztZQUNELE9BQU8sS0FBVSxDQUFDO1NBQ25CLENBQUE7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQStCO1FBQy9ELElBQUksOEJBQWEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDMUIsNEJBQWdCLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtTQUN2QztJQUNILENBQUM7SUFFTyxNQUFNLENBQU8sY0FBYyxDQUFDLE9BQVksRUFBRSxVQUFvQzs7WUFDcEYsSUFBSSx3QkFBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDdkIsTUFBTSxVQUFVLENBQUMsY0FBYyxDQUFDO29CQUM5QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87b0JBQ3hCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztpQkFDN0IsQ0FBQyxDQUFBO2FBQ0g7UUFDSCxDQUFDO0tBQUE7Q0FDRjtBQS9FRCxvQ0ErRUM7QUFFRCxTQUFTLHNCQUFzQixDQUM3QixhQUF5RCxFQUN6RCxNQUFrQixFQUNsQixLQUFZLEVBQ1osY0FBdUQ7SUFFdkQsSUFBSSxXQUF5QixDQUFBO0lBQzdCLElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDL0IsV0FBVyxHQUFHLEVBQUUsQ0FBQTtLQUNqQjtTQUFNO1FBQ0wsa0RBQWtEO1FBQ2xELFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxjQUFjLENBQUM7WUFDN0MsQ0FBQyxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxjQUFrQyxDQUFDO1lBQy9FLENBQUMsQ0FBRSxhQUFzQyxDQUFDLGlDQUFpQyxDQUN2RSxjQUFzQyxFQUN0QyxNQUFNLENBQ1AsQ0FBQTtLQUNOO0lBQ0QsT0FBTztRQUNMLFlBQVksRUFBRSxpQkFBTyxDQUFDLDhCQUE4QixDQUFDLE1BQU0sQ0FBQztRQUM1RCxLQUFLLEVBQUUsaUJBQU8sQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7UUFDeEMsT0FBTyxFQUFFO1lBQ1AsV0FBVztTQUNaO0tBQ0YsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLGNBQXVEO0lBQ2hGLElBQUksU0FBUyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNsQyxPQUFPLElBQUksQ0FBQTtLQUNaO0lBQ0QsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgKiBhcyBhdG9tSWRlIGZyb20gXCJhdG9tLWlkZS1iYXNlXCJcbmltcG9ydCAqIGFzIGxpbnRlciBmcm9tIFwiYXRvbS9saW50ZXJcIlxuaW1wb3J0IExpbnRlclB1c2hWMkFkYXB0ZXIgZnJvbSBcIi4vbGludGVyLXB1c2gtdjItYWRhcHRlclwiXG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZGVwcmVjYXRlZCAqL1xuaW1wb3J0IElkZURpYWdub3N0aWNBZGFwdGVyIGZyb20gXCIuL2RpYWdub3N0aWMtYWRhcHRlclwiXG5pbXBvcnQgYXNzZXJ0ID0gcmVxdWlyZShcImFzc2VydFwiKVxuaW1wb3J0IENvbnZlcnQgZnJvbSBcIi4uL2NvbnZlcnRcIlxuaW1wb3J0IEFwcGx5RWRpdEFkYXB0ZXIgZnJvbSBcIi4vYXBwbHktZWRpdC1hZGFwdGVyXCJcbmltcG9ydCB7XG4gIENvZGVBY3Rpb24sXG4gIENvZGVBY3Rpb25QYXJhbXMsXG4gIENvbW1hbmQsXG4gIERpYWdub3N0aWMsXG4gIExhbmd1YWdlQ2xpZW50Q29ubmVjdGlvbixcbiAgU2VydmVyQ2FwYWJpbGl0aWVzLFxuICBXb3Jrc3BhY2VFZGl0LFxufSBmcm9tIFwiLi4vbGFuZ3VhZ2VjbGllbnRcIlxuaW1wb3J0IHsgUmFuZ2UsIFRleHRFZGl0b3IgfSBmcm9tIFwiYXRvbVwiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvZGVBY3Rpb25BZGFwdGVyIHtcbiAgLyoqIEByZXR1cm5zIEEge0Jvb2xlYW59IGluZGljYXRpbmcgdGhpcyBhZGFwdGVyIGNhbiBhZGFwdCB0aGUgc2VydmVyIGJhc2VkIG9uIHRoZSBnaXZlbiBzZXJ2ZXJDYXBhYmlsaXRpZXMuICovXG4gIHB1YmxpYyBzdGF0aWMgY2FuQWRhcHQoc2VydmVyQ2FwYWJpbGl0aWVzOiBTZXJ2ZXJDYXBhYmlsaXRpZXMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc2VydmVyQ2FwYWJpbGl0aWVzLmNvZGVBY3Rpb25Qcm92aWRlciA9PT0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYzogUmV0cmlldmVzIGNvZGUgYWN0aW9ucyBmb3IgYSBnaXZlbiBlZGl0b3IsIHJhbmdlLCBhbmQgY29udGV4dCAoZGlhZ25vc3RpY3MpLiBUaHJvd3MgYW4gZXJyb3IgaWZcbiAgICogY29kZUFjdGlvblByb3ZpZGVyIGlzIG5vdCBhIHJlZ2lzdGVyZWQgY2FwYWJpbGl0eS5cbiAgICpcbiAgICogQHBhcmFtIGNvbm5lY3Rpb24gQSB7TGFuZ3VhZ2VDbGllbnRDb25uZWN0aW9ufSB0byB0aGUgbGFuZ3VhZ2Ugc2VydmVyIHRoYXQgcHJvdmlkZXMgaGlnaGxpZ2h0cy5cbiAgICogQHBhcmFtIHNlcnZlckNhcGFiaWxpdGllcyBUaGUge1NlcnZlckNhcGFiaWxpdGllc30gb2YgdGhlIGxhbmd1YWdlIHNlcnZlciB0aGF0IHdpbGwgYmUgdXNlZC5cbiAgICogQHBhcmFtIGVkaXRvciBUaGUgQXRvbSB7VGV4dEVkaXRvcn0gY29udGFpbmluZyB0aGUgZGlhZ25vc3RpY3MuXG4gICAqIEBwYXJhbSByYW5nZSBUaGUgQXRvbSB7UmFuZ2V9IHRvIGZldGNoIGNvZGUgYWN0aW9ucyBmb3IuXG4gICAqIEBwYXJhbSBsaW50ZXJNZXNzYWdlcyBBbiB7QXJyYXk8bGludGVyJE1lc3NhZ2U+fSB0byBmZXRjaCBjb2RlIGFjdGlvbnMgZm9yLiBUaGlzIGlzIHR5cGljYWxseSBhIGxpc3Qgb2YgbWVzc2FnZXNcbiAgICogICBpbnRlcnNlY3RpbmcgYHJhbmdlYC5cbiAgICogQHJldHVybnMgQSB7UHJvbWlzZX0gb2YgYW4ge0FycmF5fSBvZiB7YXRvbUlkZSRDb2RlQWN0aW9ufXMgdG8gZGlzcGxheS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2V0Q29kZUFjdGlvbnMoXG4gICAgY29ubmVjdGlvbjogTGFuZ3VhZ2VDbGllbnRDb25uZWN0aW9uLFxuICAgIHNlcnZlckNhcGFiaWxpdGllczogU2VydmVyQ2FwYWJpbGl0aWVzLFxuICAgIGxpbnRlckFkYXB0ZXI6IExpbnRlclB1c2hWMkFkYXB0ZXIgfCBJZGVEaWFnbm9zdGljQWRhcHRlciB8IHVuZGVmaW5lZCxcbiAgICBlZGl0b3I6IFRleHRFZGl0b3IsXG4gICAgcmFuZ2U6IFJhbmdlLFxuICAgIGxpbnRlck1lc3NhZ2VzOiBsaW50ZXIuTWVzc2FnZVtdIHwgYXRvbUlkZS5EaWFnbm9zdGljW10sXG4gICAgZmlsdGVyQWN0aW9uczogKGFjdGlvbnM6IChDb21tYW5kIHwgQ29kZUFjdGlvbilbXSB8IG51bGwpID0+IChDb21tYW5kIHwgQ29kZUFjdGlvbilbXSB8IG51bGwgPSAoYWN0aW9ucykgPT4gYWN0aW9ucyxcbiAgICBvbkFwcGx5OiAoYWN0aW9uOiBDb21tYW5kIHwgQ29kZUFjdGlvbikgPT4gUHJvbWlzZTxib29sZWFuPiA9ICgpID0+IFByb21pc2UucmVzb2x2ZSh0cnVlKVxuICApOiBQcm9taXNlPGF0b21JZGUuQ29kZUFjdGlvbltdPiB7XG4gICAgaWYgKGxpbnRlckFkYXB0ZXIgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICAgIGFzc2VydChzZXJ2ZXJDYXBhYmlsaXRpZXMuY29kZUFjdGlvblByb3ZpZGVyLCBcIk11c3QgaGF2ZSB0aGUgdGV4dERvY3VtZW50L2NvZGVBY3Rpb24gY2FwYWJpbGl0eVwiKVxuXG4gICAgY29uc3QgcGFyYW1zID0gY3JlYXRlQ29kZUFjdGlvblBhcmFtcyhsaW50ZXJBZGFwdGVyLCBlZGl0b3IsIHJhbmdlLCBsaW50ZXJNZXNzYWdlcylcbiAgICBjb25zdCBhY3Rpb25zID0gZmlsdGVyQWN0aW9ucyhhd2FpdCBjb25uZWN0aW9uLmNvZGVBY3Rpb24ocGFyYW1zKSlcbiAgICBpZiAoYWN0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICAgIHJldHVybiBhY3Rpb25zLm1hcCgoYWN0aW9uKSA9PiBDb2RlQWN0aW9uQWRhcHRlci5jcmVhdGVDb2RlQWN0aW9uKGFjdGlvbiwgY29ubmVjdGlvbiwgb25BcHBseSkpXG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDb2RlQWN0aW9uKFxuICAgIGFjdGlvbjogQ29tbWFuZCB8IENvZGVBY3Rpb24sXG4gICAgY29ubmVjdGlvbjogTGFuZ3VhZ2VDbGllbnRDb25uZWN0aW9uLFxuICAgIG9uQXBwbHk6IChhY3Rpb246IENvbW1hbmQgfCBDb2RlQWN0aW9uKSA9PiBQcm9taXNlPGJvb2xlYW4+XG4gICk6IGF0b21JZGUuQ29kZUFjdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFzeW5jIGFwcGx5KCkge1xuICAgICAgICBpZiAoIShhd2FpdCBvbkFwcGx5KGFjdGlvbikpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKENvZGVBY3Rpb24uaXMoYWN0aW9uKSkge1xuICAgICAgICAgIENvZGVBY3Rpb25BZGFwdGVyLmFwcGx5V29ya3NwYWNlRWRpdChhY3Rpb24uZWRpdClcbiAgICAgICAgICBhd2FpdCBDb2RlQWN0aW9uQWRhcHRlci5leGVjdXRlQ29tbWFuZChhY3Rpb24uY29tbWFuZCwgY29ubmVjdGlvbilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBDb2RlQWN0aW9uQWRhcHRlci5leGVjdXRlQ29tbWFuZChhY3Rpb24sIGNvbm5lY3Rpb24pXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBnZXRUaXRsZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFjdGlvbi50aXRsZSlcbiAgICAgIH0sXG4gICAgICBkaXNwb3NlKCk6IHZvaWQge30sXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXBwbHlXb3Jrc3BhY2VFZGl0KGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoV29ya3NwYWNlRWRpdC5pcyhlZGl0KSkge1xuICAgICAgQXBwbHlFZGl0QWRhcHRlci5vbkFwcGx5RWRpdCh7IGVkaXQgfSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBhc3luYyBleGVjdXRlQ29tbWFuZChjb21tYW5kOiBhbnksIGNvbm5lY3Rpb246IExhbmd1YWdlQ2xpZW50Q29ubmVjdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChDb21tYW5kLmlzKGNvbW1hbmQpKSB7XG4gICAgICBhd2FpdCBjb25uZWN0aW9uLmV4ZWN1dGVDb21tYW5kKHtcbiAgICAgICAgY29tbWFuZDogY29tbWFuZC5jb21tYW5kLFxuICAgICAgICBhcmd1bWVudHM6IGNvbW1hbmQuYXJndW1lbnRzLFxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29kZUFjdGlvblBhcmFtcyhcbiAgbGludGVyQWRhcHRlcjogTGludGVyUHVzaFYyQWRhcHRlciB8IElkZURpYWdub3N0aWNBZGFwdGVyLFxuICBlZGl0b3I6IFRleHRFZGl0b3IsXG4gIHJhbmdlOiBSYW5nZSxcbiAgbGludGVyTWVzc2FnZXM6IGxpbnRlci5NZXNzYWdlW10gfCBhdG9tSWRlLkRpYWdub3N0aWNbXVxuKTogQ29kZUFjdGlvblBhcmFtcyB7XG4gIGxldCBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdXG4gIGlmIChsaW50ZXJNZXNzYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICBkaWFnbm9zdGljcyA9IFtdXG4gIH0gZWxzZSB7XG4gICAgLy8gVE9ETyBjb21waWxlIHRpbWUgZGlzcGF0Y2ggdXNpbmcgZnVuY3Rpb24gbmFtZXNcbiAgICBkaWFnbm9zdGljcyA9IGFyZUxpbnRlck1lc3NhZ2VzKGxpbnRlck1lc3NhZ2VzKVxuICAgICAgPyBsaW50ZXJBZGFwdGVyLmdldExTRGlhZ25vc3RpY3NGb3JNZXNzYWdlcyhsaW50ZXJNZXNzYWdlcyBhcyBsaW50ZXIuTWVzc2FnZVtdKVxuICAgICAgOiAobGludGVyQWRhcHRlciBhcyBJZGVEaWFnbm9zdGljQWRhcHRlcikuZ2V0TFNEaWFnbm9zdGljc0ZvcklkZURpYWdub3N0aWNzKFxuICAgICAgICAgIGxpbnRlck1lc3NhZ2VzIGFzIGF0b21JZGUuRGlhZ25vc3RpY1tdLFxuICAgICAgICAgIGVkaXRvclxuICAgICAgICApXG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0ZXh0RG9jdW1lbnQ6IENvbnZlcnQuZWRpdG9yVG9UZXh0RG9jdW1lbnRJZGVudGlmaWVyKGVkaXRvciksXG4gICAgcmFuZ2U6IENvbnZlcnQuYXRvbVJhbmdlVG9MU1JhbmdlKHJhbmdlKSxcbiAgICBjb250ZXh0OiB7XG4gICAgICBkaWFnbm9zdGljcyxcbiAgICB9LFxuICB9XG59XG5cbmZ1bmN0aW9uIGFyZUxpbnRlck1lc3NhZ2VzKGxpbnRlck1lc3NhZ2VzOiBsaW50ZXIuTWVzc2FnZVtdIHwgYXRvbUlkZS5EaWFnbm9zdGljW10pOiBib29sZWFuIHtcbiAgaWYgKFwiZXhjZXJwdFwiIGluIGxpbnRlck1lc3NhZ2VzWzBdKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cbiJdfQ==
;