kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
175 lines (172 loc) • 28.6 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _react = _interopRequireWildcard(require("react"));
var _react2 = _interopRequireDefault(require("@monaco-editor/react"));
var monaco = _interopRequireWildcard(require("monaco-editor"));
var _lodash = _interopRequireDefault(require("lodash.uniq"));
var _lodash2 = _interopRequireDefault(require("lodash.uniqby"));
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
// import {tableSchema as DEFAULT_SCHEMA} from './table-schema';
var MONACO_OPTIONS = {
minimap: {
enabled: false
},
language: 'sql',
contextmenu: false,
renderLineHighlight: 'none',
scrollBeyondLastLine: false,
scrollbar: {
alwaysConsumeMouseWheel: false
},
overviewRulerLanes: 0,
automaticLayout: true,
acceptSuggestionOnEnter: 'on',
quickSuggestionsDelay: 400,
matchOnWordStartOnly: false,
tabCompletion: 'off',
lineNumbers: 'off'
};
function parseSqlAndFindTableNameAndAliases(sql) {
var regex = /\b(?:FROM|JOIN)\s+([^\s.]+(?:\.[^\s.]+)?)\s*(?:AS)?\s*([^\s,]+)?/gi;
var tables = [];
while (true) {
var match = regex.exec(sql);
if (!match) {
break;
}
var table_name = match[1];
if (!/\(/.test(table_name)) {
// exclude function calls
var alias = match[2];
if (alias && /on|where|inner|left|right|join/.test(alias)) {
alias = null;
}
tables.push({
table_name: table_name,
alias: alias || table_name
});
}
}
return tables;
}
var MonacoEditor = function MonacoEditor(_ref) {
var onRunQuery = _ref.onRunQuery,
onChange = _ref.onChange,
code = _ref.code,
tableSchema = _ref.tableSchema,
isReadOnly = _ref.isReadOnly;
// private editor?: monaco.editor.IStandaloneCodeEditor;
var schemaTableNames = (0, _react.useMemo)(function () {
return tableSchema ? (0, _lodash["default"])(tableSchema.map(function (d) {
return d.table_name;
})) : [];
}, [tableSchema]);
var schemaTableNamesSet = (0, _react.useMemo)(function () {
return new Set(schemaTableNames);
}, [schemaTableNames]);
var handleRunQueryRef = (0, _react.useRef)(onRunQuery);
handleRunQueryRef.current = onRunQuery;
var handleEditorDidMount = (0, _react.useCallback)(function (editor) {
// this.editor = editor;
editor.focus();
editor.addAction({
id: 'run-query',
label: 'Run Query',
keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter, monaco.KeyMod.Shift | monaco.KeyCode.Enter],
contextMenuGroupId: 'custom',
contextMenuOrder: 0,
run: function run() {
return handleRunQueryRef.current();
}
});
monaco.languages.registerCompletionItemProvider('*', {
provideCompletionItems: function provideCompletionItems(model, position, _context, _cancelationToken) {
var _thisLine$trim$split$, _exec, _exec2;
var suggestions = [{
label: 'myCustomSnippet',
kind: monaco.languages.CompletionItemKind.Snippet,
insertText: 'This is a piece of custom code',
insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
documentation: 'This is a piece of custom code'
// TODO: range is missing
}];
var fullQueryText = model.getValue();
var tableNamesAndAliases = new Map(parseSqlAndFindTableNameAndAliases(fullQueryText).map(function (_ref2) {
var table_name = _ref2.table_name,
alias = _ref2.alias;
return [alias, table_name];
}));
var thisLine = model.getValueInRange({
startLineNumber: position.lineNumber,
startColumn: 1,
endLineNumber: position.lineNumber,
endColumn: position.column
});
var thisToken = ((_thisLine$trim$split$ = thisLine.trim().split(' ').slice(-1)) === null || _thisLine$trim$split$ === void 0 ? void 0 : _thisLine$trim$split$[0]) || '';
var lastTokenBeforeSpace = (_exec = /\s?(\w+)\s+\w+$/.exec(thisLine.trim())) === null || _exec === void 0 ? void 0 : _exec[1];
var lastTokenBeforeDot = (_exec2 = /(\w+)\.\w*$/.exec(thisToken)) === null || _exec2 === void 0 ? void 0 : _exec2[1];
// console.log(tableNamesAndAliases, thisToken, lastTokenBeforeSpace, lastTokenBeforeDot);
if (lastTokenBeforeSpace && /from|join|update|into/.test(lastTokenBeforeSpace)) {
suggestions.push.apply(suggestions, (0, _toConsumableArray2["default"])(schemaTableNames.map(function (table_name) {
return {
label: table_name,
kind: monaco.languages.CompletionItemKind.Field,
insertText: table_name
// TODO: range is missing
};
})));
}
if (lastTokenBeforeDot) {
var table_name = null;
if (schemaTableNamesSet.has(lastTokenBeforeDot)) {
table_name = lastTokenBeforeDot;
} else if (tableNamesAndAliases.get(lastTokenBeforeDot)) {
table_name = tableNamesAndAliases.get(lastTokenBeforeDot);
}
if (table_name && tableSchema) {
suggestions.push.apply(suggestions, (0, _toConsumableArray2["default"])(tableSchema.filter(function (d) {
return d.table_name === table_name;
}).map(function (_ref3) {
var column_name = _ref3.column_name;
return {
label: column_name,
kind: monaco.languages.CompletionItemKind.Field,
insertText: column_name
// TODO: range is missing
};
})));
}
}
return {
suggestions: (0, _lodash2["default"])(suggestions, function (s) {
return s.insertText;
})
};
}
});
}, [tableSchema, schemaTableNames, schemaTableNamesSet]);
return /*#__PURE__*/_react["default"].createElement(_react2["default"], {
height: "100%",
theme: "vs-dark",
defaultLanguage: "sql",
defaultValue: code,
onChange: onChange,
onMount: handleEditorDidMount,
options: _objectSpread(_objectSpread({}, MONACO_OPTIONS), {}, {
readOnly: isReadOnly
})
});
};
var _default = exports["default"] = MonacoEditor;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3QyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIm1vbmFjbyIsIl9sb2Rhc2giLCJfbG9kYXNoMiIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIk1PTkFDT19PUFRJT05TIiwibWluaW1hcCIsImVuYWJsZWQiLCJsYW5ndWFnZSIsImNvbnRleHRtZW51IiwicmVuZGVyTGluZUhpZ2hsaWdodCIsInNjcm9sbEJleW9uZExhc3RMaW5lIiwic2Nyb2xsYmFyIiwiYWx3YXlzQ29uc3VtZU1vdXNlV2hlZWwiLCJvdmVydmlld1J1bGVyTGFuZXMiLCJhdXRvbWF0aWNMYXlvdXQiLCJhY2NlcHRTdWdnZXN0aW9uT25FbnRlciIsInF1aWNrU3VnZ2VzdGlvbnNEZWxheSIsIm1hdGNoT25Xb3JkU3RhcnRPbmx5IiwidGFiQ29tcGxldGlvbiIsImxpbmVOdW1iZXJzIiwicGFyc2VTcWxBbmRGaW5kVGFibGVOYW1lQW5kQWxpYXNlcyIsInNxbCIsInJlZ2V4IiwidGFibGVzIiwibWF0Y2giLCJleGVjIiwidGFibGVfbmFtZSIsInRlc3QiLCJhbGlhcyIsIk1vbmFjb0VkaXRvciIsIl9yZWYiLCJvblJ1blF1ZXJ5Iiwib25DaGFuZ2UiLCJjb2RlIiwidGFibGVTY2hlbWEiLCJpc1JlYWRPbmx5Iiwic2NoZW1hVGFibGVOYW1lcyIsInVzZU1lbW8iLCJ1bmlxIiwibWFwIiwiZCIsInNjaGVtYVRhYmxlTmFtZXNTZXQiLCJTZXQiLCJoYW5kbGVSdW5RdWVyeVJlZiIsInVzZVJlZiIsImN1cnJlbnQiLCJoYW5kbGVFZGl0b3JEaWRNb3VudCIsInVzZUNhbGxiYWNrIiwiZWRpdG9yIiwiZm9jdXMiLCJhZGRBY3Rpb24iLCJpZCIsImxhYmVsIiwia2V5YmluZGluZ3MiLCJLZXlNb2QiLCJDdHJsQ21kIiwiS2V5Q29kZSIsIkVudGVyIiwiU2hpZnQiLCJjb250ZXh0TWVudUdyb3VwSWQiLCJjb250ZXh0TWVudU9yZGVyIiwicnVuIiwibGFuZ3VhZ2VzIiwicmVnaXN0ZXJDb21wbGV0aW9uSXRlbVByb3ZpZGVyIiwicHJvdmlkZUNvbXBsZXRpb25JdGVtcyIsIm1vZGVsIiwicG9zaXRpb24iLCJfY29udGV4dCIsIl9jYW5jZWxhdGlvblRva2VuIiwiX3RoaXNMaW5lJHRyaW0kc3BsaXQkIiwiX2V4ZWMiLCJfZXhlYzIiLCJzdWdnZXN0aW9ucyIsImtpbmQiLCJDb21wbGV0aW9uSXRlbUtpbmQiLCJTbmlwcGV0IiwiaW5zZXJ0VGV4dCIsImluc2VydFRleHRSdWxlcyIsIkNvbXBsZXRpb25JdGVtSW5zZXJ0VGV4dFJ1bGUiLCJJbnNlcnRBc1NuaXBwZXQiLCJkb2N1bWVudGF0aW9uIiwiZnVsbFF1ZXJ5VGV4dCIsImdldFZhbHVlIiwidGFibGVOYW1lc0FuZEFsaWFzZXMiLCJNYXAiLCJfcmVmMiIsInRoaXNMaW5lIiwiZ2V0VmFsdWVJblJhbmdlIiwic3RhcnRMaW5lTnVtYmVyIiwibGluZU51bWJlciIsInN0YXJ0Q29sdW1uIiwiZW5kTGluZU51bWJlciIsImVuZENvbHVtbiIsImNvbHVtbiIsInRoaXNUb2tlbiIsInRyaW0iLCJzcGxpdCIsInNsaWNlIiwibGFzdFRva2VuQmVmb3JlU3BhY2UiLCJsYXN0VG9rZW5CZWZvcmVEb3QiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwiRmllbGQiLCJfcmVmMyIsImNvbHVtbl9uYW1lIiwidW5pcUJ5IiwicyIsImNyZWF0ZUVsZW1lbnQiLCJoZWlnaHQiLCJ0aGVtZSIsImRlZmF1bHRMYW5ndWFnZSIsImRlZmF1bHRWYWx1ZSIsIm9uTW91bnQiLCJvcHRpb25zIiwicmVhZE9ubHkiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9tb25hY28tZWRpdG9yLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgUmVhY3QsIHt1c2VDYWxsYmFjaywgdXNlTWVtbywgdXNlUmVmfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRWRpdG9yLCB7T25DaGFuZ2UsIE9uTW91bnR9IGZyb20gJ0Btb25hY28tZWRpdG9yL3JlYWN0JztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbi8vIGltcG9ydCB7dGFibGVTY2hlbWEgYXMgREVGQVVMVF9TQ0hFTUF9IGZyb20gJy4vdGFibGUtc2NoZW1hJztcbmltcG9ydCB1bmlxIGZyb20gJ2xvZGFzaC51bmlxJztcbmltcG9ydCB1bmlxQnkgZnJvbSAnbG9kYXNoLnVuaXFieSc7XG5cbmNvbnN0IE1PTkFDT19PUFRJT05TOiBtb25hY28uZWRpdG9yLklTdGFuZGFsb25lRWRpdG9yQ29uc3RydWN0aW9uT3B0aW9ucyA9IHtcbiAgbWluaW1hcDoge2VuYWJsZWQ6IGZhbHNlfSxcbiAgbGFuZ3VhZ2U6ICdzcWwnLFxuICBjb250ZXh0bWVudTogZmFsc2UsXG4gIHJlbmRlckxpbmVIaWdobGlnaHQ6ICdub25lJyxcbiAgc2Nyb2xsQmV5b25kTGFzdExpbmU6IGZhbHNlLFxuICBzY3JvbGxiYXI6IHthbHdheXNDb25zdW1lTW91c2VXaGVlbDogZmFsc2V9LFxuICBvdmVydmlld1J1bGVyTGFuZXM6IDAsXG4gIGF1dG9tYXRpY0xheW91dDogdHJ1ZSxcbiAgYWNjZXB0U3VnZ2VzdGlvbk9uRW50ZXI6ICdvbicsXG4gIHF1aWNrU3VnZ2VzdGlvbnNEZWxheTogNDAwLFxuICBtYXRjaE9uV29yZFN0YXJ0T25seTogZmFsc2UsXG4gIHRhYkNvbXBsZXRpb246ICdvZmYnLFxuICBsaW5lTnVtYmVyczogJ29mZidcbn07XG5cbmZ1bmN0aW9uIHBhcnNlU3FsQW5kRmluZFRhYmxlTmFtZUFuZEFsaWFzZXMoc3FsOiBzdHJpbmcpIHtcbiAgY29uc3QgcmVnZXggPSAvXFxiKD86RlJPTXxKT0lOKVxccysoW15cXHMuXSsoPzpcXC5bXlxccy5dKyk/KVxccyooPzpBUyk/XFxzKihbXlxccyxdKyk/L2dpO1xuICBjb25zdCB0YWJsZXM6IHt0YWJsZV9uYW1lOiBzdHJpbmc7IGFsaWFzOiBzdHJpbmd9W10gPSBbXTtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IG1hdGNoID0gcmVnZXguZXhlYyhzcWwpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZV9uYW1lID0gbWF0Y2hbMV07XG4gICAgaWYgKCEvXFwoLy50ZXN0KHRhYmxlX25hbWUpKSB7XG4gICAgICAvLyBleGNsdWRlIGZ1bmN0aW9uIGNhbGxzXG4gICAgICBsZXQgYWxpYXMgPSBtYXRjaFsyXSBhcyBzdHJpbmcgfCBudWxsO1xuICAgICAgaWYgKGFsaWFzICYmIC9vbnx3aGVyZXxpbm5lcnxsZWZ0fHJpZ2h0fGpvaW4vLnRlc3QoYWxpYXMpKSB7XG4gICAgICAgIGFsaWFzID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRhYmxlcy5wdXNoKHtcbiAgICAgICAgdGFibGVfbmFtZSxcbiAgICAgICAgYWxpYXM6IGFsaWFzIHx8IHRhYmxlX25hbWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YWJsZXM7XG59XG5cbmludGVyZmFjZSBNb25hY29FZGl0b3JQcm9wcyB7XG4gIGNvZGU6IHN0cmluZztcbiAgaXNSZWFkT25seT86IGJvb2xlYW47XG4gIG9uQ2hhbmdlOiBPbkNoYW5nZTtcbiAgb25SdW5RdWVyeTogKCkgPT4gdm9pZDtcbiAgdGFibGVTY2hlbWE/OiB7dGFibGVfbmFtZTogc3RyaW5nOyBjb2x1bW5fbmFtZTogc3RyaW5nfVtdO1xufVxuXG5jb25zdCBNb25hY29FZGl0b3I6IFJlYWN0LkZDPE1vbmFjb0VkaXRvclByb3BzPiA9ICh7XG4gIG9uUnVuUXVlcnksXG4gIG9uQ2hhbmdlLFxuICBjb2RlLFxuICB0YWJsZVNjaGVtYSxcbiAgaXNSZWFkT25seVxufSkgPT4ge1xuICAvLyBwcml2YXRlIGVkaXRvcj86IG1vbmFjby5lZGl0b3IuSVN0YW5kYWxvbmVDb2RlRWRpdG9yO1xuICBjb25zdCBzY2hlbWFUYWJsZU5hbWVzID0gdXNlTWVtbyhcbiAgICAoKSA9PiAodGFibGVTY2hlbWEgPyB1bmlxKHRhYmxlU2NoZW1hLm1hcChkID0+IGQudGFibGVfbmFtZSkpIDogW10pLFxuICAgIFt0YWJsZVNjaGVtYV1cbiAgKTtcbiAgY29uc3Qgc2NoZW1hVGFibGVOYW1lc1NldCA9IHVzZU1lbW8oKCkgPT4gbmV3IFNldChzY2hlbWFUYWJsZU5hbWVzKSwgW3NjaGVtYVRhYmxlTmFtZXNdKTtcbiAgY29uc3QgaGFuZGxlUnVuUXVlcnlSZWYgPSB1c2VSZWYob25SdW5RdWVyeSk7XG4gIGhhbmRsZVJ1blF1ZXJ5UmVmLmN1cnJlbnQgPSBvblJ1blF1ZXJ5O1xuXG4gIGNvbnN0IGhhbmRsZUVkaXRvckRpZE1vdW50OiBPbk1vdW50ID0gdXNlQ2FsbGJhY2soXG4gICAgZWRpdG9yID0+IHtcbiAgICAgIC8vIHRoaXMuZWRpdG9yID0gZWRpdG9yO1xuICAgICAgZWRpdG9yLmZvY3VzKCk7XG5cbiAgICAgIGVkaXRvci5hZGRBY3Rpb24oe1xuICAgICAgICBpZDogJ3J1bi1xdWVyeScsXG4gICAgICAgIGxhYmVsOiAnUnVuIFF1ZXJ5JyxcbiAgICAgICAga2V5YmluZGluZ3M6IFtcbiAgICAgICAgICBtb25hY28uS2V5TW9kLkN0cmxDbWQgfCBtb25hY28uS2V5Q29kZS5FbnRlcixcbiAgICAgICAgICBtb25hY28uS2V5TW9kLlNoaWZ0IHwgbW9uYWNvLktleUNvZGUuRW50ZXJcbiAgICAgICAgXSxcbiAgICAgICAgY29udGV4dE1lbnVHcm91cElkOiAnY3VzdG9tJyxcbiAgICAgICAgY29udGV4dE1lbnVPcmRlcjogMCxcbiAgICAgICAgcnVuOiAoKSA9PiBoYW5kbGVSdW5RdWVyeVJlZi5jdXJyZW50KClcbiAgICAgIH0pO1xuXG4gICAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyQ29tcGxldGlvbkl0ZW1Qcm92aWRlcignKicsIHtcbiAgICAgICAgcHJvdmlkZUNvbXBsZXRpb25JdGVtczogKG1vZGVsLCBwb3NpdGlvbiwgX2NvbnRleHQsIF9jYW5jZWxhdGlvblRva2VuKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnM6IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1bXSA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdteUN1c3RvbVNuaXBwZXQnLFxuICAgICAgICAgICAgICBraW5kOiBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZC5TbmlwcGV0LFxuICAgICAgICAgICAgICBpbnNlcnRUZXh0OiAnVGhpcyBpcyBhIHBpZWNlIG9mIGN1c3RvbSBjb2RlJyxcbiAgICAgICAgICAgICAgaW5zZXJ0VGV4dFJ1bGVzOiBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtSW5zZXJ0VGV4dFJ1bGUuSW5zZXJ0QXNTbmlwcGV0LFxuICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiAnVGhpcyBpcyBhIHBpZWNlIG9mIGN1c3RvbSBjb2RlJ1xuICAgICAgICAgICAgICAvLyBUT0RPOiByYW5nZSBpcyBtaXNzaW5nXG4gICAgICAgICAgICB9IGFzIG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1cbiAgICAgICAgICBdO1xuXG4gICAgICAgICAgY29uc3QgZnVsbFF1ZXJ5VGV4dCA9IG1vZGVsLmdldFZhbHVlKCk7XG5cbiAgICAgICAgICBjb25zdCB0YWJsZU5hbWVzQW5kQWxpYXNlcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KFxuICAgICAgICAgICAgcGFyc2VTcWxBbmRGaW5kVGFibGVOYW1lQW5kQWxpYXNlcyhmdWxsUXVlcnlUZXh0KS5tYXAoKHt0YWJsZV9uYW1lLCBhbGlhc30pID0+IFtcbiAgICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICAgIHRhYmxlX25hbWVcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IHRoaXNMaW5lID0gbW9kZWwuZ2V0VmFsdWVJblJhbmdlKHtcbiAgICAgICAgICAgIHN0YXJ0TGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlcixcbiAgICAgICAgICAgIHN0YXJ0Q29sdW1uOiAxLFxuICAgICAgICAgICAgZW5kTGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlcixcbiAgICAgICAgICAgIGVuZENvbHVtbjogcG9zaXRpb24uY29sdW1uXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgdGhpc1Rva2VuID0gdGhpc0xpbmUudHJpbSgpLnNwbGl0KCcgJykuc2xpY2UoLTEpPy5bMF0gfHwgJyc7XG5cbiAgICAgICAgICBjb25zdCBsYXN0VG9rZW5CZWZvcmVTcGFjZSA9IC9cXHM/KFxcdyspXFxzK1xcdyskLy5leGVjKHRoaXNMaW5lLnRyaW0oKSk/LlsxXTtcbiAgICAgICAgICBjb25zdCBsYXN0VG9rZW5CZWZvcmVEb3QgPSAvKFxcdyspXFwuXFx3KiQvLmV4ZWModGhpc1Rva2VuKT8uWzFdO1xuXG4gICAgICAgICAgLy8gY29uc29sZS5sb2codGFibGVOYW1lc0FuZEFsaWFzZXMsIHRoaXNUb2tlbiwgbGFzdFRva2VuQmVmb3JlU3BhY2UsIGxhc3RUb2tlbkJlZm9yZURvdCk7XG5cbiAgICAgICAgICBpZiAobGFzdFRva2VuQmVmb3JlU3BhY2UgJiYgL2Zyb218am9pbnx1cGRhdGV8aW50by8udGVzdChsYXN0VG9rZW5CZWZvcmVTcGFjZSkpIHtcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zLnB1c2goXG4gICAgICAgICAgICAgIC4uLnNjaGVtYVRhYmxlTmFtZXMubWFwKFxuICAgICAgICAgICAgICAgIHRhYmxlX25hbWUgPT5cbiAgICAgICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0YWJsZV9uYW1lLFxuICAgICAgICAgICAgICAgICAgICBraW5kOiBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZC5GaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0VGV4dDogdGFibGVfbmFtZVxuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiByYW5nZSBpcyBtaXNzaW5nXG4gICAgICAgICAgICAgICAgICB9IGFzIG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW0pXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGxhc3RUb2tlbkJlZm9yZURvdCkge1xuICAgICAgICAgICAgbGV0IHRhYmxlX25hbWUgPSBudWxsIGFzIHN0cmluZyB8IG51bGw7XG4gICAgICAgICAgICBpZiAoc2NoZW1hVGFibGVOYW1lc1NldC5oYXMobGFzdFRva2VuQmVmb3JlRG90KSkge1xuICAgICAgICAgICAgICB0YWJsZV9uYW1lID0gbGFzdFRva2VuQmVmb3JlRG90O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0YWJsZU5hbWVzQW5kQWxpYXNlcy5nZXQobGFzdFRva2VuQmVmb3JlRG90KSkge1xuICAgICAgICAgICAgICB0YWJsZV9uYW1lID0gdGFibGVOYW1lc0FuZEFsaWFzZXMuZ2V0KGxhc3RUb2tlbkJlZm9yZURvdCkgYXMgc3RyaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRhYmxlX25hbWUgJiYgdGFibGVTY2hlbWEpIHtcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICAuLi50YWJsZVNjaGVtYVxuICAgICAgICAgICAgICAgICAgLmZpbHRlcihkID0+IGQudGFibGVfbmFtZSA9PT0gdGFibGVfbmFtZSlcbiAgICAgICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgICAgICh7Y29sdW1uX25hbWV9KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogY29sdW1uX25hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBraW5kOiBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZC5GaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydFRleHQ6IGNvbHVtbl9uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiByYW5nZSBpcyBtaXNzaW5nXG4gICAgICAgICAgICAgICAgICAgICAgfSBhcyBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtKVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWdnZXN0aW9uczogdW5pcUJ5KHN1Z2dlc3Rpb25zLCBzID0+IHMuaW5zZXJ0VGV4dClcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIFt0YWJsZVNjaGVtYSwgc2NoZW1hVGFibGVOYW1lcywgc2NoZW1hVGFibGVOYW1lc1NldF1cbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxFZGl0b3JcbiAgICAgIGhlaWdodD1cIjEwMCVcIlxuICAgICAgdGhlbWU9XCJ2cy1kYXJrXCJcbiAgICAgIGRlZmF1bHRMYW5ndWFnZT1cInNxbFwiXG4gICAgICBkZWZhdWx0VmFsdWU9e2NvZGV9XG4gICAgICBvbkNoYW5nZT17b25DaGFuZ2V9XG4gICAgICBvbk1vdW50PXtoYW5kbGVFZGl0b3JEaWRNb3VudH1cbiAgICAgIG9wdGlvbnM9e3tcbiAgICAgICAgLi4uTU9OQUNPX09QVElPTlMsXG4gICAgICAgIHJlYWRPbmx5OiBpc1JlYWRPbmx5XG4gICAgICB9fVxuICAgIC8+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBNb25hY29FZGl0b3I7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxNQUFBLEdBQUFKLHVCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBSSxPQUFBLEdBQUFGLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSyxRQUFBLEdBQUFILHNCQUFBLENBQUFGLE9BQUE7QUFBbUMsU0FBQU0seUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFSLHdCQUFBUSxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsZ0JBQUFLLE9BQUEsQ0FBQUwsQ0FBQSwwQkFBQUEsQ0FBQSxzQkFBQUEsQ0FBQSxRQUFBRyxDQUFBLEdBQUFKLHdCQUFBLENBQUFHLENBQUEsT0FBQUMsQ0FBQSxJQUFBQSxDQUFBLENB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
;