@kepler.gl/mcp 0.0.0-stage → 3.3.0-alpha.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/cjs/commands/add-column-command.js +192 -0
  2. package/dist/cjs/commands/basemap-command.js +80 -0
  3. package/dist/cjs/commands/boundary-command.js +81 -0
  4. package/dist/cjs/commands/command-wrappers.js +122 -0
  5. package/dist/cjs/commands/dataset-context-command.js +87 -0
  6. package/dist/cjs/commands/index.js +230 -0
  7. package/dist/cjs/commands/layer-creation-command.js +534 -0
  8. package/dist/cjs/commands/layer-style-command.js +136 -0
  9. package/dist/cjs/commands/load-data-command.js +270 -0
  10. package/dist/cjs/commands/save-data-command.js +118 -0
  11. package/dist/cjs/commands/split-view-command.js +261 -0
  12. package/dist/cjs/commands/table-command.js +199 -0
  13. package/dist/cjs/commands/time-filter-command.js +289 -0
  14. package/dist/cjs/commands/toggle-time-filter-command.js +155 -0
  15. package/dist/cjs/commands/types.js +6 -0
  16. package/dist/cjs/commands/utils.js +536 -0
  17. package/dist/cjs/commands/view-mode-command.js +94 -0
  18. package/dist/cjs/index.js +39 -0
  19. package/dist/cjs/map-contract.js +6 -0
  20. package/dist/cjs/server/bridge-server.js +435 -0
  21. package/dist/cjs/server/index.js +31 -0
  22. package/dist/cjs/server/stdio.js +201 -0
  23. package/dist/cjs/types.js +30 -0
  24. package/dist/commands/add-column-command.d.ts +4 -0
  25. package/dist/commands/basemap-command.d.ts +4 -0
  26. package/dist/commands/boundary-command.d.ts +4 -0
  27. package/dist/commands/command-wrappers.d.ts +52 -0
  28. package/dist/commands/dataset-context-command.d.ts +4 -0
  29. package/dist/commands/index.d.ts +31 -0
  30. package/dist/commands/layer-creation-command.d.ts +8 -0
  31. package/dist/commands/layer-style-command.d.ts +4 -0
  32. package/dist/commands/load-data-command.d.ts +4 -0
  33. package/dist/commands/save-data-command.d.ts +4 -0
  34. package/dist/commands/split-view-command.d.ts +4 -0
  35. package/dist/commands/table-command.d.ts +4 -0
  36. package/dist/commands/time-filter-command.d.ts +13 -0
  37. package/dist/commands/toggle-time-filter-command.d.ts +4 -0
  38. package/dist/commands/types.d.ts +132 -0
  39. package/dist/commands/utils.d.ts +138 -0
  40. package/dist/commands/view-mode-command.d.ts +4 -0
  41. package/dist/esm/commands/add-column-command.js +185 -0
  42. package/dist/esm/commands/basemap-command.js +72 -0
  43. package/dist/esm/commands/boundary-command.js +73 -0
  44. package/dist/esm/commands/command-wrappers.js +114 -0
  45. package/dist/esm/commands/dataset-context-command.js +79 -0
  46. package/dist/esm/commands/index.js +51 -0
  47. package/dist/esm/commands/layer-creation-command.js +527 -0
  48. package/dist/esm/commands/layer-style-command.js +130 -0
  49. package/dist/esm/commands/load-data-command.js +264 -0
  50. package/dist/esm/commands/save-data-command.js +112 -0
  51. package/dist/esm/commands/split-view-command.js +255 -0
  52. package/dist/esm/commands/table-command.js +194 -0
  53. package/dist/esm/commands/time-filter-command.js +280 -0
  54. package/dist/esm/commands/toggle-time-filter-command.js +147 -0
  55. package/dist/esm/commands/types.js +3 -0
  56. package/dist/esm/commands/utils.js +521 -0
  57. package/dist/esm/commands/view-mode-command.js +86 -0
  58. package/dist/esm/index.js +20 -0
  59. package/dist/esm/map-contract.js +3 -0
  60. package/dist/esm/server/bridge-server.js +428 -0
  61. package/dist/esm/server/index.js +13 -0
  62. package/dist/esm/server/stdio.js +198 -0
  63. package/dist/esm/types.js +24 -0
  64. package/dist/index.d.ts +15 -0
  65. package/dist/map-contract.d.ts +31 -0
  66. package/dist/server/bridge-server.d.ts +53 -0
  67. package/dist/server/index.d.ts +9 -0
  68. package/dist/server/stdio.d.ts +2 -0
  69. package/dist/types.d.ts +24 -0
  70. package/package.json +84 -4
  71. package/skill/kepler/SKILL.md +438 -0
  72. package/skill/kepler/skill.yaml +4 -0
  73. package/README.md +0 -3
@@ -0,0 +1,261 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.getSplitViewCommand = getSplitViewCommand;
8
+ exports.splitViewCommandId = void 0;
9
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
+ var _zod = require("zod");
13
+ var _actions = require("@kepler.gl/actions");
14
+ 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; } } }; }
15
+ 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; } }
16
+ 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
17
+ // Copyright contributors to the kepler.gl project
18
+ var sleep = function sleep(ms) {
19
+ return new Promise(function (resolve) {
20
+ return setTimeout(resolve, ms);
21
+ });
22
+ };
23
+ var splitViewCommandId = exports.splitViewCommandId = 'map.split-view';
24
+ function getSplitViewCommand(ctx) {
25
+ return {
26
+ id: splitViewCommandId,
27
+ name: 'Toggle split map view',
28
+ group: 'Map',
29
+ description: "Enable or disable the dual-map (split view) comparison mode.\n\nWhen enabled, the map splits into two panels for side-by-side comparison. Pass layerIdsForMap0 / layerIdsForMap1 to assign which layers show ONLY in the left / right panel; without these, all layers show on both panels (no comparison).\n\nWhen disabled, the map returns to a single panel.\n\nUse the SAME colorBy / colorType for the layers being compared, so the comparison is fair.",
30
+ metadata: {
31
+ readOnly: false,
32
+ riskLevel: 'low',
33
+ idempotent: true
34
+ },
35
+ inputSchema: _zod.z.object({
36
+ action: _zod.z["enum"](['enable', 'disable']).describe('"enable" activates dual map mode; "disable" returns to a single map.'),
37
+ layerIdsForMap0: _zod.z.array(_zod.z.string()).optional().describe('Layer IDs to show ONLY in the LEFT panel. Layers not listed are hidden from the left panel.'),
38
+ layerIdsForMap1: _zod.z.array(_zod.z.string()).optional().describe('Layer IDs to show ONLY in the RIGHT panel. Layers not listed are hidden from the right panel.')
39
+ }),
40
+ execute: function () {
41
+ var _execute = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(_execCtx, input) {
42
+ var _ref, action, layerIdsForMap0, layerIdsForMap1, _iterator, _step, _step$value, name, _ids, visState, isSplit, hasLayerAssignment, updatedVis, splitMaps, allLayers, allLayerIds, allLayerIdSet, _iterator2, _step2, _step2$value, panel, ids, unknown, _splitMaps$, map0Layers, desiredSet0, _iterator3, _step3, layerId, isVisible, shouldBeVisible, _freshSplitMaps$, freshSplitMaps, map1Layers, desiredSet1, _iterator4, _step4, _layerId, _isVisible, _shouldBeVisible, finalVis, layers;
43
+ return _regenerator["default"].wrap(function _callee$(_context) {
44
+ while (1) switch (_context.prev = _context.next) {
45
+ case 0:
46
+ _ref = input !== null && input !== void 0 ? input : {}, action = _ref.action, layerIdsForMap0 = _ref.layerIdsForMap0, layerIdsForMap1 = _ref.layerIdsForMap1;
47
+ _context.prev = 1;
48
+ if (!(action !== 'enable' && action !== 'disable')) {
49
+ _context.next = 4;
50
+ break;
51
+ }
52
+ return _context.abrupt("return", {
53
+ success: false,
54
+ commandId: splitViewCommandId,
55
+ error: "Invalid action \"".concat(String(action), "\". Must be \"enable\" or \"disable\"."),
56
+ data: {
57
+ instruction: 'Pass action: "enable" to activate dual map mode, or "disable" to return to a single map.'
58
+ }
59
+ });
60
+ case 4:
61
+ // Runtime guard: the bridge/webMCP call execute without zod parsing, so
62
+ // a string/object passed as layerIdsForMap0/1 must not be treated as
63
+ // iterable (`.length`, `.filter`) and produce surprising layer toggles.
64
+ // Reject non-array or non-string entries when these fields are provided.
65
+ _iterator = _createForOfIteratorHelper([['layerIdsForMap0', layerIdsForMap0], ['layerIdsForMap1', layerIdsForMap1]]);
66
+ _context.prev = 5;
67
+ _iterator.s();
68
+ case 7:
69
+ if ((_step = _iterator.n()).done) {
70
+ _context.next = 13;
71
+ break;
72
+ }
73
+ _step$value = (0, _slicedToArray2["default"])(_step.value, 2), name = _step$value[0], _ids = _step$value[1];
74
+ if (!(_ids !== undefined && (!Array.isArray(_ids) || _ids.some(function (id) {
75
+ return typeof id !== 'string' || id.length === 0;
76
+ })))) {
77
+ _context.next = 11;
78
+ break;
79
+ }
80
+ return _context.abrupt("return", {
81
+ success: false,
82
+ commandId: splitViewCommandId,
83
+ error: "Invalid ".concat(name, ". Must be an array of non-empty layer id strings."),
84
+ data: {
85
+ instruction: "Pass ".concat(name, " as an array of layer id strings, or omit it to show all layers on that panel.")
86
+ }
87
+ });
88
+ case 11:
89
+ _context.next = 7;
90
+ break;
91
+ case 13:
92
+ _context.next = 18;
93
+ break;
94
+ case 15:
95
+ _context.prev = 15;
96
+ _context.t0 = _context["catch"](5);
97
+ _iterator.e(_context.t0);
98
+ case 18:
99
+ _context.prev = 18;
100
+ _iterator.f();
101
+ return _context.finish(18);
102
+ case 21:
103
+ visState = ctx.getVisState();
104
+ isSplit = visState.splitMaps && visState.splitMaps.length > 1;
105
+ if (!(action === 'disable')) {
106
+ _context.next = 26;
107
+ break;
108
+ }
109
+ if (isSplit) {
110
+ // Close the RIGHT panel (index 1) so the LEFT panel (map0) survives:
111
+ // `closeSpecificMapAtIndex` keeps `1 - payload`, so closing 0 would
112
+ // keep the right panel and flip layer visibility to map1's config.
113
+ ctx.dispatch((0, _actions.toggleSplitMap)(1));
114
+ }
115
+ return _context.abrupt("return", {
116
+ success: true,
117
+ commandId: splitViewCommandId,
118
+ data: {
119
+ details: 'Split map view disabled. Returned to single map view.'
120
+ }
121
+ });
122
+ case 26:
123
+ // enable
124
+ if (!isSplit) {
125
+ ctx.dispatch((0, _actions.toggleSplitMap)(0));
126
+ }
127
+ hasLayerAssignment = layerIdsForMap0 && layerIdsForMap0.length > 0 || layerIdsForMap1 && layerIdsForMap1.length > 0;
128
+ if (!hasLayerAssignment) {
129
+ _context.next = 58;
130
+ break;
131
+ }
132
+ _context.next = 31;
133
+ return sleep(200);
134
+ case 31:
135
+ updatedVis = ctx.getVisState();
136
+ splitMaps = updatedVis.splitMaps;
137
+ if (!(splitMaps && splitMaps.length > 1)) {
138
+ _context.next = 58;
139
+ break;
140
+ }
141
+ allLayers = updatedVis.layers || [];
142
+ allLayerIds = allLayers.map(function (l) {
143
+ return l.id;
144
+ }); // Fail fast on unknown layer ids — silently ignoring them would
145
+ // hide every real layer not listed and produce an unexpected blank
146
+ // panel.
147
+ allLayerIdSet = new Set(allLayerIds);
148
+ _iterator2 = _createForOfIteratorHelper([['left (map0)', layerIdsForMap0], ['right (map1)', layerIdsForMap1]]);
149
+ _context.prev = 38;
150
+ _iterator2.s();
151
+ case 40:
152
+ if ((_step2 = _iterator2.n()).done) {
153
+ _context.next = 48;
154
+ break;
155
+ }
156
+ _step2$value = (0, _slicedToArray2["default"])(_step2.value, 2), panel = _step2$value[0], ids = _step2$value[1];
157
+ if (!(ids && ids.length > 0)) {
158
+ _context.next = 46;
159
+ break;
160
+ }
161
+ unknown = ids.filter(function (id) {
162
+ return !allLayerIdSet.has(id);
163
+ });
164
+ if (!(unknown.length > 0)) {
165
+ _context.next = 46;
166
+ break;
167
+ }
168
+ throw new Error("Unknown layer id(s) for the ".concat(panel, " panel: ").concat(unknown.join(', '), ". ") + "Available layer ids: ".concat(allLayerIds.join(', ')));
169
+ case 46:
170
+ _context.next = 40;
171
+ break;
172
+ case 48:
173
+ _context.next = 53;
174
+ break;
175
+ case 50:
176
+ _context.prev = 50;
177
+ _context.t1 = _context["catch"](38);
178
+ _iterator2.e(_context.t1);
179
+ case 53:
180
+ _context.prev = 53;
181
+ _iterator2.f();
182
+ return _context.finish(53);
183
+ case 56:
184
+ if (layerIdsForMap0 && layerIdsForMap0.length > 0) {
185
+ map0Layers = ((_splitMaps$ = splitMaps[0]) === null || _splitMaps$ === void 0 ? void 0 : _splitMaps$.layers) || {};
186
+ desiredSet0 = new Set(layerIdsForMap0);
187
+ _iterator3 = _createForOfIteratorHelper(allLayerIds);
188
+ try {
189
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
190
+ layerId = _step3.value;
191
+ // Coerce to boolean: a missing entry means "hidden", and
192
+ // `toggleLayerForMapUpdater` toggles missing entries to visible.
193
+ isVisible = Boolean(map0Layers[layerId]);
194
+ shouldBeVisible = desiredSet0.has(layerId);
195
+ if (isVisible !== shouldBeVisible) {
196
+ ctx.dispatch((0, _actions.toggleLayerForMap)(0, layerId));
197
+ }
198
+ }
199
+ } catch (err) {
200
+ _iterator3.e(err);
201
+ } finally {
202
+ _iterator3.f();
203
+ }
204
+ }
205
+ if (layerIdsForMap1 && layerIdsForMap1.length > 0) {
206
+ freshSplitMaps = ctx.getVisState().splitMaps;
207
+ map1Layers = (freshSplitMaps === null || freshSplitMaps === void 0 || (_freshSplitMaps$ = freshSplitMaps[1]) === null || _freshSplitMaps$ === void 0 ? void 0 : _freshSplitMaps$.layers) || {};
208
+ desiredSet1 = new Set(layerIdsForMap1);
209
+ _iterator4 = _createForOfIteratorHelper(allLayerIds);
210
+ try {
211
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
212
+ _layerId = _step4.value;
213
+ // Coerce to boolean: a missing entry means "hidden", and
214
+ // `toggleLayerForMapUpdater` toggles missing entries to visible.
215
+ _isVisible = Boolean(map1Layers[_layerId]);
216
+ _shouldBeVisible = desiredSet1.has(_layerId);
217
+ if (_isVisible !== _shouldBeVisible) {
218
+ ctx.dispatch((0, _actions.toggleLayerForMap)(1, _layerId));
219
+ }
220
+ }
221
+ } catch (err) {
222
+ _iterator4.e(err);
223
+ } finally {
224
+ _iterator4.f();
225
+ }
226
+ }
227
+ case 58:
228
+ finalVis = ctx.getVisState();
229
+ layers = finalVis.layers || [];
230
+ return _context.abrupt("return", {
231
+ success: true,
232
+ commandId: splitViewCommandId,
233
+ data: {
234
+ details: "Split map view enabled. ".concat(layers.length, " layer(s) available.").concat(hasLayerAssignment ? " Left panel: ".concat((layerIdsForMap0 || []).length, " layer(s), Right panel: ").concat((layerIdsForMap1 || []).length, " layer(s).") : ' All layers visible on both panels. Provide layerIdsForMap0/layerIdsForMap1 to assign layers to each panel.')
235
+ }
236
+ });
237
+ case 63:
238
+ _context.prev = 63;
239
+ _context.t2 = _context["catch"](1);
240
+ return _context.abrupt("return", {
241
+ success: false,
242
+ commandId: splitViewCommandId,
243
+ error: _context.t2 instanceof Error ? _context.t2.message : 'Unknown error',
244
+ data: {
245
+ instruction: 'Check that a map is loaded and layers exist. If the error persists, ask the user to try with different parameters.'
246
+ }
247
+ });
248
+ case 66:
249
+ case "end":
250
+ return _context.stop();
251
+ }
252
+ }, _callee, null, [[1, 63], [5, 15, 18, 21], [38, 50, 53, 56]]);
253
+ }));
254
+ function execute(_x, _x2) {
255
+ return _execute.apply(this, arguments);
256
+ }
257
+ return execute;
258
+ }()
259
+ };
260
+ }
261
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfem9kIiwicmVxdWlyZSIsIl9hY3Rpb25zIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJyIiwiZSIsInQiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwiZiIsIlR5cGVFcnJvciIsIm8iLCJhIiwidSIsImNhbGwiLCJuZXh0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJzbGVlcCIsIm1zIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzZXRUaW1lb3V0Iiwic3BsaXRWaWV3Q29tbWFuZElkIiwiZXhwb3J0cyIsImdldFNwbGl0Vmlld0NvbW1hbmQiLCJjdHgiLCJpZCIsImdyb3VwIiwiZGVzY3JpcHRpb24iLCJtZXRhZGF0YSIsInJlYWRPbmx5Iiwicmlza0xldmVsIiwiaWRlbXBvdGVudCIsImlucHV0U2NoZW1hIiwieiIsIm9iamVjdCIsImFjdGlvbiIsImRlc2NyaWJlIiwibGF5ZXJJZHNGb3JNYXAwIiwiYXJyYXkiLCJzdHJpbmciLCJvcHRpb25hbCIsImxheWVySWRzRm9yTWFwMSIsImV4ZWN1dGUiLCJfZXhlY3V0ZSIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiX2V4ZWNDdHgiLCJpbnB1dCIsIl9yZWYiLCJfaXRlcmF0b3IiLCJfc3RlcCIsIl9zdGVwJHZhbHVlIiwiX2lkcyIsInZpc1N0YXRlIiwiaXNTcGxpdCIsImhhc0xheWVyQXNzaWdubWVudCIsInVwZGF0ZWRWaXMiLCJzcGxpdE1hcHMiLCJhbGxMYXllcnMiLCJhbGxMYXllcklkcyIsImFsbExheWVySWRTZXQiLCJfaXRlcmF0b3IyIiwiX3N0ZXAyIiwiX3N0ZXAyJHZhbHVlIiwicGFuZWwiLCJpZHMiLCJ1bmtub3duIiwiX3NwbGl0TWFwcyQiLCJtYXAwTGF5ZXJzIiwiZGVzaXJlZFNldDAiLCJfaXRlcmF0b3IzIiwiX3N0ZXAzIiwibGF5ZXJJZCIsImlzVmlzaWJsZSIsInNob3VsZEJlVmlzaWJsZSIsIl9mcmVzaFNwbGl0TWFwcyQiLCJmcmVzaFNwbGl0TWFwcyIsIm1hcDFMYXllcnMiLCJkZXNpcmVkU2V0MSIsIl9pdGVyYXRvcjQiLCJfc3RlcDQiLCJfbGF5ZXJJZCIsIl9pc1Zpc2libGUiLCJfc2hvdWxkQmVWaXNpYmxlIiwiZmluYWxWaXMiLCJsYXllcnMiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJhYnJ1cHQiLCJzdWNjZXNzIiwiY29tbWFuZElkIiwiZXJyb3IiLCJjb25jYXQiLCJTdHJpbmciLCJkYXRhIiwiaW5zdHJ1Y3Rpb24iLCJfc2xpY2VkVG9BcnJheTIiLCJ1bmRlZmluZWQiLCJzb21lIiwidDAiLCJmaW5pc2giLCJnZXRWaXNTdGF0ZSIsImRpc3BhdGNoIiwidG9nZ2xlU3BsaXRNYXAiLCJkZXRhaWxzIiwibWFwIiwibCIsIlNldCIsImZpbHRlciIsImhhcyIsIkVycm9yIiwiam9pbiIsInQxIiwiQm9vbGVhbiIsInRvZ2dsZUxheWVyRm9yTWFwIiwiZXJyIiwidDIiLCJtZXNzYWdlIiwic3RvcCIsIl94IiwiX3gyIiwiYXBwbHkiLCJhcmd1bWVudHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbWFuZHMvc3BsaXQtdmlldy1jb21tYW5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB0eXBlIHtSb29tQ29tbWFuZH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5pbXBvcnQge3RvZ2dsZVNwbGl0TWFwLCB0b2dnbGVMYXllckZvck1hcH0gZnJvbSAnQGtlcGxlci5nbC9hY3Rpb25zJztcbmltcG9ydCB0eXBlIHtLZXBsZXJDb250ZXh0fSBmcm9tICcuL3R5cGVzJztcblxuY29uc3Qgc2xlZXAgPSAobXM6IG51bWJlcikgPT4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG5cbmV4cG9ydCBjb25zdCBzcGxpdFZpZXdDb21tYW5kSWQgPSAnbWFwLnNwbGl0LXZpZXcnIGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BsaXRWaWV3Q29tbWFuZChjdHg6IEtlcGxlckNvbnRleHQpOiBSb29tQ29tbWFuZCB7XG4gIHJldHVybiB7XG4gICAgaWQ6IHNwbGl0Vmlld0NvbW1hbmRJZCxcbiAgICBuYW1lOiAnVG9nZ2xlIHNwbGl0IG1hcCB2aWV3JyxcbiAgICBncm91cDogJ01hcCcsXG4gICAgZGVzY3JpcHRpb246IGBFbmFibGUgb3IgZGlzYWJsZSB0aGUgZHVhbC1tYXAgKHNwbGl0IHZpZXcpIGNvbXBhcmlzb24gbW9kZS5cblxuV2hlbiBlbmFibGVkLCB0aGUgbWFwIHNwbGl0cyBpbnRvIHR3byBwYW5lbHMgZm9yIHNpZGUtYnktc2lkZSBjb21wYXJpc29uLiBQYXNzIGxheWVySWRzRm9yTWFwMCAvIGxheWVySWRzRm9yTWFwMSB0byBhc3NpZ24gd2hpY2ggbGF5ZXJzIHNob3cgT05MWSBpbiB0aGUgbGVmdCAvIHJpZ2h0IHBhbmVsOyB3aXRob3V0IHRoZXNlLCBhbGwgbGF5ZXJzIHNob3cgb24gYm90aCBwYW5lbHMgKG5vIGNvbXBhcmlzb24pLlxuXG5XaGVuIGRpc2FibGVkLCB0aGUgbWFwIHJldHVybnMgdG8gYSBzaW5nbGUgcGFuZWwuXG5cblVzZSB0aGUgU0FNRSBjb2xvckJ5IC8gY29sb3JUeXBlIGZvciB0aGUgbGF5ZXJzIGJlaW5nIGNvbXBhcmVkLCBzbyB0aGUgY29tcGFyaXNvbiBpcyBmYWlyLmAsXG4gICAgbWV0YWRhdGE6IHtyZWFkT25seTogZmFsc2UsIHJpc2tMZXZlbDogJ2xvdycsIGlkZW1wb3RlbnQ6IHRydWV9LFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBhY3Rpb246IHpcbiAgICAgICAgLmVudW0oWydlbmFibGUnLCAnZGlzYWJsZSddKVxuICAgICAgICAuZGVzY3JpYmUoJ1wiZW5hYmxlXCIgYWN0aXZhdGVzIGR1YWwgbWFwIG1vZGU7IFwiZGlzYWJsZVwiIHJldHVybnMgdG8gYSBzaW5nbGUgbWFwLicpLFxuICAgICAgbGF5ZXJJZHNGb3JNYXAwOiB6XG4gICAgICAgIC5hcnJheSh6LnN0cmluZygpKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgJ0xheWVyIElEcyB0byBzaG93IE9OTFkgaW4gdGhlIExFRlQgcGFuZWwuIExheWVycyBub3QgbGlzdGVkIGFyZSBoaWRkZW4gZnJvbSB0aGUgbGVmdCBwYW5lbC4nXG4gICAgICAgICksXG4gICAgICBsYXllcklkc0Zvck1hcDE6IHpcbiAgICAgICAgLmFycmF5KHouc3RyaW5nKCkpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICAnTGF5ZXIgSURzIHRvIHNob3cgT05MWSBpbiB0aGUgUklHSFQgcGFuZWwuIExheWVycyBub3QgbGlzdGVkIGFyZSBoaWRkZW4gZnJvbSB0aGUgcmlnaHQgcGFuZWwuJ1xuICAgICAgICApXG4gICAgfSkgYXMgYW55LFxuICAgIGV4ZWN1dGU6IGFzeW5jIChfZXhlY0N0eCwgaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IHthY3Rpb24sIGxheWVySWRzRm9yTWFwMCwgbGF5ZXJJZHNGb3JNYXAxfSA9IChpbnB1dCA/PyB7fSkgYXMge1xuICAgICAgICBhY3Rpb246ICdlbmFibGUnIHwgJ2Rpc2FibGUnO1xuICAgICAgICBsYXllcklkc0Zvck1hcDA/OiBzdHJpbmdbXTtcbiAgICAgICAgbGF5ZXJJZHNGb3JNYXAxPzogc3RyaW5nW107XG4gICAgICB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gUnVudGltZSBndWFyZDogdGhlIGJyaWRnZS93ZWJNQ1AgY2FsbCBleGVjdXRlIHdpdGhvdXQgem9kIHBhcnNpbmcsIHNvXG4gICAgICAgIC8vIGEgbWlzc2luZy9pbnZhbGlkIGFjdGlvbiBtdXN0IG5vdCBmYWxsIHRocm91Z2ggdG8gdGhlIGVuYWJsZSBwYXRoIGFuZFxuICAgICAgICAvLyB0b2dnbGUgc3BsaXQgdmlldyB1bmV4cGVjdGVkbHkuXG4gICAgICAgIGlmIChhY3Rpb24gIT09ICdlbmFibGUnICYmIGFjdGlvbiAhPT0gJ2Rpc2FibGUnKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgY29tbWFuZElkOiBzcGxpdFZpZXdDb21tYW5kSWQsXG4gICAgICAgICAgICBlcnJvcjogYEludmFsaWQgYWN0aW9uIFwiJHtTdHJpbmcoYWN0aW9uKX1cIi4gTXVzdCBiZSBcImVuYWJsZVwiIG9yIFwiZGlzYWJsZVwiLmAsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIGluc3RydWN0aW9uOlxuICAgICAgICAgICAgICAgICdQYXNzIGFjdGlvbjogXCJlbmFibGVcIiB0byBhY3RpdmF0ZSBkdWFsIG1hcCBtb2RlLCBvciBcImRpc2FibGVcIiB0byByZXR1cm4gdG8gYSBzaW5nbGUgbWFwLidcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUnVudGltZSBndWFyZDogdGhlIGJyaWRnZS93ZWJNQ1AgY2FsbCBleGVjdXRlIHdpdGhvdXQgem9kIHBhcnNpbmcsIHNvXG4gICAgICAgIC8vIGEgc3RyaW5nL29iamVjdCBwYXNzZWQgYXMgbGF5ZXJJZHNGb3JNYXAwLzEgbXVzdCBub3QgYmUgdHJlYXRlZCBhc1xuICAgICAgICAvLyBpdGVyYWJsZSAoYC5sZW5ndGhgLCBgLmZpbHRlcmApIGFuZCBwcm9kdWNlIHN1cnByaXNpbmcgbGF5ZXIgdG9nZ2xlcy5cbiAgICAgICAgLy8gUmVqZWN0IG5vbi1hcnJheSBvciBub24tc3RyaW5nIGVudHJpZXMgd2hlbiB0aGVzZSBmaWVsZHMgYXJlIHByb3ZpZGVkLlxuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBpZHNdIG9mIFtcbiAgICAgICAgICBbJ2xheWVySWRzRm9yTWFwMCcsIGxheWVySWRzRm9yTWFwMF0sXG4gICAgICAgICAgWydsYXllcklkc0Zvck1hcDEnLCBsYXllcklkc0Zvck1hcDFdXG4gICAgICAgIF0gYXMgY29uc3QpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpZHMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgKCFBcnJheS5pc0FycmF5KGlkcykgfHwgaWRzLnNvbWUoaWQgPT4gdHlwZW9mIGlkICE9PSAnc3RyaW5nJyB8fCBpZC5sZW5ndGggPT09IDApKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgIGNvbW1hbmRJZDogc3BsaXRWaWV3Q29tbWFuZElkLFxuICAgICAgICAgICAgICBlcnJvcjogYEludmFsaWQgJHtuYW1lfS4gTXVzdCBiZSBhbiBhcnJheSBvZiBub24tZW1wdHkgbGF5ZXIgaWQgc3RyaW5ncy5gLFxuICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb246IGBQYXNzICR7bmFtZX0gYXMgYW4gYXJyYXkgb2YgbGF5ZXIgaWQgc3RyaW5ncywgb3Igb21pdCBpdCB0byBzaG93IGFsbCBsYXllcnMgb24gdGhhdCBwYW5lbC5gXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmlzU3RhdGUgPSBjdHguZ2V0VmlzU3RhdGUoKTtcbiAgICAgICAgY29uc3QgaXNTcGxpdCA9IHZpc1N0YXRlLnNwbGl0TWFwcyAmJiB2aXNTdGF0ZS5zcGxpdE1hcHMubGVuZ3RoID4gMTtcblxuICAgICAgICBpZiAoYWN0aW9uID09PSAnZGlzYWJsZScpIHtcbiAgICAgICAgICBpZiAoaXNTcGxpdCkge1xuICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIFJJR0hUIHBhbmVsIChpbmRleCAxKSBzbyB0aGUgTEVGVCBwYW5lbCAobWFwMCkgc3Vydml2ZXM6XG4gICAgICAgICAgICAvLyBgY2xvc2VTcGVjaWZpY01hcEF0SW5kZXhgIGtlZXBzIGAxIC0gcGF5bG9hZGAsIHNvIGNsb3NpbmcgMCB3b3VsZFxuICAgICAgICAgICAgLy8ga2VlcCB0aGUgcmlnaHQgcGFuZWwgYW5kIGZsaXAgbGF5ZXIgdmlzaWJpbGl0eSB0byBtYXAxJ3MgY29uZmlnLlxuICAgICAgICAgICAgY3R4LmRpc3BhdGNoKHRvZ2dsZVNwbGl0TWFwKDEpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBjb21tYW5kSWQ6IHNwbGl0Vmlld0NvbW1hbmRJZCxcbiAgICAgICAgICAgIGRhdGE6IHtkZXRhaWxzOiAnU3BsaXQgbWFwIHZpZXcgZGlzYWJsZWQuIFJldHVybmVkIHRvIHNpbmdsZSBtYXAgdmlldy4nfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbmFibGVcbiAgICAgICAgaWYgKCFpc1NwbGl0KSB7XG4gICAgICAgICAgY3R4LmRpc3BhdGNoKHRvZ2dsZVNwbGl0TWFwKDApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhc0xheWVyQXNzaWdubWVudCA9XG4gICAgICAgICAgKGxheWVySWRzRm9yTWFwMCAmJiBsYXllcklkc0Zvck1hcDAubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAobGF5ZXJJZHNGb3JNYXAxICYmIGxheWVySWRzRm9yTWFwMS5sZW5ndGggPiAwKTtcblxuICAgICAgICBpZiAoaGFzTGF5ZXJBc3NpZ25tZW50KSB7XG4gICAgICAgICAgYXdhaXQgc2xlZXAoMjAwKTtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkVmlzID0gY3R4LmdldFZpc1N0YXRlKCk7XG4gICAgICAgICAgY29uc3Qgc3BsaXRNYXBzID0gdXBkYXRlZFZpcy5zcGxpdE1hcHM7XG5cbiAgICAgICAgICBpZiAoc3BsaXRNYXBzICYmIHNwbGl0TWFwcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBjb25zdCBhbGxMYXllcnMgPSB1cGRhdGVkVmlzLmxheWVycyB8fCBbXTtcbiAgICAgICAgICAgIGNvbnN0IGFsbExheWVySWRzID0gYWxsTGF5ZXJzLm1hcCgobDogYW55KSA9PiBsLmlkKTtcblxuICAgICAgICAgICAgLy8gRmFpbCBmYXN0IG9uIHVua25vd24gbGF5ZXIgaWRzIOKAlCBzaWxlbnRseSBpZ25vcmluZyB0aGVtIHdvdWxkXG4gICAgICAgICAgICAvLyBoaWRlIGV2ZXJ5IHJlYWwgbGF5ZXIgbm90IGxpc3RlZCBhbmQgcHJvZHVjZSBhbiB1bmV4cGVjdGVkIGJsYW5rXG4gICAgICAgICAgICAvLyBwYW5lbC5cbiAgICAgICAgICAgIGNvbnN0IGFsbExheWVySWRTZXQgPSBuZXcgU2V0KGFsbExheWVySWRzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW3BhbmVsLCBpZHNdIG9mIFtcbiAgICAgICAgICAgICAgWydsZWZ0IChtYXAwKScsIGxheWVySWRzRm9yTWFwMF0sXG4gICAgICAgICAgICAgIFsncmlnaHQgKG1hcDEpJywgbGF5ZXJJZHNGb3JNYXAxXVxuICAgICAgICAgICAgXSBhcyBjb25zdCkge1xuICAgICAgICAgICAgICBpZiAoaWRzICYmIGlkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdW5rbm93biA9IGlkcy5maWx0ZXIoaWQgPT4gIWFsbExheWVySWRTZXQuaGFzKGlkKSk7XG4gICAgICAgICAgICAgICAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgVW5rbm93biBsYXllciBpZChzKSBmb3IgdGhlICR7cGFuZWx9IHBhbmVsOiAke3Vua25vd24uam9pbignLCAnKX0uIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBBdmFpbGFibGUgbGF5ZXIgaWRzOiAke2FsbExheWVySWRzLmpvaW4oJywgJyl9YFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxheWVySWRzRm9yTWFwMCAmJiBsYXllcklkc0Zvck1hcDAubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBjb25zdCBtYXAwTGF5ZXJzID0gc3BsaXRNYXBzWzBdPy5sYXllcnMgfHwge307XG4gICAgICAgICAgICAgIGNvbnN0IGRlc2lyZWRTZXQwID0gbmV3IFNldChsYXllcklkc0Zvck1hcDApO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgb2YgYWxsTGF5ZXJJZHMpIHtcbiAgICAgICAgICAgICAgICAvLyBDb2VyY2UgdG8gYm9vbGVhbjogYSBtaXNzaW5nIGVudHJ5IG1lYW5zIFwiaGlkZGVuXCIsIGFuZFxuICAgICAgICAgICAgICAgIC8vIGB0b2dnbGVMYXllckZvck1hcFVwZGF0ZXJgIHRvZ2dsZXMgbWlzc2luZyBlbnRyaWVzIHRvIHZpc2libGUuXG4gICAgICAgICAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gQm9vbGVhbihtYXAwTGF5ZXJzW2xheWVySWRdKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRCZVZpc2libGUgPSBkZXNpcmVkU2V0MC5oYXMobGF5ZXJJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzVmlzaWJsZSAhPT0gc2hvdWxkQmVWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgICBjdHguZGlzcGF0Y2godG9nZ2xlTGF5ZXJGb3JNYXAoMCwgbGF5ZXJJZCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGF5ZXJJZHNGb3JNYXAxICYmIGxheWVySWRzRm9yTWFwMS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZyZXNoU3BsaXRNYXBzID0gY3R4LmdldFZpc1N0YXRlKCkuc3BsaXRNYXBzO1xuICAgICAgICAgICAgICBjb25zdCBtYXAxTGF5ZXJzID0gZnJlc2hTcGxpdE1hcHM/LlsxXT8ubGF5ZXJzIHx8IHt9O1xuICAgICAgICAgICAgICBjb25zdCBkZXNpcmVkU2V0MSA9IG5ldyBTZXQobGF5ZXJJZHNGb3JNYXAxKTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBsYXllcklkIG9mIGFsbExheWVySWRzKSB7XG4gICAgICAgICAgICAgICAgLy8gQ29lcmNlIHRvIGJvb2xlYW46IGEgbWlzc2luZyBlbnRyeSBtZWFucyBcImhpZGRlblwiLCBhbmRcbiAgICAgICAgICAgICAgICAvLyBgdG9nZ2xlTGF5ZXJGb3JNYXBVcGRhdGVyYCB0b2dnbGVzIG1pc3NpbmcgZW50cmllcyB0byB2aXNpYmxlLlxuICAgICAgICAgICAgICAgIGNvbnN0IGlzVmlzaWJsZSA9IEJvb2xlYW4obWFwMUxheWVyc1tsYXllcklkXSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkQmVWaXNpYmxlID0gZGVzaXJlZFNldDEuaGFzKGxheWVySWQpO1xuICAgICAgICAgICAgICAgIGlmIChpc1Zpc2libGUgIT09IHNob3VsZEJlVmlzaWJsZSkge1xuICAgICAgICAgICAgICAgICAgY3R4LmRpc3BhdGNoKHRvZ2dsZUxheWVyRm9yTWFwKDEsIGxheWVySWQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaW5hbFZpcyA9IGN0eC5nZXRWaXNTdGF0ZSgpO1xuICAgICAgICBjb25zdCBsYXllcnMgPSBmaW5hbFZpcy5sYXllcnMgfHwgW107XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIGNvbW1hbmRJZDogc3BsaXRWaWV3Q29tbWFuZElkLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGRldGFpbHM6IGBTcGxpdCBtYXAgdmlldyBlbmFibGVkLiAke2xheWVycy5sZW5ndGh9IGxheWVyKHMpIGF2YWlsYWJsZS4ke1xuICAgICAgICAgICAgICBoYXNMYXllckFzc2lnbm1lbnRcbiAgICAgICAgICAgICAgICA/IGAgTGVmdCBwYW5lbDogJHsobGF5ZXJJZHNGb3JNYXAwIHx8IFtdKS5sZW5ndGh9IGxheWVyKHMpLCBSaWdodCBwYW5lbDogJHtcbiAgICAgICAgICAgICAgICAgICAgKGxheWVySWRzRm9yTWFwMSB8fCBbXSkubGVuZ3RoXG4gICAgICAgICAgICAgICAgICB9IGxheWVyKHMpLmBcbiAgICAgICAgICAgICAgICA6ICcgQWxsIGxheWVycyB2aXNpYmxlIG9uIGJvdGggcGFuZWxzLiBQcm92aWRlIGxheWVySWRzRm9yTWFwMC9sYXllcklkc0Zvck1hcDEgdG8gYXNzaWduIGxheWVycyB0byBlYWNoIHBhbmVsLidcbiAgICAgICAgICAgIH1gXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBjb21tYW5kSWQ6IHNwbGl0Vmlld0NvbW1hbmRJZCxcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgaW5zdHJ1Y3Rpb246XG4gICAgICAgICAgICAgICdDaGVjayB0aGF0IGEgbWFwIGlzIGxvYWRlZCBhbmQgbGF5ZXJzIGV4aXN0LiBJZiB0aGUgZXJyb3IgcGVyc2lzdHMsIGFzayB0aGUgdXNlciB0byB0cnkgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVycy4nXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFJQSxJQUFBQSxJQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxRQUFBLEdBQUFELE9BQUE7QUFBcUUsU0FBQUUsMkJBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLHlCQUFBQyxNQUFBLElBQUFILENBQUEsQ0FBQUcsTUFBQSxDQUFBQyxRQUFBLEtBQUFKLENBQUEscUJBQUFFLENBQUEsUUFBQUcsS0FBQSxDQUFBQyxPQUFBLENBQUFOLENBQUEsTUFBQUUsQ0FBQSxHQUFBSywyQkFBQSxDQUFBUCxDQUFBLE1BQUFDLENBQUEsSUFBQUQsQ0FBQSx1QkFBQUEsQ0FBQSxDQUFBUSxNQUFBLElBQUFOLENBQUEsS0FBQUYsQ0FBQSxHQUFBRSxDQUFBLE9BQUFPLEVBQUEsTUFBQUMsQ0FBQSxZQUFBQSxFQUFBLGVBQUFDLENBQUEsRUFBQUQsQ0FBQSxFQUFBRSxDQUFBLFdBQUFBLEVBQUEsV0FBQUgsRUFBQSxJQUFBVCxDQUFBLENBQUFRLE1BQUEsS0FBQUssSUFBQSxXQUFBQSxJQUFBLE1BQUFDLEtBQUEsRUFBQWQsQ0FBQSxDQUFBUyxFQUFBLFVBQUFSLENBQUEsV0FBQUEsRUFBQUQsQ0FBQSxVQUFBQSxDQUFBLEtBQUFlLENBQUEsRUFBQUwsQ0FBQSxnQkFBQU0sU0FBQSxpSkFBQUMsQ0FBQSxFQUFBQyxDQUFBLE9BQUFDLENBQUEsZ0JBQUFSLENBQUEsV0FBQUEsRUFBQSxJQUFBVCxDQUFBLEdBQUFBLENBQUEsQ0FBQWtCLElBQUEsQ0FBQXBCLENBQUEsTUFBQVksQ0FBQSxXQUFBQSxFQUFBLFFBQUFaLENBQUEsR0FBQUUsQ0FBQSxDQUFBbUIsSUFBQSxXQUFBSCxDQUFBLEdBQUFsQixDQUFBLENBQUFh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
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.getTableCommand = getTableCommand;
8
+ exports.tableCommandId = void 0;
9
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
+ var _zod = require("zod");
13
+ var _apacheArrow = require("apache-arrow");
14
+ var _actions = require("@kepler.gl/actions");
15
+ var _processors = require("@kepler.gl/processors");
16
+ var _utils = require("./utils");
17
+ 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; } } }; }
18
+ 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; } }
19
+ 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
20
+ // Copyright contributors to the kepler.gl project
21
+ var tableCommandId = exports.tableCommandId = 'map.create-table';
22
+ function getTableCommand(ctx) {
23
+ return {
24
+ id: tableCommandId,
25
+ name: 'Create map dataset via SQL',
26
+ group: 'Map',
27
+ description: "Create a NEW dataset in kepler.gl from a SQL query. The result becomes a SEPARATE new dataset (resultDatasetName); the ORIGINAL dataset and its layers/filters are left untouched. Use it to build a new table with different columns \u2014 e.g. add, delete, or rename columns, or change a column's type (CAST(col AS <type>)) \u2014 inside the new dataset.\nNOTE: To modify an EXISTING dataset in place, do NOT use this command \u2014 use map.add-column instead (add a column that copies an existing one to \"rename\", or casts it via expression to change its type). Only reach for map.create-table when the user wants a NEW, separate dataset.\nPlease note:\n1. Do not use * to select all columns, instead use all the column names in dataset.\n2. List all column names the new table or dataset will have.\nIMPORTANT: Use __TABLE__ as the table name placeholder in SQL. It will be replaced with the actual DuckDB table name at runtime.",
28
+ metadata: {
29
+ readOnly: false,
30
+ riskLevel: 'high',
31
+ idempotent: false,
32
+ requiresConfirmation: true
33
+ },
34
+ inputSchema: _zod.z.object({
35
+ datasetName: _zod.z.string().describe('The name of the source dataset'),
36
+ variableNames: _zod.z.array(_zod.z.string()).describe('Only use variable names that already exist in the dataset.'),
37
+ sql: _zod.z.string().describe('The SQL query to execute. Use __TABLE__ as the table name placeholder.'),
38
+ resultDatasetName: _zod.z.string().describe('The name for the new dataset')
39
+ }),
40
+ execute: function () {
41
+ var _execute = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(_execCtx, input) {
42
+ var _ref, datasetName, variableNames, sql, resultDatasetName, visState, datasets, dataId, dbTableName, resolvedSql, uniqueVariableNames, columnData, objectColumns, _iterator, _step, varName, values, arrowTable, db, arrowResult, jsonResult, parsedData, firstFiveRows;
43
+ return _regenerator["default"].wrap(function _callee$(_context) {
44
+ while (1) switch (_context.prev = _context.next) {
45
+ case 0:
46
+ _ref = input !== null && input !== void 0 ? input : {}, datasetName = _ref.datasetName, variableNames = _ref.variableNames, sql = _ref.sql, resultDatasetName = _ref.resultDatasetName;
47
+ _context.prev = 1;
48
+ if (!(typeof datasetName !== 'string' || datasetName.length === 0)) {
49
+ _context.next = 4;
50
+ break;
51
+ }
52
+ throw new Error('datasetName must be a non-empty string.');
53
+ case 4:
54
+ if (!(!Array.isArray(variableNames) || variableNames.length === 0 || variableNames.some(function (v) {
55
+ return typeof v !== 'string' || v.length === 0;
56
+ }))) {
57
+ _context.next = 6;
58
+ break;
59
+ }
60
+ throw new Error('variableNames must be a non-empty array of non-empty strings.');
61
+ case 6:
62
+ if (!(typeof sql !== 'string' || sql.length === 0)) {
63
+ _context.next = 8;
64
+ break;
65
+ }
66
+ throw new Error('sql must be a non-empty string.');
67
+ case 8:
68
+ if (!(typeof resultDatasetName !== 'string' || resultDatasetName.length === 0)) {
69
+ _context.next = 10;
70
+ break;
71
+ }
72
+ throw new Error('resultDatasetName must be a non-empty string.');
73
+ case 10:
74
+ visState = ctx.getVisState();
75
+ datasets = visState.datasets;
76
+ dataId = Object.keys(datasets).find(function (id) {
77
+ return id === datasetName || datasets[id].label === datasetName;
78
+ });
79
+ if (dataId) {
80
+ _context.next = 15;
81
+ break;
82
+ }
83
+ throw new Error("Dataset \"".concat(datasetName, "\" not found."));
84
+ case 15:
85
+ // Derive the DuckDB table name from the resolved dataset id, not the
86
+ // user-provided label: different labels can sanitize to the same table
87
+ // name (e.g. "A-B" vs "A B"), which would clobber another dataset's
88
+ // temp table inside DuckDB and run the SQL against unintended data.
89
+ dbTableName = (0, _utils.datasetNameToTableName)(dataId); // The contract requires the __TABLE__ placeholder — without it the
90
+ // query would run against whatever table names appear in the SQL (or
91
+ // return unrelated results), which is especially risky for a
92
+ // high-risk, confirmation-gated command. Fail fast with an actionable
93
+ // error instead.
94
+ if (sql.includes('__TABLE__')) {
95
+ _context.next = 18;
96
+ break;
97
+ }
98
+ throw new Error('The SQL query must use the __TABLE__ placeholder as the table name, ' + 'e.g. `SELECT * FROM __TABLE__`.');
99
+ case 18:
100
+ resolvedSql = sql.replace(/__TABLE__/g, "\"".concat(dbTableName, "\"")); // Dedupe variableNames: duplicate names would silently overwrite
101
+ // earlier entries in columnData, producing an Arrow table that doesn't
102
+ // match the requested column list.
103
+ uniqueVariableNames = (0, _toConsumableArray2["default"])(new Set(variableNames));
104
+ columnData = {}; // Object-valued columns (the `_geojson` Feature objects) must not be
105
+ // round-tripped through Arrow raw: `tableFromArrays` infers ONE Arrow
106
+ // type per column from the first value, so a dataset mixing Polygon and
107
+ // MultiPolygon features gets the shallower (Polygon) coordinate nesting
108
+ // and the MultiPolygon coordinates come back as nulls. Stringify them
109
+ // for the DuckDB round-trip and restore the objects afterwards.
110
+ objectColumns = [];
111
+ _iterator = _createForOfIteratorHelper(uniqueVariableNames);
112
+ try {
113
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
114
+ varName = _step.value;
115
+ // Pass the user-provided datasetName (label or id) — the documented
116
+ // KeplerContext contract — not the resolved id; getValuesFromDataset
117
+ // matches by label or id either way.
118
+ values = ctx.getValuesFromDataset(datasetName, varName);
119
+ if ((0, _utils.isObjectColumn)(values)) objectColumns.push(varName);
120
+ columnData[varName] = (0, _utils.stringifyObjectColumn)(values);
121
+ }
122
+ } catch (err) {
123
+ _iterator.e(err);
124
+ } finally {
125
+ _iterator.f();
126
+ }
127
+ arrowTable = (0, _apacheArrow.tableFromArrays)(columnData);
128
+ _context.next = 27;
129
+ return ctx.getConnector();
130
+ case 27:
131
+ db = _context.sent;
132
+ _context.next = 30;
133
+ return db.execute("DROP TABLE IF EXISTS \"".concat(dbTableName, "\""));
134
+ case 30:
135
+ _context.next = 32;
136
+ return db.loadArrow(arrowTable, dbTableName);
137
+ case 32:
138
+ _context.next = 34;
139
+ return db.query(resolvedSql);
140
+ case 34:
141
+ arrowResult = _context.sent;
142
+ jsonResult = (0, _utils.arrowTableToObjects)(arrowResult);
143
+ (0, _utils.restoreObjectColumns)(jsonResult, objectColumns);
144
+ _context.next = 39;
145
+ return (0, _processors.processFileData)({
146
+ content: {
147
+ data: jsonResult,
148
+ fileName: resultDatasetName
149
+ },
150
+ fileCache: []
151
+ });
152
+ case 39:
153
+ parsedData = _context.sent;
154
+ ctx.dispatch((0, _actions.addDataToMap)({
155
+ datasets: parsedData,
156
+ // No auto-create — the assistant creates the layer explicitly via
157
+ // `map.add-layer` to avoid duplicate default layers.
158
+ options: {
159
+ autoCreateLayers: false,
160
+ centerMap: true
161
+ }
162
+ }));
163
+
164
+ // Trimmed, model-facing subset (ported from the old `toModelOutput`).
165
+ firstFiveRows = jsonResult.slice(0, 5);
166
+ return _context.abrupt("return", {
167
+ success: true,
168
+ commandId: tableCommandId,
169
+ data: {
170
+ details: "Table created as ".concat(resultDatasetName, " (").concat(jsonResult.length, " rows) and added to kepler.gl."),
171
+ resultDatasetName: resultDatasetName,
172
+ firstFiveRows: firstFiveRows
173
+ }
174
+ });
175
+ case 45:
176
+ _context.prev = 45;
177
+ _context.t0 = _context["catch"](1);
178
+ return _context.abrupt("return", {
179
+ success: false,
180
+ commandId: tableCommandId,
181
+ error: _context.t0 instanceof Error ? _context.t0.message : String(_context.t0),
182
+ data: {
183
+ instruction: 'Please explain the error and give a plan to fix it. Then try again with a different query.'
184
+ }
185
+ });
186
+ case 48:
187
+ case "end":
188
+ return _context.stop();
189
+ }
190
+ }, _callee, null, [[1, 45]]);
191
+ }));
192
+ function execute(_x, _x2) {
193
+ return _execute.apply(this, arguments);
194
+ }
195
+ return execute;
196
+ }()
197
+ };
198
+ }
199
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfem9kIiwicmVxdWlyZSIsIl9hcGFjaGVBcnJvdyIsIl9hY3Rpb25zIiwiX3Byb2Nlc3NvcnMiLCJfdXRpbHMiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsInIiLCJlIiwidCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwibGVuZ3RoIiwiX24iLCJGIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJmIiwiVHlwZUVycm9yIiwibyIsImEiLCJ1IiwiY2FsbCIsIm5leHQiLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJmcm9tIiwidGVzdCIsInRhYmxlQ29tbWFuZElkIiwiZXhwb3J0cyIsImdldFRhYmxlQ29tbWFuZCIsImN0eCIsImlkIiwiZ3JvdXAiLCJkZXNjcmlwdGlvbiIsIm1ldGFkYXRhIiwicmVhZE9ubHkiLCJyaXNrTGV2ZWwiLCJpZGVtcG90ZW50IiwicmVxdWlyZXNDb25maXJtYXRpb24iLCJpbnB1dFNjaGVtYSIsInoiLCJvYmplY3QiLCJkYXRhc2V0TmFtZSIsInN0cmluZyIsImRlc2NyaWJlIiwidmFyaWFibGVOYW1lcyIsImFycmF5Iiwic3FsIiwicmVzdWx0RGF0YXNldE5hbWUiLCJleGVjdXRlIiwiX2V4ZWN1dGUiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsIl9leGVjQ3R4IiwiaW5wdXQiLCJfcmVmIiwidmlzU3RhdGUiLCJkYXRhc2V0cyIsImRhdGFJZCIsImRiVGFibGVOYW1lIiwicmVzb2x2ZWRTcWwiLCJ1bmlxdWVWYXJpYWJsZU5hbWVzIiwiY29sdW1uRGF0YSIsIm9iamVjdENvbHVtbnMiLCJfaXRlcmF0b3IiLCJfc3RlcCIsInZhck5hbWUiLCJ2YWx1ZXMiLCJhcnJvd1RhYmxlIiwiZGIiLCJhcnJvd1Jlc3VsdCIsImpzb25SZXN1bHQiLCJwYXJzZWREYXRhIiwiZmlyc3RGaXZlUm93cyIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwicHJldiIsIkVycm9yIiwic29tZSIsInYiLCJnZXRWaXNTdGF0ZSIsIk9iamVjdCIsImtleXMiLCJmaW5kIiwibGFiZWwiLCJjb25jYXQiLCJkYXRhc2V0TmFtZVRvVGFibGVOYW1lIiwiaW5jbHVkZXMiLCJyZXBsYWNlIiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsIlNldCIsImdldFZhbHVlc0Zyb21EYXRhc2V0IiwiaXNPYmplY3RDb2x1bW4iLCJwdXNoIiwic3RyaW5naWZ5T2JqZWN0Q29sdW1uIiwiZXJyIiwidGFibGVGcm9tQXJyYXlzIiwiZ2V0Q29ubmVjdG9yIiwic2VudCIsImxvYWRBcnJvdyIsInF1ZXJ5IiwiYXJyb3dUYWJsZVRvT2JqZWN0cyIsInJlc3RvcmVPYmplY3RDb2x1bW5zIiwicHJvY2Vzc0ZpbGVEYXRhIiwiY29udGVudCIsImRhdGEiLCJmaWxlTmFtZSIsImZpbGVDYWNoZSIsImRpc3BhdGNoIiwiYWRkRGF0YVRvTWFwIiwib3B0aW9ucyIsImF1dG9DcmVhdGVMYXllcnMiLCJjZW50ZXJNYXAiLCJhYnJ1cHQiLCJzdWNjZXNzIiwiY29tbWFuZElkIiwiZGV0YWlscyIsInQwIiwiZXJyb3IiLCJtZXNzYWdlIiwiU3RyaW5nIiwiaW5zdHJ1Y3Rpb24iLCJzdG9wIiwiX3giLCJfeDIiLCJhcHBseSIsImFyZ3VtZW50cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy90YWJsZS1jb21tYW5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB0eXBlIHtSb29tQ29tbWFuZH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5pbXBvcnQge3RhYmxlRnJvbUFycmF5cywgVGFibGUgYXMgQXJyb3dUYWJsZX0gZnJvbSAnYXBhY2hlLWFycm93JztcbmltcG9ydCB7YWRkRGF0YVRvTWFwfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtwcm9jZXNzRmlsZURhdGF9IGZyb20gJ0BrZXBsZXIuZ2wvcHJvY2Vzc29ycyc7XG5pbXBvcnQgdHlwZSB7S2VwbGVyQ29udGV4dH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge2RhdGFzZXROYW1lVG9UYWJsZU5hbWUsIGFycm93VGFibGVUb09iamVjdHN9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtpc09iamVjdENvbHVtbiwgc3RyaW5naWZ5T2JqZWN0Q29sdW1uLCByZXN0b3JlT2JqZWN0Q29sdW1uc30gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjb25zdCB0YWJsZUNvbW1hbmRJZCA9ICdtYXAuY3JlYXRlLXRhYmxlJyBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlQ29tbWFuZChjdHg6IEtlcGxlckNvbnRleHQpOiBSb29tQ29tbWFuZCB7XG4gIHJldHVybiB7XG4gICAgaWQ6IHRhYmxlQ29tbWFuZElkLFxuICAgIG5hbWU6ICdDcmVhdGUgbWFwIGRhdGFzZXQgdmlhIFNRTCcsXG4gICAgZ3JvdXA6ICdNYXAnLFxuICAgIGRlc2NyaXB0aW9uOiBgQ3JlYXRlIGEgTkVXIGRhdGFzZXQgaW4ga2VwbGVyLmdsIGZyb20gYSBTUUwgcXVlcnkuIFRoZSByZXN1bHQgYmVjb21lcyBhIFNFUEFSQVRFIG5ldyBkYXRhc2V0IChyZXN1bHREYXRhc2V0TmFtZSk7IHRoZSBPUklHSU5BTCBkYXRhc2V0IGFuZCBpdHMgbGF5ZXJzL2ZpbHRlcnMgYXJlIGxlZnQgdW50b3VjaGVkLiBVc2UgaXQgdG8gYnVpbGQgYSBuZXcgdGFibGUgd2l0aCBkaWZmZXJlbnQgY29sdW1ucyDigJQgZS5nLiBhZGQsIGRlbGV0ZSwgb3IgcmVuYW1lIGNvbHVtbnMsIG9yIGNoYW5nZSBhIGNvbHVtbidzIHR5cGUgKENBU1QoY29sIEFTIDx0eXBlPikpIOKAlCBpbnNpZGUgdGhlIG5ldyBkYXRhc2V0LlxuTk9URTogVG8gbW9kaWZ5IGFuIEVYSVNUSU5HIGRhdGFzZXQgaW4gcGxhY2UsIGRvIE5PVCB1c2UgdGhpcyBjb21tYW5kIOKAlCB1c2UgbWFwLmFkZC1jb2x1bW4gaW5zdGVhZCAoYWRkIGEgY29sdW1uIHRoYXQgY29waWVzIGFuIGV4aXN0aW5nIG9uZSB0byBcInJlbmFtZVwiLCBvciBjYXN0cyBpdCB2aWEgZXhwcmVzc2lvbiB0byBjaGFuZ2UgaXRzIHR5cGUpLiBPbmx5IHJlYWNoIGZvciBtYXAuY3JlYXRlLXRhYmxlIHdoZW4gdGhlIHVzZXIgd2FudHMgYSBORVcsIHNlcGFyYXRlIGRhdGFzZXQuXG5QbGVhc2Ugbm90ZTpcbjEuIERvIG5vdCB1c2UgKiB0byBzZWxlY3QgYWxsIGNvbHVtbnMsIGluc3RlYWQgdXNlIGFsbCB0aGUgY29sdW1uIG5hbWVzIGluIGRhdGFzZXQuXG4yLiBMaXN0IGFsbCBjb2x1bW4gbmFtZXMgdGhlIG5ldyB0YWJsZSBvciBkYXRhc2V0IHdpbGwgaGF2ZS5cbklNUE9SVEFOVDogVXNlIF9fVEFCTEVfXyBhcyB0aGUgdGFibGUgbmFtZSBwbGFjZWhvbGRlciBpbiBTUUwuIEl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsIER1Y2tEQiB0YWJsZSBuYW1lIGF0IHJ1bnRpbWUuYCxcbiAgICBtZXRhZGF0YToge3JlYWRPbmx5OiBmYWxzZSwgcmlza0xldmVsOiAnaGlnaCcsIGlkZW1wb3RlbnQ6IGZhbHNlLCByZXF1aXJlc0NvbmZpcm1hdGlvbjogdHJ1ZX0sXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGRhdGFzZXROYW1lOiB6LnN0cmluZygpLmRlc2NyaWJlKCdUaGUgbmFtZSBvZiB0aGUgc291cmNlIGRhdGFzZXQnKSxcbiAgICAgIHZhcmlhYmxlTmFtZXM6IHpcbiAgICAgICAgLmFycmF5KHouc3RyaW5nKCkpXG4gICAgICAgIC5kZXNjcmliZSgnT25seSB1c2UgdmFyaWFibGUgbmFtZXMgdGhhdCBhbHJlYWR5IGV4aXN0IGluIHRoZSBkYXRhc2V0LicpLFxuICAgICAgc3FsOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoJ1RoZSBTUUwgcXVlcnkgdG8gZXhlY3V0ZS4gVXNlIF9fVEFCTEVfXyBhcyB0aGUgdGFibGUgbmFtZSBwbGFjZWhvbGRlci4nKSxcbiAgICAgIHJlc3VsdERhdGFzZXROYW1lOiB6LnN0cmluZygpLmRlc2NyaWJlKCdUaGUgbmFtZSBmb3IgdGhlIG5ldyBkYXRhc2V0JylcbiAgICB9KSBhcyBhbnksXG4gICAgZXhlY3V0ZTogYXN5bmMgKF9leGVjQ3R4LCBpbnB1dCkgPT4ge1xuICAgICAgY29uc3Qge2RhdGFzZXROYW1lLCB2YXJpYWJsZU5hbWVzLCBzcWwsIHJlc3VsdERhdGFzZXROYW1lfSA9IChpbnB1dCA/PyB7fSkgYXMge1xuICAgICAgICBkYXRhc2V0TmFtZTogc3RyaW5nO1xuICAgICAgICB2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXTtcbiAgICAgICAgc3FsOiBzdHJpbmc7XG4gICAgICAgIHJlc3VsdERhdGFzZXROYW1lOiBzdHJpbmc7XG4gICAgICB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gUnVudGltZSBndWFyZDogdGhlIGJyaWRnZS93ZWJNQ1AgY2FsbCBleGVjdXRlIHdpdGhvdXQgem9kIHBhcnNpbmcsIHNvXG4gICAgICAgIC8vIG1pc3Npbmcvd3JvbmctdHlwZWQgaW5wdXRzIG11c3Qgbm90IGZhbGwgdGhyb3VnaCB0byBUeXBlRXJyb3JzIChlLmcuXG4gICAgICAgIC8vIGBzcWwuaW5jbHVkZXNgIG9uIGEgbm9uLXN0cmluZykgdGhhdCBzdXJmYWNlIGFzIGNvbmZ1c2luZyBlcnJvcnMuXG4gICAgICAgIGlmICh0eXBlb2YgZGF0YXNldE5hbWUgIT09ICdzdHJpbmcnIHx8IGRhdGFzZXROYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZGF0YXNldE5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICFBcnJheS5pc0FycmF5KHZhcmlhYmxlTmFtZXMpIHx8XG4gICAgICAgICAgdmFyaWFibGVOYW1lcy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICB2YXJpYWJsZU5hbWVzLnNvbWUodiA9PiB0eXBlb2YgdiAhPT0gJ3N0cmluZycgfHwgdi5sZW5ndGggPT09IDApXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndmFyaWFibGVOYW1lcyBtdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5IG9mIG5vbi1lbXB0eSBzdHJpbmdzLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc3FsICE9PSAnc3RyaW5nJyB8fCBzcWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzcWwgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHREYXRhc2V0TmFtZSAhPT0gJ3N0cmluZycgfHwgcmVzdWx0RGF0YXNldE5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXN1bHREYXRhc2V0TmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZpc1N0YXRlID0gY3R4LmdldFZpc1N0YXRlKCk7XG4gICAgICAgIGNvbnN0IGRhdGFzZXRzID0gdmlzU3RhdGUuZGF0YXNldHM7XG4gICAgICAgIGNvbnN0IGRhdGFJZCA9IE9iamVjdC5rZXlzKGRhdGFzZXRzKS5maW5kKFxuICAgICAgICAgIGlkID0+IGlkID09PSBkYXRhc2V0TmFtZSB8fCBkYXRhc2V0c1tpZF0ubGFiZWwgPT09IGRhdGFzZXROYW1lXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZGF0YUlkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEYXRhc2V0IFwiJHtkYXRhc2V0TmFtZX1cIiBub3QgZm91bmQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVyaXZlIHRoZSBEdWNrREIgdGFibGUgbmFtZSBmcm9tIHRoZSByZXNvbHZlZCBkYXRhc2V0IGlkLCBub3QgdGhlXG4gICAgICAgIC8vIHVzZXItcHJvdmlkZWQgbGFiZWw6IGRpZmZlcmVudCBsYWJlbHMgY2FuIHNhbml0aXplIHRvIHRoZSBzYW1lIHRhYmxlXG4gICAgICAgIC8vIG5hbWUgKGUuZy4gXCJBLUJcIiB2cyBcIkEgQlwiKSwgd2hpY2ggd291bGQgY2xvYmJlciBhbm90aGVyIGRhdGFzZXQnc1xuICAgICAgICAvLyB0ZW1wIHRhYmxlIGluc2lkZSBEdWNrREIgYW5kIHJ1biB0aGUgU1FMIGFnYWluc3QgdW5pbnRlbmRlZCBkYXRhLlxuICAgICAgICBjb25zdCBkYlRhYmxlTmFtZSA9IGRhdGFzZXROYW1lVG9UYWJsZU5hbWUoZGF0YUlkKTtcbiAgICAgICAgLy8gVGhlIGNvbnRyYWN0IHJlcXVpcmVzIHRoZSBfX1RBQkxFX18gcGxhY2Vob2xkZXIg4oCUIHdpdGhvdXQgaXQgdGhlXG4gICAgICAgIC8vIHF1ZXJ5IHdvdWxkIHJ1biBhZ2FpbnN0IHdoYXRldmVyIHRhYmxlIG5hbWVzIGFwcGVhciBpbiB0aGUgU1FMIChvclxuICAgICAgICAvLyByZXR1cm4gdW5yZWxhdGVkIHJlc3VsdHMpLCB3aGljaCBpcyBlc3BlY2lhbGx5IHJpc2t5IGZvciBhXG4gICAgICAgIC8vIGhpZ2gtcmlzaywgY29uZmlybWF0aW9uLWdhdGVkIGNvbW1hbmQuIEZhaWwgZmFzdCB3aXRoIGFuIGFjdGlvbmFibGVcbiAgICAgICAgLy8gZXJyb3IgaW5zdGVhZC5cbiAgICAgICAgaWYgKCFzcWwuaW5jbHVkZXMoJ19fVEFCTEVfXycpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ1RoZSBTUUwgcXVlcnkgbXVzdCB1c2UgdGhlIF9fVEFCTEVfXyBwbGFjZWhvbGRlciBhcyB0aGUgdGFibGUgbmFtZSwgJyArXG4gICAgICAgICAgICAgICdlLmcuIGBTRUxFQ1QgKiBGUk9NIF9fVEFCTEVfX2AuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzb2x2ZWRTcWwgPSBzcWwucmVwbGFjZSgvX19UQUJMRV9fL2csIGBcIiR7ZGJUYWJsZU5hbWV9XCJgKTtcbiAgICAgICAgLy8gRGVkdXBlIHZhcmlhYmxlTmFtZXM6IGR1cGxpY2F0ZSBuYW1lcyB3b3VsZCBzaWxlbnRseSBvdmVyd3JpdGVcbiAgICAgICAgLy8gZWFybGllciBlbnRyaWVzIGluIGNvbHVtbkRhdGEsIHByb2R1Y2luZyBhbiBBcnJvdyB0YWJsZSB0aGF0IGRvZXNuJ3RcbiAgICAgICAgLy8gbWF0Y2ggdGhlIHJlcXVlc3RlZCBjb2x1bW4gbGlzdC5cbiAgICAgICAgY29uc3QgdW5pcXVlVmFyaWFibGVOYW1lcyA9IFsuLi5uZXcgU2V0KHZhcmlhYmxlTmFtZXMpXTtcbiAgICAgICAgY29uc3QgY29sdW1uRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bltdPiA9IHt9O1xuICAgICAgICAvLyBPYmplY3QtdmFsdWVkIGNvbHVtbnMgKHRoZSBgX2dlb2pzb25gIEZlYXR1cmUgb2JqZWN0cykgbXVzdCBub3QgYmVcbiAgICAgICAgLy8gcm91bmQtdHJpcHBlZCB0aHJvdWdoIEFycm93IHJhdzogYHRhYmxlRnJvbUFycmF5c2AgaW5mZXJzIE9ORSBBcnJvd1xuICAgICAgICAvLyB0eXBlIHBlciBjb2x1bW4gZnJvbSB0aGUgZmlyc3QgdmFsdWUsIHNvIGEgZGF0YXNldCBtaXhpbmcgUG9seWdvbiBhbmRcbiAgICAgICAgLy8gTXVsdGlQb2x5Z29uIGZlYXR1cmVzIGdldHMgdGhlIHNoYWxsb3dlciAoUG9seWdvbikgY29vcmRpbmF0ZSBuZXN0aW5nXG4gICAgICAgIC8vIGFuZCB0aGUgTXVsdGlQb2x5Z29uIGNvb3JkaW5hdGVzIGNvbWUgYmFjayBhcyBudWxscy4gU3RyaW5naWZ5IHRoZW1cbiAgICAgICAgLy8gZm9yIHRoZSBEdWNrREIgcm91bmQtdHJpcCBhbmQgcmVzdG9yZSB0aGUgb2JqZWN0cyBhZnRlcndhcmRzLlxuICAgICAgICBjb25zdCBvYmplY3RDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHZhck5hbWUgb2YgdW5pcXVlVmFyaWFibGVOYW1lcykge1xuICAgICAgICAgIC8vIFBhc3MgdGhlIHVzZXItcHJvdmlkZWQgZGF0YXNldE5hbWUgKGxhYmVsIG9yIGlkKSDigJQgdGhlIGRvY3VtZW50ZWRcbiAgICAgICAgICAvLyBLZXBsZXJDb250ZXh0IGNvbnRyYWN0IOKAlCBub3QgdGhlIHJlc29sdmVkIGlkOyBnZXRWYWx1ZXNGcm9tRGF0YXNldFxuICAgICAgICAgIC8vIG1hdGNoZXMgYnkgbGFiZWwgb3IgaWQgZWl0aGVyIHdheS5cbiAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBjdHguZ2V0VmFsdWVzRnJvbURhdGFzZXQoZGF0YXNldE5hbWUsIHZhck5hbWUpO1xuICAgICAgICAgIGlmIChpc09iamVjdENvbHVtbih2YWx1ZXMpKSBvYmplY3RDb2x1bW5zLnB1c2godmFyTmFtZSk7XG4gICAgICAgICAgY29sdW1uRGF0YVt2YXJOYW1lXSA9IHN0cmluZ2lmeU9iamVjdENvbHVtbih2YWx1ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXJyb3dUYWJsZTogQXJyb3dUYWJsZSA9IHRhYmxlRnJvbUFycmF5cyhjb2x1bW5EYXRhKTtcbiAgICAgICAgY29uc3QgZGIgPSBhd2FpdCBjdHguZ2V0Q29ubmVjdG9yKCk7XG5cbiAgICAgICAgYXdhaXQgZGIuZXhlY3V0ZShgRFJPUCBUQUJMRSBJRiBFWElTVFMgXCIke2RiVGFibGVOYW1lfVwiYCk7XG4gICAgICAgIGF3YWl0IGRiLmxvYWRBcnJvdyhhcnJvd1RhYmxlLCBkYlRhYmxlTmFtZSk7XG5cbiAgICAgICAgY29uc3QgYXJyb3dSZXN1bHQgPSBhd2FpdCBkYi5xdWVyeShyZXNvbHZlZFNxbCk7XG5cbiAgICAgICAgY29uc3QganNvblJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IGFycm93VGFibGVUb09iamVjdHMoYXJyb3dSZXN1bHQpO1xuICAgICAgICByZXN0b3JlT2JqZWN0Q29sdW1ucyhqc29uUmVzdWx0LCBvYmplY3RDb2x1bW5zKTtcblxuICAgICAgICBjb25zdCBwYXJzZWREYXRhID0gYXdhaXQgcHJvY2Vzc0ZpbGVEYXRhKHtcbiAgICAgICAgICBjb250ZW50OiB7ZGF0YToganNvblJlc3VsdCwgZmlsZU5hbWU6IHJlc3VsdERhdGFzZXROYW1lfSxcbiAgICAgICAgICBmaWxlQ2FjaGU6IFtdXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGN0eC5kaXNwYXRjaChcbiAgICAgICAgICBhZGREYXRhVG9NYXAoe1xuICAgICAgICAgICAgZGF0YXNldHM6IHBhcnNlZERhdGEsXG4gICAgICAgICAgICAvLyBObyBhdXRvLWNyZWF0ZSDigJQgdGhlIGFzc2lzdGFudCBjcmVhdGVzIHRoZSBsYXllciBleHBsaWNpdGx5IHZpYVxuICAgICAgICAgICAgLy8gYG1hcC5hZGQtbGF5ZXJgIHRvIGF2b2lkIGR1cGxpY2F0ZSBkZWZhdWx0IGxheWVycy5cbiAgICAgICAgICAgIG9wdGlvbnM6IHthdXRvQ3JlYXRlTGF5ZXJzOiBmYWxzZSwgY2VudGVyTWFwOiB0cnVlfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVHJpbW1lZCwgbW9kZWwtZmFjaW5nIHN1YnNldCAocG9ydGVkIGZyb20gdGhlIG9sZCBgdG9Nb2RlbE91dHB1dGApLlxuICAgICAgICBjb25zdCBmaXJzdEZpdmVSb3dzID0ganNvblJlc3VsdC5zbGljZSgwLCA1KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIGNvbW1hbmRJZDogdGFibGVDb21tYW5kSWQsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgZGV0YWlsczogYFRhYmxlIGNyZWF0ZWQgYXMgJHtyZXN1bHREYXRhc2V0TmFtZX0gKCR7anNvblJlc3VsdC5sZW5ndGh9IHJvd3MpIGFuZCBhZGRlZCB0byBrZXBsZXIuZ2wuYCxcbiAgICAgICAgICAgIHJlc3VsdERhdGFzZXROYW1lLFxuICAgICAgICAgICAgZmlyc3RGaXZlUm93c1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgY29tbWFuZElkOiB0YWJsZUNvbW1hbmRJZCxcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGluc3RydWN0aW9uOlxuICAgICAgICAgICAgICAnUGxlYXNlIGV4cGxhaW4gdGhlIGVycm9yIGFuZCBnaXZlIGEgcGxhbiB0byBmaXggaXQuIFRoZW4gdHJ5IGFnYWluIHdpdGggYSBkaWZmZXJlbnQgcXVlcnkuJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBSUEsSUFBQUEsSUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsWUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsUUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsV0FBQSxHQUFBSCxPQUFBO0FBRUEsSUFBQUksTUFBQSxHQUFBSixPQUFBO0FBQW9FLFNBQUFLLDJCQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSx5QkFBQUMsTUFBQSxJQUFBSCxDQUFBLENBQUFHLE1BQUEsQ0FBQUMsUUFBQSxLQUFBSixDQUFBLHFCQUFBRSxDQUFBLFFBQUFHLEtBQUEs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O2dCQUFpQixDQUFDO2dCQUN4RDhELFNBQVMsRUFBRTtjQUNiLENBQUMsQ0FBQztZQUFBO2NBSElwQyxVQUFVLEdBQUFJLFFBQUEsQ0FBQXVCLElBQUE7Y0FLaEJ2RSxHQUFHLENBQUNpRixRQUFRLENBQ1YsSUFBQUMscUJBQVksRUFBQztnQkFDWHJELFFBQVEsRUFBRWUsVUFBVTtnQkFDcEI7Z0JBQ0E7Z0JBQ0F1QyxPQUFPLEVBQUU7a0JBQUNDLGdCQUFnQixFQUFFLEtBQUs7a0JBQUVDLFNBQVMsRUFBRTtnQkFBSTtjQUNwRCxDQUFDLENBQ0gsQ0FBQzs7Y0FFRDtjQUNNeEMsYUFBYSxHQUFHRixVQUFVLENBQUNuRCxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztjQUFBLE9BQUF3RCxRQUFBLENBQUFzQyxNQUFBLFdBQ3JDO2dCQUNMQyxPQUFPLEVBQUUsSUFBSTtnQkFDYkMsU0FBUyxFQUFFM0YsY0FBYztnQkFDekJpRixJQUFJLEVBQUU7a0JBQ0pXLE9BQU8sc0JBQUEvQixNQUFBLENBQXNCeEMsaUJBQWlCLFFBQUF3QyxNQUFBLENBQUtmLFVBQVUsQ0FBQ25FLE1BQU0sbUNBQWdDO2tCQUNwRzBDLGlCQUFpQixFQUFqQkEsaUJBQWlCO2tCQUNqQjJCLGFBQWEsRUFBYkE7Z0JBQ0Y7Y0FDRixDQUFDO1lBQUE7Y0FBQUcsUUFBQSxDQUFBQyxJQUFBO2NBQUFELFFBQUEsQ0FBQTBDLEVBQUEsR0FBQTFDLFFBQUE7Y0FBQSxPQUFBQSxRQUFBLENBQUFzQyxNQUFBLFdBRU07Z0JBQ0xDLE9BQU8sRUFBRSxLQUFLO2dCQUNkQyxTQUFTLEVBQUUzRixjQUFjO2dCQUN6QjhGLEtBQUssRUFBRTNDLFFBQUEsQ0FBQTBDLEVBQUEsWUFBaUJ4QyxLQUFLLEdBQUdGLFFBQUEsQ0FBQTBDLEVBQUEsQ0FBTUUsT0FBTyxHQUFHQyxNQUFNLENBQUE3QyxRQUFBLENBQUEwQyxFQUFNLENBQUM7Z0JBQzdEWixJQUFJLEVBQUU7a0JBQ0pnQixXQUFXLEVBQ1Q7Z0JBQ0o7Y0FDRixDQUFDO1lBQUE7WUFBQTtjQUFBLE9BQUE5QyxRQUFBLENBQUErQyxJQUFBO1VBQUE7UUFBQSxHQUFBdkUsT0FBQTtNQUFBLENBRUo7TUFBQSxTQXpIREwsT0FBT0EsQ0FBQTZFLEVBQUEsRUFBQUMsR0FBQTtRQUFBLE9BQUE3RSxRQUFBLENBQUE4RSxLQUFBLE9BQUFDLFNBQUE7TUFBQTtNQUFBLE9BQVBoRixPQUFPO0lBQUE7RUEwSFQsQ0FBQztBQUNIIiwiaWdub3JlTGlzdCI6W119