UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

167 lines (160 loc) 27.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.AiAssistantComponent = AiAssistantComponent; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _reactRedux = require("react-redux"); var _styledComponents = _interopRequireDefault(require("styled-components")); var _styles = require("@kepler.gl/styles"); var _core = require("@openassistant/core"); var _ui = require("@openassistant/ui"); require("@openassistant/echarts/dist/index.css"); require("@openassistant/ui/dist/index.css"); var _actions = require("../actions"); var _constants = require("../constants"); var _utils = require("../tools/utils"); var _tools = require("../tools/tools"); 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; } 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; } 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"]))); function AiAssistantComponent() { var visState = (0, _reactRedux.useSelector)(function (state) { return state.demo.keplerGl.map.visState; }); var aiAssistant = (0, _reactRedux.useSelector)(function (state) { return state.demo.aiAssistant; }); var dispatch = (0, _reactRedux.useDispatch)(); // define LLM functions var tools = (0, _tools.setupLLMTools)({ visState: visState, aiAssistant: aiAssistant, dispatch: dispatch }); // enable voice and screen capture var enableVoiceAndScreenCapture = (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.provider) === 'openai' || (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.provider) === 'google' || false; // define assistant props var assistantProps = { name: _constants.ASSISTANT_NAME, description: _constants.ASSISTANT_DESCRIPTION, version: _constants.ASSISTANT_VERSION, modelProvider: (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.provider) || '', model: (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.model) || '', apiKey: (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.apiKey) || '', baseUrl: (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.baseUrl) || '', tools: tools }; var _useState = (0, _react.useState)(''), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), datasetMetaData = _useState2[0], setDatasetMetaData = _useState2[1]; var _useState3 = (0, _react.useState)([]), _useState4 = (0, _slicedToArray2["default"])(_useState3, 2), ideas = _useState4[0], setIdeas = _useState4[1]; // get dataset meta data and re-initialize assistant when datasets or layers change (0, _react.useEffect)(function () { var metaData = (0, _utils.getDatasetContext)(visState === null || visState === void 0 ? void 0 : visState.datasets, (visState === null || visState === void 0 ? void 0 : visState.layers) || []); setDatasetMetaData(metaData); // eslint-disable-next-line react-hooks/exhaustive-deps }, [visState === null || visState === void 0 ? void 0 : visState.datasets, visState === null || visState === void 0 ? void 0 : visState.layers]); // use dataset meta data in LLM instructions var instructions = "".concat(_constants.INSTRUCTIONS, "\n\n").concat(datasetMetaData); // generate ideas from LLM var _useAssistant = (0, _core.useAssistant)(_objectSpread(_objectSpread({}, assistantProps), {}, { instructions: instructions })), temporaryPrompt = _useAssistant.temporaryPrompt; var generateIdeas = /*#__PURE__*/function () { var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() { var response, match, json; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: _context.prev = 0; _context.next = 3; return temporaryPrompt({ prompt: _constants.PROMPT_IDEAS, temperature: 1.0 }); case 3: response = _context.sent; // find [{},{}...] in the text and parse it as json, handling whitespace match = response === null || response === void 0 ? void 0 : response.match(/\[\s*\{[\s\S]*\}\s*\]/); if (match) { json = JSON.parse(match[0]); setIdeas(json); } _context.next = 11; break; case 8: _context.prev = 8; _context.t0 = _context["catch"](0); console.error('Error generating ideas', _context.t0); case 11: case "end": return _context.stop(); } }, _callee, null, [[0, 8]]); })); return function generateIdeas() { return _ref.apply(this, arguments); }; }(); (0, _react.useEffect)(function () { // get ideas UI component if (ideas.length === 0 && datasetMetaData.length > 0) { generateIdeas(); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [datasetMetaData]); var onRestartAssistant = function onRestartAssistant() { // clean up aiAssistant state dispatch((0, _actions.updateAiAssistantMessages)([])); }; var onMessagesUpdated = function onMessagesUpdated(messages) { dispatch((0, _actions.updateAiAssistantMessages)(messages)); }; var onScreenshotClick = function onScreenshotClick() { dispatch((0, _actions.setStartScreenCapture)(true)); }; var onRemoveScreenshot = function onRemoveScreenshot() { dispatch((0, _actions.setScreenCaptured)('')); }; return /*#__PURE__*/_react["default"].createElement(StyledAiAssistantComponent, { className: "ai-assistant-component" }, /*#__PURE__*/_react["default"].createElement(_ui.AiAssistant, (0, _extends2["default"])({}, assistantProps, { instructions: instructions, theme: _styles.theme.textColor === _styles.textColorLT ? 'light' : 'dark', welcomeMessage: _constants.WELCOME_MESSAGE, temperature: (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.temperature) || 0, topP: (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.config.topP) || 0, initialMessages: aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.messages, onMessagesUpdated: onMessagesUpdated, enableVoice: enableVoiceAndScreenCapture, enableScreenCapture: enableVoiceAndScreenCapture, onScreenshotClick: onScreenshotClick, screenCapturedBase64: (aiAssistant === null || aiAssistant === void 0 ? void 0 : aiAssistant.screenshotToAsk.screenCaptured) || '', onRemoveScreenshot: onRemoveScreenshot, onRestartChat: onRestartAssistant, fontSize: 'text-tiny', botMessageClassName: '', githubIssueLink: 'https://github.com/keplergl/kepler.gl/issues', ideas: ideas, onRefreshIdeas: generateIdeas }))); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RSZWR1eCIsIl9zdHlsZWRDb21wb25lbnRzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9zdHlsZXMiLCJfY29yZSIsIl91aSIsIl9hY3Rpb25zIiwiX2NvbnN0YW50cyIsIl91dGlscyIsIl90b29scyIsIl90ZW1wbGF0ZU9iamVjdCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIlN0eWxlZEFpQXNzaXN0YW50Q29tcG9uZW50Iiwic3R5bGVkIiwiZGl2IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJBaUFzc2lzdGFudENvbXBvbmVudCIsInZpc1N0YXRlIiwidXNlU2VsZWN0b3IiLCJzdGF0ZSIsImRlbW8iLCJrZXBsZXJHbCIsIm1hcCIsImFpQXNzaXN0YW50IiwiZGlzcGF0Y2giLCJ1c2VEaXNwYXRjaCIsInRvb2xzIiwic2V0dXBMTE1Ub29scyIsImVuYWJsZVZvaWNlQW5kU2NyZWVuQ2FwdHVyZSIsImNvbmZpZyIsInByb3ZpZGVyIiwiYXNzaXN0YW50UHJvcHMiLCJuYW1lIiwiQVNTSVNUQU5UX05BTUUiLCJkZXNjcmlwdGlvbiIsIkFTU0lTVEFOVF9ERVNDUklQVElPTiIsInZlcnNpb24iLCJBU1NJU1RBTlRfVkVSU0lPTiIsIm1vZGVsUHJvdmlkZXIiLCJtb2RlbCIsImFwaUtleSIsImJhc2VVcmwiLCJfdXNlU3RhdGUiLCJ1c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheTIiLCJkYXRhc2V0TWV0YURhdGEiLCJzZXREYXRhc2V0TWV0YURhdGEiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsImlkZWFzIiwic2V0SWRlYXMiLCJ1c2VFZmZlY3QiLCJtZXRhRGF0YSIsImdldERhdGFzZXRDb250ZXh0IiwiZGF0YXNldHMiLCJsYXllcnMiLCJpbnN0cnVjdGlvbnMiLCJjb25jYXQiLCJJTlNUUlVDVElPTlMiLCJfdXNlQXNzaXN0YW50IiwidXNlQXNzaXN0YW50IiwidGVtcG9yYXJ5UHJvbXB0IiwiZ2VuZXJhdGVJZGVhcyIsIl9yZWYiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsInJlc3BvbnNlIiwibWF0Y2giLCJqc29uIiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsInByb21wdCIsIlBST01QVF9JREVBUyIsInRlbXBlcmF0dXJlIiwic2VudCIsIkpTT04iLCJwYXJzZSIsInQwIiwiY29uc29sZSIsImVycm9yIiwic3RvcCIsIm9uUmVzdGFydEFzc2lzdGFudCIsInVwZGF0ZUFpQXNzaXN0YW50TWVzc2FnZXMiLCJvbk1lc3NhZ2VzVXBkYXRlZCIsIm1lc3NhZ2VzIiwib25TY3JlZW5zaG90Q2xpY2siLCJzZXRTdGFydFNjcmVlbkNhcHR1cmUiLCJvblJlbW92ZVNjcmVlbnNob3QiLCJzZXRTY3JlZW5DYXB0dXJlZCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJBaUFzc2lzdGFudCIsIl9leHRlbmRzMiIsInRoZW1lIiwidGV4dENvbG9yIiwidGV4dENvbG9yTFQiLCJ3ZWxjb21lTWVzc2FnZSIsIldFTENPTUVfTUVTU0FHRSIsInRvcFAiLCJpbml0aWFsTWVzc2FnZXMiLCJlbmFibGVWb2ljZSIsImVuYWJsZVNjcmVlbkNhcHR1cmUiLCJzY3JlZW5DYXB0dXJlZEJhc2U2NCIsInNjcmVlbnNob3RUb0FzayIsInNjcmVlbkNhcHR1cmVkIiwib25SZXN0YXJ0Q2hhdCIsImZvbnRTaXplIiwiYm90TWVzc2FnZUNsYXNzTmFtZSIsImdpdGh1Yklzc3VlTGluayIsIm9uUmVmcmVzaElkZWFzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvYWktYXNzaXN0YW50LWNvbXBvbmVudC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7dXNlRWZmZWN0LCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHt1c2VEaXNwYXRjaCwgdXNlU2VsZWN0b3J9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHt0ZXh0Q29sb3JMVCwgdGhlbWV9IGZyb20gJ0BrZXBsZXIuZ2wvc3R5bGVzJztcbmltcG9ydCB7TWVzc2FnZU1vZGVsLCB1c2VBc3Npc3RhbnR9IGZyb20gJ0BvcGVuYXNzaXN0YW50L2NvcmUnO1xuaW1wb3J0IHtBaUFzc2lzdGFudH0gZnJvbSAnQG9wZW5hc3Npc3RhbnQvdWknO1xuaW1wb3J0ICdAb3BlbmFzc2lzdGFudC9lY2hhcnRzL2Rpc3QvaW5kZXguY3NzJztcbmltcG9ydCAnQG9wZW5hc3Npc3RhbnQvdWkvZGlzdC9pbmRleC5jc3MnO1xuaW1wb3J0IHtzZXRTY3JlZW5DYXB0dXJlZCwgc2V0U3RhcnRTY3JlZW5DYXB0dXJlLCB1cGRhdGVBaUFzc2lzdGFudE1lc3NhZ2VzfSBmcm9tICcuLi9hY3Rpb25zJztcbmltcG9ydCB7XG4gIEFTU0lTVEFOVF9ERVNDUklQVElPTixcbiAgQVNTSVNUQU5UX05BTUUsXG4gIEFTU0lTVEFOVF9WRVJTSU9OLFxuICBJTlNUUlVDVElPTlMsXG4gIFBST01QVF9JREVBUyxcbiAgV0VMQ09NRV9NRVNTQUdFXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQge2dldERhdGFzZXRDb250ZXh0fSBmcm9tICcuLi90b29scy91dGlscyc7XG5pbXBvcnQge3NldHVwTExNVG9vbHN9IGZyb20gJy4uL3Rvb2xzL3Rvb2xzJztcbmltcG9ydCB7U3RhdGV9IGZyb20gJy4vYWktYXNzaXN0YW50LW1hbmFnZXInO1xuXG5jb25zdCBTdHlsZWRBaUFzc2lzdGFudENvbXBvbmVudCA9IHN0eWxlZC5kaXZgXG4gIGhlaWdodDogMTAwJTtcbiAgcGFkZGluZy1ib3R0b206IDRweDtcblxuICAqIHtcbiAgICBmb250LXNpemU6IDExcHg7XG4gIH1cbmA7XG5cbmV4cG9ydCBmdW5jdGlvbiBBaUFzc2lzdGFudENvbXBvbmVudCgpIHtcbiAgY29uc3QgdmlzU3RhdGUgPSB1c2VTZWxlY3Rvcigoc3RhdGU6IFN0YXRlKSA9PiBzdGF0ZS5kZW1vLmtlcGxlckdsLm1hcC52aXNTdGF0ZSk7XG4gIGNvbnN0IGFpQXNzaXN0YW50ID0gdXNlU2VsZWN0b3IoKHN0YXRlOiBTdGF0ZSkgPT4gc3RhdGUuZGVtby5haUFzc2lzdGFudCk7XG4gIGNvbnN0IGRpc3BhdGNoID0gdXNlRGlzcGF0Y2goKTtcblxuICAvLyBkZWZpbmUgTExNIGZ1bmN0aW9uc1xuICBjb25zdCB0b29scyA9IHNldHVwTExNVG9vbHMoe3Zpc1N0YXRlLCBhaUFzc2lzdGFudCwgZGlzcGF0Y2h9KTtcblxuICAvLyBlbmFibGUgdm9pY2UgYW5kIHNjcmVlbiBjYXB0dXJlXG4gIGNvbnN0IGVuYWJsZVZvaWNlQW5kU2NyZWVuQ2FwdHVyZSA9XG4gICAgYWlBc3Npc3RhbnQ/LmNvbmZpZy5wcm92aWRlciA9PT0gJ29wZW5haScgfHwgYWlBc3Npc3RhbnQ/LmNvbmZpZy5wcm92aWRlciA9PT0gJ2dvb2dsZScgfHwgZmFsc2U7XG5cbiAgLy8gZGVmaW5lIGFzc2lzdGFudCBwcm9wc1xuICBjb25zdCBhc3Npc3RhbnRQcm9wcyA9IHtcbiAgICBuYW1lOiBBU1NJU1RBTlRfTkFNRSxcbiAgICBkZXNjcmlwdGlvbjogQVNTSVNUQU5UX0RFU0NSSVBUSU9OLFxuICAgIHZlcnNpb246IEFTU0lTVEFOVF9WRVJTSU9OLFxuICAgIG1vZGVsUHJvdmlkZXI6IGFpQXNzaXN0YW50Py5jb25maWcucHJvdmlkZXIgfHwgJycsXG4gICAgbW9kZWw6IGFpQXNzaXN0YW50Py5jb25maWcubW9kZWwgfHwgJycsXG4gICAgYXBpS2V5OiBhaUFzc2lzdGFudD8uY29uZmlnLmFwaUtleSB8fCAnJyxcbiAgICBiYXNlVXJsOiBhaUFzc2lzdGFudD8uY29uZmlnLmJhc2VVcmwgfHwgJycsXG4gICAgdG9vbHNcbiAgfTtcblxuICBjb25zdCBbZGF0YXNldE1ldGFEYXRhLCBzZXREYXRhc2V0TWV0YURhdGFdID0gdXNlU3RhdGU8c3RyaW5nPignJyk7XG5cbiAgY29uc3QgW2lkZWFzLCBzZXRJZGVhc10gPSB1c2VTdGF0ZTx7dGl0bGU6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZ31bXT4oW10pO1xuXG4gIC8vIGdldCBkYXRhc2V0IG1ldGEgZGF0YSBhbmQgcmUtaW5pdGlhbGl6ZSBhc3Npc3RhbnQgd2hlbiBkYXRhc2V0cyBvciBsYXllcnMgY2hhbmdlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgbWV0YURhdGEgPSBnZXREYXRhc2V0Q29udGV4dCh2aXNTdGF0ZT8uZGF0YXNldHMsIHZpc1N0YXRlPy5sYXllcnMgfHwgW10pO1xuICAgIHNldERhdGFzZXRNZXRhRGF0YShtZXRhRGF0YSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbdmlzU3RhdGU/LmRhdGFzZXRzLCB2aXNTdGF0ZT8ubGF5ZXJzXSk7XG5cbiAgLy8gdXNlIGRhdGFzZXQgbWV0YSBkYXRhIGluIExMTSBpbnN0cnVjdGlvbnNcbiAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gYCR7SU5TVFJVQ1RJT05TfVxcblxcbiR7ZGF0YXNldE1ldGFEYXRhfWA7XG5cbiAgLy8gZ2VuZXJhdGUgaWRlYXMgZnJvbSBMTE1cbiAgY29uc3Qge3RlbXBvcmFyeVByb21wdH0gPSB1c2VBc3Npc3RhbnQoey4uLmFzc2lzdGFudFByb3BzLCBpbnN0cnVjdGlvbnN9KTtcblxuICBjb25zdCBnZW5lcmF0ZUlkZWFzID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRlbXBvcmFyeVByb21wdCh7XG4gICAgICAgIHByb21wdDogUFJPTVBUX0lERUFTLFxuICAgICAgICB0ZW1wZXJhdHVyZTogMS4wXG4gICAgICB9KTtcbiAgICAgIC8vIGZpbmQgW3t9LHt9Li4uXSBpbiB0aGUgdGV4dCBhbmQgcGFyc2UgaXQgYXMganNvbiwgaGFuZGxpbmcgd2hpdGVzcGFjZVxuICAgICAgY29uc3QgbWF0Y2ggPSByZXNwb25zZT8ubWF0Y2goL1xcW1xccypcXHsuKlxcfVxccypcXF0vcyk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UobWF0Y2hbMF0pO1xuICAgICAgICBzZXRJZGVhcyhqc29uKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2VuZXJhdGluZyBpZGVhcycsIGVycm9yKTtcbiAgICB9XG4gIH07XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBnZXQgaWRlYXMgVUkgY29tcG9uZW50XG4gICAgaWYgKGlkZWFzLmxlbmd0aCA9PT0gMCAmJiBkYXRhc2V0TWV0YURhdGEubGVuZ3RoID4gMCkge1xuICAgICAgZ2VuZXJhdGVJZGVhcygpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtkYXRhc2V0TWV0YURhdGFdKTtcblxuICBjb25zdCBvblJlc3RhcnRBc3Npc3RhbnQgPSAoKSA9PiB7XG4gICAgLy8gY2xlYW4gdXAgYWlBc3Npc3RhbnQgc3RhdGVcbiAgICBkaXNwYXRjaCh1cGRhdGVBaUFzc2lzdGFudE1lc3NhZ2VzKFtdKSk7XG4gIH07XG5cbiAgY29uc3Qgb25NZXNzYWdlc1VwZGF0ZWQgPSAobWVzc2FnZXM6IE1lc3NhZ2VNb2RlbFtdKSA9PiB7XG4gICAgZGlzcGF0Y2godXBkYXRlQWlBc3Npc3RhbnRNZXNzYWdlcyhtZXNzYWdlcykpO1xuICB9O1xuXG4gIGNvbnN0IG9uU2NyZWVuc2hvdENsaWNrID0gKCkgPT4ge1xuICAgIGRpc3BhdGNoKHNldFN0YXJ0U2NyZWVuQ2FwdHVyZSh0cnVlKSk7XG4gIH07XG5cbiAgY29uc3Qgb25SZW1vdmVTY3JlZW5zaG90ID0gKCkgPT4ge1xuICAgIGRpc3BhdGNoKHNldFNjcmVlbkNhcHR1cmVkKCcnKSk7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8U3R5bGVkQWlBc3Npc3RhbnRDb21wb25lbnQgY2xhc3NOYW1lPVwiYWktYXNzaXN0YW50LWNvbXBvbmVudFwiPlxuICAgICAgPEFpQXNzaXN0YW50XG4gICAgICAgIHsuLi5hc3Npc3RhbnRQcm9wc31cbiAgICAgICAgaW5zdHJ1Y3Rpb25zPXtpbnN0cnVjdGlvbnN9XG4gICAgICAgIHRoZW1lPXt0aGVtZS50ZXh0Q29sb3IgPT09IHRleHRDb2xvckxUID8gJ2xpZ2h0JyA6ICdkYXJrJ31cbiAgICAgICAgd2VsY29tZU1lc3NhZ2U9e1dFTENPTUVfTUVTU0FHRX1cbiAgICAgICAgdGVtcGVyYXR1cmU9e2FpQXNzaXN0YW50Py5jb25maWcudGVtcGVyYXR1cmUgfHwgMH1cbiAgICAgICAgdG9wUD17YWlBc3Npc3RhbnQ/LmNvbmZpZy50b3BQIHx8IDB9XG4gICAgICAgIGluaXRpYWxNZXNzYWdlcz17YWlBc3Npc3RhbnQ/Lm1lc3NhZ2VzfVxuICAgICAgICBvbk1lc3NhZ2VzVXBkYXRlZD17b25NZXNzYWdlc1VwZGF0ZWR9XG4gICAgICAgIGVuYWJsZVZvaWNlPXtlbmFibGVWb2ljZUFuZFNjcmVlbkNhcHR1cmV9XG4gICAgICAgIGVuYWJsZVNjcmVlbkNhcHR1cmU9e2VuYWJsZVZvaWNlQW5kU2NyZWVuQ2FwdHVyZX1cbiAgICAgICAgb25TY3JlZW5zaG90Q2xpY2s9e29uU2NyZWVuc2hvdENsaWNrfVxuICAgICAgICBzY3JlZW5DYXB0dXJlZEJhc2U2ND17YWlBc3Npc3RhbnQ/LnNjcmVlbnNob3RUb0Fzay5zY3JlZW5DYXB0dXJlZCB8fCAnJ31cbiAgICAgICAgb25SZW1vdmVTY3JlZW5zaG90PXtvblJlbW92ZVNjcmVlbnNob3R9XG4gICAgICAgIG9uUmVzdGFydENoYXQ9e29uUmVzdGFydEFzc2lzdGFudH1cbiAgICAgICAgZm9udFNpemU9eyd0ZXh0LXRpbnknfVxuICAgICAgICBib3RNZXNzYWdlQ2xhc3NOYW1lPXsnJ31cbiAgICAgICAgZ2l0aHViSXNzdWVMaW5rPXsnaHR0cHM6Ly9naXRodWIuY29tL2tlcGxlcmdsL2tlcGxlci5nbC9pc3N1ZXMnfVxuICAgICAgICBpZGVhcz17aWRlYXN9XG4gICAgICAgIG9uUmVmcmVzaElkZWFzPXtnZW5lcmF0ZUlkZWFzfVxuICAgICAgLz5cbiAgICA8L1N0eWxlZEFpQXNzaXN0YW50Q29tcG9uZW50PlxuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxPQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxLQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxHQUFBLEdBQUFOLE9BQUE7QUFDQUEs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