kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
193 lines (192 loc) • 27.9 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SaveDataToMapToolComponent = SaveDataToMapToolComponent;
exports.saveToolResults = void 0;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _react = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react");
var _lib = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react-redux/lib");
var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/processors/src");
var _src2 = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/actions/src");
var _utils = require("@openassistant/utils");
var _zod = require("zod");
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; }
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
var saveToolResults = exports.saveToolResults = (0, _utils.extendedTool)({
description: 'Save tool results to kepler.gl. The tool includes: buffer, zipcode, county, state, isochrone, thiessenPolygons, mst, cartogram, etc.',
parameters: _zod.z.object({
datasetNames: _zod.z.array(_zod.z.string()).describe('The names of the datasets created by tools.')
}),
execute: function () {
var _execute = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(args) {
var datasetNames, loadedDatasetNames, result, toolCache, datasetType, _iterator, _step, _datasetName, dataset, mergedResult, mergedColumnData, columnNames, numberOfRows, i, rowObject, _iterator2, _step2, columnName, datasetName, parsedData;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
_context.prev = 0;
datasetNames = args.datasetNames;
loadedDatasetNames = [];
result = [];
toolCache = _utils.ToolCache.getInstance();
_iterator = _createForOfIteratorHelper(datasetNames);
_context.prev = 6;
_iterator.s();
case 8:
if ((_step = _iterator.n()).done) {
_context.next = 28;
break;
}
_datasetName = _step.value;
dataset = toolCache.getDataset(_datasetName);
if (!(dataset && dataset.type === 'geojson')) {
_context.next = 15;
break;
}
datasetType = 'geojson';
_context.next = 24;
break;
case 15:
if (!(dataset && dataset.type === 'columnData')) {
_context.next = 19;
break;
}
datasetType = 'columnData';
_context.next = 24;
break;
case 19:
if (!(dataset && dataset.type === 'rowObjects')) {
_context.next = 23;
break;
}
datasetType = 'rowObjects';
_context.next = 24;
break;
case 23:
throw new Error("Can not save tool cache dataset ".concat(_datasetName, ", the dataset type ").concat(datasetType, " is not supported"));
case 24:
result.push(dataset.content);
loadedDatasetNames.push(_datasetName);
case 26:
_context.next = 8;
break;
case 28:
_context.next = 33;
break;
case 30:
_context.prev = 30;
_context.t0 = _context["catch"](6);
_iterator.e(_context.t0);
case 33:
_context.prev = 33;
_iterator.f();
return _context.finish(33);
case 36:
if (!(result.length === 0)) {
_context.next = 38;
break;
}
throw new Error("Can not save dataset, No datasets found from ".concat(datasetNames.join(', ')));
case 38:
if (datasetType === 'geojson') {
mergedResult = result.reduce(function (acc, geom) {
return _objectSpread(_objectSpread({}, acc), {}, {
features: [].concat((0, _toConsumableArray2["default"])(acc.features), (0, _toConsumableArray2["default"])(geom.features))
});
}, {
type: 'FeatureCollection',
features: []
});
} else if (datasetType === 'columnData') {
mergedColumnData = result.reduce(function (acc, row) {
return _objectSpread(_objectSpread({}, acc), row);
}, {}); // convert the merged result to a rowObjects array
columnNames = Object.keys(mergedColumnData);
numberOfRows = mergedColumnData[columnNames[0]].length;
for (i = 0; i < numberOfRows; i++) {
rowObject = {};
_iterator2 = _createForOfIteratorHelper(columnNames);
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
columnName = _step2.value;
rowObject[columnName] = mergedColumnData[columnName][i];
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
mergedResult.push(rowObject);
}
} else if (datasetType === 'rowObjects') {
mergedResult = result.reduce(function (acc, row) {
return [].concat((0, _toConsumableArray2["default"])(acc), (0, _toConsumableArray2["default"])(row));
}, []);
}
datasetName = datasetNames.length > 1 ? "".concat(datasetNames.join('_'), "_").concat((0, _utils.generateId)()) : datasetNames[0]; // try to process the merged result using kepler.gl processor
_context.next = 42;
return (0, _src.processFileData)({
content: {
data: mergedResult,
fileName: "".concat(datasetName)
},
fileCache: []
});
case 42:
parsedData = _context.sent;
return _context.abrupt("return", {
llmResult: {
success: true,
savedDatasetName: datasetName,
details: "Successfully save dataset: ".concat(datasetName, " in kepler.gl")
},
additionalData: {
parsedData: parsedData
}
});
case 46:
_context.prev = 46;
_context.t1 = _context["catch"](0);
return _context.abrupt("return", {
llmResult: {
success: false,
details: "Can not save data to kepler.gl, ".concat(_context.t1)
}
});
case 49:
case "end":
return _context.stop();
}
}, _callee, null, [[0, 46], [6, 30, 33, 36]]);
}));
function execute(_x) {
return _execute.apply(this, arguments);
}
return execute;
}(),
component: SaveDataToMapToolComponent
});
function SaveDataToMapToolComponent(_ref) {
var parsedData = _ref.parsedData;
var dispatch = (0, _lib.useDispatch)();
(0, _react.useEffect)(function () {
dispatch((0, _src2.addDataToMap)({
datasets: parsedData,
options: {
autoCreateLayers: true,
centerMap: true
}
}));
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return null;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX2xpYiIsIl9zcmMiLCJfc3JjMiIsIl91dGlscyIsIl96b2QiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbiIsIkYiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsImYiLCJUeXBlRXJyb3IiLCJhIiwidSIsImNhbGwiLCJuZXh0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJzYXZlVG9vbFJlc3VsdHMiLCJleHBvcnRzIiwiZXh0ZW5kZWRUb29sIiwiZGVzY3JpcHRpb24iLCJwYXJhbWV0ZXJzIiwieiIsIm9iamVjdCIsImRhdGFzZXROYW1lcyIsImFycmF5Iiwic3RyaW5nIiwiZGVzY3JpYmUiLCJleGVjdXRlIiwiX2V4ZWN1dGUiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsImFyZ3MiLCJsb2FkZWREYXRhc2V0TmFtZXMiLCJyZXN1bHQiLCJ0b29sQ2FjaGUiLCJkYXRhc2V0VHlwZSIsIl9pdGVyYXRvciIsIl9zdGVwIiwiX2RhdGFzZXROYW1lIiwiZGF0YXNldCIsIm1lcmdlZFJlc3VsdCIsIm1lcmdlZENvbHVtbkRhdGEiLCJjb2x1bW5OYW1lcyIsIm51bWJlck9mUm93cyIsImkiLCJyb3dPYmplY3QiLCJfaXRlcmF0b3IyIiwiX3N0ZXAyIiwiY29sdW1uTmFtZSIsImRhdGFzZXROYW1lIiwicGFyc2VkRGF0YSIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwicHJldiIsIlRvb2xDYWNoZSIsImdldEluc3RhbmNlIiwiZ2V0RGF0YXNldCIsInR5cGUiLCJFcnJvciIsImNvbmNhdCIsImNvbnRlbnQiLCJ0MCIsImZpbmlzaCIsImpvaW4iLCJyZWR1Y2UiLCJhY2MiLCJnZW9tIiwiZmVhdHVyZXMiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwicm93IiwiZXJyIiwiZ2VuZXJhdGVJZCIsInByb2Nlc3NGaWxlRGF0YSIsImRhdGEiLCJmaWxlTmFtZSIsImZpbGVDYWNoZSIsInNlbnQiLCJhYnJ1cHQiLCJsbG1SZXN1bHQiLCJzdWNjZXNzIiwic2F2ZWREYXRhc2V0TmFtZSIsImRldGFpbHMiLCJhZGRpdGlvbmFsRGF0YSIsInQxIiwic3RvcCIsIl94IiwiY29tcG9uZW50IiwiU2F2ZURhdGFUb01hcFRvb2xDb21wb25lbnQiLCJfcmVmIiwiZGlzcGF0Y2giLCJ1c2VEaXNwYXRjaCIsInVzZUVmZmVjdCIsImFkZERhdGFUb01hcCIsImRhdGFzZXRzIiwib3B0aW9ucyIsImF1dG9DcmVhdGVMYXllcnMiLCJjZW50ZXJNYXAiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYWktYXNzaXN0YW50L3NyYy90b29scy9rZXBsZXItdG9vbHMvc2F2ZS1kYXRhLXRvb2wudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7dXNlRWZmZWN0fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge3VzZURpc3BhdGNofSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQge3Byb2Nlc3NGaWxlRGF0YX0gZnJvbSAnQGtlcGxlci5nbC9wcm9jZXNzb3JzJztcbmltcG9ydCB7YWRkRGF0YVRvTWFwfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtQcm90b0RhdGFzZXR9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtGZWF0dXJlQ29sbGVjdGlvbn0gZnJvbSAnZ2VvanNvbic7XG5pbXBvcnQge2V4dGVuZGVkVG9vbCwgVG9vbENhY2hlLCBnZW5lcmF0ZUlkfSBmcm9tICdAb3BlbmFzc2lzdGFudC91dGlscyc7XG5pbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5cbmV4cG9ydCBjb25zdCBzYXZlVG9vbFJlc3VsdHMgPSBleHRlbmRlZFRvb2woe1xuICBkZXNjcmlwdGlvbjpcbiAgICAnU2F2ZSB0b29sIHJlc3VsdHMgdG8ga2VwbGVyLmdsLiBUaGUgdG9vbCBpbmNsdWRlczogYnVmZmVyLCB6aXBjb2RlLCBjb3VudHksIHN0YXRlLCBpc29jaHJvbmUsIHRoaWVzc2VuUG9seWdvbnMsIG1zdCwgY2FydG9ncmFtLCBldGMuJyxcbiAgcGFyYW1ldGVyczogei5vYmplY3Qoe1xuICAgIGRhdGFzZXROYW1lczogei5hcnJheSh6LnN0cmluZygpKS5kZXNjcmliZSgnVGhlIG5hbWVzIG9mIHRoZSBkYXRhc2V0cyBjcmVhdGVkIGJ5IHRvb2xzLicpXG4gIH0pLFxuICBleGVjdXRlOiBhc3luYyAoYXJnczoge2RhdGFzZXROYW1lczogc3RyaW5nW119KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHtkYXRhc2V0TmFtZXN9ID0gYXJncztcbiAgICAgIGNvbnN0IGxvYWRlZERhdGFzZXROYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IHJlc3VsdDogdW5rbm93bltdID0gW107XG4gICAgICBjb25zdCB0b29sQ2FjaGUgPSBUb29sQ2FjaGUuZ2V0SW5zdGFuY2UoKTtcblxuICAgICAgbGV0IGRhdGFzZXRUeXBlO1xuXG4gICAgICBmb3IgKGNvbnN0IGRhdGFzZXROYW1lIG9mIGRhdGFzZXROYW1lcykge1xuICAgICAgICBjb25zdCBkYXRhc2V0ID0gdG9vbENhY2hlLmdldERhdGFzZXQoZGF0YXNldE5hbWUpO1xuICAgICAgICBpZiAoZGF0YXNldCAmJiBkYXRhc2V0LnR5cGUgPT09ICdnZW9qc29uJykge1xuICAgICAgICAgIGRhdGFzZXRUeXBlID0gJ2dlb2pzb24nO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGFzZXQgJiYgZGF0YXNldC50eXBlID09PSAnY29sdW1uRGF0YScpIHtcbiAgICAgICAgICBkYXRhc2V0VHlwZSA9ICdjb2x1bW5EYXRhJztcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhc2V0ICYmIGRhdGFzZXQudHlwZSA9PT0gJ3Jvd09iamVjdHMnKSB7XG4gICAgICAgICAgZGF0YXNldFR5cGUgPSAncm93T2JqZWN0cyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbiBub3Qgc2F2ZSB0b29sIGNhY2hlIGRhdGFzZXQgJHtkYXRhc2V0TmFtZX0sIHRoZSBkYXRhc2V0IHR5cGUgJHtkYXRhc2V0VHlwZX0gaXMgbm90IHN1cHBvcnRlZGBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKGRhdGFzZXQuY29udGVudCk7XG4gICAgICAgIGxvYWRlZERhdGFzZXROYW1lcy5wdXNoKGRhdGFzZXROYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4gbm90IHNhdmUgZGF0YXNldCwgTm8gZGF0YXNldHMgZm91bmQgZnJvbSAke2RhdGFzZXROYW1lcy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBtZXJnZSB0aGUgcmVzdWx0IGJhc2VkIG9uIHRoZSBkYXRhc2V0IHR5cGVcbiAgICAgIGxldCBtZXJnZWRSZXN1bHQ7XG5cbiAgICAgIGlmIChkYXRhc2V0VHlwZSA9PT0gJ2dlb2pzb24nKSB7XG4gICAgICAgIG1lcmdlZFJlc3VsdCA9IChyZXN1bHQgYXMgRmVhdHVyZUNvbGxlY3Rpb25bXSkucmVkdWNlKFxuICAgICAgICAgIChhY2MsIGdlb20pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmFjYyxcbiAgICAgICAgICAgICAgZmVhdHVyZXM6IFsuLi5hY2MuZmVhdHVyZXMsIC4uLmdlb20uZmVhdHVyZXNdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0sXG4gICAgICAgICAge3R5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsIGZlYXR1cmVzOiBbXX1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YXNldFR5cGUgPT09ICdjb2x1bW5EYXRhJykge1xuICAgICAgICBjb25zdCBtZXJnZWRDb2x1bW5EYXRhID0gKHJlc3VsdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdKS5yZWR1Y2UoKGFjYywgcm93KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmFjYyxcbiAgICAgICAgICAgIC4uLnJvd1xuICAgICAgICAgIH07XG4gICAgICAgIH0sIHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duW10+O1xuICAgICAgICAvLyBjb252ZXJ0IHRoZSBtZXJnZWQgcmVzdWx0IHRvIGEgcm93T2JqZWN0cyBhcnJheVxuICAgICAgICBjb25zdCBjb2x1bW5OYW1lcyA9IE9iamVjdC5rZXlzKG1lcmdlZENvbHVtbkRhdGEpO1xuICAgICAgICBjb25zdCBudW1iZXJPZlJvd3MgPSBtZXJnZWRDb2x1bW5EYXRhW2NvbHVtbk5hbWVzWzBdXS5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVyT2ZSb3dzOyBpKyspIHtcbiAgICAgICAgICBjb25zdCByb3dPYmplY3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICAgICAgZm9yIChjb25zdCBjb2x1bW5OYW1lIG9mIGNvbHVtbk5hbWVzKSB7XG4gICAgICAgICAgICByb3dPYmplY3RbY29sdW1uTmFtZV0gPSBtZXJnZWRDb2x1bW5EYXRhW2NvbHVtbk5hbWVdW2ldO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtZXJnZWRSZXN1bHQucHVzaChyb3dPYmplY3QpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGFzZXRUeXBlID09PSAncm93T2JqZWN0cycpIHtcbiAgICAgICAgbWVyZ2VkUmVzdWx0ID0gKHJlc3VsdCBhcyB1bmtub3duW11bXSkucmVkdWNlKChhY2MsIHJvdykgPT4ge1xuICAgICAgICAgIHJldHVybiBbLi4uYWNjLCAuLi5yb3ddO1xuICAgICAgICB9LCBbXSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID1cbiAgICAgICAgZGF0YXNldE5hbWVzLmxlbmd0aCA+IDEgPyBgJHtkYXRhc2V0TmFtZXMuam9pbignXycpfV8ke2dlbmVyYXRlSWQoKX1gIDogZGF0YXNldE5hbWVzWzBdO1xuXG4gICAgICAvLyB0cnkgdG8gcHJvY2VzcyB0aGUgbWVyZ2VkIHJlc3VsdCB1c2luZyBrZXBsZXIuZ2wgcHJvY2Vzc29yXG4gICAgICBjb25zdCBwYXJzZWREYXRhID0gYXdhaXQgcHJvY2Vzc0ZpbGVEYXRhKHtcbiAgICAgICAgY29udGVudDoge1xuICAgICAgICAgIGRhdGE6IG1lcmdlZFJlc3VsdCxcbiAgICAgICAgICBmaWxlTmFtZTogYCR7ZGF0YXNldE5hbWV9YFxuICAgICAgICB9LFxuICAgICAgICBmaWxlQ2FjaGU6IFtdXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGxtUmVzdWx0OiB7XG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBzYXZlZERhdGFzZXROYW1lOiBkYXRhc2V0TmFtZSxcbiAgICAgICAgICBkZXRhaWxzOiBgU3VjY2Vzc2Z1bGx5IHNhdmUgZGF0YXNldDogJHtkYXRhc2V0TmFtZX0gaW4ga2VwbGVyLmdsYFxuICAgICAgICB9LFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIHBhcnNlZERhdGFcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGxtUmVzdWx0OiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgZGV0YWlsczogYENhbiBub3Qgc2F2ZSBkYXRhIHRvIGtlcGxlci5nbCwgJHtlcnJvcn1gXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9LFxuICBjb21wb25lbnQ6IFNhdmVEYXRhVG9NYXBUb29sQ29tcG9uZW50XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIFNhdmVEYXRhVG9NYXBUb29sQ29tcG9uZW50KHtwYXJzZWREYXRhfToge3BhcnNlZERhdGE6IFByb3RvRGF0YXNldFtdfSkge1xuICBjb25zdCBkaXNwYXRjaCA9IHVzZURpc3BhdGNoKCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBkaXNwYXRjaChcbiAgICAgIGFkZERhdGFUb01hcCh7XG4gICAgICAgIGRhdGFzZXRzOiBwYXJzZWREYXRhLFxuICAgICAgICBvcHRpb25zOiB7YXV0b0NyZWF0ZUxheWVyczogdHJ1ZSwgY2VudGVyTWFwOiB0cnVlfVxuICAgICAgfSlcbiAgICApO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW10pO1xuXG4gIHJldHVybiBudWxsO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxJQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxJQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxLQUFBLEdBQUFILE9BQUE7QUFHQSxJQUFBSSxN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
;