@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,192 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.addColumnCommandId = void 0;
8
+ exports.getAddColumnCommand = getAddColumnCommand;
9
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
+ var _zod = require("zod");
12
+ var _actions = require("@kepler.gl/actions");
13
+ var _utils = require("./utils");
14
+ // SPDX-License-Identifier: MIT
15
+ // Copyright contributors to the kepler.gl project
16
+
17
+ var addColumnCommandId = exports.addColumnCommandId = 'map.add-column';
18
+ function getAddColumnCommand(ctx) {
19
+ return {
20
+ id: addColumnCommandId,
21
+ name: 'Add a column to an existing map dataset',
22
+ group: 'Map',
23
+ description: "Add a NEW column to an existing kepler.gl dataset (table), in place. The dataset keeps its name, id, color and layers; existing columns are untouched, so layers, filters and tooltips keep working unchanged.\nThe new column's values come from exactly ONE of two sources:\n- copyFromColumn \u2014 copy the values of an existing column. This is how you \"rename\" a column in place: to rename \"fare\" to \"fare_amount\", add a new column \"fare_amount\" that copies \"fare\" (the original \"fare\" column stays \u2014 this command never removes columns).\n- expression \u2014 an SQL expression computed in DuckDB against the dataset's rows, e.g. a z-score: \"(HR60 - AVG(HR60) OVER()) / STDDEV(HR60) OVER()\" adds HR60_Z holding the standardized value of HR60. The expression may reference existing columns and window functions; it must produce exactly one value per row.\nCHANGING A COLUMN'S TYPE: use expression to add a NEW column that casts the original, e.g. to turn \"NOSOUTH\" (numeric) into a string, add a new column with expression \"NOSOUTH::VARCHAR\" (or \"CAST(NOSOUTH AS VARCHAR)\"). The values become strings; the original column stays. Name the new column clearly (e.g. \"NOSOUTH_str\") or as the user requests.\nIMPORTANT: this command only ADDS columns. It cannot delete or rename-in-place an existing column, and it never changes the type OF an existing column in place \u2014 a type change is achieved by adding a NEW column holding the cast values. If you need to remove columns or rebuild the whole table, use map.create-table (which creates a NEW dataset; the original is untouched).",
24
+ metadata: {
25
+ readOnly: false,
26
+ riskLevel: 'medium',
27
+ idempotent: false
28
+ },
29
+ inputSchema: _zod.z.object({
30
+ datasetName: _zod.z.string().min(1).describe('The name (label) or id of the dataset to add the column to'),
31
+ newColumnName: _zod.z.string().min(1).describe('The name of the new column to add. Must not already exist in the dataset.'),
32
+ copyFromColumn: _zod.z.string().min(1).optional().describe('The name of an EXISTING column whose values the new column will copy. Mutually exclusive with `expression` — provide exactly one.'),
33
+ expression: _zod.z.string().min(1).optional().describe('An SQL expression computed in DuckDB against the dataset rows; the result becomes the new column. e.g. z-score: "(HR60 - AVG(HR60) OVER()) / STDDEV(HR60) OVER()". Mutually exclusive with `copyFromColumn` — provide exactly one.')
34
+ }).superRefine(function (data, ctx) {
35
+ var provided = [data.copyFromColumn, data.expression].filter(function (v) {
36
+ return v != null;
37
+ }).length;
38
+ if (provided !== 1) {
39
+ ctx.addIssue({
40
+ code: _zod.z.ZodIssueCode.custom,
41
+ message: 'Provide exactly one of copyFromColumn or expression.'
42
+ });
43
+ }
44
+ }),
45
+ execute: function () {
46
+ var _execute = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(_execCtx, input) {
47
+ var _ref, datasetName, newColumnName, copyFromColumn, expression, provided, visState, datasets, dataId, fieldNames, dbTableName, db, escapeIdent, appendedSql, arrowResult, _buildAddColumnPayloa, rows, fields, previewRows, valueSource;
48
+ return _regenerator["default"].wrap(function _callee$(_context) {
49
+ while (1) switch (_context.prev = _context.next) {
50
+ case 0:
51
+ _ref = input !== null && input !== void 0 ? input : {}, datasetName = _ref.datasetName, newColumnName = _ref.newColumnName, copyFromColumn = _ref.copyFromColumn, expression = _ref.expression;
52
+ _context.prev = 1;
53
+ // Runtime guard: the bridge/webMCP call execute without zod parsing, so
54
+ // the superRefine "exactly one of copyFromColumn/expression" constraint
55
+ // is not enforced. Without it, both-missing would build
56
+ // `(undefined) AS ...` and produce a confusing DuckDB error.
57
+ provided = [copyFromColumn, expression].filter(function (v) {
58
+ return v != null;
59
+ }).length;
60
+ if (!(provided !== 1)) {
61
+ _context.next = 5;
62
+ break;
63
+ }
64
+ throw new Error('Provide exactly one of copyFromColumn or expression.');
65
+ case 5:
66
+ if (!(typeof datasetName !== 'string' || datasetName.length === 0)) {
67
+ _context.next = 7;
68
+ break;
69
+ }
70
+ throw new Error('datasetName must be a non-empty string.');
71
+ case 7:
72
+ if (!(typeof newColumnName !== 'string' || newColumnName.length === 0)) {
73
+ _context.next = 9;
74
+ break;
75
+ }
76
+ throw new Error('newColumnName must be a non-empty string.');
77
+ case 9:
78
+ if (!(copyFromColumn != null && (typeof copyFromColumn !== 'string' || copyFromColumn.length === 0))) {
79
+ _context.next = 11;
80
+ break;
81
+ }
82
+ throw new Error('copyFromColumn must be a non-empty string.');
83
+ case 11:
84
+ if (!(expression != null && (typeof expression !== 'string' || expression.length === 0))) {
85
+ _context.next = 13;
86
+ break;
87
+ }
88
+ throw new Error('expression must be a non-empty string.');
89
+ case 13:
90
+ visState = ctx.getVisState();
91
+ datasets = visState.datasets;
92
+ dataId = Object.keys(datasets).find(function (id) {
93
+ return id === datasetName || datasets[id].label === datasetName;
94
+ });
95
+ if (dataId) {
96
+ _context.next = 18;
97
+ break;
98
+ }
99
+ throw new Error("Dataset \"".concat(datasetName, "\" not found."));
100
+ case 18:
101
+ fieldNames = datasets[dataId].fields.map(function (f) {
102
+ return f.name;
103
+ });
104
+ if (!(copyFromColumn != null && !fieldNames.includes(copyFromColumn))) {
105
+ _context.next = 21;
106
+ break;
107
+ }
108
+ throw new Error("Column \"".concat(copyFromColumn, "\" does not exist in dataset \"").concat(datasetName, "\". ") + "Existing columns: ".concat(fieldNames.join(', '), "."));
109
+ case 21:
110
+ if (!fieldNames.includes(newColumnName)) {
111
+ _context.next = 23;
112
+ break;
113
+ }
114
+ throw new Error("Column \"".concat(newColumnName, "\" already exists in dataset \"").concat(datasetName, "\". Choose a different name."));
115
+ case 23:
116
+ // Derive the DuckDB table name from the resolved dataset id, not the
117
+ // user-provided label: different labels can sanitize to the same table
118
+ // name (e.g. "A-B" vs "A B"), which would clobber another dataset's
119
+ // temp table inside DuckDB and run the SQL against unintended data.
120
+ dbTableName = (0, _utils.datasetNameToTableName)(dataId); // Pass the user-provided datasetName (label or id) to
121
+ // loadTableIntoDuckDB — the documented KeplerContext contract — not
122
+ // the resolved id.
123
+ _context.next = 26;
124
+ return ctx.loadTableIntoDuckDB(datasetName, fieldNames, dbTableName);
125
+ case 26:
126
+ db = _context.sent;
127
+ // Add-only: compute ONLY the new column in DuckDB. Existing columns are
128
+ // never round-tripped through DuckDB/Arrow — `tableFromArrays` infers a
129
+ // single Arrow type for `_geojson`, and a dataset mixing Polygon and
130
+ // MultiPolygon features gets the shallower type, so the MultiPolygon
131
+ // coordinates come back as nulls and the geometry disappears.
132
+ // `buildAddColumnPayload` rebuilds the payload from the original kepler
133
+ // values instead, appending the new column from this single-column result.
134
+ // Escape double quotes in identifier names before embedding them in
135
+ // quoted SQL identifiers — a `"` in copyFromColumn/newColumnName would
136
+ // otherwise break the query or enable SQL injection into DuckDB. (The
137
+ // `expression` is user-provided SQL by design, so it is not escaped.)
138
+ escapeIdent = function escapeIdent(name) {
139
+ return name.replace(/"/g, '""');
140
+ };
141
+ appendedSql = copyFromColumn != null ? "\"".concat(escapeIdent(copyFromColumn), "\" AS \"").concat(escapeIdent(newColumnName), "\"") : "(".concat(expression, ") AS \"").concat(escapeIdent(newColumnName), "\"");
142
+ _context.next = 31;
143
+ return db.query("SELECT ".concat(appendedSql, " FROM \"").concat(dbTableName, "\""));
144
+ case 31:
145
+ arrowResult = _context.sent;
146
+ _buildAddColumnPayloa = (0, _utils.buildAddColumnPayload)(datasets, visState.layers, datasetName, newColumnName, arrowResult), rows = _buildAddColumnPayloa.rows, fields = _buildAddColumnPayloa.fields;
147
+ ctx.dispatch((0, _actions.updateDataset)(dataId, {
148
+ rows: rows,
149
+ fields: fields
150
+ }));
151
+
152
+ // LLM-facing preview: first 5 rows of the full (original + new) payload.
153
+ previewRows = rows.slice(0, 5).map(function (r) {
154
+ return Object.fromEntries(fields.map(function (f, i) {
155
+ return [f.name, r[i]];
156
+ }));
157
+ });
158
+ valueSource = copyFromColumn != null ? "copied from \"".concat(copyFromColumn, "\"") : "computed";
159
+ return _context.abrupt("return", {
160
+ success: true,
161
+ commandId: addColumnCommandId,
162
+ data: {
163
+ details: "Added column \"".concat(newColumnName, "\" to dataset \"").concat(datasetName, "\" (").concat(valueSource, ", ").concat(rows.length, " rows)."),
164
+ addedColumns: [newColumnName],
165
+ firstFiveRows: (0, _utils.tableToLLMResult)(previewRows)
166
+ }
167
+ });
168
+ case 39:
169
+ _context.prev = 39;
170
+ _context.t0 = _context["catch"](1);
171
+ return _context.abrupt("return", {
172
+ success: false,
173
+ commandId: addColumnCommandId,
174
+ error: _context.t0 instanceof Error ? _context.t0.message : String(_context.t0),
175
+ data: {
176
+ instruction: 'Please explain the error and give a plan to fix it. Then try again.'
177
+ }
178
+ });
179
+ case 42:
180
+ case "end":
181
+ return _context.stop();
182
+ }
183
+ }, _callee, null, [[1, 39]]);
184
+ }));
185
+ function execute(_x, _x2) {
186
+ return _execute.apply(this, arguments);
187
+ }
188
+ return execute;
189
+ }()
190
+ };
191
+ }
192
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfem9kIiwicmVxdWlyZSIsIl9hY3Rpb25zIiwiX3V0aWxzIiwiYWRkQ29sdW1uQ29tbWFuZElkIiwiZXhwb3J0cyIsImdldEFkZENvbHVtbkNvbW1hbmQiLCJjdHgiLCJpZCIsIm5hbWUiLCJncm91cCIsImRlc2NyaXB0aW9uIiwibWV0YWRhdGEiLCJyZWFkT25seSIsInJpc2tMZXZlbCIsImlkZW1wb3RlbnQiLCJpbnB1dFNjaGVtYSIsInoiLCJvYmplY3QiLCJkYXRhc2V0TmFtZSIsInN0cmluZyIsIm1pbiIsImRlc2NyaWJlIiwibmV3Q29sdW1uTmFtZSIsImNvcHlGcm9tQ29sdW1uIiwib3B0aW9uYWwiLCJleHByZXNzaW9uIiwic3VwZXJSZWZpbmUiLCJkYXRhIiwicHJvdmlkZWQiLCJmaWx0ZXIiLCJ2IiwibGVuZ3RoIiwiYWRkSXNzdWUiLCJjb2RlIiwiWm9kSXNzdWVDb2RlIiwiY3VzdG9tIiwibWVzc2FnZSIsImV4ZWN1dGUiLCJfZXhlY3V0ZSIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiX2V4ZWNDdHgiLCJpbnB1dCIsIl9yZWYiLCJ2aXNTdGF0ZSIsImRhdGFzZXRzIiwiZGF0YUlkIiwiZmllbGROYW1lcyIsImRiVGFibGVOYW1lIiwiZGIiLCJlc2NhcGVJZGVudCIsImFwcGVuZGVkU3FsIiwiYXJyb3dSZXN1bHQiLCJfYnVpbGRBZGRDb2x1bW5QYXlsb2EiLCJyb3dzIiwiZmllbGRzIiwicHJldmlld1Jvd3MiLCJ2YWx1ZVNvdXJjZSIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJFcnJvciIsImdldFZpc1N0YXRlIiwiT2JqZWN0Iiwia2V5cyIsImZpbmQiLCJsYWJlbCIsImNvbmNhdCIsIm1hcCIsImYiLCJpbmNsdWRlcyIsImpvaW4iLCJkYXRhc2V0TmFtZVRvVGFibGVOYW1lIiwibG9hZFRhYmxlSW50b0R1Y2tEQiIsInNlbnQiLCJyZXBsYWNlIiwicXVlcnkiLCJidWlsZEFkZENvbHVtblBheWxvYWQiLCJsYXllcnMiLCJkaXNwYXRjaCIsInVwZGF0ZURhdGFzZXQiLCJzbGljZSIsInIiLCJmcm9tRW50cmllcyIsImkiLCJhYnJ1cHQiLCJzdWNjZXNzIiwiY29tbWFuZElkIiwiZGV0YWlscyIsImFkZGVkQ29sdW1ucyIsImZpcnN0Rml2ZVJvd3MiLCJ0YWJsZVRvTExNUmVzdWx0IiwidDAiLCJlcnJvciIsIlN0cmluZyIsImluc3RydWN0aW9uIiwic3RvcCIsIl94IiwiX3gyIiwiYXBwbHkiLCJhcmd1bWVudHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbWFuZHMvYWRkLWNvbHVtbi1jb21tYW5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB0eXBlIHtSb29tQ29tbWFuZH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5pbXBvcnQge3VwZGF0ZURhdGFzZXR9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQgdHlwZSB7S2VwbGVyQ29udGV4dH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge2J1aWxkQWRkQ29sdW1uUGF5bG9hZH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge2RhdGFzZXROYW1lVG9UYWJsZU5hbWUsIHRhYmxlVG9MTE1SZXN1bHR9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgYWRkQ29sdW1uQ29tbWFuZElkID0gJ21hcC5hZGQtY29sdW1uJyBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFkZENvbHVtbkNvbW1hbmQoY3R4OiBLZXBsZXJDb250ZXh0KTogUm9vbUNvbW1hbmQge1xuICByZXR1cm4ge1xuICAgIGlkOiBhZGRDb2x1bW5Db21tYW5kSWQsXG4gICAgbmFtZTogJ0FkZCBhIGNvbHVtbiB0byBhbiBleGlzdGluZyBtYXAgZGF0YXNldCcsXG4gICAgZ3JvdXA6ICdNYXAnLFxuICAgIGRlc2NyaXB0aW9uOiBgQWRkIGEgTkVXIGNvbHVtbiB0byBhbiBleGlzdGluZyBrZXBsZXIuZ2wgZGF0YXNldCAodGFibGUpLCBpbiBwbGFjZS4gVGhlIGRhdGFzZXQga2VlcHMgaXRzIG5hbWUsIGlkLCBjb2xvciBhbmQgbGF5ZXJzOyBleGlzdGluZyBjb2x1bW5zIGFyZSB1bnRvdWNoZWQsIHNvIGxheWVycywgZmlsdGVycyBhbmQgdG9vbHRpcHMga2VlcCB3b3JraW5nIHVuY2hhbmdlZC5cblRoZSBuZXcgY29sdW1uJ3MgdmFsdWVzIGNvbWUgZnJvbSBleGFjdGx5IE9ORSBvZiB0d28gc291cmNlczpcbi0gY29weUZyb21Db2x1bW4g4oCUIGNvcHkgdGhlIHZhbHVlcyBvZiBhbiBleGlzdGluZyBjb2x1bW4uIFRoaXMgaXMgaG93IHlvdSBcInJlbmFtZVwiIGEgY29sdW1uIGluIHBsYWNlOiB0byByZW5hbWUgXCJmYXJlXCIgdG8gXCJmYXJlX2Ftb3VudFwiLCBhZGQgYSBuZXcgY29sdW1uIFwiZmFyZV9hbW91bnRcIiB0aGF0IGNvcGllcyBcImZhcmVcIiAodGhlIG9yaWdpbmFsIFwiZmFyZVwiIGNvbHVtbiBzdGF5cyDigJQgdGhpcyBjb21tYW5kIG5ldmVyIHJlbW92ZXMgY29sdW1ucykuXG4tIGV4cHJlc3Npb24g4oCUIGFuIFNRTCBleHByZXNzaW9uIGNvbXB1dGVkIGluIER1Y2tEQiBhZ2FpbnN0IHRoZSBkYXRhc2V0J3Mgcm93cywgZS5nLiBhIHotc2NvcmU6IFwiKEhSNjAgLSBBVkcoSFI2MCkgT1ZFUigpKSAvIFNURERFVihIUjYwKSBPVkVSKClcIiBhZGRzIEhSNjBfWiBob2xkaW5nIHRoZSBzdGFuZGFyZGl6ZWQgdmFsdWUgb2YgSFI2MC4gVGhlIGV4cHJlc3Npb24gbWF5IHJlZmVyZW5jZSBleGlzdGluZyBjb2x1bW5zIGFuZCB3aW5kb3cgZnVuY3Rpb25zOyBpdCBtdXN0IHByb2R1Y2UgZXhhY3RseSBvbmUgdmFsdWUgcGVyIHJvdy5cbkNIQU5HSU5HIEEgQ09MVU1OJ1MgVFlQRTogdXNlIGV4cHJlc3Npb24gdG8gYWRkIGEgTkVXIGNvbHVtbiB0aGF0IGNhc3RzIHRoZSBvcmlnaW5hbCwgZS5nLiB0byB0dXJuIFwiTk9TT1VUSFwiIChudW1lcmljKSBpbnRvIGEgc3RyaW5nLCBhZGQgYSBuZXcgY29sdW1uIHdpdGggZXhwcmVzc2lvbiBcIk5PU09VVEg6OlZBUkNIQVJcIiAob3IgXCJDQVNUKE5PU09VVEggQVMgVkFSQ0hBUilcIikuIFRoZSB2YWx1ZXMgYmVjb21lIHN0cmluZ3M7IHRoZSBvcmlnaW5hbCBjb2x1bW4gc3RheXMuIE5hbWUgdGhlIG5ldyBjb2x1bW4gY2xlYXJseSAoZS5nLiBcIk5PU09VVEhfc3RyXCIpIG9yIGFzIHRoZSB1c2VyIHJlcXVlc3RzLlxuSU1QT1JUQU5UOiB0aGlzIGNvbW1hbmQgb25seSBBRERTIGNvbHVtbnMuIEl0IGNhbm5vdCBkZWxldGUgb3IgcmVuYW1lLWluLXBsYWNlIGFuIGV4aXN0aW5nIGNvbHVtbiwgYW5kIGl0IG5ldmVyIGNoYW5nZXMgdGhlIHR5cGUgT0YgYW4gZXhpc3RpbmcgY29sdW1uIGluIHBsYWNlIOKAlCBhIHR5cGUgY2hhbmdlIGlzIGFjaGlldmVkIGJ5IGFkZGluZyBhIE5FVyBjb2x1bW4gaG9sZGluZyB0aGUgY2FzdCB2YWx1ZXMuIElmIHlvdSBuZWVkIHRvIHJlbW92ZSBjb2x1bW5zIG9yIHJlYnVpbGQgdGhlIHdob2xlIHRhYmxlLCB1c2UgbWFwLmNyZWF0ZS10YWJsZSAod2hpY2ggY3JlYXRlcyBhIE5FVyBkYXRhc2V0OyB0aGUgb3JpZ2luYWwgaXMgdW50b3VjaGVkKS5gLFxuICAgIG1ldGFkYXRhOiB7cmVhZE9ubHk6IGZhbHNlLCByaXNrTGV2ZWw6ICdtZWRpdW0nLCBpZGVtcG90ZW50OiBmYWxzZX0sXG4gICAgaW5wdXRTY2hlbWE6IHpcbiAgICAgIC5vYmplY3Qoe1xuICAgICAgICBkYXRhc2V0TmFtZTogelxuICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgIC5taW4oMSlcbiAgICAgICAgICAuZGVzY3JpYmUoJ1RoZSBuYW1lIChsYWJlbCkgb3IgaWQgb2YgdGhlIGRhdGFzZXQgdG8gYWRkIHRoZSBjb2x1bW4gdG8nKSxcbiAgICAgICAgbmV3Q29sdW1uTmFtZTogelxuICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgIC5taW4oMSlcbiAgICAgICAgICAuZGVzY3JpYmUoJ1RoZSBuYW1lIG9mIHRoZSBuZXcgY29sdW1uIHRvIGFkZC4gTXVzdCBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgZGF0YXNldC4nKSxcbiAgICAgICAgY29weUZyb21Db2x1bW46IHpcbiAgICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgICAubWluKDEpXG4gICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgICAnVGhlIG5hbWUgb2YgYW4gRVhJU1RJTkcgY29sdW1uIHdob3NlIHZhbHVlcyB0aGUgbmV3IGNvbHVtbiB3aWxsIGNvcHkuIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBleHByZXNzaW9uYCDigJQgcHJvdmlkZSBleGFjdGx5IG9uZS4nXG4gICAgICAgICAgKSxcbiAgICAgICAgZXhwcmVzc2lvbjogelxuICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgIC5taW4oMSlcbiAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICAgICdBbiBTUUwgZXhwcmVzc2lvbiBjb21wdXRlZCBpbiBEdWNrREIgYWdhaW5zdCB0aGUgZGF0YXNldCByb3dzOyB0aGUgcmVzdWx0IGJlY29tZXMgdGhlIG5ldyBjb2x1bW4uIGUuZy4gei1zY29yZTogXCIoSFI2MCAtIEFWRyhIUjYwKSBPVkVSKCkpIC8gU1REREVWKEhSNjApIE9WRVIoKVwiLiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgY29weUZyb21Db2x1bW5gIOKAlCBwcm92aWRlIGV4YWN0bHkgb25lLidcbiAgICAgICAgICApXG4gICAgICB9KVxuICAgICAgLnN1cGVyUmVmaW5lKChkYXRhLCBjdHgpID0+IHtcbiAgICAgICAgY29uc3QgcHJvdmlkZWQgPSBbZGF0YS5jb3B5RnJvbUNvbHVtbiwgZGF0YS5leHByZXNzaW9uXS5maWx0ZXIodiA9PiB2ICE9IG51bGwpLmxlbmd0aDtcbiAgICAgICAgaWYgKHByb3ZpZGVkICE9PSAxKSB7XG4gICAgICAgICAgY3R4LmFkZElzc3VlKHtcbiAgICAgICAgICAgIGNvZGU6IHouWm9kSXNzdWVDb2RlLmN1c3RvbSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdQcm92aWRlIGV4YWN0bHkgb25lIG9mIGNvcHlGcm9tQ29sdW1uIG9yIGV4cHJlc3Npb24uJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KSBhcyBhbnksXG4gICAgZXhlY3V0ZTogYXN5bmMgKF9leGVjQ3R4LCBpbnB1dCkgPT4ge1xuICAgICAgY29uc3Qge2RhdGFzZXROYW1lLCBuZXdDb2x1bW5OYW1lLCBjb3B5RnJvbUNvbHVtbiwgZXhwcmVzc2lvbn0gPSAoaW5wdXQgPz8ge30pIGFzIHtcbiAgICAgICAgZGF0YXNldE5hbWU6IHN0cmluZztcbiAgICAgICAgbmV3Q29sdW1uTmFtZTogc3RyaW5nO1xuICAgICAgICBjb3B5RnJvbUNvbHVtbj86IHN0cmluZztcbiAgICAgICAgZXhwcmVzc2lvbj86IHN0cmluZztcbiAgICAgIH07XG4gICAgICB0cnkge1xuICAgICAgICAvLyBSdW50aW1lIGd1YXJkOiB0aGUgYnJpZGdlL3dlYk1DUCBjYWxsIGV4ZWN1dGUgd2l0aG91dCB6b2QgcGFyc2luZywgc29cbiAgICAgICAgLy8gdGhlIHN1cGVyUmVmaW5lIFwiZXhhY3RseSBvbmUgb2YgY29weUZyb21Db2x1bW4vZXhwcmVzc2lvblwiIGNvbnN0cmFpbnRcbiAgICAgICAgLy8gaXMgbm90IGVuZm9yY2VkLiBXaXRob3V0IGl0LCBib3RoLW1pc3Npbmcgd291bGQgYnVpbGRcbiAgICAgICAgLy8gYCh1bmRlZmluZWQpIEFTIC4uLmAgYW5kIHByb2R1Y2UgYSBjb25mdXNpbmcgRHVja0RCIGVycm9yLlxuICAgICAgICBjb25zdCBwcm92aWRlZCA9IFtjb3B5RnJvbUNvbHVtbiwgZXhwcmVzc2lvbl0uZmlsdGVyKHYgPT4gdiAhPSBudWxsKS5sZW5ndGg7XG4gICAgICAgIGlmIChwcm92aWRlZCAhPT0gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJvdmlkZSBleGFjdGx5IG9uZSBvZiBjb3B5RnJvbUNvbHVtbiBvciBleHByZXNzaW9uLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YXNldE5hbWUgIT09ICdzdHJpbmcnIHx8IGRhdGFzZXROYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZGF0YXNldE5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuZXdDb2x1bW5OYW1lICE9PSAnc3RyaW5nJyB8fCBuZXdDb2x1bW5OYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbmV3Q29sdW1uTmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy4nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnJpZGdlL3dlYk1DUCBwYXRoIHNraXBzIHpvZCwgc28gYW4gZW1wdHkgY29weUZyb21Db2x1bW4vZXhwcmVzc2lvblxuICAgICAgICAvLyB3b3VsZCBzbGlwIHRocm91Z2ggYW5kIGJ1aWxkIGAoKSBBUyAuLi5gIC8gYFwiXCIgQVMgLi4uYCDigJQgYSBjb25mdXNpbmdcbiAgICAgICAgLy8gRHVja0RCIGVycm9yIGluc3RlYWQgb2YgYW4gYWN0aW9uYWJsZSBvbmUuIEVuZm9yY2Ugbm9uLWVtcHR5IHN0cmluZ3NcbiAgICAgICAgLy8gZm9yIHdoaWNoZXZlciBzb3VyY2UgaXMgc2VsZWN0ZWQuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBjb3B5RnJvbUNvbHVtbiAhPSBudWxsICYmXG4gICAgICAgICAgKHR5cGVvZiBjb3B5RnJvbUNvbHVtbiAhPT0gJ3N0cmluZycgfHwgY29weUZyb21Db2x1bW4ubGVuZ3RoID09PSAwKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvcHlGcm9tQ29sdW1uIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChleHByZXNzaW9uICE9IG51bGwgJiYgKHR5cGVvZiBleHByZXNzaW9uICE9PSAnc3RyaW5nJyB8fCBleHByZXNzaW9uLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cHJlc3Npb24gbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2aXNTdGF0ZSA9IGN0eC5nZXRWaXNTdGF0ZSgpO1xuICAgICAgICBjb25zdCBkYXRhc2V0cyA9IHZpc1N0YXRlLmRhdGFzZXRzO1xuICAgICAgICBjb25zdCBkYXRhSWQgPSBPYmplY3Qua2V5cyhkYXRhc2V0cykuZmluZChcbiAgICAgICAgICBpZCA9PiBpZCA9PT0gZGF0YXNldE5hbWUgfHwgZGF0YXNldHNbaWRdLmxhYmVsID09PSBkYXRhc2V0TmFtZVxuICAgICAgICApO1xuICAgICAgICBpZiAoIWRhdGFJZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0YXNldCBcIiR7ZGF0YXNldE5hbWV9XCIgbm90IGZvdW5kLmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpZWxkTmFtZXMgPSBkYXRhc2V0c1tkYXRhSWRdLmZpZWxkcy5tYXAoKGY6IGFueSkgPT4gZi5uYW1lKTtcbiAgICAgICAgaWYgKGNvcHlGcm9tQ29sdW1uICE9IG51bGwgJiYgIWZpZWxkTmFtZXMuaW5jbHVkZXMoY29weUZyb21Db2x1bW4pKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENvbHVtbiBcIiR7Y29weUZyb21Db2x1bW59XCIgZG9lcyBub3QgZXhpc3QgaW4gZGF0YXNldCBcIiR7ZGF0YXNldE5hbWV9XCIuIGAgK1xuICAgICAgICAgICAgICBgRXhpc3RpbmcgY29sdW1uczogJHtmaWVsZE5hbWVzLmpvaW4oJywgJyl9LmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWVsZE5hbWVzLmluY2x1ZGVzKG5ld0NvbHVtbk5hbWUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENvbHVtbiBcIiR7bmV3Q29sdW1uTmFtZX1cIiBhbHJlYWR5IGV4aXN0cyBpbiBkYXRhc2V0IFwiJHtkYXRhc2V0TmFtZX1cIi4gQ2hvb3NlIGEgZGlmZmVyZW50IG5hbWUuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZXJpdmUgdGhlIER1Y2tEQiB0YWJsZSBuYW1lIGZyb20gdGhlIHJlc29sdmVkIGRhdGFzZXQgaWQsIG5vdCB0aGVcbiAgICAgICAgLy8gdXNlci1wcm92aWRlZCBsYWJlbDogZGlmZmVyZW50IGxhYmVscyBjYW4gc2FuaXRpemUgdG8gdGhlIHNhbWUgdGFibGVcbiAgICAgICAgLy8gbmFtZSAoZS5nLiBcIkEtQlwiIHZzIFwiQSBCXCIpLCB3aGljaCB3b3VsZCBjbG9iYmVyIGFub3RoZXIgZGF0YXNldCdzXG4gICAgICAgIC8vIHRlbXAgdGFibGUgaW5zaWRlIER1Y2tEQiBhbmQgcnVuIHRoZSBTUUwgYWdhaW5zdCB1bmludGVuZGVkIGRhdGEuXG4gICAgICAgIGNvbnN0IGRiVGFibGVOYW1lID0gZGF0YXNldE5hbWVUb1RhYmxlTmFtZShkYXRhSWQpO1xuICAgICAgICAvLyBQYXNzIHRoZSB1c2VyLXByb3ZpZGVkIGRhdGFzZXROYW1lIChsYWJlbCBvciBpZCkgdG9cbiAgICAgICAgLy8gbG9hZFRhYmxlSW50b0R1Y2tEQiDigJQgdGhlIGRvY3VtZW50ZWQgS2VwbGVyQ29udGV4dCBjb250cmFjdCDigJQgbm90XG4gICAgICAgIC8vIHRoZSByZXNvbHZlZCBpZC5cbiAgICAgICAgY29uc3QgZGIgPSBhd2FpdCBjdHgubG9hZFRhYmxlSW50b0R1Y2tEQihkYXRhc2V0TmFtZSwgZmllbGROYW1lcywgZGJUYWJsZU5hbWUpO1xuXG4gICAgICAgIC8vIEFkZC1vbmx5OiBjb21wdXRlIE9OTFkgdGhlIG5ldyBjb2x1bW4gaW4gRHVja0RCLiBFeGlzdGluZyBjb2x1bW5zIGFyZVxuICAgICAgICAvLyBuZXZlciByb3VuZC10cmlwcGVkIHRocm91Z2ggRHVja0RCL0Fycm93IOKAlCBgdGFibGVGcm9tQXJyYXlzYCBpbmZlcnMgYVxuICAgICAgICAvLyBzaW5nbGUgQXJyb3cgdHlwZSBmb3IgYF9nZW9qc29uYCwgYW5kIGEgZGF0YXNldCBtaXhpbmcgUG9seWdvbiBhbmRcbiAgICAgICAgLy8gTXVsdGlQb2x5Z29uIGZlYXR1cmVzIGdldHMgdGhlIHNoYWxsb3dlciB0eXBlLCBzbyB0aGUgTXVsdGlQb2x5Z29uXG4gICAgICAgIC8vIGNvb3JkaW5hdGVzIGNvbWUgYmFjayBhcyBudWxscyBhbmQgdGhlIGdlb21ldHJ5IGRpc2FwcGVhcnMuXG4gICAgICAgIC8vIGBidWlsZEFkZENvbHVtblBheWxvYWRgIHJlYnVpbGRzIHRoZSBwYXlsb2FkIGZyb20gdGhlIG9yaWdpbmFsIGtlcGxlclxuICAgICAgICAvLyB2YWx1ZXMgaW5zdGVhZCwgYXBwZW5kaW5nIHRoZSBuZXcgY29sdW1uIGZyb20gdGhpcyBzaW5nbGUtY29sdW1uIHJlc3VsdC5cbiAgICAgICAgLy8gRXNjYXBlIGRvdWJsZSBxdW90ZXMgaW4gaWRlbnRpZmllciBuYW1lcyBiZWZvcmUgZW1iZWRkaW5nIHRoZW0gaW5cbiAgICAgICAgLy8gcXVvdGVkIFNRTCBpZGVudGlmaWVycyDigJQgYSBgXCJgIGluIGNvcHlGcm9tQ29sdW1uL25ld0NvbHVtbk5hbWUgd291bGRcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGJyZWFrIHRoZSBxdWVyeSBvciBlbmFibGUgU1FMIGluamVjdGlvbiBpbnRvIER1Y2tEQi4gKFRoZVxuICAgICAgICAvLyBgZXhwcmVzc2lvbmAgaXMgdXNlci1wcm92aWRlZCBTUUwgYnkgZGVzaWduLCBzbyBpdCBpcyBub3QgZXNjYXBlZC4pXG4gICAgICAgIGNvbnN0IGVzY2FwZUlkZW50ID0gKG5hbWU6IHN0cmluZykgPT4gbmFtZS5yZXBsYWNlKC9cIi9nLCAnXCJcIicpO1xuICAgICAgICBjb25zdCBhcHBlbmRlZFNxbCA9XG4gICAgICAgICAgY29weUZyb21Db2x1bW4gIT0gbnVsbFxuICAgICAgICAgICAgPyBgXCIke2VzY2FwZUlkZW50KGNvcHlGcm9tQ29sdW1uKX1cIiBBUyBcIiR7ZXNjYXBlSWRlbnQobmV3Q29sdW1uTmFtZSl9XCJgXG4gICAgICAgICAgICA6IGAoJHtleHByZXNzaW9ufSkgQVMgXCIke2VzY2FwZUlkZW50KG5ld0NvbHVtbk5hbWUpfVwiYDtcbiAgICAgICAgY29uc3QgYXJyb3dSZXN1bHQgPSBhd2FpdCBkYi5xdWVyeShgU0VMRUNUICR7YXBwZW5kZWRTcWx9IEZST00gXCIke2RiVGFibGVOYW1lfVwiYCk7XG5cbiAgICAgICAgY29uc3Qge3Jvd3MsIGZpZWxkc30gPSBidWlsZEFkZENvbHVtblBheWxvYWQoXG4gICAgICAgICAgZGF0YXNldHMsXG4gICAgICAgICAgdmlzU3RhdGUubGF5ZXJzLFxuICAgICAgICAgIGRhdGFzZXROYW1lLFxuICAgICAgICAgIG5ld0NvbHVtbk5hbWUsXG4gICAgICAgICAgYXJyb3dSZXN1bHRcbiAgICAgICAgKTtcbiAgICAgICAgY3R4LmRpc3BhdGNoKHVwZGF0ZURhdGFzZXQoZGF0YUlkLCB7cm93cywgZmllbGRzfSBhcyBhbnkpKTtcblxuICAgICAgICAvLyBMTE0tZmFjaW5nIHByZXZpZXc6IGZpcnN0IDUgcm93cyBvZiB0aGUgZnVsbCAob3JpZ2luYWwgKyBuZXcpIHBheWxvYWQuXG4gICAgICAgIGNvbnN0IHByZXZpZXdSb3dzID0gcm93c1xuICAgICAgICAgIC5zbGljZSgwLCA1KVxuICAgICAgICAgIC5tYXAociA9PiBPYmplY3QuZnJvbUVudHJpZXMoZmllbGRzLm1hcCgoZiwgaSkgPT4gW2YubmFtZSwgcltpXV0pKSk7XG4gICAgICAgIGNvbnN0IHZhbHVlU291cmNlID0gY29weUZyb21Db2x1bW4gIT0gbnVsbCA/IGBjb3BpZWQgZnJvbSBcIiR7Y29weUZyb21Db2x1bW59XCJgIDogYGNvbXB1dGVkYDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIGNvbW1hbmRJZDogYWRkQ29sdW1uQ29tbWFuZElkLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGRldGFpbHM6IGBBZGRlZCBjb2x1bW4gXCIke25ld0NvbHVtbk5hbWV9XCIgdG8gZGF0YXNldCBcIiR7ZGF0YXNldE5hbWV9XCIgKCR7dmFsdWVTb3VyY2V9LCAke3Jvd3MubGVuZ3RofSByb3dzKS5gLFxuICAgICAgICAgICAgYWRkZWRDb2x1bW5zOiBbbmV3Q29sdW1uTmFtZV0sXG4gICAgICAgICAgICBmaXJzdEZpdmVSb3dzOiB0YWJsZVRvTExNUmVzdWx0KHByZXZpZXdSb3dzKVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgY29tbWFuZElkOiBhZGRDb2x1bW5Db21tYW5kSWQsXG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBpbnN0cnVjdGlvbjogJ1BsZWFzZSBleHBsYWluIHRoZSBlcnJvciBhbmQgZ2l2ZSBhIHBsYW4gdG8gZml4IGl0LiBUaGVuIHRy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
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.basemapCommandId = void 0;
8
+ exports.getBasemapCommand = getBasemapCommand;
9
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
+ var _zod = require("zod");
12
+ var _constants = require("@kepler.gl/constants");
13
+ var _actions = require("@kepler.gl/actions");
14
+ // SPDX-License-Identifier: MIT
15
+ // Copyright contributors to the kepler.gl project
16
+
17
+ var basemapCommandId = exports.basemapCommandId = 'map.set-basemap';
18
+ function getBasemapCommand(ctx) {
19
+ return {
20
+ id: basemapCommandId,
21
+ name: 'Set basemap',
22
+ group: 'Map',
23
+ description: 'Change the basemap style of the kepler.gl map.',
24
+ metadata: {
25
+ readOnly: false,
26
+ riskLevel: 'low',
27
+ idempotent: true
28
+ },
29
+ inputSchema: _zod.z.object({
30
+ styleType: _zod.z["enum"](['no_map', 'dark-matter', 'positron', 'voyager', 'satellite', 'dark', 'light', 'muted', 'muted_night'])
31
+ }),
32
+ execute: function () {
33
+ var _execute = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(_execCtx, input) {
34
+ var _ref, styleType;
35
+ return _regenerator["default"].wrap(function _callee$(_context) {
36
+ while (1) switch (_context.prev = _context.next) {
37
+ case 0:
38
+ _ref = input !== null && input !== void 0 ? input : {}, styleType = _ref.styleType;
39
+ _context.prev = 1;
40
+ if (_constants.DEFAULT_MAP_STYLES.find(function (style) {
41
+ return style.id === styleType;
42
+ })) {
43
+ _context.next = 4;
44
+ break;
45
+ }
46
+ throw new Error("Invalid basemap style: ".concat(styleType, "."));
47
+ case 4:
48
+ ctx.dispatch((0, _actions.mapStyleChange)(styleType));
49
+ return _context.abrupt("return", {
50
+ success: true,
51
+ commandId: basemapCommandId,
52
+ data: {
53
+ details: "Basemap style changed to ".concat(styleType, ".")
54
+ }
55
+ });
56
+ case 8:
57
+ _context.prev = 8;
58
+ _context.t0 = _context["catch"](1);
59
+ return _context.abrupt("return", {
60
+ success: false,
61
+ commandId: basemapCommandId,
62
+ error: _context.t0 instanceof Error ? _context.t0.message : 'Unknown error',
63
+ data: {
64
+ instruction: 'Try to fix the error. If the error persists, ask the user to try with a different basemap style.'
65
+ }
66
+ });
67
+ case 11:
68
+ case "end":
69
+ return _context.stop();
70
+ }
71
+ }, _callee, null, [[1, 8]]);
72
+ }));
73
+ function execute(_x, _x2) {
74
+ return _execute.apply(this, arguments);
75
+ }
76
+ return execute;
77
+ }()
78
+ };
79
+ }
80
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfem9kIiwicmVxdWlyZSIsIl9jb25zdGFudHMiLCJfYWN0aW9ucyIsImJhc2VtYXBDb21tYW5kSWQiLCJleHBvcnRzIiwiZ2V0QmFzZW1hcENvbW1hbmQiLCJjdHgiLCJpZCIsIm5hbWUiLCJncm91cCIsImRlc2NyaXB0aW9uIiwibWV0YWRhdGEiLCJyZWFkT25seSIsInJpc2tMZXZlbCIsImlkZW1wb3RlbnQiLCJpbnB1dFNjaGVtYSIsInoiLCJvYmplY3QiLCJzdHlsZVR5cGUiLCJleGVjdXRlIiwiX2V4ZWN1dGUiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsIl9leGVjQ3R4IiwiaW5wdXQiLCJfcmVmIiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsIkRFRkFVTFRfTUFQX1NUWUxFUyIsImZpbmQiLCJzdHlsZSIsIkVycm9yIiwiY29uY2F0IiwiZGlzcGF0Y2giLCJtYXBTdHlsZUNoYW5nZSIsImFicnVwdCIsInN1Y2Nlc3MiLCJjb21tYW5kSWQiLCJkYXRhIiwiZGV0YWlscyIsInQwIiwiZXJyb3IiLCJtZXNzYWdlIiwiaW5zdHJ1Y3Rpb24iLCJzdG9wIiwiX3giLCJfeDIiLCJhcHBseSIsImFyZ3VtZW50cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9iYXNlbWFwLWNvbW1hbmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHR5cGUge1Jvb21Db21tYW5kfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7en0gZnJvbSAnem9kJztcbmltcG9ydCB7REVGQVVMVF9NQVBfU1RZTEVTfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge21hcFN0eWxlQ2hhbmdlfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHR5cGUge0tlcGxlckNvbnRleHR9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgYmFzZW1hcENvbW1hbmRJZCA9ICdtYXAuc2V0LWJhc2VtYXAnIGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QmFzZW1hcENvbW1hbmQoY3R4OiBLZXBsZXJDb250ZXh0KTogUm9vbUNvbW1hbmQge1xuICByZXR1cm4ge1xuICAgIGlkOiBiYXNlbWFwQ29tbWFuZElkLFxuICAgIG5hbWU6ICdTZXQgYmFzZW1hcCcsXG4gICAgZ3JvdXA6ICdNYXAnLFxuICAgIGRlc2NyaXB0aW9uOiAnQ2hhbmdlIHRoZSBiYXNlbWFwIHN0eWxlIG9mIHRoZSBrZXBsZXIuZ2wgbWFwLicsXG4gICAgbWV0YWRhdGE6IHtyZWFkT25seTogZmFsc2UsIHJpc2tMZXZlbDogJ2xvdycsIGlkZW1wb3RlbnQ6IHRydWV9LFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBzdHlsZVR5cGU6IHouZW51bShbXG4gICAgICAgICdub19tYXAnLFxuICAgICAgICAnZGFyay1tYXR0ZXInLFxuICAgICAgICAncG9zaXRyb24nLFxuICAgICAgICAndm95YWdlcicsXG4gICAgICAgICdzYXRlbGxpdGUnLFxuICAgICAgICAnZGFyaycsXG4gICAgICAgICdsaWdodCcsXG4gICAgICAgICdtdXRlZCcsXG4gICAgICAgICdtdXRlZF9uaWdodCdcbiAgICAgIF0pXG4gICAgfSkgYXMgYW55LFxuICAgIGV4ZWN1dGU6IGFzeW5jIChfZXhlY0N0eCwgaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IHtzdHlsZVR5cGV9ID0gKGlucHV0ID8/IHt9KSBhcyB7c3R5bGVUeXBlOiBzdHJpbmd9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFERUZBVUxUX01BUF9TVFlMRVMuZmluZChzdHlsZSA9PiBzdHlsZS5pZCA9PT0gc3R5bGVUeXBlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBiYXNlbWFwIHN0eWxlOiAke3N0eWxlVHlwZX0uYCk7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LmRpc3BhdGNoKG1hcFN0eWxlQ2hhbmdlKHN0eWxlVHlwZSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgY29tbWFuZElkOiBiYXNlbWFwQ29tbWFuZElkLFxuICAgICAgICAgIGRhdGE6IHtkZXRhaWxzOiBgQmFzZW1hcCBzdHlsZSBjaGFuZ2VkIHRvICR7c3R5bGVUeXBlfS5gfVxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBjb21tYW5kSWQ6IGJhc2VtYXBDb21tYW5kSWQsXG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGluc3RydWN0aW9uOlxuICAgICAgICAgICAgICAnVHJ5IHRvIGZpeCB0aGUgZXJyb3IuIElmIHRoZSBlcnJvciBwZXJzaXN0cywgYXNrIHRoZSB1c2VyIHRvIHRyeSB3aXRoIGEgZGlmZmVyZW50IGJhc2VtYXAgc3R5bGUuJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFJQSxJQUFBQSxJQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxVQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxRQUFBLEdBQUFGLE9BQUE7QUFOQTtBQUNBOztBQVFPLElBQU1HLGdCQUFnQixHQUFBQyxPQUFBLENBQUFELGdCQUFBLEdBQUcsaUJBQTBCO0FBRW5ELFNBQVNFLGlCQUFpQkEsQ0FBQ0MsR0FBa0IsRUFBZTtFQUNqRSxPQUFPO0lBQ0xDLEVB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
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.getMapBoundaryCommand = getMapBoundaryCommand;
8
+ exports.mapBoundaryCommandId = void 0;
9
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
+ var _zod = require("zod");
12
+ // SPDX-License-Identifier: MIT
13
+ // Copyright contributors to the kepler.gl project
14
+
15
+ var mapBoundaryCommandId = exports.mapBoundaryCommandId = 'map.get-boundary';
16
+ function getMapBoundaryCommand(ctx) {
17
+ return {
18
+ id: mapBoundaryCommandId,
19
+ name: 'Get map boundary',
20
+ group: 'Map',
21
+ description: 'Get the boundary of the map. Northwest and Southeast coordinates in [longitude, latitude] format.',
22
+ metadata: {
23
+ readOnly: true,
24
+ riskLevel: 'low',
25
+ idempotent: true
26
+ },
27
+ inputSchema: _zod.z.object({}),
28
+ execute: function () {
29
+ var _execute = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
30
+ var boundary;
31
+ return _regenerator["default"].wrap(function _callee$(_context) {
32
+ while (1) switch (_context.prev = _context.next) {
33
+ case 0:
34
+ _context.prev = 0;
35
+ boundary = ctx.getMapBoundary();
36
+ if (boundary) {
37
+ _context.next = 4;
38
+ break;
39
+ }
40
+ return _context.abrupt("return", {
41
+ success: false,
42
+ commandId: mapBoundaryCommandId,
43
+ error: 'Map boundary not available.',
44
+ data: {
45
+ instruction: 'Please ensure the kepler.gl map is properly loaded and try again.'
46
+ }
47
+ });
48
+ case 4:
49
+ return _context.abrupt("return", {
50
+ success: true,
51
+ commandId: mapBoundaryCommandId,
52
+ data: {
53
+ details: "Map boundary retrieved. NW: [".concat(boundary.nw[0], ", ").concat(boundary.nw[1], "], SE: [").concat(boundary.se[0], ", ").concat(boundary.se[1], "]"),
54
+ boundary: boundary
55
+ }
56
+ });
57
+ case 7:
58
+ _context.prev = 7;
59
+ _context.t0 = _context["catch"](0);
60
+ return _context.abrupt("return", {
61
+ success: false,
62
+ commandId: mapBoundaryCommandId,
63
+ error: _context.t0 instanceof Error ? _context.t0.message : 'Unknown error',
64
+ data: {
65
+ instruction: 'Please ensure the kepler.gl map is properly loaded and try again.'
66
+ }
67
+ });
68
+ case 10:
69
+ case "end":
70
+ return _context.stop();
71
+ }
72
+ }, _callee, null, [[0, 7]]);
73
+ }));
74
+ function execute() {
75
+ return _execute.apply(this, arguments);
76
+ }
77
+ return execute;
78
+ }()
79
+ };
80
+ }
81
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfem9kIiwicmVxdWlyZSIsIm1hcEJvdW5kYXJ5Q29tbWFuZElkIiwiZXhwb3J0cyIsImdldE1hcEJvdW5kYXJ5Q29tbWFuZCIsImN0eCIsImlkIiwibmFtZSIsImdyb3VwIiwiZGVzY3JpcHRpb24iLCJtZXRhZGF0YSIsInJlYWRPbmx5Iiwicmlza0xldmVsIiwiaWRlbXBvdGVudCIsImlucHV0U2NoZW1hIiwieiIsIm9iamVjdCIsImV4ZWN1dGUiLCJfZXhlY3V0ZSIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiYm91bmRhcnkiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiZ2V0TWFwQm91bmRhcnkiLCJhYnJ1cHQiLCJzdWNjZXNzIiwiY29tbWFuZElkIiwiZXJyb3IiLCJkYXRhIiwiaW5zdHJ1Y3Rpb24iLCJkZXRhaWxzIiwiY29uY2F0IiwibnciLCJzZSIsInQwIiwiRXJyb3IiLCJtZXNzYWdlIiwic3RvcCIsImFwcGx5IiwiYXJndW1lbnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2JvdW5kYXJ5LWNvbW1hbmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHR5cGUge1Jvb21Db21tYW5kfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7en0gZnJvbSAnem9kJztcbmltcG9ydCB0eXBlIHtLZXBsZXJDb250ZXh0fSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IG1hcEJvdW5kYXJ5Q29tbWFuZElkID0gJ21hcC5nZXQtYm91bmRhcnknIGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFwQm91bmRhcnlDb21tYW5kKGN0eDogS2VwbGVyQ29udGV4dCk6IFJvb21Db21tYW5kIHtcbiAgcmV0dXJuIHtcbiAgICBpZDogbWFwQm91bmRhcnlDb21tYW5kSWQsXG4gICAgbmFtZTogJ0dldCBtYXAgYm91bmRhcnknLFxuICAgIGdyb3VwOiAnTWFwJyxcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdHZXQgdGhlIGJvdW5kYXJ5IG9mIHRoZSBtYXAuIE5vcnRod2VzdCBhbmQgU291dGhlYXN0IGNvb3JkaW5hdGVzIGluIFtsb25naXR1ZGUsIGxhdGl0dWRlXSBmb3JtYXQuJyxcbiAgICBtZXRhZGF0YToge3JlYWRPbmx5OiB0cnVlLCByaXNrTGV2ZWw6ICdsb3cnLCBpZGVtcG90ZW50OiB0cnVlfSxcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe30pIGFzIGFueSxcbiAgICBleGVjdXRlOiBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBib3VuZGFyeSA9IGN0eC5nZXRNYXBCb3VuZGFyeSgpO1xuICAgICAgICBpZiAoIWJvdW5kYXJ5KSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgY29tbWFuZElkOiBtYXBCb3VuZGFyeUNvbW1hbmRJZCxcbiAgICAgICAgICAgIGVycm9yOiAnTWFwIGJvdW5kYXJ5IG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb246ICdQbGVhc2UgZW5zdXJlIHRoZSBrZXBsZXIuZ2wgbWFwIGlzIHByb3Blcmx5IGxvYWRlZCBhbmQgdHJ5IGFnYWluLidcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBjb21tYW5kSWQ6IG1hcEJvdW5kYXJ5Q29tbWFuZElkLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGRldGFpbHM6IGBNYXAgYm91bmRhcnkgcmV0cmlldmVkLiBOVzogWyR7Ym91bmRhcnkubndbMF19LCAke2JvdW5kYXJ5Lm53WzFdfV0sIFNFOiBbJHtib3VuZGFyeS5zZVswXX0sICR7Ym91bmRhcnkuc2VbMV19XWAsXG4gICAgICAgICAgICBib3VuZGFyeVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgY29tbWFuZElkOiBtYXBCb3VuZGFyeUNvbW1hbmRJZCxcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgaW5zdHJ1Y3Rpb246ICdQbGVhc2UgZW5zdXJlIHRoZSBrZXBsZXIuZ2wgbWFwIGlzIHByb3Blcmx5IGxvYWRlZCBhbmQgdHJ5IGFnYWluLidcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBSUEsSUFBQUEsSUFBQSxHQUFBQyxPQUFBO0FBSkE7QUFDQTs7QUFNTyxJQUFNQyxvQkFBb0IsR0FBQUMsT0FBQSxDQUFBRCxvQkFBQSxHQUFHLGtCQUEyQjtBQUV4RCxTQUFTRSxxQkFBcUJBLENBQUNDLEdBQWtCLEVBQWU7RUFDckUsT0FBTztJQUNMQyxFQUFFLEVBQUVKLG9CQUFvQjtJQUN4QkssSUFBSSxFQUFFLGtCQUFrQjtJQUN4QkMsS0FBSyxFQUFFLEtBQUs7SUFDWkMsV0FBVyxFQUNULG1HQUFtRztJQUNyR0MsUUFBUSxFQUFFO01BQUNDLFFBQVEsRUFBRSxJQUFJO01BQUVDLFNBQVMsRUFBRSxLQUFLO01BQUVDLFVBQVUsRUFBRTtJQUFJLENBQUM7SUFDOURDLFdBQVcsRUFBRUMsTUFBQyxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQVE7SUFDaENDLE9BQU87TUFBQSxJQUFBQyxRQUFBLE9BQUFDLGtCQUFBLDBCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBRSxTQUFBQyxRQUFBO1FBQUEsSUFBQUMsUUFBQTtRQUFBLE9BQUFILFlBQUEsWUFBQUksSUFBQSxVQUFBQyxTQUFBQyxRQUFBO1VBQUEsa0JBQUFBLFFBQUEsQ0FBQUMsSUFBQSxHQUFBRCxRQUFBLENBQUFFLElBQUE7WUFBQTtjQUFBRixRQUFBLENBQUFDLElBQUE7Y0FFQ0osUUFBUSxHQUFHbEIsR0FBRyxDQUFDd0IsY0FBYyxDQUFDLENBQUM7Y0FBQSxJQUNoQ04sUUFBUTtnQkFBQUcsUUFBQSxDQUFBRSxJQUFBO2dCQUFBO2NBQUE7Y0FBQSxPQUFBRixRQUFBLENBQUFJLE1BQUEsV0FDSjtnQkFDTEMsT0FBTyxFQUFFLEtBQUs7Z0JBQ2RDLFNBQVMsRUFBRTlCLG9CQUFvQjtnQkFDL0IrQixLQUFLLEVBQUUsNkJBQTZCO2dCQUNwQ0MsSUFBSSxFQUFFO2tCQUNKQyxXQUFXLEVBQUU7Z0JBQ2Y7Y0FDRixDQUFDO1lBQUE7Y0FBQSxPQUFBVCxRQUFBLENBQUFJLE1BQUEsV0FFSTtnQkFDTEMsT0FBTyxFQUFFLElBQUk7Z0JBQ2JDLFNBQVMsRUFBRTlCLG9CQUFvQjtnQkFDL0JnQyxJQUFJLEVBQUU7a0JBQ0pFLE9BQU8sa0NBQUFDLE1BQUEsQ0FBa0NkLFFBQVEsQ0FBQ2UsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFBRCxNQUFBLENBQUtkLFFBQVEsQ0FBQ2UsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFBRCxNQUFBLENBQVdkLFFBQVEsQ0FBQ2dCLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBQUYsTUFBQSxDQUFLZCxRQUFRLENBQUNnQixFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQUc7a0JBQ3pIaEIsUUFBUSxFQUFSQTtnQkFDRjtjQUNGLENBQUM7WUFBQTtjQUFBRyxRQUFBLENBQUFDLElBQUE7Y0FBQUQsUUFBQSxDQUFBYyxFQUFBLEdBQUFkLFFBQUE7Y0FBQSxPQUFBQSxRQUFBLENBQUFJLE1BQUEsV0FFTTtnQkFDTEMsT0FBTyxFQUFFLEtBQUs7Z0JBQ2RDLFNBQVMsRUFBRTlCLG9CQUFvQjtnQkFDL0IrQixLQUFLLEVBQUVQLFFBQUEsQ0FBQWMsRUFBQSxZQUFpQkMsS0FBSyxHQUFHZixRQUFBLENBQUFjLEVBQUEsQ0FBTUUsT0FBTyxHQUFHLGVBQWU7Z0JBQy9EUixJQUFJLEVBQUU7a0JBQ0pDLFdBQVcsRUFBRTtnQkFDZjtjQUNGLENBQUM7WUFBQTtZQUFBO2NBQUEsT0FBQVQsUUFBQSxDQUFBaUIsSUFBQTtVQUFBO1FBQUEsR0FBQXJCLE9BQUE7TUFBQSxDQUVKO01BQUEsU0EvQkRMLE9BQU9BLENBQUE7UUFBQSxPQUFBQyxRQUFBLENBQUEwQixLQUFBLE9BQUFDLFNBQUE7TUFBQTtNQUFBLE9BQVA1QixPQUFPO0lBQUE7RUFnQ1QsQ0FBQztBQUNIIiwiaWdub3JlTGlzdCI6W119
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.asInputSchema = asInputSchema;
8
+ exports.toolToCommand = toolToCommand;
9
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
11
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
+ // SPDX-License-Identifier: MIT
13
+ // Copyright contributors to the kepler.gl project
14
+
15
+ /**
16
+ * Generic utility for converting an existing AI SDK tool into a sqlrooms
17
+ * `RoomCommand`. Kept dependency-light (only `zod` + `RoomCommand` type) so it
18
+ * can be reused by any in-browser skill system that wants to expose its
19
+ * existing AI SDK tools as commands without rewriting them.
20
+ *
21
+ * The demo-app's own command factories return `RoomCommand` directly (preferred
22
+ * when you own the command — see `basemap-command.ts` for the reference shape). This
23
+ * wrapper is the fallback path for hosts that cannot rewrite their tools:
24
+ * it folds the tool's `execute`, `inputSchema`, and `toModelOutput` (the
25
+ * token-trim logic the AI SDK applies between tool call and model) into a
26
+ * single `RoomCommand.execute` so the registry-stored result already carries
27
+ * the model-facing subset.
28
+ */
29
+
30
+ /** A built AI SDK tool, treated loosely for dynamic dispatch. */
31
+
32
+ /** Metadata that the AI SDK tool does not carry but a `RoomCommand` requires. */
33
+
34
+ /**
35
+ * Cast a concrete zod schema (e.g. `z.object({...})`, which is `ZodObject<...>`)
36
+ * to the `ZodType<unknown>` that `RoomCommand.inputSchema` expects. The
37
+ * installed zod `ZodObject` is not structurally assignable to sqlrooms'
38
+ * `ZodType<unknown>` (covariance on the output type), so a cast is required at
39
+ * the assignment site. This helper centralizes that cast.
40
+ */
41
+ function asInputSchema(schema) {
42
+ return schema;
43
+ }
44
+
45
+ /**
46
+ * Wrap an existing AI SDK tool as a sqlrooms `RoomCommand`. The command's
47
+ * `execute` calls the tool's `execute` and then applies the tool's
48
+ * `toModelOutput` (if any) so the trimmed, model-facing shape is what the
49
+ * registry stores and downstream surfaces (AI skill, palette, CLI, MCP) see.
50
+ */
51
+ function toolToCommand(tool, meta) {
52
+ return {
53
+ id: meta.id,
54
+ name: meta.name,
55
+ description: tool.description,
56
+ group: meta.group,
57
+ keywords: meta.keywords,
58
+ inputSchema: tool.inputSchema,
59
+ execute: function () {
60
+ var _execute = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(ctx, input) {
61
+ var _rawOutput$success, _ref, _ref2, rawOutput, trimmed;
62
+ return _regenerator["default"].wrap(function _callee$(_context) {
63
+ while (1) switch (_context.prev = _context.next) {
64
+ case 0:
65
+ if (!(!tool.execute || typeof tool.execute !== 'function')) {
66
+ _context.next = 2;
67
+ break;
68
+ }
69
+ return _context.abrupt("return", {
70
+ success: false,
71
+ commandId: meta.id,
72
+ error: 'Tool has no execute function.'
73
+ });
74
+ case 2:
75
+ _context.prev = 2;
76
+ _context.next = 5;
77
+ return tool.execute(input !== null && input !== void 0 ? input : {}, {
78
+ toolCallId: meta.id,
79
+ signal: ctx.signal
80
+ });
81
+ case 5:
82
+ rawOutput = _context.sent;
83
+ trimmed = typeof tool.toModelOutput === 'function' ? tool.toModelOutput({
84
+ output: rawOutput,
85
+ toolCallId: meta.id
86
+ }) : rawOutput;
87
+ return _context.abrupt("return", {
88
+ success: (_rawOutput$success = rawOutput === null || rawOutput === void 0 ? void 0 : rawOutput.success) !== null && _rawOutput$success !== void 0 ? _rawOutput$success : true,
89
+ commandId: meta.id,
90
+ // A structured failure (success:false) that didn't throw must still
91
+ // carry an error message — otherwise callers see {success:false,
92
+ // error:undefined} and downstream formatters misreport it as a
93
+ // success. Many tool/result shapes (including RoomCommandResult)
94
+ // carry the failure in a `message` field rather than `error`, so
95
+ // fall back to that before the generic message.
96
+ error: (rawOutput === null || rawOutput === void 0 ? void 0 : rawOutput.success) === false ? (_ref = (_ref2 = rawOutput === null || rawOutput === void 0 ? void 0 : rawOutput.error) !== null && _ref2 !== void 0 ? _ref2 : rawOutput === null || rawOutput === void 0 ? void 0 : rawOutput.message) !== null && _ref !== void 0 ? _ref : 'Tool execution failed.' : undefined,
97
+ data: (0, _typeof2["default"])(trimmed) === 'object' && trimmed !== null ? trimmed : {
98
+ details: trimmed
99
+ }
100
+ });
101
+ case 10:
102
+ _context.prev = 10;
103
+ _context.t0 = _context["catch"](2);
104
+ return _context.abrupt("return", {
105
+ success: false,
106
+ commandId: meta.id,
107
+ error: _context.t0 instanceof Error ? _context.t0.message : String(_context.t0)
108
+ });
109
+ case 13:
110
+ case "end":
111
+ return _context.stop();
112
+ }
113
+ }, _callee, null, [[2, 10]]);
114
+ }));
115
+ function execute(_x, _x2) {
116
+ return _execute.apply(this, arguments);
117
+ }
118
+ return execute;
119
+ }()
120
+ };
121
+ }
122
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc0lucHV0U2NoZW1hIiwic2NoZW1hIiwidG9vbFRvQ29tbWFuZCIsInRvb2wiLCJtZXRhIiwiaWQiLCJuYW1lIiwiZGVzY3JpcHRpb24iLCJncm91cCIsImtleXdvcmRzIiwiaW5wdXRTY2hlbWEiLCJleGVjdXRlIiwiX2V4ZWN1dGUiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsImN0eCIsImlucHV0IiwiX3Jhd091dHB1dCRzdWNjZXNzIiwiX3JlZiIsIl9yZWYyIiwicmF3T3V0cHV0IiwidHJpbW1lZCIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJhYnJ1cHQiLCJzdWNjZXNzIiwiY29tbWFuZElkIiwiZXJyb3IiLCJ0b29sQ2FsbElkIiwic2lnbmFsIiwic2VudCIsInRvTW9kZWxPdXRwdXQiLCJvdXRwdXQiLCJtZXNzYWdlIiwidW5kZWZpbmVkIiwiZGF0YSIsIl90eXBlb2YyIiwiZGV0YWlscyIsInQwIiwiRXJyb3IiLCJTdHJpbmciLCJzdG9wIiwiX3giLCJfeDIiLCJhcHBseSIsImFyZ3VtZW50cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9jb21tYW5kLXdyYXBwZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbi8qKlxuICogR2VuZXJpYyB1dGlsaXR5IGZvciBjb252ZXJ0aW5nIGFuIGV4aXN0aW5nIEFJIFNESyB0b29sIGludG8gYSBzcWxyb29tc1xuICogYFJvb21Db21tYW5kYC4gS2VwdCBkZXBlbmRlbmN5LWxpZ2h0IChvbmx5IGB6b2RgICsgYFJvb21Db21tYW5kYCB0eXBlKSBzbyBpdFxuICogY2FuIGJlIHJldXNlZCBieSBhbnkgaW4tYnJvd3NlciBza2lsbCBzeXN0ZW0gdGhhdCB3YW50cyB0byBleHBvc2UgaXRzXG4gKiBleGlzdGluZyBBSSBTREsgdG9vbHMgYXMgY29tbWFuZHMgd2l0aG91dCByZXdyaXRpbmcgdGhlbS5cbiAqXG4gKiBUaGUgZGVtby1hcHAncyBvd24gY29tbWFuZCBmYWN0b3JpZXMgcmV0dXJuIGBSb29tQ29tbWFuZGAgZGlyZWN0bHkgKHByZWZlcnJlZFxuICogd2hlbiB5b3Ugb3duIHRoZSBjb21tYW5kIOKAlCBzZWUgYGJhc2VtYXAtY29tbWFuZC50c2AgZm9yIHRoZSByZWZlcmVuY2Ugc2hhcGUpLiBUaGlzXG4gKiB3cmFwcGVyIGlzIHRoZSBmYWxsYmFjayBwYXRoIGZvciBob3N0cyB0aGF0IGNhbm5vdCByZXdyaXRlIHRoZWlyIHRvb2xzOlxuICogaXQgZm9sZHMgdGhlIHRvb2wncyBgZXhlY3V0ZWAsIGBpbnB1dFNjaGVtYWAsIGFuZCBgdG9Nb2RlbE91dHB1dGAgKHRoZVxuICogdG9rZW4tdHJpbSBsb2dpYyB0aGUgQUkgU0RLIGFwcGxpZXMgYmV0d2VlbiB0b29sIGNhbGwgYW5kIG1vZGVsKSBpbnRvIGFcbiAqIHNpbmdsZSBgUm9vbUNvbW1hbmQuZXhlY3V0ZWAgc28gdGhlIHJlZ2lzdHJ5LXN0b3JlZCByZXN1bHQgYWxyZWFkeSBjYXJyaWVzXG4gKiB0aGUgbW9kZWwtZmFjaW5nIHN1YnNldC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7Um9vbUNvbW1hbmR9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHR5cGUge1pvZFR5cGV9IGZyb20gJ3pvZCc7XG5cbi8qKiBBIGJ1aWx0IEFJIFNESyB0b29sLCB0cmVhdGVkIGxvb3NlbHkgZm9yIGR5bmFtaWMgZGlzcGF0Y2guICovXG5leHBvcnQgdHlwZSBBbnlUb29sID0ge1xuICBleGVjdXRlPzogKGFyZ3M6IGFueSwgb3B0aW9uczogYW55KSA9PiBQcm9taXNlPGFueT47XG4gIHRvTW9kZWxPdXRwdXQ/OiAocGFyYW1zOiB7b3V0cHV0OiBhbnk7IHRvb2xDYWxsSWQ/OiBzdHJpbmd9KSA9PiBhbnk7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBpbnB1dFNjaGVtYT86IFpvZFR5cGU7XG59O1xuXG4vKiogTWV0YWRhdGEgdGhhdCB0aGUgQUkgU0RLIHRvb2wgZG9lcyBub3QgY2FycnkgYnV0IGEgYFJvb21Db21tYW5kYCByZXF1aXJlcy4gKi9cbmV4cG9ydCB0eXBlIENvbW1hbmRNZXRhID0ge1xuICAvKiogU3RhYmxlLCBuYW1lc3BhY2VkIGNvbW1hbmQgaWQsIGUuZy4gYG1hcC5zZXQtYmFzZW1hcGAuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBuYW1lIHNob3duIGluIHRoZSBjb21tYW5kIHBhbGV0dGUgLyBsaXN0aW5ncy4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgZ3JvdXBpbmcgbGFiZWwsIGUuZy4gYE1hcGAsIGBEYXRhYCwgYEdlb0RhYC4gKi9cbiAgZ3JvdXA/OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBzZWFyY2gga2V5d29yZHMuICovXG4gIGtleXdvcmRzPzogc3RyaW5nW107XG59O1xuXG4vKipcbiAqIENhc3QgYSBjb25jcmV0ZSB6b2Qgc2NoZW1hIChlLmcuIGB6Lm9iamVjdCh7Li4ufSlgLCB3aGljaCBpcyBgWm9kT2JqZWN0PC4uLj5gKVxuICogdG8gdGhlIGBab2RUeXBlPHVua25vd24+YCB0aGF0IGBSb29tQ29tbWFuZC5pbnB1dFNjaGVtYWAgZXhwZWN0cy4gVGhlXG4gKiBpbnN0YWxsZWQgem9kIGBab2RPYmplY3RgIGlzIG5vdCBzdHJ1Y3R1cmFsbHkgYXNzaWduYWJsZSB0byBzcWxyb29tcydcbiAqIGBab2RUeXBlPHVua25vd24+YCAoY292YXJpYW5jZSBvbiB0aGUgb3V0cHV0IHR5cGUpLCBzbyBhIGNhc3QgaXMgcmVxdWlyZWQgYXRcbiAqIHRoZSBhc3NpZ25tZW50IHNpdGUuIFRoaXMgaGVscGVyIGNlbnRyYWxpemVzIHRoYXQgY2FzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzSW5wdXRTY2hlbWEoc2NoZW1hOiBab2RUeXBlKTogWm9kVHlwZTx1bmtub3duPiB7XG4gIHJldHVybiBzY2hlbWEgYXMgdW5rbm93biBhcyBab2RUeXBlPHVua25vd24+O1xufVxuXG4vKipcbiAqIFdyYXAgYW4gZXhpc3RpbmcgQUkgU0RLIHRvb2wgYXMgYSBzcWxyb29tcyBgUm9vbUNvbW1hbmRgLiBUaGUgY29tbWFuZCdzXG4gKiBgZXhlY3V0ZWAgY2FsbHMgdGhlIHRvb2wncyBgZXhlY3V0ZWAgYW5kIHRoZW4gYXBwbGllcyB0aGUgdG9vbCdzXG4gKiBgdG9Nb2RlbE91dHB1dGAgKGlmIGFueSkgc28gdGhlIHRyaW1tZWQsIG1vZGVsLWZhY2luZyBzaGFwZSBpcyB3aGF0IHRoZVxuICogcmVnaXN0cnkgc3RvcmVzIGFuZCBkb3duc3RyZWFtIHN1cmZhY2VzIChBSSBza2lsbCwgcGFsZXR0ZSwgQ0xJLCBNQ1ApIHNlZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvb2xUb0NvbW1hbmQodG9vbDogQW55VG9vbCwgbWV0YTogQ29tbWFuZE1ldGEpOiBSb29tQ29tbWFuZCB7XG4gIHJldHVybiB7XG4gICAgaWQ6IG1ldGEuaWQsXG4gICAgbmFtZTogbWV0YS5uYW1lLFxuICAgIGRlc2NyaXB0aW9uOiB0b29sLmRlc2NyaXB0aW9uLFxuICAgIGdyb3VwOiBtZXRhLmdyb3VwLFxuICAgIGtleXdvcmRzOiBtZXRhLmtleXdvcmRzLFxuICAgIGlucHV0U2NoZW1hOiB0b29sLmlucHV0U2NoZW1hIGFzIGFueSxcbiAgICBleGVjdXRlOiBhc3luYyAoY3R4LCBpbnB1dCkgPT4ge1xuICAgICAgaWYgKCF0b29sLmV4ZWN1dGUgfHwgdHlwZW9mIHRvb2wuZXhlY3V0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGNvbW1hbmRJZDogbWV0YS5pZCxcbiAgICAgICAgICBlcnJvcjogJ1Rvb2wgaGFzIG5vIGV4ZWN1dGUgZnVuY3Rpb24uJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhyZWFkIHRoZSBjYWxsZXIncyBBYm9ydFNpZ25hbCB0aHJvdWdoIHNvIGhvc3RzIChXZWJNQ1AgLyBicmlkZ2UpXG4gICAgICAgIC8vIGNhbiBjYW5jZWwgbG9uZy1ydW5uaW5nIHdyYXBwZWQgdG9vbHMgd2hlbiB0aGUgYWdlbnQgYWJvcnRzLiBUb29sc1xuICAgICAgICAvLyB0aGF0IGRvbid0IHVzZSBhIHNpZ25hbCBpZ25vcmUgaXQuXG4gICAgICAgIGNvbnN0IHJhd091dHB1dCA9IGF3YWl0IHRvb2wuZXhlY3V0ZShpbnB1dCA/PyB7fSwge1xuICAgICAgICAgIHRvb2xDYWxsSWQ6IG1ldGEuaWQsXG4gICAgICAgICAgc2lnbmFsOiBjdHguc2lnbmFsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0cmltbWVkID1cbiAgICAgICAgICB0eXBlb2YgdG9vbC50b01vZGVsT3V0cHV0ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IHRvb2wudG9Nb2RlbE91dHB1dCh7b3V0cHV0OiByYXdPdXRwdXQsIHRvb2xDYWxsSWQ6IG1ldGEuaWR9KVxuICAgICAgICAgICAgOiByYXdPdXRwdXQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogcmF3T3V0cHV0Py5zdWNjZXNzID8/IHRydWUsXG4gICAgICAgICAgY29tbWFuZElkOiBtZXRhLmlkLFxuICAgICAgICAgIC8vIEEgc3RydWN0dXJlZCBmYWlsdXJlIChzdWNjZXNzOmZhbHNlKSB0aGF0IGRpZG4ndCB0aHJvdyBtdXN0IHN0aWxsXG4gICAgICAgICAgLy8gY2FycnkgYW4gZXJyb3IgbWVzc2FnZSDigJQgb3RoZXJ3aXNlIGNhbGxlcnMgc2VlIHtzdWNjZXNzOmZhbHNlLFxuICAgICAgICAgIC8vIGVycm9yOnVuZGVmaW5lZH0gYW5kIGRvd25zdHJlYW0gZm9ybWF0dGVycyBtaXNyZXBvcnQgaXQgYXMgYVxuICAgICAgICAgIC8vIHN1Y2Nlc3MuIE1hbnkgdG9vbC9yZXN1bHQgc2hhcGVzIChpbmNsdWRpbmcgUm9vbUNvbW1hbmRSZXN1bHQpXG4gICAgICAgICAgLy8gY2FycnkgdGhlIGZhaWx1cmUgaW4gYSBgbWVzc2FnZWAgZmllbGQgcmF0aGVyIHRoYW4gYGVycm9yYCwgc29cbiAgICAgICAgICAvLyBmYWxsIGJhY2sgdG8gdGhhdCBiZWZvcmUgdGhlIGdlbmVyaWMgbWVzc2FnZS5cbiAgICAgICAgICBlcnJvcjpcbiAgICAgICAgICAgIHJhd091dHB1dD8uc3VjY2VzcyA9PT0gZmFsc2VcbiAgICAgICAgICAgICAgPyAocmF3T3V0cHV0Py5lcnJvciBhcyBzdHJpbmcgfCB1bmRlZmluZWQpID8/XG4gICAgICAgICAgICAgICAgKHJhd091dHB1dD8ubWVzc2FnZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpID8/XG4gICAgICAgICAgICAgICAgJ1Rvb2wgZXhlY3V0aW9uIGZhaWxlZC4nXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGRhdGE6IHR5cGVvZiB0cmltbWVkID09PSAnb2JqZWN0JyAmJiB0cmltbWVkICE9PSBudWxsID8gdHJpbW1lZCA6IHtkZXRhaWxzOiB0cmltbWVkfVxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBjb21tYW5kSWQ6IG1ldGEuaWQsXG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBS0E7O0FBUUE7O0FBWUE7QUFD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