@kepler.gl/duckdb 3.3.0-alpha.5 → 3.3.0-alpha.6

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 (39) hide show
  1. package/dist/cjs/adapters/duckdb-wasm-adapter.js +258 -0
  2. package/dist/{components → cjs/components}/index.js +1 -1
  3. package/dist/cjs/components/monaco-editor.js +174 -0
  4. package/dist/cjs/components/preview-data-panel.js +127 -0
  5. package/dist/cjs/components/schema-panel.js +170 -0
  6. package/dist/cjs/components/sql-panel.js +395 -0
  7. package/dist/cjs/components/tree.js +90 -0
  8. package/dist/{index.js → cjs/index.js} +1 -1
  9. package/dist/{plugin.js → cjs/plugin.js} +1 -1
  10. package/dist/cjs/processors/data-processor.js +353 -0
  11. package/dist/cjs/table/duckdb-table-utils.js +668 -0
  12. package/dist/cjs/table/duckdb-table.js +479 -0
  13. package/dist/{table → cjs/table}/index.js +1 -1
  14. package/dist/cjs/utils/perf.js +46 -0
  15. package/dist/esm/adapters/duckdb-wasm-adapter.js +251 -0
  16. package/dist/esm/components/index.js +9 -0
  17. package/dist/esm/components/monaco-editor.js +167 -0
  18. package/dist/esm/components/preview-data-panel.js +120 -0
  19. package/dist/esm/components/schema-panel.js +164 -0
  20. package/dist/esm/components/sql-panel.js +388 -0
  21. package/dist/esm/components/tree.js +82 -0
  22. package/dist/esm/index.js +9 -0
  23. package/dist/esm/plugin.js +22 -0
  24. package/dist/esm/processors/data-processor.js +342 -0
  25. package/dist/esm/table/duckdb-table-utils.js +644 -0
  26. package/dist/esm/table/duckdb-table.js +474 -0
  27. package/dist/esm/table/index.js +5 -0
  28. package/dist/esm/utils/perf.js +40 -0
  29. package/package.json +21 -17
  30. package/dist/adapters/duckdb-wasm-adapter.js +0 -258
  31. package/dist/components/monaco-editor.js +0 -174
  32. package/dist/components/preview-data-panel.js +0 -127
  33. package/dist/components/schema-panel.js +0 -170
  34. package/dist/components/sql-panel.js +0 -395
  35. package/dist/components/tree.js +0 -90
  36. package/dist/processors/data-processor.js +0 -353
  37. package/dist/table/duckdb-table-utils.js +0 -668
  38. package/dist/table/duckdb-table.js +0 -479
  39. package/dist/utils/perf.js +0 -46
@@ -1,479 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _typeof3 = require("@babel/runtime/helpers/typeof");
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.restoreGeoarrowMetadata = exports.KeplerGlDuckDbTable = void 0;
9
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
12
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
14
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
15
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
16
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
17
- var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
18
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
19
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
20
- var arrow = _interopRequireWildcard(require("apache-arrow"));
21
- var _constants = require("@kepler.gl/constants");
22
- var _processors = require("@kepler.gl/processors");
23
- var _table = require("@kepler.gl/table");
24
- var _utils = require("@kepler.gl/utils");
25
- var _dataProcessor = require("../processors/data-processor");
26
- var _duckdbTableUtils = require("./duckdb-table-utils");
27
- var _duckdbTableUtils2 = require("../table/duckdb-table-utils");
28
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof3(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
29
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
30
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
31
- function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
32
- function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
33
- function _superPropGet(t, o, e, r) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } // SPDX-License-Identifier: MIT
34
- // Copyright contributors to the kepler.gl project
35
- // TODO use files from disk or url directly, without parsing by loaders and then ingection into DeckDb
36
-
37
- /**
38
- * Default DuckDb geometry columns created by ST_READ
39
- */
40
- var DUCKDB_GEOM_COLUMN = 'geom';
41
- var DUCKDB_WKB_COLUMN = 'wkb_geometry';
42
-
43
- /**
44
- Default column name for processed geojson in Kepler.
45
- Use this name to rename default 'geom' column from DuckDb
46
- in order to support Kepler maps saved before introduction of DuckDb plugin.
47
- */
48
- var KEPLER_GEOM_FROM_GEOJSON_COLUMN = '_geojson';
49
-
50
- /**
51
- * Names of columns that most likely contain binary wkb geometry
52
- */
53
- var SUGGESTED_GEOM_COLUMNS = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, KEPLER_GEOM_FROM_GEOJSON_COLUMN, _constants.GEOARROW_EXTENSIONS.WKB), DUCKDB_GEOM_COLUMN, _constants.GEOARROW_EXTENSIONS.WKB), "geometry", _constants.GEOARROW_EXTENSIONS.WKB);
54
- var KeplerGlDuckDbTable = exports.KeplerGlDuckDbTable = /*#__PURE__*/function (_KeplerTable) {
55
- function KeplerGlDuckDbTable(props) {
56
- (0, _classCallCheck2["default"])(this, KeplerGlDuckDbTable);
57
- return _callSuper(this, KeplerGlDuckDbTable, [props]);
58
- }
59
- (0, _inherits2["default"])(KeplerGlDuckDbTable, _KeplerTable);
60
- return (0, _createClass2["default"])(KeplerGlDuckDbTable, [{
61
- key: "importRowData",
62
- value: function () {
63
- var _importRowData = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(_ref) {
64
- var data, db, c, fields, rows, rowsForDb, columns, createTableSql;
65
- return _regenerator["default"].wrap(function _callee$(_context) {
66
- while (1) switch (_context.prev = _context.next) {
67
- case 0:
68
- data = _ref.data, db = _ref.db, c = _ref.c;
69
- _context.prev = 1;
70
- fields = data.fields, rows = data.rows; // DATASET_FORMATS.keplergl loads data as any[][] instead of [{}]
71
- // TODO potential memory usage explosion: original data, new object and then DuckDb table
72
- rowsForDb = Array.isArray(rows[0]) ? rows.map(function (row) {
73
- var newRow = {};
74
- row.forEach(function (value, index) {
75
- newRow[fields[index].name] = value;
76
- });
77
- return newRow;
78
- }) : rows;
79
- _context.next = 6;
80
- return db.registerFileText(this.id, JSON.stringify(rowsForDb));
81
- case 6:
82
- columns = fields.reduce(function (acc, field, index) {
83
- // @ts-expect-error TODO extend fields to contain duckDBColumnType
84
- return "".concat(acc).concat(index > 0 ? ',' : '', " '").concat(field.name, "': '").concat(field.duckDBColumnType, "'");
85
- }, '');
86
- createTableSql = "\n CREATE TABLE '".concat(this.label, "' AS\n SELECT *\n FROM read_json('").concat(this.id, "',\n columns = {").concat(columns, "});\n ");
87
- _context.next = 10;
88
- return c.query(createTableSql);
89
- case 10:
90
- _context.next = 16;
91
- break;
92
- case 12:
93
- _context.prev = 12;
94
- _context.t0 = _context["catch"](1);
95
- console.log('importRowData', _context.t0);
96
- throw _context.t0;
97
- case 16:
98
- case "end":
99
- return _context.stop();
100
- }
101
- }, _callee, this, [[1, 12]]);
102
- }));
103
- function importRowData(_x) {
104
- return _importRowData.apply(this, arguments);
105
- }
106
- return importRowData;
107
- }()
108
- }, {
109
- key: "importGeoJsonData",
110
- value: function () {
111
- var _importGeoJsonData = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2(_ref2) {
112
- var data, db, c, rows, createTableSql;
113
- return _regenerator["default"].wrap(function _callee2$(_context2) {
114
- while (1) switch (_context2.prev = _context2.next) {
115
- case 0:
116
- data = _ref2.data, db = _ref2.db, c = _ref2.c;
117
- _context2.prev = 1;
118
- rows = data.rows;
119
- _context2.next = 5;
120
- return db.registerFileText(this.id, JSON.stringify(rows));
121
- case 5:
122
- createTableSql = "\n install spatial;\n load spatial;\n CREATE TABLE '".concat(this.label, "' AS\n SELECT *\n FROM ST_READ('").concat(this.id, "', keep_wkb = TRUE);\n ALTER TABLE '").concat(this.label, "' RENAME '").concat(DUCKDB_WKB_COLUMN, "' TO '").concat(KEPLER_GEOM_FROM_GEOJSON_COLUMN, "';\n ");
123
- _context2.next = 8;
124
- return c.query(createTableSql);
125
- case 8:
126
- _context2.next = 14;
127
- break;
128
- case 10:
129
- _context2.prev = 10;
130
- _context2.t0 = _context2["catch"](1);
131
- console.error('importGeoJsonData', _context2.t0);
132
- throw _context2.t0;
133
- case 14:
134
- return _context2.abrupt("return", {
135
- // _geojson column is created from geometry with keep_wkb flag and contains valid WKB data.
136
- geoarrowMetadata: (0, _defineProperty2["default"])({}, KEPLER_GEOM_FROM_GEOJSON_COLUMN, _constants.GEOARROW_EXTENSIONS.WKB)
137
- });
138
- case 15:
139
- case "end":
140
- return _context2.stop();
141
- }
142
- }, _callee2, this, [[1, 10]]);
143
- }));
144
- function importGeoJsonData(_x2) {
145
- return _importGeoJsonData.apply(this, arguments);
146
- }
147
- return importGeoJsonData;
148
- }()
149
- }, {
150
- key: "importArrowData",
151
- value: function () {
152
- var _importArrowData = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3(_ref3) {
153
- var data, c, adjustedMetadata, arrowTable, setupSql;
154
- return _regenerator["default"].wrap(function _callee3$(_context3) {
155
- while (1) switch (_context3.prev = _context3.next) {
156
- case 0:
157
- data = _ref3.data, c = _ref3.c;
158
- adjustedMetadata = {};
159
- _context3.prev = 2;
160
- // 1) data.rows contains an arrow table created by Add to Map data from DuckDb query.
161
- // 2) arrow table is in cols & fields when a file is dragged & dropped into Add Data To Map dialog.
162
- arrowTable = (0, _utils.isArrowTable)(data.rows) ? data.rows : (0, _duckdbTableUtils2.restoreArrowTable)(data.cols || [], data.fields, data.arrowSchema); // remove unsupported extensions from an arrow table that throw exceptions in DuckDB.
163
- adjustedMetadata = (0, _duckdbTableUtils2.removeUnsupportedExtensions)(arrowTable);
164
- setupSql = "\n install spatial;\n load spatial;\n ";
165
- _context3.next = 8;
166
- return c.query(setupSql);
167
- case 8:
168
- _context3.next = 10;
169
- return c.insertArrowTable(arrowTable, {
170
- name: this.label
171
- });
172
- case 10:
173
- // restore unsupported extensions that throw exceptions in DuckDb
174
- (0, _duckdbTableUtils2.restoreUnsupportedExtensions)(arrowTable, adjustedMetadata);
175
- _context3.next = 17;
176
- break;
177
- case 13:
178
- _context3.prev = 13;
179
- _context3.t0 = _context3["catch"](2);
180
- // Known issues:
181
- // 1) Arrow Type with extension name: geoarrow.point and format: +w:2 is not currently supported in DuckDB.
182
- console.error('importArrowData', _context3.t0);
183
- throw _context3.t0;
184
- case 17:
185
- return _context3.abrupt("return", {
186
- geoarrowMetadata: _objectSpread(_objectSpread({}, SUGGESTED_GEOM_COLUMNS), adjustedMetadata),
187
- // use fields generated from the created arrow table
188
- useNewFields: true
189
- });
190
- case 18:
191
- case "end":
192
- return _context3.stop();
193
- }
194
- }, _callee3, this, [[2, 13]]);
195
- }));
196
- function importArrowData(_x3) {
197
- return _importArrowData.apply(this, arguments);
198
- }
199
- return importArrowData;
200
- }()
201
- /**
202
- * Creates a table from data, returns an arrow table with the data
203
- * @param data
204
- * @returns {Promise<{fields: Field[], cols: any[]}>}
205
- */
206
- }, {
207
- key: "createTableAndGetArrow",
208
- value: (function () {
209
- var _createTableAndGetArrow = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4(data) {
210
- var db, c, tableName, format, _data$rows, _data$rows2, _data$rows3, _data$cols, importDetails, fields, cols, _data$fields, _ref4, _ref4$geoarrowMetadat, geoarrowMetadata, _ref4$useNewFields, useNewFields, duckDbColumns, tableDuckDBTypes, adjustedQuery, arrowResult;
211
- return _regenerator["default"].wrap(function _callee4$(_context4) {
212
- while (1) switch (_context4.prev = _context4.next) {
213
- case 0:
214
- _context4.next = 2;
215
- return (0, _utils.getApplicationConfig)().database;
216
- case 2:
217
- db = _context4.sent;
218
- if (db) {
219
- _context4.next = 6;
220
- break;
221
- }
222
- console.error('The database is not configured properly.');
223
- return _context4.abrupt("return", {
224
- fields: [],
225
- cols: []
226
- });
227
- case 6:
228
- _context4.next = 8;
229
- return db.connect();
230
- case 8:
231
- c = _context4.sent;
232
- tableName = this.label;
233
- _context4.next = 12;
234
- return (0, _duckdbTableUtils2.dropTableIfExists)(c, tableName);
235
- case 12:
236
- format = this.metadata.format;
237
- if (!format) {
238
- // format is missing when we load Kepler.gl examples
239
- if (Array.isArray((_data$rows = data.rows) === null || _data$rows === void 0 ? void 0 : _data$rows[0]) || (0, _typeof2["default"])((_data$rows2 = data.rows) === null || _data$rows2 === void 0 ? void 0 : _data$rows2[0]) === 'object') {
240
- format = _constants.DATASET_FORMATS.row;
241
- } else if (((_data$rows3 = data.rows) === null || _data$rows3 === void 0 ? void 0 : _data$rows3.type) === 'FeatureCollection') {
242
- format = _constants.DATASET_FORMATS.geojson;
243
- } else if ((0, _utils.isArrowVector)((_data$cols = data.cols) === null || _data$cols === void 0 ? void 0 : _data$cols[0])) {
244
- format = _constants.DATASET_FORMATS.arrow;
245
- }
246
- }
247
- if (!(format === _constants.DATASET_FORMATS.row)) {
248
- _context4.next = 19;
249
- break;
250
- }
251
- _context4.next = 17;
252
- return this.importRowData({
253
- data: data,
254
- db: db,
255
- c: c
256
- });
257
- case 17:
258
- _context4.next = 32;
259
- break;
260
- case 19:
261
- if (!(format === _constants.DATASET_FORMATS.geojson)) {
262
- _context4.next = 25;
263
- break;
264
- }
265
- _context4.next = 22;
266
- return this.importGeoJsonData({
267
- data: data,
268
- db: db,
269
- c: c
270
- });
271
- case 22:
272
- importDetails = _context4.sent;
273
- _context4.next = 32;
274
- break;
275
- case 25:
276
- if (!(format === _constants.DATASET_FORMATS.arrow)) {
277
- _context4.next = 31;
278
- break;
279
- }
280
- _context4.next = 28;
281
- return this.importArrowData({
282
- data: data,
283
- db: db,
284
- c: c
285
- });
286
- case 28:
287
- importDetails = _context4.sent;
288
- _context4.next = 32;
289
- break;
290
- case 31:
291
- console.error('Unrecognized format', format);
292
- case 32:
293
- fields = [];
294
- cols = [];
295
- _context4.prev = 34;
296
- _ref4 = importDetails || {}, _ref4$geoarrowMetadat = _ref4.geoarrowMetadata, geoarrowMetadata = _ref4$geoarrowMetadat === void 0 ? {} : _ref4$geoarrowMetadat, _ref4$useNewFields = _ref4.useNewFields, useNewFields = _ref4$useNewFields === void 0 ? false : _ref4$useNewFields;
297
- _context4.next = 38;
298
- return (0, _duckdbTableUtils2.getDuckDBColumnTypes)(c, tableName);
299
- case 38:
300
- duckDbColumns = _context4.sent;
301
- tableDuckDBTypes = (0, _duckdbTableUtils2.getDuckDBColumnTypesMap)(duckDbColumns);
302
- adjustedQuery = (0, _duckdbTableUtils2.castDuckDBTypesForKepler)(tableName, duckDbColumns);
303
- _context4.next = 43;
304
- return c.query(adjustedQuery);
305
- case 43:
306
- arrowResult = _context4.sent;
307
- // TODO if format is an arrow table then just use the original one, instead of the new table from the query?
308
-
309
- restoreGeoarrowMetadata(arrowResult, geoarrowMetadata);
310
- fields = useNewFields ? (0, _processors.arrowSchemaToFields)(arrowResult, tableDuckDBTypes) : (_data$fields = data.fields) !== null && _data$fields !== void 0 ? _data$fields : (0, _processors.arrowSchemaToFields)(arrowResult, tableDuckDBTypes);
311
- cols = (0, _toConsumableArray2["default"])(Array(arrowResult.numCols).keys()).map(function (i) {
312
- return arrowResult.getChildAt(i);
313
- }).filter(function (col) {
314
- return col;
315
- });
316
- _context4.next = 53;
317
- break;
318
- case 49:
319
- _context4.prev = 49;
320
- _context4.t0 = _context4["catch"](34);
321
- console.error('DuckDB table: createTableAndGetArrow', _context4.t0);
322
- throw _context4.t0;
323
- case 53:
324
- _context4.next = 55;
325
- return c.close();
326
- case 55:
327
- return _context4.abrupt("return", {
328
- fields: fields,
329
- cols: cols
330
- });
331
- case 56:
332
- case "end":
333
- return _context4.stop();
334
- }
335
- }, _callee4, this, [[34, 49]]);
336
- }));
337
- function createTableAndGetArrow(_x4) {
338
- return _createTableAndGetArrow.apply(this, arguments);
339
- }
340
- return createTableAndGetArrow;
341
- }())
342
- }, {
343
- key: "importData",
344
- value: function () {
345
- var _importData = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5(_ref5) {
346
- var data, _yield$this$createTab, fields, cols;
347
- return _regenerator["default"].wrap(function _callee5$(_context5) {
348
- while (1) switch (_context5.prev = _context5.next) {
349
- case 0:
350
- data = _ref5.data;
351
- if (!(this.type === _constants.DatasetType.VECTOR_TILE)) {
352
- _context5.next = 4;
353
- break;
354
- }
355
- _superPropGet(KeplerGlDuckDbTable, "importData", this, 3)([{
356
- data: _objectSpread(_objectSpread({}, data), {}, {
357
- rows: []
358
- })
359
- }]);
360
- return _context5.abrupt("return");
361
- case 4:
362
- _context5.next = 6;
363
- return this.createTableAndGetArrow(data);
364
- case 6:
365
- _yield$this$createTab = _context5.sent;
366
- fields = _yield$this$createTab.fields;
367
- cols = _yield$this$createTab.cols;
368
- _superPropGet(KeplerGlDuckDbTable, "importData", this, 3)([{
369
- data: {
370
- fields: fields,
371
- cols: cols,
372
- rows: []
373
- }
374
- }]);
375
- case 10:
376
- case "end":
377
- return _context5.stop();
378
- }
379
- }, _callee5, this);
380
- }));
381
- function importData(_x5) {
382
- return _importData.apply(this, arguments);
383
- }
384
- return importData;
385
- }()
386
- }, {
387
- key: "update",
388
- value: function () {
389
- var _update = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6(data) {
390
- var _yield$this$createTab2, cols;
391
- return _regenerator["default"].wrap(function _callee6$(_context6) {
392
- while (1) switch (_context6.prev = _context6.next) {
393
- case 0:
394
- if (!(this.type === _constants.DatasetType.VECTOR_TILE)) {
395
- _context6.next = 3;
396
- break;
397
- }
398
- _superPropGet(KeplerGlDuckDbTable, "importData", this, 3)([{
399
- data: data
400
- }]);
401
- return _context6.abrupt("return", this);
402
- case 3:
403
- _context6.next = 5;
404
- return this.createTableAndGetArrow(data);
405
- case 5:
406
- _yield$this$createTab2 = _context6.sent;
407
- cols = _yield$this$createTab2.cols;
408
- return _context6.abrupt("return", _superPropGet(KeplerGlDuckDbTable, "update", this, 3)([{
409
- cols: cols,
410
- rows: [],
411
- fields: []
412
- }]));
413
- case 8:
414
- case "end":
415
- return _context6.stop();
416
- }
417
- }, _callee6, this);
418
- }));
419
- function update(_x6) {
420
- return _update.apply(this, arguments);
421
- }
422
- return update;
423
- }()
424
- }]);
425
- }(_table.KeplerTable);
426
- /**
427
- * Try to restore geoarrow metadata lost during DuckDb ingestion.
428
- * Note that this function can generate wrong geometry types.
429
- * @param arrowTable Arrow table to update.
430
- * @param geoarrowMetadata A map with field names that usually used to store geoarrow geometry.
431
- */
432
- (0, _defineProperty2["default"])(KeplerGlDuckDbTable, "getFileProcessor", function (data, inputFormat) {
433
- var processor;
434
- var format;
435
- if (inputFormat === _constants.DATASET_FORMATS.arrow || (0, _processors.isArrowData)(data)) {
436
- format = _constants.DATASET_FORMATS.arrow;
437
- processor = _processors.processArrowBatches;
438
- } else if (inputFormat === _constants.DATASET_FORMATS.keplergl || (0, _processors.isKeplerGlMap)(data)) {
439
- format = _constants.DATASET_FORMATS.keplergl;
440
- processor = _dataProcessor.processKeplerglJSONforDuckDb;
441
- } else if (inputFormat === _constants.DATASET_FORMATS.row || (0, _processors.isRowObject)(data)) {
442
- // csv file goes here
443
- format = _constants.DATASET_FORMATS.row;
444
- processor = _dataProcessor.processCsvRowObject; // directly import json object into duckdb-wasm
445
- } else if (inputFormat === _constants.DATASET_FORMATS.geojson || (0, _processors.isGeoJson)(data)) {
446
- format = _constants.DATASET_FORMATS.geojson;
447
- processor = _dataProcessor.processGeojson;
448
- }
449
- return {
450
- processor: processor,
451
- format: format
452
- };
453
- });
454
- (0, _defineProperty2["default"])(KeplerGlDuckDbTable, "getInputDataValidator", function () {
455
- // In DuckDB mode data is validated later during import.
456
- return function (d) {
457
- return d;
458
- };
459
- });
460
- var restoreGeoarrowMetadata = exports.restoreGeoarrowMetadata = function restoreGeoarrowMetadata(arrowTable, geoarrowMetadata) {
461
- arrowTable.schema.fields.forEach(function (f) {
462
- if (arrow.DataType.isBinary(f.type) && geoarrowMetadata[f.name]) {
463
- f.metadata.set(_constants.GEOARROW_METADATA_KEY, geoarrowMetadata[f.name]);
464
- } else if ((0, _duckdbTableUtils.isGeoArrowPoint)(f.type)) {
465
- f.metadata.set(_constants.GEOARROW_METADATA_KEY, _constants.GEOARROW_EXTENSIONS.POINT);
466
- } else if ((0, _duckdbTableUtils.isGeoArrowLineString)(f.type)) {
467
- f.metadata.set(_constants.GEOARROW_METADATA_KEY, _constants.GEOARROW_EXTENSIONS.LINESTRING);
468
- } else if ((0, _duckdbTableUtils.isGeoArrowPolygon)(f.type)) {
469
- f.metadata.set(_constants.GEOARROW_METADATA_KEY, _constants.GEOARROW_EXTENSIONS.POLYGON);
470
- } else if ((0, _duckdbTableUtils.isGeoArrowMultiPoint)(f.type)) {
471
- f.metadata.set(_constants.GEOARROW_METADATA_KEY, _constants.GEOARROW_EXTENSIONS.MULTIPOINT);
472
- } else if ((0, _duckdbTableUtils.isGeoArrowMultiLineString)(f.type)) {
473
- f.metadata.set(_constants.GEOARROW_METADATA_KEY, _constants.GEOARROW_EXTENSIONS.MULTILINESTRING);
474
- } else if ((0, _duckdbTableUtils.isGeoArrowMultiPolygon)(f.type)) {
475
- f.metadata.set(_constants.GEOARROW_METADATA_KEY, _constants.GEOARROW_EXTENSIONS.MULTIPOLYGON);
476
- }
477
- });
478
- };
479
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhcnJvdyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsIl9jb25zdGFudHMiLCJfcHJvY2Vzc29ycyIsIl90YWJsZSIsIl91dGlscyIsIl9kYXRhUHJvY2Vzc29yIiwiX2R1Y2tkYlRhYmxlVXRpbHMiLCJfZHVja2RiVGFibGVVdGlsczIiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJfdHlwZW9mMyIsImhhcyIsImdldCIsInNldCIsIl90IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwiX3N1cGVyUHJvcEdldCIsInAiLCJfZ2V0MiIsIkRVQ0tEQl9HRU9NX0NPTFVNTiIsIkRVQ0tEQl9XS0JfQ09MVU1OIiwiS0VQTEVSX0dFT01fRlJPTV9HRU9KU09OX0NPTFVNTiIsIlNVR0dFU1RFRF9HRU9NX0NPTFVNTlMiLCJHRU9BUlJPV19FWFRFTlNJT05TIiwiV0tCIiwiS2VwbGVyR2xEdWNrRGJUYWJsZSIsImV4cG9ydHMiLCJfS2VwbGVyVGFibGUiLCJwcm9wcyIsIl9jbGFzc0NhbGxDaGVjazIiLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsInZhbHVlIiwiX2ltcG9ydFJvd0RhdGEiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsIl9yZWYiLCJkYXRhIiwiZGIiLCJjIiwiZmllbGRzIiwicm93cyIsInJvd3NGb3JEYiIsImNvbHVtbnMiLCJjcmVhdGVUYWJsZVNxbCIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJBcnJheSIsImlzQXJyYXkiLCJtYXAiLCJyb3ciLCJuZXdSb3ciLCJpbmRleCIsIm5hbWUiLCJyZWdpc3RlckZpbGVUZXh0IiwiaWQiLCJKU09OIiwic3RyaW5naWZ5IiwicmVkdWNlIiwiYWNjIiwiZmllbGQiLCJjb25jYXQiLCJkdWNrREJDb2x1bW5UeXBlIiwibGFiZWwiLCJxdWVyeSIsInQwIiwiY29uc29sZSIsImxvZyIsInN0b3AiLCJpbXBvcnRSb3dEYXRhIiwiX3giLCJfaW1wb3J0R2VvSnNvbkRhdGEiLCJfY2FsbGVlMiIsIl9yZWYyIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwiZXJyb3IiLCJhYnJ1cHQiLCJnZW9hcnJvd01ldGFkYXRhIiwiaW1wb3J0R2VvSnNvbkRhdGEiLCJfeDIiLCJfaW1wb3J0QXJyb3dEYXRhIiwiX2NhbGxlZTMiLCJfcmVmMyIsImFkanVzdGVkTWV0YWRhdGEiLCJhcnJvd1RhYmxlIiwic2V0dXBTcWwiLCJfY2FsbGVlMyQiLCJfY29udGV4dDMiLCJpc0Fycm93VGFibGUiLCJyZXN0b3JlQXJyb3dUYWJsZSIsImNvbHMiLCJhcnJvd1NjaGVtYSIsInJlbW92ZVVuc3VwcG9ydGVkRXh0ZW5zaW9ucyIsImluc2VydEFycm93VGFibGUiLCJyZXN0b3JlVW5zdXBwb3J0ZWRFeHRlbnNpb25zIiwidXNlTmV3RmllbGRzIiwiaW1wb3J0QXJyb3dEYXRhIiwiX3gzIiwiX2NyZWF0ZVRhYmxlQW5kR2V0QXJyb3ciLCJfY2FsbGVlNCIsInRhYmxlTmFtZSIsImZvcm1hdCIsIl9kYXRhJHJvd3MiLCJfZGF0YSRyb3dzMiIsIl9kYXRhJHJvd3MzIiwiX2RhdGEkY29scyIsImltcG9ydERldGFpbHMiLCJfZGF0YSRmaWVsZHMiLCJfcmVmNCIsIl9yZWY0JGdlb2Fycm93TWV0YWRhdCIsIl9yZWY0JHVzZU5ld0ZpZWxkcyIsImR1Y2tEYkNvbHVtbnMiLCJ0YWJsZUR1Y2tEQlR5cGVzIiwiYWRqdXN0ZWRRdWVyeSIsImFycm93UmVzdWx0IiwiX2NhbGxlZTQkIiwiX2NvbnRleHQ0IiwiZ2V0QXBwbGljYXRpb25Db25maWciLCJkYXRhYmFzZSIsInNlbnQiLCJjb25uZWN0IiwiZHJvcFRhYmxlSWZFeGlzdHMiLCJtZXRhZGF0YSIsIl90eXBlb2YyIiwiREFUQVNFVF9GT1JNQVRTIiwidHlwZSIsImdlb2pzb24iLCJpc0Fycm93VmVjdG9yIiwiZ2V0RHVja0RCQ29sdW1uVHlwZXMiLCJnZXREdWNrREJDb2x1bW5UeXBlc01hcCIsImNhc3REdWNrREJUeXBlc0ZvcktlcGxlciIsInJlc3RvcmVHZW9hcnJvd01ldGFkYXRhIiwiYXJyb3dTY2hlbWFUb0ZpZWxkcyIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJudW1Db2xzIiwiZ2V0Q2hpbGRBdCIsImNvbCIsImNsb3NlIiwiY3JlYXRlVGFibGVBbmRHZXRBcnJvdyIsIl94NCIsIl9pbXBvcnREYXRhIiwiX2NhbGxlZTUiLCJfcmVmNSIsIl95aWVsZCR0aGlzJGNyZWF0ZVRhYiIsIl9jYWxsZWU1JCIsIl9jb250ZXh0NSIsIkRhdGFzZXRUeXBlIiwiVkVDVE9SX1RJTEUiLCJpbXBvcnREYXRhIiwiX3g1IiwiX3VwZGF0ZSIsIl9jYWxsZWU2IiwiX3lpZWxkJHRoaXMkY3JlYXRlVGFiMiIsIl9jYWxsZWU2JCIsIl9jb250ZXh0NiIsInVwZGF0ZSIsIl94NiIsIktlcGxlclRhYmxlIiwiaW5wdXRGb3JtYXQiLCJwcm9jZXNzb3IiLCJpc0Fycm93RGF0YSIsInByb2Nlc3NBcnJvd0JhdGNoZXMiLCJrZXBsZXJnbCIsImlzS2VwbGVyR2xNYXAiLCJwcm9jZXNzS2VwbGVyZ2xKU09OZm9yRHVja0RiIiwiaXNSb3dPYmplY3QiLCJwcm9jZXNzQ3N2Um93T2JqZWN0IiwiaXNHZW9Kc29uIiwicHJvY2Vzc0dlb2pzb24iLCJkIiwic2NoZW1hIiwiRGF0YVR5cGUiLCJpc0JpbmFyeSIsIkdFT0FSUk9XX01FVEFEQVRBX0tFWSIsImlzR2VvQXJyb3dQb2ludCIsIlBPSU5UIiwiaXNHZW9BcnJvd0xpbmVTdHJpbmciLCJMSU5FU1RSSU5HIiwiaXNHZW9BcnJvd1BvbHlnb24iLCJQT0xZR09OIiwiaXNHZW9BcnJvd011bHRpUG9pbnQiLCJNVUxUSVBPSU5UIiwiaXNHZW9BcnJvd011bHRpTGluZVN0cmluZyIsIk1VTFRJTElORVNUUklORyIsImlzR2VvQXJyb3dNdWx0aVBvbHlnb24iLCJNVUxUSVBPTFlHT04iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGFibGUvZHVja2RiLXRhYmxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCAqIGFzIGFycm93IGZyb20gJ2FwYWNoZS1hcnJvdyc7XG5cbmltcG9ydCB7XG4gIERhdGFzZXRUeXBlLFxuICBEQVRBU0VUX0ZPUk1BVFMsXG4gIEdFT0FSUk9XX0VYVEVOU0lPTlMsXG4gIEdFT0FSUk9XX01FVEFEQVRBX0tFWVxufSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBhcnJvd1NjaGVtYVRvRmllbGRzLFxuICBpc0Fycm93RGF0YSxcbiAgaXNHZW9Kc29uLFxuICBpc0tlcGxlckdsTWFwLFxuICBpc1Jvd09iamVjdCxcbiAgcHJvY2Vzc0Fycm93QmF0Y2hlc1xufSBmcm9tICdAa2VwbGVyLmdsL3Byb2Nlc3NvcnMnO1xuaW1wb3J0IHtLZXBsZXJUYWJsZX0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5pbXBvcnQge0ZpZWxkfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7XG4gIGdldEFwcGxpY2F0aW9uQ29uZmlnLFxuICBEYXRhYmFzZUFkYXB0ZXIsXG4gIERhdGFiYXNlQ29ubmVjdGlvbixcbiAgaXNBcnJvd1RhYmxlLFxuICBpc0Fycm93VmVjdG9yXG59IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuXG5pbXBvcnQge1xuICBwcm9jZXNzQ3N2Um93T2JqZWN0LFxuICBwcm9jZXNzR2VvanNvbixcbiAgcHJvY2Vzc0tlcGxlcmdsSlNPTmZvckR1Y2tEYixcbiAgUHJvY2Vzc29yUmVzdWx0XG59IGZyb20gJy4uL3Byb2Nlc3NvcnMvZGF0YS1wcm9jZXNzb3InO1xuXG5pbXBvcnQge1xuICBpc0dlb0Fycm93UG9pbnQsXG4gIGlzR2VvQXJyb3dMaW5lU3RyaW5nLFxuICBpc0dlb0Fycm93UG9seWdvbixcbiAgaXNHZW9BcnJvd011bHRpUG9pbnQsXG4gIGlzR2VvQXJyb3dNdWx0aUxpbmVTdHJpbmcsXG4gIGlzR2VvQXJyb3dNdWx0aVBvbHlnb25cbn0gZnJvbSAnLi9kdWNrZGItdGFibGUtdXRpbHMnO1xuXG5pbXBvcnQge1xuICBjYXN0RHVja0RCVHlwZXNGb3JLZXBsZXIsXG4gIGRyb3BUYWJsZUlmRXhpc3RzLFxuICBnZXREdWNrREJDb2x1bW5UeXBlcyxcbiAgZ2V0RHVja0RCQ29sdW1uVHlwZXNNYXAsXG4gIHJlbW92ZVVuc3VwcG9ydGVkRXh0ZW5zaW9ucyxcbiAgcmVzdG9yZUFycm93VGFibGUsXG4gIHJlc3RvcmVVbnN1cHBvcnRlZEV4dGVuc2lvbnNcbn0gZnJvbSAnLi4vdGFibGUvZHVja2RiLXRhYmxlLXV0aWxzJztcblxuLy8gVE9ETyB1c2UgZmlsZXMgZnJvbSBkaXNrIG9yIHVybCBkaXJlY3RseSwgd2l0aG91dCBwYXJzaW5nIGJ5IGxvYWRlcnMgYW5kIHRoZW4gaW5nZWN0aW9uIGludG8gRGVja0RiXG5cbi8qKlxuICogRGVmYXVsdCBEdWNrRGIgZ2VvbWV0cnkgY29sdW1ucyBjcmVhdGVkIGJ5IFNUX1JFQURcbiAqL1xuY29uc3QgRFVDS0RCX0dFT01fQ09MVU1OID0gJ2dlb20nO1xuY29uc3QgRFVDS0RCX1dLQl9DT0xVTU4gPSAnd2tiX2dlb21ldHJ5JztcblxuLyoqXG4gRGVmYXVsdCBjb2x1bW4gbmFtZSBmb3IgcHJvY2Vzc2VkIGdlb2pzb24gaW4gS2VwbGVyLlxuIFVzZSB0aGlzIG5hbWUgdG8gcmVuYW1lIGRlZmF1bHQgJ2dlb20nIGNvbHVtbiBmcm9tIER1Y2tEYlxuIGluIG9yZGVyIHRvIHN1cHBvcnQgS2VwbGVyIG1hcHMgc2F2ZWQgYmVmb3JlIGludHJvZHVjdGlvbiBvZiBEdWNrRGIgcGx1Z2luLlxuICovXG5jb25zdCBLRVBMRVJfR0VPTV9GUk9NX0dFT0pTT05fQ09MVU1OID0gJ19nZW9qc29uJztcblxuLyoqXG4gKiBOYW1lcyBvZiBjb2x1bW5zIHRoYXQgbW9zdCBsaWtlbHkgY29udGFpbiBiaW5hcnkgd2tiIGdlb21ldHJ5XG4gKi9cbmNvbnN0IFNVR0dFU1RFRF9HRU9NX0NPTFVNTlMgPSB7XG4gIFtLRVBMRVJfR0VPTV9GUk9NX0dFT0pTT05fQ09MVU1OXTogR0VPQVJST1dfRVhURU5TSU9OUy5XS0IsXG4gIFtEVUNLREJfR0VPTV9DT0xVTU5dOiBHRU9BUlJPV19FWFRFTlNJT05TLldLQixcbiAgZ2VvbWV0cnk6IEdFT0FSUk9XX0VYVEVOU0lPTlMuV0tCXG59O1xuXG50eXBlIEltcG9ydERhdGFUb0R1Y2tQcm9wcyA9IHtcbiAgZGF0YTogUHJvY2Vzc29yUmVzdWx0ICYge2Fycm93U2NoZW1hOiBhcnJvdy5TY2hlbWF9O1xuICBkYjogRGF0YWJhc2VBZGFwdGVyO1xuICBjOiBEYXRhYmFzZUNvbm5lY3Rpb247XG59O1xuXG50eXBlIEltcG9ydERhdGFUb0R1Y2tSZXN1bHQgPSB7XG4gIC8vIER1Y2tEYiBkcm9wcyBnZW9hcnJvdyBtZXRhZGF0YSwgc28gdHJ5IHRvIHByZXNlcnZlIGFuZCB0aGVuIHJlc3RvcmUgdGhlIGV4dGVuc2lvbiBuYW1lXG4gIGdlb2Fycm93TWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvLyBVc2UgZmllbGRzIGZyb20gYXJyb3cgdGFibGUgZXZlbiBpZiBmaWVsZHMgYXJlIHByb3ZpZGVkXG4gIHVzZU5ld0ZpZWxkcz86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgY2xhc3MgS2VwbGVyR2xEdWNrRGJUYWJsZSBleHRlbmRzIEtlcGxlclRhYmxlIHtcbiAgZGVjbGFyZSByZWFkb25seSBpZDogc3RyaW5nO1xuICBkZWNsYXJlIGxhYmVsOiBzdHJpbmc7XG4gIGRlY2xhcmUgdHlwZTogc3RyaW5nO1xuICBkZWNsYXJlIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG5cbiAgYXN5bmMgaW1wb3J0Um93RGF0YSh7ZGF0YSwgZGIsIGN9OiBJbXBvcnREYXRhVG9EdWNrUHJvcHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qge2ZpZWxkcywgcm93c30gPSBkYXRhO1xuXG4gICAgICAvLyBEQVRBU0VUX0ZPUk1BVFMua2VwbGVyZ2wgbG9hZHMgZGF0YSBhcyBhbnlbXVtdIGluc3RlYWQgb2YgW3t9XVxuICAgICAgLy8gVE9ETyBwb3RlbnRpYWwgbWVtb3J5IHVzYWdlIGV4cGxvc2lvbjogb3JpZ2luYWwgZGF0YSwgbmV3IG9iamVjdCBhbmQgdGhlbiBEdWNrRGIgdGFibGVcbiAgICAgIGNvbnN0IHJvd3NGb3JEYiA9IEFycmF5LmlzQXJyYXkocm93c1swXSlcbiAgICAgICAgPyByb3dzLm1hcChyb3cgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3Um93ID0ge307XG4gICAgICAgICAgICByb3cuZm9yRWFjaCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIG5ld1Jvd1tmaWVsZHNbaW5kZXhdLm5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBuZXdSb3c7XG4gICAgICAgICAgfSlcbiAgICAgICAgOiByb3dzO1xuXG4gICAgICBhd2FpdCBkYi5yZWdpc3RlckZpbGVUZXh0KHRoaXMuaWQsIEpTT04uc3RyaW5naWZ5KHJvd3NGb3JEYikpO1xuXG4gICAgICBjb25zdCBjb2x1bW5zID0gZmllbGRzLnJlZHVjZSgoYWNjLCBmaWVsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUT0RPIGV4dGVuZCBmaWVsZHMgdG8gY29udGFpbiBkdWNrREJDb2x1bW5UeXBlXG4gICAgICAgIHJldHVybiBgJHthY2N9JHtpbmRleCA+IDAgPyAnLCcgOiAnJ30gJyR7ZmllbGQubmFtZX0nOiAnJHtmaWVsZC5kdWNrREJDb2x1bW5UeXBlfSdgO1xuICAgICAgfSwgJycpO1xuXG4gICAgICBjb25zdCBjcmVhdGVUYWJsZVNxbCA9IGBcbiAgICAgICAgQ1JFQVRFIFRBQkxFICcke3RoaXMubGFiZWx9JyBBU1xuICAgICAgICBTRUxFQ1QgKlxuICAgICAgICBGUk9NIHJlYWRfanNvbignJHt0aGlzLmlkfScsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnMgPSB7JHtjb2x1bW5zfX0pO1xuICAgICAgYDtcbiAgICAgIGF3YWl0IGMucXVlcnkoY3JlYXRlVGFibGVTcWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZygnaW1wb3J0Um93RGF0YScsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGltcG9ydEdlb0pzb25EYXRhKHtkYXRhLCBkYiwgY306IEltcG9ydERhdGFUb0R1Y2tQcm9wcyk6IFByb21pc2U8SW1wb3J0RGF0YVRvRHVja1Jlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7cm93c30gPSBkYXRhO1xuICAgICAgYXdhaXQgZGIucmVnaXN0ZXJGaWxlVGV4dCh0aGlzLmlkLCBKU09OLnN0cmluZ2lmeShyb3dzKSk7XG5cbiAgICAgIGNvbnN0IGNyZWF0ZVRhYmxlU3FsID0gYFxuICAgICAgICBpbnN0YWxsIHNwYXRpYWw7XG4gICAgICAgIGxvYWQgc3BhdGlhbDtcbiAgICAgICAgQ1JFQVRFIFRBQkxFICcke3RoaXMubGFiZWx9JyBBU1xuICAgICAgICBTRUxFQ1QgKlxuICAgICAgICBGUk9NIFNUX1JFQUQoJyR7dGhpcy5pZH0nLCBrZWVwX3drYiA9IFRSVUUpO1xuICAgICAgICBBTFRFUiBUQUJMRSAnJHt0aGlzLmxhYmVsfScgUkVOQU1FICcke0RVQ0tEQl9XS0JfQ09MVU1OfScgVE8gJyR7S0VQTEVSX0dFT01fRlJPTV9HRU9KU09OX0NPTFVNTn0nO1xuICAgICAgYDtcblxuICAgICAgYXdhaXQgYy5xdWVyeShjcmVhdGVUYWJsZVNxbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ltcG9ydEdlb0pzb25EYXRhJywgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIF9nZW9qc29uIGNvbHVtbiBpcyBjcmVhdGVkIGZyb20gZ2VvbWV0cnkgd2l0aCBrZWVwX3drYiBmbGFnIGFuZCBjb250YWlucyB2YWxpZCBXS0IgZGF0YS5cbiAgICAgIGdlb2Fycm93TWV0YWRhdGE6IHtbS0VQTEVSX0dFT01fRlJPTV9HRU9KU09OX0NPTFVNTl06IEdFT0FSUk9XX0VYVEVOU0lPTlMuV0tCfVxuICAgIH07XG4gIH1cblxuICBhc3luYyBpbXBvcnRBcnJvd0RhdGEoe2RhdGEsIGN9OiBJbXBvcnREYXRhVG9EdWNrUHJvcHMpOiBQcm9taXNlPEltcG9ydERhdGFUb0R1Y2tSZXN1bHQ+IHtcbiAgICBsZXQgYWRqdXN0ZWRNZXRhZGF0YSA9IHt9O1xuICAgIHRyeSB7XG4gICAgICAvLyAxKSBkYXRhLnJvd3MgY29udGFpbnMgYW4gYXJyb3cgdGFibGUgY3JlYXRlZCBieSBBZGQgdG8gTWFwIGRhdGEgZnJvbSBEdWNrRGIgcXVlcnkuXG4gICAgICAvLyAyKSBhcnJvdyB0YWJsZSBpcyBpbiBjb2xzICYgZmllbGRzIHdoZW4gYSBmaWxlIGlzIGRyYWdnZWQgJiBkcm9wcGVkIGludG8gQWRkIERhdGEgVG8gTWFwIGRpYWxvZy5cbiAgICAgIGNvbnN0IGFycm93VGFibGUgPSBpc0Fycm93VGFibGUoZGF0YS5yb3dzKVxuICAgICAgICA/IGRhdGEucm93c1xuICAgICAgICA6IHJlc3RvcmVBcnJvd1RhYmxlKGRhdGEuY29scyB8fCBbXSwgZGF0YS5maWVsZHMsIGRhdGEuYXJyb3dTY2hlbWEpO1xuXG4gICAgICAvLyByZW1vdmUgdW5zdXBwb3J0ZWQgZXh0ZW5zaW9ucyBmcm9tIGFuIGFycm93IHRhYmxlIHRoYXQgdGhyb3cgZXhjZXB0aW9ucyBpbiBEdWNrREIuXG4gICAgICBhZGp1c3RlZE1ldGFkYXRhID0gcmVtb3ZlVW5zdXBwb3J0ZWRFeHRlbnNpb25zKGFycm93VGFibGUpO1xuXG4gICAgICBjb25zdCBzZXR1cFNxbCA9IGBcbiAgICAgICAgaW5zdGFsbCBzcGF0aWFsO1xuICAgICAgICBsb2FkIHNwYXRpYWw7XG4gICAgICBgO1xuICAgICAgYXdhaXQgYy5xdWVyeShzZXR1cFNxbCk7XG4gICAgICBhd2FpdCBjLmluc2VydEFycm93VGFibGUoYXJyb3dUYWJsZSwge25hbWU6IHRoaXMubGFiZWx9KTtcblxuICAgICAgLy8gcmVzdG9yZSB1bnN1cHBvcnRlZCBleHRlbnNpb25zIHRoYXQgdGhyb3cgZXhjZXB0aW9ucyBpbiBEdWNrRGJcbiAgICAgIHJlc3RvcmVVbnN1cHBvcnRlZEV4dGVuc2lvbnMoYXJyb3dUYWJsZSwgYWRqdXN0ZWRNZXRhZGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEtub3duIGlzc3VlczpcbiAgICAgIC8vIDEpIEFycm93IFR5cGUgd2l0aCBleHRlbnNpb24gbmFtZTogZ2VvYXJyb3cucG9pbnQgYW5kIGZvcm1hdDogK3c6MiBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBpbiBEdWNrREIuXG4gICAgICBjb25zb2xlLmVycm9yKCdpbXBvcnRBcnJvd0RhdGEnLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2VvYXJyb3dNZXRhZGF0YTogey4uLlNVR0dFU1RFRF9HRU9NX0NPTFVNTlMsIC4uLmFkanVzdGVkTWV0YWRhdGF9LFxuICAgICAgLy8gdXNlIGZpZWxkcyBnZW5lcmF0ZWQgZnJvbSB0aGUgY3JlYXRlZCBhcnJvdyB0YWJsZVxuICAgICAgdXNlTmV3RmllbGRzOiB0cnVlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdGFibGUgZnJvbSBkYXRhLCByZXR1cm5zIGFuIGFycm93IHRhYmxlIHdpdGggdGhlIGRhdGFcbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHJldHVybnMge1Byb21pc2U8e2ZpZWxkczogRmllbGRbXSwgY29sczogYW55W119Pn1cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVUYWJsZUFuZEdldEFycm93KGRhdGEpOiBQcm9taXNlPHtmaWVsZHM6IGFueVtdOyBjb2xzOiBhcnJvdy5WZWN0b3JbXX0+IHtcbiAgICBjb25zdCBkYiA9IGF3YWl0IGdldEFwcGxpY2F0aW9uQ29uZmlnKCkuZGF0YWJhc2U7XG4gICAgaWYgKCFkYikge1xuICAgICAgY29uc29sZS5lcnJvcignVGhlIGRhdGFiYXNlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LicpO1xuICAgICAgcmV0dXJuIHtmaWVsZHM6IFtdLCBjb2xzOiBbXX07XG4gICAgfVxuICAgIGNvbnN0IGMgPSBhd2FpdCBkYi5jb25uZWN0KCk7XG5cbiAgICBjb25zdCB0YWJsZU5hbWUgPSB0aGlzLmxhYmVsO1xuICAgIGF3YWl0IGRyb3BUYWJsZUlmRXhpc3RzKGMsIHRhYmxlTmFtZSk7XG5cbiAgICBsZXQgZm9ybWF0ID0gdGhpcy5tZXRhZGF0YS5mb3JtYXQ7XG4gICAgaWYgKCFmb3JtYXQpIHtcbiAgICAgIC8vIGZvcm1hdCBpcyBtaXNzaW5nIHdoZW4gd2UgbG9hZCBLZXBsZXIuZ2wgZXhhbXBsZXNcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEucm93cz8uWzBdKSB8fCB0eXBlb2YgZGF0YS5yb3dzPy5bMF0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvcm1hdCA9IERBVEFTRVRfRk9STUFUUy5yb3c7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEucm93cz8udHlwZSA9PT0gJ0ZlYXR1cmVDb2xsZWN0aW9uJykge1xuICAgICAgICBmb3JtYXQgPSBEQVRBU0VUX0ZPUk1BVFMuZ2VvanNvbjtcbiAgICAgIH0gZWxzZSBpZiAoaXNBcnJvd1ZlY3RvcihkYXRhLmNvbHM/LlswXSkpIHtcbiAgICAgICAgZm9ybWF0ID0gREFUQVNFVF9GT1JNQVRTLmFycm93O1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBpbXBvcnREZXRhaWxzOiBJbXBvcnREYXRhVG9EdWNrUmVzdWx0IHwgdW5kZWZpbmVkO1xuICAgIGlmIChmb3JtYXQgPT09IERBVEFTRVRfRk9STUFUUy5yb3cpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW1wb3J0Um93RGF0YSh7ZGF0YSwgZGIsIGN9KTtcbiAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gREFUQVNFVF9GT1JNQVRTLmdlb2pzb24pIHtcbiAgICAgIGltcG9ydERldGFpbHMgPSBhd2FpdCB0aGlzLmltcG9ydEdlb0pzb25EYXRhKHtkYXRhLCBkYiwgY30pO1xuICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSBEQVRBU0VUX0ZPUk1BVFMuYXJyb3cpIHtcbiAgICAgIGltcG9ydERldGFpbHMgPSBhd2FpdCB0aGlzLmltcG9ydEFycm93RGF0YSh7ZGF0YSwgZGIsIGN9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignVW5yZWNvZ25pemVkIGZvcm1hdCcsIGZvcm1hdCk7XG4gICAgfVxuXG4gICAgbGV0IGZpZWxkczogRmllbGRbXSA9IFtdO1xuICAgIGxldCBjb2xzOiBhcnJvdy5WZWN0b3JbXSA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHtnZW9hcnJvd01ldGFkYXRhID0ge30sIHVzZU5ld0ZpZWxkcyA9IGZhbHNlfSA9IGltcG9ydERldGFpbHMgfHwge307XG5cbiAgICAgIGNvbnN0IGR1Y2tEYkNvbHVtbnMgPSBhd2FpdCBnZXREdWNrREJDb2x1bW5UeXBlcyhjLCB0YWJsZU5hbWUpO1xuICAgICAgY29uc3QgdGFibGVEdWNrREJUeXBlcyA9IGdldER1Y2tEQkNvbHVtblR5cGVzTWFwKGR1Y2tEYkNvbHVtbnMpO1xuICAgICAgY29uc3QgYWRqdXN0ZWRRdWVyeSA9IGNhc3REdWNrREJUeXBlc0ZvcktlcGxlcih0YWJsZU5hbWUsIGR1Y2tEYkNvbHVtbnMpO1xuICAgICAgY29uc3QgYXJyb3dSZXN1bHQgPSBhd2FpdCBjLnF1ZXJ5KGFkanVzdGVkUXVlcnkpO1xuXG4gICAgICAvLyBUT0RPIGlmIGZvcm1hdCBpcyBhbiBhcnJvdyB0YWJsZSB0aGVuIGp1c3QgdXNlIHRoZSBvcmlnaW5hbCBvbmUsIGluc3RlYWQgb2YgdGhlIG5ldyB0YWJsZSBmcm9tIHRoZSBxdWVyeT9cblxuICAgICAgcmVzdG9yZUdlb2Fycm93TWV0YWRhdGEoYXJyb3dSZXN1bHQsIGdlb2Fycm93TWV0YWRhdGEpO1xuXG4gICAgICBmaWVsZHMgPSB1c2VOZXdGaWVsZHNcbiAgICAgICAgPyBhcnJvd1NjaGVtYVRvRmllbGRzKGFycm93UmVzdWx0LCB0YWJsZUR1Y2tEQlR5cGVzKVxuICAgICAgICA6IGRhdGEuZmllbGRzID8/IGFycm93U2NoZW1hVG9GaWVsZHMoYXJyb3dSZXN1bHQsIHRhYmxlRHVja0RCVHlwZXMpO1xuICAgICAgY29scyA9IFsuLi5BcnJheShhcnJvd1Jlc3VsdC5udW1Db2xzKS5rZXlzKCldXG4gICAgICAgIC5tYXAoaSA9PiBhcnJvd1Jlc3VsdC5nZXRDaGlsZEF0KGkpKVxuICAgICAgICAuZmlsdGVyKGNvbCA9PiBjb2wpIGFzIGFycm93LlZlY3RvcltdO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdEdWNrREIgdGFibGU6IGNyZWF0ZVRhYmxlQW5kR2V0QXJyb3cnLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBhd2FpdCBjLmNsb3NlKCk7XG5cbiAgICByZXR1cm4ge2ZpZWxkcywgY29sc307XG4gIH1cblxuICBhc3luYyBpbXBvcnREYXRhKHtkYXRhfToge2RhdGE6IFByb2Nlc3NvclJlc3VsdH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBWZWN0b3JUaWxlIGlzIGEgc3BlY2lhbCBjYXNlLCBpZ25vcmUgZm9yIG5vd1xuICAgIGlmICh0aGlzLnR5cGUgPT09IERhdGFzZXRUeXBlLlZFQ1RPUl9USUxFKSB7XG4gICAgICBzdXBlci5pbXBvcnREYXRhKHtkYXRhOiB7Li4uZGF0YSwgcm93czogW119fSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge2ZpZWxkcywgY29sc30gPSBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlQW5kR2V0QXJyb3coZGF0YSk7XG5cbiAgICBzdXBlci5pbXBvcnREYXRhKHtkYXRhOiB7ZmllbGRzLCBjb2xzLCByb3dzOiBbXX19KTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZShkYXRhKSB7XG4gICAgLy8gVmVjdG9yVGlsZSBpcyBhIHNwZWNpYWwgY2FzZSwgaWdub3JlIGZvciBub3dcbiAgICBpZiAodGhpcy50eXBlID09PSBEYXRhc2V0VHlwZS5WRUNUT1JfVElMRSkge1xuICAgICAgc3VwZXIuaW1wb3J0RGF0YSh7ZGF0YX0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgY29uc3Qge2NvbHN9ID0gYXdhaXQgdGhpcy5jcmVhdGVUYWJsZUFuZEdldEFycm93KGRhdGEpO1xuXG4gICAgcmV0dXJuIHN1cGVyLnVwZGF0ZSh7Y29scywgcm93czogW10sIGZpZWxkczogW119KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRGaWxlUHJvY2Vzc29yID0gZnVuY3Rpb24gKGRhdGE6IGFueSwgaW5wdXRGb3JtYXQ/OiBzdHJpbmcpIHtcbiAgICBsZXQgcHJvY2Vzc29yO1xuICAgIGxldCBmb3JtYXQ7XG4gICAgaWYgKGlucHV0Rm9ybWF0ID09PSBEQVRBU0VUX0ZPUk1BVFMuYXJyb3cgfHwgaXNBcnJvd0RhdGEoZGF0YSkpIHtcbiAgICAgIGZvcm1hdCA9IERBVEFTRVRfRk9STUFUUy5hcnJvdztcbiAgICAgIHByb2Nlc3NvciA9IHByb2Nlc3NBcnJvd0JhdGNoZXM7XG4gICAgfSBlbHNlIGlmIChpbnB1dEZvcm1hdCA9PT0gREFUQVNFVF9GT1JNQVRTLmtlcGxlcmdsIHx8IGlzS2VwbGVyR2xNYXAoZGF0YSkpIHtcbiAgICAgIGZvcm1hdCA9IERBVEFTRVRfRk9STUFUUy5rZXBsZXJnbDtcbiAgICAgIHByb2Nlc3NvciA9IHByb2Nlc3NLZXBsZXJnbEpTT05mb3JEdWNrRGI7XG4gICAgfSBlbHNlIGlmIChpbnB1dEZvcm1hdCA9PT0gREFUQVNFVF9GT1JNQVRTLnJvdyB8fCBpc1Jvd09iamVjdChkYXRhKSkge1xuICAgICAgLy8gY3N2IGZpbGUgZ29lcyBoZXJlXG4gICAgICBmb3JtYXQgPSBEQVRBU0VUX0ZPUk1BVFMucm93O1xuICAgICAgcHJvY2Vzc29yID0gcHJvY2Vzc0NzdlJvd09iamVjdDsgLy8gZGlyZWN0bHkgaW1wb3J0IGpzb24gb2JqZWN0IGludG8gZHVja2RiLXdhc21cbiAgICB9IGVsc2UgaWYgKGlucHV0Rm9ybWF0ID09PSBEQVRBU0VUX0ZPUk1BVFMuZ2VvanNvbiB8fCBpc0dlb0pzb24oZGF0YSkpIHtcbiAgICAgIGZvcm1hdCA9IERBVEFTRVRfRk9STUFUUy5nZW9qc29uO1xuICAgICAgcHJvY2Vzc29yID0gcHJvY2Vzc0dlb2pzb247XG4gICAgfVxuICAgIHJldHVybiB7cHJvY2Vzc29yLCBmb3JtYXR9O1xuICB9O1xuXG4gIHN0YXRpYyBnZXRJbnB1dERhdGFWYWxpZGF0b3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gSW4gRHVja0RCIG1vZGUgZGF0YSBpcyB2YWxpZGF0ZWQgbGF0ZXIgZHVyaW5nIGltcG9ydC5cbiAgICByZXR1cm4gZCA9PiBkO1xuICB9O1xufVxuXG4vKipcbiAqIFRyeSB0byByZXN0b3JlIGdlb2Fycm93IG1ldGFkYXRhIGxvc3QgZHVyaW5nIER1Y2tEYiBpbmdlc3Rpb24uXG4gKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBjYW4gZ2VuZXJhdGUgd3JvbmcgZ2VvbWV0cnkgdHlwZXMuXG4gKiBAcGFyYW0gYXJyb3dUYWJsZSBBcnJvdyB0YWJsZSB0byB1cGRhdGUuXG4gKiBAcGFyYW0gZ2VvYXJyb3dNZXRhZGF0YSBBIG1hcCB3aXRoIGZpZWxkIG5hbWVzIHRoYXQgdXN1YWxseSB1c2VkIHRvIHN0b3JlIGdlb2Fycm93IGdlb21ldHJ5LlxuICovXG5leHBvcnQgY29uc3QgcmVzdG9yZUdlb2Fycm93TWV0YWRhdGEgPSAoXG4gIGFycm93VGFibGU6IGFycm93LlRhYmxlLFxuICBnZW9hcnJvd01ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4pID0+IHtcbiAgYXJyb3dUYWJsZS5zY2hlbWEuZmllbGRzLmZvckVhY2goZiA9PiB7XG4gICAgaWYgKGFycm93LkRhdGFUeXBlLmlzQmluYXJ5KGYudHlwZSkgJiYgZ2VvYXJyb3dNZXRhZGF0YVtmLm5hbWVdKSB7XG4gICAgICBmLm1ldGFkYXRhLnNldChHRU9BUlJPV19NRVRBREFUQV9LRVksIGdlb2Fycm93TWV0YWRhdGFbZi5uYW1lXSk7XG4gICAgfSBlbHNlIGlmIChpc0dlb0Fycm93UG9pbnQoZi50eXBlKSkge1xuICAgICAgZi5tZXRhZGF0YS5zZXQoR0VPQVJST1dfTUVUQURBVEFfS0VZLCBHRU9BUlJPV19FWFRFTlNJT05TLlBPSU5UKTtcbiAgICB9IGVsc2UgaWYgKGlzR2VvQXJyb3dMaW5lU3RyaW5nKGYudHlwZSkpIHtcbiAgICAgIGYubWV0YWRhdGEuc2V0KEdFT0FSUk9XX01FVEFEQVRBX0tFWSwgR0VPQVJST1dfRVhURU5TSU9OUy5MSU5FU1RSSU5HKTtcbiAgICB9IGVsc2UgaWYgKGlzR2VvQXJyb3dQb2x5Z29uKGYudHlwZSkpIHtcbiAgICAgIGYubWV0YWRhdGEuc2V0KEdFT0FSUk9XX01FVEFEQVRBX0tFWSwgR0VPQVJST1dfRVhURU5TSU9OUy5QT0xZR09OKTtcbiAgICB9IGVsc2UgaWYgKGlzR2VvQXJyb3dNdWx0aVBvaW50KGYudHlwZSkpIHtcbiAgICAgIGYubWV0YWRhdGEuc2V0KEdFT0FSUk9XX01FVEFEQVRBX0tFWSwgR0VPQVJST1dfRVhURU5TSU9OUy5NVUxUSVBPSU5UKTtcbiAgICB9IGVsc2UgaWYgKGlzR2VvQXJyb3dNdWx0aUxpbmVTdHJpbmcoZi50eXBlKSkge1xuICAgICAgZi5tZXRhZGF0YS5zZXQoR0VPQVJST1dfTUVUQURBVEFfS0VZLCBHRU9BUlJPV19FWFRFTlNJT05TLk1VTFRJTElORVNUUklORyk7XG4gICAgfSBlbHNlIGlmIChpc0dlb0Fycm93TXVsdGlQb2x5Z29uKGYudHlwZSkpIHtcbiAgICAgIGYubWV0YWRhdGEuc2V0KEdFT0FSUk9XX01FVEFEQVRBX0tFWSwgR0VPQVJST1dfRVhURU5TSU9OUy5NVUxUSVBPTFlHT04pO1xuICAgIH1cbiAgfSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsS0FBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUMsVUFBQSxHQUFBRCxPQUFBO0FBTUEsSUFBQUUsV0FBQSxHQUFBRixPQUFBO0FBUUEsSUFBQUcsTUFBQSxHQUFBSCxPQUFBO0FBRUEsSUFBQUksTUFBQSxHQUFBSixPQUFBO0FBUUEsSUFBQUssY0FBQSxHQUFBTCxPQUFBO0FBT0EsSUFBQU0saUJBQUEsR0FBQU4sT0FBQTtBQVNBLElBQUFPLGtCQUFBLEdBQUFQLE9BQUE7QUFRcUMsU0FBQUQsd0JBQUFTLENBQUEsRUFBQUMsQ0FBQSw2QkFBQUMsT0FB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
@@ -1,46 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.logElapsedTime = void 0;
7
- // SPDX-License-Identifier: MIT
8
- // Copyright contributors to the kepler.gl project
9
-
10
- // git@github.com:holdenmatt/duckdb-wasm-kit.git
11
- var FgRed = '\x1b[31m';
12
- var ResetColors = '\x1b[0m';
13
-
14
- /**
15
- * Format a time interval between start/end timestamps.
16
- *
17
- * If no end time is given, use the current time.
18
- */
19
- var formatElapsedTime = function formatElapsedTime(label, start) {
20
- var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
21
- var endTime = end !== null && end !== void 0 ? end : performance.now();
22
- var elapsed = endTime - start;
23
- var timeString;
24
- switch (true) {
25
- case elapsed >= 1000:
26
- timeString = "".concat((elapsed / 1000).toFixed(1), "s");
27
- break;
28
- case elapsed >= 1:
29
- timeString = "".concat(elapsed.toFixed(0), "ms");
30
- break;
31
- default:
32
- timeString = "".concat(elapsed.toFixed(3), "ms");
33
- break;
34
- }
35
- var message = "".concat(FgRed, "[").concat(timeString, "] ").concat(ResetColors).concat(label);
36
- return message;
37
- };
38
-
39
- /**
40
- * Print the elapsed time to console.debug.
41
- */
42
- var logElapsedTime = exports.logElapsedTime = function logElapsedTime(label, start) {
43
- var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
44
- console.debug(formatElapsedTime(label, start, end));
45
- };
46
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGZ1JlZCIsIlJlc2V0Q29sb3JzIiwiZm9ybWF0RWxhcHNlZFRpbWUiLCJsYWJlbCIsInN0YXJ0IiwiZW5kIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiZW5kVGltZSIsInBlcmZvcm1hbmNlIiwibm93IiwiZWxhcHNlZCIsInRpbWVTdHJpbmciLCJjb25jYXQiLCJ0b0ZpeGVkIiwibWVzc2FnZSIsImxvZ0VsYXBzZWRUaW1lIiwiZXhwb3J0cyIsImNvbnNvbGUiLCJkZWJ1ZyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9wZXJmLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbi8vIGdpdEBnaXRodWIuY29tOmhvbGRlbm1hdHQvZHVja2RiLXdhc20ta2l0LmdpdFxuY29uc3QgRmdSZWQgPSAnXFx4MWJbMzFtJztcbmNvbnN0IFJlc2V0Q29sb3JzID0gJ1xceDFiWzBtJztcblxuLyoqXG4gKiBGb3JtYXQgYSB0aW1lIGludGVydmFsIGJldHdlZW4gc3RhcnQvZW5kIHRpbWVzdGFtcHMuXG4gKlxuICogSWYgbm8gZW5kIHRpbWUgaXMgZ2l2ZW4sIHVzZSB0aGUgY3VycmVudCB0aW1lLlxuICovXG5jb25zdCBmb3JtYXRFbGFwc2VkVGltZSA9IChcbiAgbGFiZWw6IHN0cmluZyxcbiAgc3RhcnQ6IG51bWJlcixcbiAgZW5kOiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGVuZFRpbWUgPSBlbmQgPz8gcGVyZm9ybWFuY2Uubm93KCk7XG4gIGNvbnN0IGVsYXBzZWQgPSBlbmRUaW1lIC0gc3RhcnQ7XG5cbiAgbGV0IHRpbWVTdHJpbmc6IHN0cmluZztcbiAgc3dpdGNoICh0cnVlKSB7XG4gICAgY2FzZSBlbGFwc2VkID49IDEwMDA6XG4gICAgICB0aW1lU3RyaW5nID0gYCR7KGVsYXBzZWQgLyAxMDAwKS50b0ZpeGVkKDEpfXNgO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBlbGFwc2VkID49IDE6XG4gICAgICB0aW1lU3RyaW5nID0gYCR7ZWxhcHNlZC50b0ZpeGVkKDApfW1zYDtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aW1lU3RyaW5nID0gYCR7ZWxhcHNlZC50b0ZpeGVkKDMpfW1zYDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IGAke0ZnUmVkfVske3RpbWVTdHJpbmd9XSAke1Jlc2V0Q29sb3JzfSR7bGFiZWx9YDtcbiAgcmV0dXJuIG1lc3NhZ2U7XG59O1xuXG4vKipcbiAqIFByaW50IHRoZSBlbGFwc2VkIHRpbWUgdG8gY29uc29sZS5kZWJ1Zy5cbiAqL1xuZXhwb3J0IGNvbnN0IGxvZ0VsYXBzZWRUaW1lID0gKFxuICBsYWJlbDogc3RyaW5nLFxuICBzdGFydDogbnVtYmVyLFxuICBlbmQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuKSA9PiB7XG4gIGNvbnNvbGUuZGVidWcoZm9ybWF0RWxhcHNlZFRpbWUobGFiZWwsIHN0YXJ0LCBlbmQpKTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7O0FBRUE7QUFDQSxJQUFNQSxLQUFLLEdBQUcsVUFBVTtBQUN4QixJQUFNQyxXQUFXLEdBQUcsU0FBUzs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQU1DLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBaUJBLENBQ3JCQyxLQUFhLEVBQ2JDLEtBQWEsRUFFRjtFQUFBLElBRFhDLEdBQXVCLEdBQUFDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHRSxTQUFTO0VBRW5DLElBQU1DLE9BQU8sR0FBR0osR0FBRyxhQUFIQSxHQUFHLGNBQUhBLEdBQUcsR0FBSUssV0FBVyxDQUFDQyxHQUFHLENBQUMsQ0FBQztFQUN4QyxJQUFNQyxPQUFPLEdBQUdILE9BQU8sR0FBR0wsS0FBSztFQUUvQixJQUFJUyxVQUFrQjtFQUN0QixRQUFRLElBQUk7SUFDVixLQUFLRCxPQUFPLElBQUksSUFBSTtNQUNsQkMsVUFBVSxNQUFBQyxNQUFBLENBQU0sQ0FBQ0YsT0FBTyxHQUFHLElBQUksRUFBRUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFHO01BQzlDO0lBQ0YsS0FBS0gsT0FBTyxJQUFJLENBQUM7TUFDZkMsVUFBVSxNQUFBQyxNQUFBLENBQU1GLE9BQU8sQ0FBQ0csT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFJO01BQ3RDO0lBQ0Y7TUFDRUYsVUFBVSxNQUFBQyxNQUFBLENBQU1GLE9BQU8sQ0FBQ0csT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFJO01BQ3RDO0VBQ0o7RUFFQSxJQUFNQyxPQUFPLE1BQUFGLE1BQUEsQ0FBTWQsS0FBSyxPQUFBYyxNQUFBLENBQUlELFVBQVUsUUFBQUMsTUFBQSxDQUFLYixXQUFXLEVBQUFhLE1BQUEsQ0FBR1gsS0FBSyxDQUFFO0VBQ2hFLE9BQU9hLE9BQU87QUFDaEIsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDTyxJQUFNQyxjQUFjLEdBQUFDLE9BQUEsQ0FBQUQsY0FBQSxHQUFHLFNBQWpCQSxjQUFjQSxDQUN6QmQsS0FBYSxFQUNiQyxLQUFhLEVBRVY7RUFBQSxJQURIQyxHQUF1QixHQUFBQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBR0UsU0FBUztFQUVuQ1csT0FBTyxDQUFDQyxLQUFLLENBQUNsQixpQkFBaUIsQ0FBQ0MsS0FBSyxFQUFFQyxLQUFLLEVBQUVDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JELENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=