kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
190 lines (183 loc) • 31.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 _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _styledComponents = _interopRequireWildcard(require("styled-components"));
var _core = require("@openassistant/core");
var _geoda = require("@openassistant/geoda");
var _echarts = require("@openassistant/echarts");
var _ui = require("@openassistant/ui");
require("@openassistant/echarts/dist/index.css");
require("@openassistant/ui/dist/index.css");
var _styles = require("@kepler.gl/styles");
var _basemapFunctions = require("../tools/basemap-functions");
var _loadurlFunction = require("../tools/loadurl-function");
var _constants = require("../constants");
var _layerCreationFunction = require("../tools/layer-creation-function");
var _layerStyleFunction = require("../tools/layer-style-function");
var _utils = require("../tools/utils");
var _templateObject; // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
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; }
var StyledAiAssistantComponent = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n height: 100%;\n padding-bottom: 4px;\n\n * {\n font-size: 11px;\n }\n"])));
AiAssistantComponentFactory.deps = [];
function AiAssistantComponentFactory() {
var AiAssistantComponent = function AiAssistantComponent(_ref) {
var theme = _ref.theme,
aiAssistant = _ref.aiAssistant,
updateAiAssistantMessages = _ref.updateAiAssistantMessages,
setStartScreenCapture = _ref.setStartScreenCapture,
setScreenCaptured = _ref.setScreenCaptured,
keplerGlActions = _ref.keplerGlActions,
mapStyle = _ref.mapStyle,
visState = _ref.visState;
// get values from dataset, used by LLM functions
var getValuesCallback = function getValuesCallback(datasetName, variableName) {
return (0, _utils.getValuesFromDataset)(visState.datasets, datasetName, variableName);
};
// highlight rows, used by LLM functions and plots (scatterplot, histogram)
var highlightRowsCallback = function highlightRowsCallback(datasetName, selectedRowIndices) {
return (0, _utils.highlightRows)(visState.datasets, visState.layers, datasetName, selectedRowIndices, keplerGlActions.layerSetIsValid);
};
// define LLM functions
var functions = [(0, _basemapFunctions.basemapFunctionDefinition)({
mapStyleChange: keplerGlActions.mapStyleChange,
mapStyle: mapStyle
}), (0, _loadurlFunction.loadUrlFunctionDefinition)({
addDataToMap: keplerGlActions.addDataToMap,
loaders: visState.loaders,
loadOptions: visState.loadOptions
}), (0, _layerCreationFunction.addLayerFunctionDefinition)({
addLayer: keplerGlActions.addLayer,
datasets: visState.datasets
}), (0, _layerStyleFunction.updateLayerColorFunctionDefinition)({
layerVisualChannelConfigChange: keplerGlActions.layerVisualChannelConfigChange,
layers: visState.layers
}), (0, _echarts.histogramFunctionDefinition)({
getValues: getValuesCallback,
onSelected: highlightRowsCallback
}), (0, _echarts.scatterplotFunctionDefinition)({
getValues: function () {
var _getValues = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(datasetName, xVar, yVar) {
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
return _context.abrupt("return", (0, _utils.getScatterplotValuesFromDataset)(visState.datasets, datasetName, xVar, yVar));
case 1:
case "end":
return _context.stop();
}
}, _callee);
}));
function getValues(_x, _x2, _x3) {
return _getValues.apply(this, arguments);
}
return getValues;
}(),
onSelected: highlightRowsCallback
}), (0, _geoda.dataClassifyFunctionDefinition)({
getValues: getValuesCallback
}), (0, _geoda.spatialCountFunctionDefinition)({
getValues: getValuesCallback,
getGeometries: function getGeometries(datasetName) {
return (0, _utils.getGeometriesFromDataset)(visState.datasets, visState.layers, visState.layerData, datasetName);
},
saveAsDataset: function saveAsDataset(datasetName, data) {
return (0, _utils.saveAsDataset)(visState.datasets, datasetName, data, keplerGlActions.addDataToMap);
}
})];
// enable voice and screen capture
var enableVoiceAndScreenCapture = aiAssistant.config.provider === 'openai' || aiAssistant.config.provider === 'google';
// define assistant props
var assistantProps = {
name: _constants.ASSISTANT_NAME,
description: _constants.ASSISTANT_DESCRIPTION,
version: _constants.ASSISTANT_VERSION,
modelProvider: aiAssistant.config.provider,
model: aiAssistant.config.model,
apiKey: aiAssistant.config.apiKey,
baseUrl: aiAssistant.config.baseUrl,
instructions: _constants.INSTRUCTIONS,
functions: functions
};
var _useAssistant = (0, _core.useAssistant)(assistantProps),
initializeAssistant = _useAssistant.initializeAssistant,
addAdditionalContext = _useAssistant.addAdditionalContext;
// initialize assistant with context
var initializeAssistantWithContext = /*#__PURE__*/function () {
var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
var context;
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
_context2.next = 2;
return initializeAssistant();
case 2:
context = (0, _utils.getDatasetContext)(visState.datasets, visState.layers);
addAdditionalContext({
context: context
});
case 4:
case "end":
return _context2.stop();
}
}, _callee2);
}));
return function initializeAssistantWithContext() {
return _ref2.apply(this, arguments);
};
}();
// initialize assistant with context
(0, _react.useEffect)(function () {
initializeAssistantWithContext();
// re-initialize assistant when datasets, filters or layers change
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [visState.datasets, visState.filters, visState.layers]);
var onRestartAssistant = function onRestartAssistant() {
// clean up aiAssistant state
updateAiAssistantMessages([]);
initializeAssistantWithContext();
};
var onMessagesUpdated = function onMessagesUpdated(messages) {
updateAiAssistantMessages(messages);
};
var onScreenshotClick = function onScreenshotClick() {
setStartScreenCapture(true);
};
var onRemoveScreenshot = function onRemoveScreenshot() {
setScreenCaptured('');
};
return /*#__PURE__*/_react["default"].createElement(StyledAiAssistantComponent, {
className: "ai-assistant-component"
}, /*#__PURE__*/_react["default"].createElement(_ui.AiAssistant, (0, _extends2["default"])({}, assistantProps, {
theme: theme.textColor === _styles.textColorLT ? 'light' : 'dark',
welcomeMessage: _constants.WELCOME_MESSAGE,
temperature: aiAssistant.config.temperature,
topP: aiAssistant.config.topP,
historyMessages: aiAssistant.messages,
onMessagesUpdated: onMessagesUpdated,
enableVoice: enableVoiceAndScreenCapture,
enableScreenCapture: enableVoiceAndScreenCapture,
onScreenshotClick: onScreenshotClick,
screenCapturedBase64: aiAssistant.screenshotToAsk.screenCaptured,
onRemoveScreenshot: onRemoveScreenshot,
onRestartChat: onRestartAssistant,
fontSize: 'text-tiny',
botMessageClassName: '',
githubIssueLink: 'https://github.com/keplergl/kepler.gl/issues',
ideas: _constants.PROMPT_IDEAS
})));
};
return (0, _styledComponents.withTheme)(AiAssistantComponent);
}
var _default = exports["default"] = AiAssistantComponentFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9jb3JlIiwiX2dlb2RhIiwiX2VjaGFydHMiLCJfdWkiLCJfc3R5bGVzIiwiX2Jhc2VtYXBGdW5jdGlvbnMiLCJfbG9hZHVybEZ1bmN0aW9uIiwiX2NvbnN0YW50cyIsIl9sYXllckNyZWF0aW9uRnVuY3Rpb24iLCJfbGF5ZXJTdHlsZUZ1bmN0aW9uIiwiX3V0aWxzIiwiX3RlbXBsYXRlT2JqZWN0IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiU3R5bGVkQWlBc3Npc3RhbnRDb21wb25lbnQiLCJzdHlsZWQiLCJkaXYiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsIkFpQXNzaXN0YW50Q29tcG9uZW50RmFjdG9yeSIsImRlcHMiLCJBaUFzc2lzdGFudENvbXBvbmVudCIsIl9yZWYiLCJ0aGVtZSIsImFpQXNzaXN0YW50IiwidXBkYXRlQWlBc3Npc3RhbnRNZXNzYWdlcyIsInNldFN0YXJ0U2NyZWVuQ2FwdHVyZSIsInNldFNjcmVlbkNhcHR1cmVkIiwia2VwbGVyR2xBY3Rpb25zIiwibWFwU3R5bGUiLCJ2aXNTdGF0ZSIsImdldFZhbHVlc0NhbGxiYWNrIiwiZGF0YXNldE5hbWUiLCJ2YXJpYWJsZU5hbWUiLCJnZXRWYWx1ZXNGcm9tRGF0YXNldCIsImRhdGFzZXRzIiwiaGlnaGxpZ2h0Um93c0NhbGxiYWNrIiwic2VsZWN0ZWRSb3dJbmRpY2VzIiwiaGlnaGxpZ2h0Um93cyIsImxheWVycyIsImxheWVyU2V0SXNWYWxpZCIsImZ1bmN0aW9ucyIsImJhc2VtYXBGdW5jdGlvbkRlZmluaXRpb24iLCJtYXBTdHlsZUNoYW5nZSIsImxvYWRVcmxGdW5jdGlvbkRlZmluaXRpb24iLCJhZGREYXRhVG9NYXAiLCJsb2FkZXJzIiwibG9hZE9wdGlvbnMiLCJhZGRMYXllckZ1bmN0aW9uRGVmaW5pdGlvbiIsImFkZExheWVyIiwidXBkYXRlTGF5ZXJDb2xvckZ1bmN0aW9uRGVmaW5pdGlvbiIsImxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZSIsImhpc3RvZ3JhbUZ1bmN0aW9uRGVmaW5pdGlvbiIsImdldFZhbHVlcyIsIm9uU2VsZWN0ZWQiLCJzY2F0dGVycGxvdEZ1bmN0aW9uRGVmaW5pdGlvbiIsIl9nZXRWYWx1ZXMiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsInhWYXIiLCJ5VmFyIiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImFicnVwdCIsImdldFNjYXR0ZXJwbG90VmFsdWVzRnJvbURhdGFzZXQiLCJzdG9wIiwiX3giLCJfeDIiLCJfeDMiLCJhcHBseSIsImFyZ3VtZW50cyIsImRhdGFDbGFzc2lmeUZ1bmN0aW9uRGVmaW5pdGlvbiIsInNwYXRpYWxDb3VudEZ1bmN0aW9uRGVmaW5pdGlvbiIsImdldEdlb21ldHJpZXMiLCJnZXRHZW9tZXRyaWVzRnJvbURhdGFzZXQiLCJsYXllckRhdGEiLCJzYXZlQXNEYXRhc2V0IiwiZGF0YSIsImVuYWJsZVZvaWNlQW5kU2NyZWVuQ2FwdHVyZSIsImNvbmZpZyIsInByb3ZpZGVyIiwiYXNzaXN0YW50UHJvcHMiLCJuYW1lIiwiQVNTSVNUQU5UX05BTUUiLCJkZXNjcmlwdGlvbiIsIkFTU0lTVEFOVF9ERVNDUklQVElPTiIsInZlcnNpb24iLCJBU1NJU1RBTlRfVkVSU0lPTiIsIm1vZGVsUHJvdmlkZXIiLCJtb2RlbCIsImFwaUtleSIsImJhc2VVcmwiLCJpbnN0cnVjdGlvbnMiLCJJTlNUUlVDVElPTlMiLCJfdXNlQXNzaXN0YW50IiwidXNlQXNzaXN0YW50IiwiaW5pdGlhbGl6ZUFzc2lzdGFudCIsImFkZEFkZGl0aW9uYWxDb250ZXh0IiwiaW5pdGlhbGl6ZUFzc2lzdGFudFdpdGhDb250ZXh0IiwiX3JlZjIiLCJfY2FsbGVlMiIsImNvbnRleHQiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJnZXREYXRhc2V0Q29udGV4dCIsInVzZUVmZmVjdCIsImZpbHRlcnMiLCJvblJlc3RhcnRBc3Npc3RhbnQiLCJvbk1lc3NhZ2VzVXBkYXRlZCIsIm1lc3NhZ2VzIiwib25TY3JlZW5zaG90Q2xpY2siLCJvblJlbW92ZVNjcmVlbnNob3QiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwiQWlBc3Npc3RhbnQiLCJfZXh0ZW5kczIiLCJ0ZXh0Q29sb3IiLCJ0ZXh0Q29sb3JMVCIsIndlbGNvbWVNZXNzYWdlIiwiV0VMQ09NRV9NRVNTQUdFIiwidGVtcGVyYXR1cmUiLCJ0b3BQIiwiaGlzdG9yeU1lc3NhZ2VzIiwiZW5hYmxlVm9pY2UiLCJlbmFibGVTY3JlZW5DYXB0dXJlIiwic2NyZWVuQ2FwdHVyZWRCYXNlNjQiLCJzY3JlZW5zaG90VG9Bc2siLCJzY3JlZW5DYXB0dXJlZCIsIm9uUmVzdGFydENoYXQiLCJmb250U2l6ZSIsImJvdE1lc3NhZ2VDbGFzc05hbWUiLCJnaXRodWJJc3N1ZUxpbmsiLCJpZGVhcyIsIlBST01QVF9JREVBUyIsIndpdGhUaGVtZSIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL2FpLWFzc2lzdGFudC1jb21wb25lbnQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZUVmZmVjdH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHN0eWxlZCwge3dpdGhUaGVtZX0gZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtNZXNzYWdlTW9kZWwsIHVzZUFzc2lzdGFudH0gZnJvbSAnQG9wZW5hc3Npc3RhbnQvY29yZSc7XG5pbXBvcnQge1xuICBkYXRhQ2xhc3NpZnlGdW5jdGlvbkRlZmluaXRpb24sXG4gIHNwYXRpYWxDb3VudEZ1bmN0aW9uRGVmaW5pdGlvbixcbiAgU3BhdGlhbEpvaW5HZW9tZXRyaWVzXG59IGZyb20gJ0BvcGVuYXNzaXN0YW50L2dlb2RhJztcbmltcG9ydCB7aGlzdG9ncmFtRnVuY3Rpb25EZWZpbml0aW9uLCBzY2F0dGVycGxvdEZ1bmN0aW9uRGVmaW5pdGlvbn0gZnJvbSAnQG9wZW5hc3Npc3RhbnQvZWNoYXJ0cyc7XG5pbXBvcnQge0FpQXNzaXN0YW50fSBmcm9tICdAb3BlbmFzc2lzdGFudC91aSc7XG5pbXBvcnQgJ0BvcGVuYXNzaXN0YW50L2VjaGFydHMvZGlzdC9pbmRleC5jc3MnO1xuaW1wb3J0ICdAb3BlbmFzc2lzdGFudC91aS9kaXN0L2luZGV4LmNzcyc7XG5cbmltcG9ydCB7dGV4dENvbG9yTFR9IGZyb20gJ0BrZXBsZXIuZ2wvc3R5bGVzJztcbmltcG9ydCB7QWN0aW9uSGFuZGxlcn0gZnJvbSAnQGtlcGxlci5nbC9hY3Rpb25zJztcbmltcG9ydCB7TWFwU3R5bGV9IGZyb20gJ0BrZXBsZXIuZ2wvcmVkdWNlcnMnO1xuaW1wb3J0IHtWaXNTdGF0ZX0gZnJvbSAnQGtlcGxlci5nbC9zY2hlbWFzJztcblxuaW1wb3J0IHtiYXNlbWFwRnVuY3Rpb25EZWZpbml0aW9ufSBmcm9tICcuLi90b29scy9iYXNlbWFwLWZ1bmN0aW9ucyc7XG5pbXBvcnQge2xvYWRVcmxGdW5jdGlvbkRlZmluaXRpb259IGZyb20gJy4uL3Rvb2xzL2xvYWR1cmwtZnVuY3Rpb24nO1xuXG5pbXBvcnQge0FpQXNzaXN0YW50U3RhdGV9IGZyb20gJy4uL3JlZHVjZXJzJztcbmltcG9ydCB7c2V0U2NyZWVuQ2FwdHVyZWQsIHNldFN0YXJ0U2NyZWVuQ2FwdHVyZSwgdXBkYXRlQWlBc3Npc3RhbnRNZXNzYWdlc30gZnJvbSAnLi4vYWN0aW9ucyc7XG5pbXBvcnQge1xuICBBU1NJU1RBTlRfREVTQ1JJUFRJT04sXG4gIEFTU0lTVEFOVF9OQU1FLFxuICBBU1NJU1RBTlRfVkVSU0lPTixcbiAgSU5TVFJVQ1RJT05TLFxuICBQUk9NUFRfSURFQVMsXG4gIFdFTENPTUVfTUVTU0FHRVxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHthZGRMYXllckZ1bmN0aW9uRGVmaW5pdGlvbn0gZnJvbSAnLi4vdG9vbHMvbGF5ZXItY3JlYXRpb24tZnVuY3Rpb24nO1xuaW1wb3J0IHt1cGRhdGVMYXllckNvbG9yRnVuY3Rpb25EZWZpbml0aW9ufSBmcm9tICcuLi90b29scy9sYXllci1zdHlsZS1mdW5jdGlvbic7XG5pbXBvcnQge1NlbGVjdGVkS2VwbGVyR2xBY3Rpb25zfSBmcm9tICcuL2FpLWFzc2lzdGFudC1tYW5hZ2VyJztcbmltcG9ydCB7XG4gIGdldERhdGFzZXRDb250ZXh0LFxuICBnZXRHZW9tZXRyaWVzRnJvbURhdGFzZXQsXG4gIGdldFNjYXR0ZXJwbG90VmFsdWVzRnJvbURhdGFzZXQsXG4gIGdldFZhbHVlc0Zyb21EYXRhc2V0LFxuICBoaWdobGlnaHRSb3dzLFxuICBzYXZlQXNEYXRhc2V0XG59IGZyb20gJy4uL3Rvb2xzL3V0aWxzJztcblxudHlwZSBUaGVtZVByb3BzID0ge3RoZW1lOiBhbnl9O1xuXG5leHBvcnQgdHlwZSBBaUFzc2lzdGFudENvbXBvbmVudFByb3BzID0ge1xuICBhaUFzc2lzdGFudDogQWlBc3Npc3RhbnRTdGF0ZTtcbiAgdXBkYXRlQWlBc3Npc3RhbnRNZXNzYWdlczogQWN0aW9uSGFuZGxlcjx0eXBlb2YgdXBkYXRlQWlBc3Npc3RhbnRNZXNzYWdlcz47XG4gIHNldFN0YXJ0U2NyZWVuQ2FwdHVyZTogQWN0aW9uSGFuZGxlcjx0eXBlb2Ygc2V0U3RhcnRTY3JlZW5DYXB0dXJlPjtcbiAgc2V0U2NyZWVuQ2FwdHVyZWQ6IEFjdGlvbkhhbmRsZXI8dHlwZW9mIHNldFNjcmVlbkNhcHR1cmVkPjtcbiAga2VwbGVyR2xBY3Rpb25zOiBTZWxlY3RlZEtlcGxlckdsQWN0aW9ucztcbiAgbWFwU3R5bGU6IE1hcFN0eWxlO1xuICB2aXNTdGF0ZTogVmlzU3RhdGU7XG59O1xuXG5jb25zdCBTdHlsZWRBaUFzc2lzdGFudENvbXBvbmVudCA9IHN0eWxlZC5kaXZgXG4gIGhlaWdodDogMTAwJTtcbiAgcGFkZGluZy1ib3R0b206IDRweDtcblxuICAqIHtcbiAgICBmb250LXNpemU6IDExcHg7XG4gIH1cbmA7XG5cbkFpQXNzaXN0YW50Q29tcG9uZW50RmFjdG9yeS5kZXBzID0gW107XG5cbmZ1bmN0aW9uIEFpQXNzaXN0YW50Q29tcG9uZW50RmFjdG9yeSgpIHtcbiAgY29uc3QgQWlBc3Npc3RhbnRDb21wb25lbnQ6IFJlYWN0LkZDPEFpQXNzaXN0YW50Q29tcG9uZW50UHJvcHMgJiBUaGVtZVByb3BzPiA9ICh7XG4gICAgdGhlbWUsXG4gICAgYWlBc3Npc3RhbnQsXG4gICAgdXBkYXRlQWlBc3Npc3RhbnRNZXNzYWdlcyxcbiAgICBzZXRTdGFydFNjcmVlbkNhcHR1cmUsXG4gICAgc2V0U2NyZWVuQ2FwdHVyZWQsXG4gICAga2VwbGVyR2xBY3Rpb25zLFxuICAgIG1hcFN0eWxlLFxuICAgIHZpc1N0YXRlXG4gIH06IEFpQXNzaXN0YW50Q29tcG9uZW50UHJvcHMgJiBUaGVtZVByb3BzKSA9PiB7XG4gICAgLy8gZ2V0IHZhbHVlcyBmcm9tIGRhdGFzZXQsIHVzZWQgYnkgTExNIGZ1bmN0aW9uc1xuICAgIGNvbnN0IGdldFZhbHVlc0NhbGxiYWNrID0gKGRhdGFzZXROYW1lOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogbnVtYmVyW10gPT5cbiAgICAgIGdldFZhbHVlc0Zyb21EYXRhc2V0KHZpc1N0YXRlLmRhdGFzZXRzLCBkYXRhc2V0TmFtZSwgdmFyaWFibGVOYW1lKTtcblxuICAgIC8vIGhpZ2hsaWdodCByb3dzLCB1c2VkIGJ5IExMTSBmdW5jdGlvbnMgYW5kIHBsb3RzIChzY2F0dGVycGxvdCwgaGlzdG9ncmFtKVxuICAgIGNvbnN0IGhpZ2hsaWdodFJvd3NDYWxsYmFjayA9IChkYXRhc2V0TmFtZTogc3RyaW5nLCBzZWxlY3RlZFJvd0luZGljZXM6IG51bWJlcltdKSA9PlxuICAgICAgaGlnaGxpZ2h0Um93cyhcbiAgICAgICAgdmlzU3RhdGUuZGF0YXNldHMsXG4gICAgICAgIHZpc1N0YXRlLmxheWVycyxcbiAgICAgICAgZGF0YXNldE5hbWUsXG4gICAgICAgIHNlbGVjdGVkUm93SW5kaWNlcyxcbiAgICAgICAga2VwbGVyR2xBY3Rpb25zLmxheWVyU2V0SXNWYWxpZFxuICAgICAgKTtcblxuICAgIC8vIGRlZmluZSBMTE0gZnVuY3Rpb25zXG4gICAgY29uc3QgZnVuY3Rpb25zID0gW1xuICAgICAgYmFzZW1hcEZ1bmN0aW9uRGVmaW5pdGlvbih7bWFwU3R5bGVDaGFuZ2U6IGtlcGxlckdsQWN0aW9ucy5tYXBTdHlsZUNoYW5nZSwgbWFwU3R5bGV9KSxcbiAgICAgIGxvYWRVcmxGdW5jdGlvbkRlZmluaXRpb24oe1xuICAgICAgICBhZGREYXRhVG9NYXA6IGtlcGxlckdsQWN0aW9ucy5hZGREYXRhVG9NYXAsXG4gICAgICAgIGxvYWRlcnM6IHZpc1N0YXRlLmxvYWRlcnMsXG4gICAgICAgIGxvYWRPcHRpb25zOiB2aXNTdGF0ZS5sb2FkT3B0aW9uc1xuICAgICAgfSksXG4gICAgICBhZGRMYXllckZ1bmN0aW9uRGVmaW5pdGlvbih7XG4gICAgICAgIGFkZExheWVyOiBrZXBsZXJHbEFjdGlvbnMuYWRkTGF5ZXIsXG4gICAgICAgIGRhdGFzZXRzOiB2aXNTdGF0ZS5kYXRhc2V0c1xuICAgICAgfSksXG4gICAgICB1cGRhdGVMYXllckNvbG9yRnVuY3Rpb25EZWZpbml0aW9uKHtcbiAgICAgICAgbGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlOiBrZXBsZXJHbEFjdGlvbnMubGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlLFxuICAgICAgICBsYXllcnM6IHZpc1N0YXRlLmxheWVyc1xuICAgICAgfSksXG4gICAgICBoaXN0b2dyYW1GdW5jdGlvbkRlZmluaXRpb24oe1xuICAgICAgICBnZXRWYWx1ZXM6IGdldFZhbHVlc0NhbGxiYWNrLFxuICAgICAgICBvblNlbGVjdGVkOiBoaWdobGlnaHRSb3dzQ2FsbGJhY2tcbiAgICAgIH0pLFxuICAgICAgc2NhdHRlcnBsb3RGdW5jdGlvbkRlZmluaXRpb24oe1xuICAgICAgICBnZXRWYWx1ZXM6IGFzeW5jIChkYXRhc2V0TmFtZTogc3RyaW5nLCB4VmFyOiBzdHJpbmcsIHlWYXI6IHN0cmluZykgPT5cbiAgICAgICAgICBnZXRTY2F0dGVycGxvdFZhbHVlc0Zyb21EYXRhc2V0KHZpc1N0YXRlLmRhdGFzZXRzLCBkYXRhc2V0TmFtZSwgeFZhciwgeVZhciksXG4gICAgICAgIG9uU2VsZWN0ZWQ6IGhpZ2hsaWdodFJvd3NDYWxsYmFja1xuICAgICAgfSksXG4gICAgICBkYXRhQ2xhc3NpZnlGdW5jdGlvbkRlZmluaXRpb24oe1xuICAgICAgICBnZXRWYWx1ZXM6IGdldFZhbHVlc0NhbGxiYWNrXG4gICAgICB9KSxcbiAgICAgIHNwYXRpYWxDb3VudEZ1bmN0aW9uRGVmaW5pdGlvbih7XG4gICAgICAgIGdldFZhbHVlczogZ2V0VmFsdWVzQ2FsbGJhY2ssXG4gICAgICAgIGdldEdlb21ldHJpZXM6IChkYXRhc2V0TmFtZTogc3RyaW5nKTogU3BhdGlhbEpvaW5HZW9tZXRyaWVzID0+XG4gICAgICAgICAgZ2V0R2VvbWV0cmllc0Zyb21EYXRhc2V0KFxuICAgICAgICAgICAgdmlzU3RhdGUuZGF0YXNldHMsXG4gICAgICAgICAgICB2aXNTdGF0ZS5sYXllcnMsXG4gICAgICAgICAgICB2aXNTdGF0ZS5sYXllckRhdGEsXG4gICAgICAgICAgICBkYXRhc2V0TmFtZVxuICAgICAgICAgICksXG4gICAgICAgIHNhdmVBc0RhdGFzZXQ6IChkYXRhc2V0TmFtZTogc3RyaW5nLCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXJbXT4pID0+XG4gICAgICAgICAgc2F2ZUFzRGF0YXNldCh2aXNTdGF0ZS5kYXRhc2V0cywgZGF0YXNldE5hbWUsIGRhdGEsIGtlcGxlckdsQWN0aW9ucy5hZGREYXRhVG9NYXApXG4gICAgICB9KVxuICAgIF07XG5cbiAgICAvLyBlbmFibGUgdm9pY2UgYW5kIHNjcmVlbiBjYXB0dXJlXG4gICAgY29uc3QgZW5hYmxlVm9pY2VBbmRTY3JlZW5DYXB0dXJlID1cbiAgICAgIGFpQXNzaXN0YW50LmNvbmZpZy5wcm92aWRlciA9PT0gJ29wZW5haScgfHwgYWlBc3Npc3RhbnQuY29uZmlnLnByb3ZpZGVyID09PSAnZ29vZ2xlJztcblxuICAgIC8vIGRlZmluZSBhc3Npc3RhbnQgcHJvcHNcbiAgICBjb25zdCBhc3Npc3RhbnRQcm9wcyA9IHtcbiAgICAgIG5hbWU6IEFTU0lTVEFOVF9OQU1FLFxuICAgICAgZGVzY3JpcHRpb246IEFTU0lTVEFOVF9ERVNDUklQVElPTixcbiAgICAgIHZlcnNpb246IEFTU0lTVEFOVF9WRVJTSU9OLFxuICAgICAgbW9kZWxQcm92aWRlcjogYWlBc3Npc3RhbnQuY29uZmlnLnByb3ZpZGVyLFxuICAgICAgbW9kZWw6IGFpQXNzaXN0YW50LmNvbmZpZy5tb2RlbCxcbiAgICAgIGFwaUtleTogYWlBc3Npc3RhbnQuY29uZmlnLmFwaUtleSxcbiAgICAgIGJhc2VVcmw6IGFpQXNzaXN0YW50LmNvbmZpZy5iYXNlVXJsLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBJTlNUUlVDVElPTlMsXG4gICAgICBmdW5jdGlvbnNcbiAgICB9O1xuXG4gICAgY29uc3Qge2luaXRpYWxpemVBc3Npc3RhbnQsIGFkZEFkZGl0aW9uYWxDb250ZXh0fSA9IHVzZUFzc2lzdGFudChhc3Npc3RhbnRQcm9wcyk7XG5cbiAgICAvLyBpbml0aWFsaXplIGFzc2lzdGFudCB3aXRoIGNvbnRleHRcbiAgICBjb25zdCBpbml0aWFsaXplQXNzaXN0YW50V2l0aENvbnRleHQgPSBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBpbml0aWFsaXplQXNzaXN0YW50KCk7XG4gICAgICBjb25zdCBjb250ZXh0ID0gZ2V0RGF0YXNldENvbnRleHQodmlzU3RhdGUuZGF0YXNldHMsIHZpc1N0YXRlLmxheWVycyk7XG4gICAgICBhZGRBZGRpdGlvbmFsQ29udGV4dCh7Y29udGV4dH0pO1xuICAgIH07XG5cbiAgICAvLyBpbml0aWFsaXplIGFzc2lzdGFudCB3aXRoIGNvbnRleHRcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgaW5pdGlhbGl6ZUFzc2lzdGFudFdpdGhDb250ZXh0KCk7XG4gICAgICAvLyByZS1pbml0aWFsaXplIGFzc2lzdGFudCB3aGVuIGRhdGFzZXRzLCBmaWx0ZXJzIG9yIGxheWVycyBjaGFuZ2VcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICB9LCBbdmlzU3RhdGUuZGF0YXNldHMsIHZpc1N0YXRlLmZpbHRlcnMsIHZpc1N0YXRlLmxheWVyc10pO1xuXG4gICAgY29uc3Qgb25SZXN0YXJ0QXNzaXN0YW50ID0gKCkgPT4ge1xuICAgICAgLy8gY2xlYW4gdXAgYWlBc3Npc3RhbnQgc3RhdGVcbiAgICAgIHVwZGF0ZUFpQXNzaXN0YW50TWVzc2FnZXMoW10pO1xuICAgICAgaW5pdGlhbGl6ZUFzc2lzdGFudFdpdGhDb250ZXh0KCk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9uTWVzc2FnZXNVcGRhdGVkID0gKG1lc3NhZ2VzOiBNZXNzYWdlTW9kZWxbXSkgPT4ge1xuICAgICAgdXBkYXRlQWlBc3Npc3RhbnRNZXNzYWdlcyhtZXNzYWdlcyk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU2NyZWVuc2hvdENsaWNrID0gKCkgPT4ge1xuICAgICAgc2V0U3RhcnRTY3JlZW5DYXB0dXJlKHRydWUpO1xuICAgIH07XG5cbiAgICBjb25zdCBvblJlbW92ZVNjcmVlbnNob3QgPSAoKSA9PiB7XG4gICAgICBzZXRTY3JlZW5DYXB0dXJlZCgnJyk7XG4gICAgfTtcblxuICAgIHJldHVybiAoXG4gICAgICA8U3R5bGVkQWlBc3Npc3RhbnRDb21wb25lbnQgY2xhc3NOYW1lPVwiYWktYXNzaXN0YW50LWNvbXBvbmVudFwiPlxuICAgICAgICA8QWlBc3Npc3RhbnRcbiAgICAgICAgICB7Li4uYXNzaXN0YW50UHJvcHN9XG4gICAgICAgICAgdGhlbWU9e3RoZW1lLnRleHRDb2xvciA9PT0gdGV4dENvbG9yTFQgPyAnbGlnaHQnIDogJ2RhcmsnfVxuICAgICAgICAgIHdlbGNvbWVNZXNzYWdlPXtXRUxDT01FX01FU1NBR0V9XG4gICAgICAgICAgdGVtcGVyYXR1cmU9e2FpQXNzaXN0YW50LmNvbmZpZy50ZW1wZXJhdHVyZX1cbiAgICAgICAgICB0b3BQPXthaUFzc2lzdGFudC5jb25maWcudG9wUH1cbiAgICAgICAgICBoaXN0b3J5TWVzc2FnZXM9e2FpQXNzaXN0YW50Lm1lc3NhZ2VzfVxuICAgICAgICAgIG9uTWVzc2FnZXNVcGRhdGVkPXtvbk1lc3NhZ2VzVXBkYXRlZH1cbiAgICAgICAgICBlbmFibGVWb2ljZT17ZW5hYmxlVm9pY2VBbmRTY3JlZW5DYXB0dXJlfVxuICAgICAgICAgIGVuYWJsZVNjcmVlbkNhcHR1cmU9e2VuYWJsZVZvaWNlQW5kU2NyZWVuQ2FwdHVyZX1cbiAgICAgICAgICBvblNjcmVlbnNob3RDbGljaz17b25TY3JlZW5zaG90Q2xpY2t9XG4gICAgICAgICAgc2NyZWVuQ2FwdHVyZWRCYXNlNjQ9e2FpQXNzaXN0YW50LnNjcmVlbnNob3RUb0Fzay5zY3JlZW5DYXB0dXJlZH1cbiAgICAgICAgICBvblJlbW92ZVNjcmVlbnNob3Q9e29uUmVtb3ZlU2NyZWVuc2hvdH1cbiAgICAgICAgICBvblJlc3RhcnRDaGF0PXtvblJlc3RhcnRBc3Npc3RhbnR9XG4gICAgICAgICAgZm9udFNpemU9eyd0ZXh0LXRpbnknfVxuICAgICAgICAgIGJvdE1lc3NhZ2VDbGFzc05hbWU9eycnfVxuICAgICAgICAgIGdpdGh1Yklzc3VlTGluaz17J2h0dHBzOi8vZ2l0aHViLmNvbS9rZXBsZXJnbC9rZXBsZXIuZ2wvaXNzdWVzJ31cbiAgICAgICAgICBpZGVhcz17UFJPTVBUX0lERUFTfVxuICAgICAgICAvPlxuICAgICAgPC9TdHlsZWRBaUFzc2lzdGFudENvbXBvbmVudD5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiB3aXRoVGhlbWUoQWlBc3Npc3RhbnRDb21wb25lbnQpIGFzIFJlYWN0LkZDPEFpQXNzaXN0YW50Q29tcG9uZW50UHJvcHM+O1xufVxuXG5leHBvcnQgZGVmYXVsdCBBaUFzc2lzdGFudENvbXBvbmVudEZhY3Rvcnk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFGLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxNQUFBLEdBQUFILE9BQUE7QUFLQSxJQUFBSSxRQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxHQUFBLEdBQUFMLE9BQUE7QUFDQUEsT0FBQTtBQUNBQSxPQUFBO0FBRUEsSUFBQU0sT0FBQSxHQUFBTixPQUFBO0FBS0EsSUFBQU8saUJBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLGdCQUFBLEdBQUFSLE9BQUE7QUFJQSxJQUFBUyxVQUFBLEdBQUFULE9BQUE7QUFRQSxJQUFBVSxzQkFBQSxHQUFBVixPQUFBO0FBQ0EsSUFBQVcsbUJBQUEsR0FBQVgsT0FBQTtBQUVBLElBQUFZLE1BQUEsR0FBQVosT0FBQTtBQU93QixJQUFBYSxlQUFBLEVBNUN4QjtBQUNBO0FBQUEsU0FBQUMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFB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QUFrQkEsQ0FBQSxFQUFTO01BQy9CO01BQ0F2Rix5QkFBeUIsQ0FBQyxFQUFFLENBQUM7TUFDN0I4RSw4QkFBOEIsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFNVSxpQkFBaUIsR0FBRyxTQUFwQkEsaUJBQWlCQSxDQUFJQyxRQUF3QixFQUFLO01BQ3REekYseUJBQXlCLENBQUN5RixRQUFRLENBQUM7SUFDckMsQ0FBQztJQUVELElBQU1DLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBaUJBLENBQUEsRUFBUztNQUM5QnpGLHFCQUFxQixDQUFDLElBQUksQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBTTBGLGtCQUFrQixHQUFHLFNBQXJCQSxrQkFBa0JBLENBQUEsRUFBUztNQUMvQnpGLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsb0JBQ0VoRCxNQUFBLFlBQUEwSSxhQUFBLENBQUN0RywwQkFBMEI7TUFBQ3VHLFNBQVMsRUFBQztJQUF3QixnQkFDNUQzSSxNQUFBLFlBQUEwSSxhQUFBLENBQUNuSSxHQUFBLENBQUFxSSxXQUFXLE1BQUFDLFNBQUEsaUJBQ05sQyxjQUFjO01BQ2xCL0QsS0FBSyxFQUFFQSxLQUFLLENBQUNrRyxTQUFTLEtBQUtDLG1CQUFXLEdBQUcsT0FBTyxHQUFHLE1BQU87TUFDMURDLGNBQWMsRUFBRUMsMEJBQWdCO01BQ2hDQyxXQUFXLEVBQUVyRyxXQUFXLENBQUM0RCxNQUFNLENBQUN5QyxXQUFZO01BQzVDQyxJQUFJLEVBQUV0RyxXQUFXLENBQUM0RCxNQUFNLENBQUMwQyxJQUFLO01BQzlCQyxlQUFlLEVBQUV2RyxXQUFXLENBQUMwRixRQUFTO01BQ3RDRCxpQkFBaUIsRUFBRUEsaUJBQWtCO01BQ3JDZSxXQUFXLEVBQUU3QywyQkFBNEI7TUFDekM4QyxtQkFBbUIsRUFBRTlDLDJCQUE0QjtNQUNqRGdDLGlCQUFpQixFQUFFQSxpQkFBa0I7TUFDckNlLG9CQUFvQixFQUFFMUcsV0FBVyxDQUFDMkcsZUFBZSxDQUFDQyxjQUFlO01BQ2pFaEIsa0JBQWtCLEVBQUVBLGtCQUFtQjtNQUN2Q2lCLGFBQWEsRUFBRXJCLGtCQUFtQjtNQUNsQ3NCLFFBQVEsRUFBRSxXQUFZO01BQ3RCQyxtQkFBbUIsRUFBRSxFQUFHO01BQ3hCQyxlQUFlLEVBQUUsOENBQStDO01BQ2hFQyxLQUFLLEVBQUVDO0lBQWEsRUFDckIsQ0FDeUIsQ0FBQztFQUVqQyxDQUFDO0VBRUQsT0FBTyxJQUFBQywyQkFBUyxFQUFDdEgsb0JBQW9CLENBQUM7QUFDeEM7QUFBQyxJQUFBdUgsUUFBQSxHQUFBQyxPQUFBLGNBRWMxSCwyQkFBMkIiLCJpZ25vcmVMaXN0IjpbXX0=
;