UNPKG

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
"use strict"; 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=