@kepler.gl/duckdb 3.3.0-alpha.0 → 3.3.0-alpha.10

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 (40) 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} +2 -2
  10. package/dist/cjs/processors/data-processor.js +353 -0
  11. package/dist/cjs/table/duckdb-table-utils.js +670 -0
  12. package/dist/cjs/table/duckdb-table.js +482 -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 +645 -0
  26. package/dist/esm/table/duckdb-table.js +477 -0
  27. package/dist/esm/table/index.js +5 -0
  28. package/dist/esm/utils/perf.js +40 -0
  29. package/dist/table/duckdb-table-utils.d.ts +7 -0
  30. package/package.json +28 -24
  31. package/dist/adapters/duckdb-wasm-adapter.js +0 -259
  32. package/dist/components/monaco-editor.js +0 -175
  33. package/dist/components/preview-data-panel.js +0 -128
  34. package/dist/components/schema-panel.js +0 -171
  35. package/dist/components/sql-panel.js +0 -396
  36. package/dist/components/tree.js +0 -91
  37. package/dist/processors/data-processor.js +0 -353
  38. package/dist/table/duckdb-table-utils.js +0 -669
  39. package/dist/table/duckdb-table.js +0 -480
  40. package/dist/utils/perf.js +0 -46
@@ -0,0 +1,258 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.DuckDBWasmAdapter = void 0;
9
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
12
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
14
+ var _duckdbWasm = _interopRequireWildcard(require("@duckdb/duckdb-wasm"));
15
+ var duckdb = _duckdbWasm;
16
+ var _perf = require("../utils/perf");
17
+ 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" != _typeof(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); }
18
+ // SPDX-License-Identifier: MIT
19
+ // Copyright contributors to the kepler.gl project
20
+ var Connection = /*#__PURE__*/function () {
21
+ function Connection(connection) {
22
+ (0, _classCallCheck2["default"])(this, Connection);
23
+ (0, _defineProperty2["default"])(this, "connection", void 0);
24
+ this.connection = connection;
25
+ }
26
+ return (0, _createClass2["default"])(Connection, [{
27
+ key: "query",
28
+ value: function () {
29
+ var _query = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(statement) {
30
+ return _regenerator["default"].wrap(function _callee$(_context) {
31
+ while (1) switch (_context.prev = _context.next) {
32
+ case 0:
33
+ return _context.abrupt("return", this.connection.query(statement));
34
+ case 1:
35
+ case "end":
36
+ return _context.stop();
37
+ }
38
+ }, _callee, this);
39
+ }));
40
+ function query(_x) {
41
+ return _query.apply(this, arguments);
42
+ }
43
+ return query;
44
+ }()
45
+ }, {
46
+ key: "insertArrowTable",
47
+ value: function () {
48
+ var _insertArrowTable = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2(arrowTable, params) {
49
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
50
+ while (1) switch (_context2.prev = _context2.next) {
51
+ case 0:
52
+ _context2.next = 2;
53
+ return this.connection.insertArrowTable(arrowTable, params);
54
+ case 2:
55
+ case "end":
56
+ return _context2.stop();
57
+ }
58
+ }, _callee2, this);
59
+ }));
60
+ function insertArrowTable(_x2, _x3) {
61
+ return _insertArrowTable.apply(this, arguments);
62
+ }
63
+ return insertArrowTable;
64
+ }()
65
+ }, {
66
+ key: "close",
67
+ value: function () {
68
+ var _close = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
69
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
70
+ while (1) switch (_context3.prev = _context3.next) {
71
+ case 0:
72
+ _context3.next = 2;
73
+ return this.connection.close();
74
+ case 2:
75
+ case "end":
76
+ return _context3.stop();
77
+ }
78
+ }, _callee3, this);
79
+ }));
80
+ function close() {
81
+ return _close.apply(this, arguments);
82
+ }
83
+ return close;
84
+ }()
85
+ }]);
86
+ }();
87
+ var DuckDBWasmAdapter = exports.DuckDBWasmAdapter = /*#__PURE__*/function () {
88
+ function DuckDBWasmAdapter(options) {
89
+ (0, _classCallCheck2["default"])(this, DuckDBWasmAdapter);
90
+ (0, _defineProperty2["default"])(this, "duckDB", void 0);
91
+ // pass existing AsyncDuckDB object created elsewhere
92
+ if (options instanceof Promise || options instanceof _duckdbWasm.AsyncDuckDB) {
93
+ this.duckDB = options;
94
+ return;
95
+ }
96
+
97
+ // or create a new AsyncDuckDB object
98
+ var _ref = options || {},
99
+ _ref$debug = _ref.debug,
100
+ debug = _ref$debug === void 0 ? false : _ref$debug,
101
+ config = _ref.config;
102
+ this.duckDB = initializeDuckDbWasm(config, debug);
103
+ }
104
+ return (0, _createClass2["default"])(DuckDBWasmAdapter, [{
105
+ key: "connect",
106
+ value: function () {
107
+ var _connect = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4() {
108
+ var db, c;
109
+ return _regenerator["default"].wrap(function _callee4$(_context4) {
110
+ while (1) switch (_context4.prev = _context4.next) {
111
+ case 0:
112
+ _context4.next = 2;
113
+ return this.duckDB;
114
+ case 2:
115
+ db = _context4.sent;
116
+ _context4.next = 5;
117
+ return db.connect();
118
+ case 5:
119
+ c = _context4.sent;
120
+ return _context4.abrupt("return", new Connection(c));
121
+ case 7:
122
+ case "end":
123
+ return _context4.stop();
124
+ }
125
+ }, _callee4, this);
126
+ }));
127
+ function connect() {
128
+ return _connect.apply(this, arguments);
129
+ }
130
+ return connect;
131
+ }()
132
+ }, {
133
+ key: "registerFileText",
134
+ value: function () {
135
+ var _registerFileText = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5(filename, content) {
136
+ var db;
137
+ return _regenerator["default"].wrap(function _callee5$(_context5) {
138
+ while (1) switch (_context5.prev = _context5.next) {
139
+ case 0:
140
+ _context5.next = 2;
141
+ return this.duckDB;
142
+ case 2:
143
+ db = _context5.sent;
144
+ _context5.next = 5;
145
+ return db.registerFileText(filename, content);
146
+ case 5:
147
+ case "end":
148
+ return _context5.stop();
149
+ }
150
+ }, _callee5, this);
151
+ }));
152
+ function registerFileText(_x4, _x5) {
153
+ return _registerFileText.apply(this, arguments);
154
+ }
155
+ return registerFileText;
156
+ }()
157
+ }, {
158
+ key: "registerFileHandle",
159
+ value: function () {
160
+ var _registerFileHandle = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6(name, handle, protocol, directIO) {
161
+ var db;
162
+ return _regenerator["default"].wrap(function _callee6$(_context6) {
163
+ while (1) switch (_context6.prev = _context6.next) {
164
+ case 0:
165
+ _context6.next = 2;
166
+ return this.duckDB;
167
+ case 2:
168
+ db = _context6.sent;
169
+ _context6.next = 5;
170
+ return db.registerFileHandle(name, handle, protocol, directIO);
171
+ case 5:
172
+ case "end":
173
+ return _context6.stop();
174
+ }
175
+ }, _callee6, this);
176
+ }));
177
+ function registerFileHandle(_x6, _x7, _x8, _x9) {
178
+ return _registerFileHandle.apply(this, arguments);
179
+ }
180
+ return registerFileHandle;
181
+ }()
182
+ }]);
183
+ }();
184
+ /**
185
+ * Initialize DuckDB with a browser-specific Wasm bundle.
186
+ */
187
+ var initializeDuckDbWasm = /*#__PURE__*/function () {
188
+ var _ref2 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7(config, debug) {
189
+ var start, JSDELIVR_BUNDLES, bundle, worker_url, worker, logger, db, res, buffer, fileNameMatch;
190
+ return _regenerator["default"].wrap(function _callee7$(_context7) {
191
+ while (1) switch (_context7.prev = _context7.next) {
192
+ case 0:
193
+ start = performance.now(); // Select a bundle based on browser checks
194
+ JSDELIVR_BUNDLES = duckdb.getJsDelivrBundles();
195
+ _context7.next = 4;
196
+ return duckdb.selectBundle(JSDELIVR_BUNDLES);
197
+ case 4:
198
+ bundle = _context7.sent;
199
+ if (bundle.mainWorker) {
200
+ _context7.next = 7;
201
+ break;
202
+ }
203
+ throw new Error('Failed to initialize DuckDB');
204
+ case 7:
205
+ worker_url = URL.createObjectURL(new Blob(["importScripts(\"".concat(bundle.mainWorker, "\");")], {
206
+ type: 'text/javascript'
207
+ })); // Instantiate the async version of DuckDB-wasm
208
+ worker = new Worker(worker_url);
209
+ logger = debug ? new duckdb.ConsoleLogger() : new duckdb.VoidLogger();
210
+ db = new _duckdbWasm.AsyncDuckDB(logger, worker);
211
+ _context7.next = 13;
212
+ return db.instantiate(bundle.mainModule, bundle.pthreadWorker);
213
+ case 13:
214
+ URL.revokeObjectURL(worker_url);
215
+ if (!config) {
216
+ _context7.next = 28;
217
+ break;
218
+ }
219
+ if (!config.path) {
220
+ _context7.next = 26;
221
+ break;
222
+ }
223
+ _context7.next = 18;
224
+ return fetch(config.path);
225
+ case 18:
226
+ res = _context7.sent;
227
+ _context7.next = 21;
228
+ return res.arrayBuffer();
229
+ case 21:
230
+ buffer = _context7.sent;
231
+ fileNameMatch = config.path.match(/[^/]*$/);
232
+ if (fileNameMatch) {
233
+ config.path = fileNameMatch[0];
234
+ }
235
+ _context7.next = 26;
236
+ return db.registerFileBuffer(config.path, new Uint8Array(buffer));
237
+ case 26:
238
+ _context7.next = 28;
239
+ return db.open(config);
240
+ case 28:
241
+ if (debug) {
242
+ (0, _perf.logElapsedTime)('DuckDB initialized', start);
243
+ if (config) {
244
+ console.debug("DuckDbConfig: ".concat(JSON.stringify(config, null, 2)));
245
+ }
246
+ }
247
+ return _context7.abrupt("return", db);
248
+ case 30:
249
+ case "end":
250
+ return _context7.stop();
251
+ }
252
+ }, _callee7);
253
+ }));
254
+ return function initializeDuckDbWasm(_x0, _x1) {
255
+ return _ref2.apply(this, arguments);
256
+ };
257
+ }();
258
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZHVja2RiV2FzbSIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsImR1Y2tkYiIsIl9wZXJmIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiX3R5cGVvZiIsImhhcyIsImdldCIsInNldCIsIl90IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJDb25uZWN0aW9uIiwiY29ubmVjdGlvbiIsIl9jbGFzc0NhbGxDaGVjazIiLCJfZGVmaW5lUHJvcGVydHkyIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsInZhbHVlIiwiX3F1ZXJ5IiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJzdGF0ZW1lbnQiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiYWJydXB0IiwicXVlcnkiLCJzdG9wIiwiX3giLCJhcHBseSIsImFyZ3VtZW50cyIsIl9pbnNlcnRBcnJvd1RhYmxlIiwiX2NhbGxlZTIiLCJhcnJvd1RhYmxlIiwicGFyYW1zIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwiaW5zZXJ0QXJyb3dUYWJsZSIsIl94MiIsIl94MyIsIl9jbG9zZSIsIl9jYWxsZWUzIiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwiY2xvc2UiLCJEdWNrREJXYXNtQWRhcHRlciIsImV4cG9ydHMiLCJvcHRpb25zIiwiUHJvbWlzZSIsIkFzeW5jRHVja0RCIiwiZHVja0RCIiwiX3JlZiIsIl9yZWYkZGVidWciLCJkZWJ1ZyIsImNvbmZpZyIsImluaXRpYWxpemVEdWNrRGJXYXNtIiwiX2Nvbm5lY3QiLCJfY2FsbGVlNCIsImRiIiwiYyIsIl9jYWxsZWU0JCIsIl9jb250ZXh0NCIsInNlbnQiLCJjb25uZWN0IiwiX3JlZ2lzdGVyRmlsZVRleHQiLCJfY2FsbGVlNSIsImZpbGVuYW1lIiwiY29udGVudCIsIl9jYWxsZWU1JCIsIl9jb250ZXh0NSIsInJlZ2lzdGVyRmlsZVRleHQiLCJfeDQiLCJfeDUiLCJfcmVnaXN0ZXJGaWxlSGFuZGxlIiwiX2NhbGxlZTYiLCJuYW1lIiwiaGFuZGxlIiwicHJvdG9jb2wiLCJkaXJlY3RJTyIsIl9jYWxsZWU2JCIsIl9jb250ZXh0NiIsInJlZ2lzdGVyRmlsZUhhbmRsZSIsIl94NiIsIl94NyIsIl94OCIsIl94OSIsIl9yZWYyIiwiX2NhbGxlZTciLCJzdGFydCIsIkpTREVMSVZSX0JVTkRMRVMiLCJidW5kbGUiLCJ3b3JrZXJfdXJsIiwid29ya2VyIiwibG9nZ2VyIiwicmVzIiwiYnVmZmVyIiwiZmlsZU5hbWVNYXRjaCIsIl9jYWxsZWU3JCIsIl9jb250ZXh0NyIsInBlcmZvcm1hbmNlIiwibm93IiwiZ2V0SnNEZWxpdnJCdW5kbGVzIiwic2VsZWN0QnVuZGxlIiwibWFpbldvcmtlciIsIkVycm9yIiwiVVJMIiwiY3JlYXRlT2JqZWN0VVJMIiwiQmxvYiIsImNvbmNhdCIsInR5cGUiLCJXb3JrZXIiLCJDb25zb2xlTG9nZ2VyIiwiVm9pZExvZ2dlciIsImluc3RhbnRpYXRlIiwibWFpbk1vZHVsZSIsInB0aHJlYWRXb3JrZXIiLCJyZXZva2VPYmplY3RVUkwiLCJwYXRoIiwiZmV0Y2giLCJhcnJheUJ1ZmZlciIsIm1hdGNoIiwicmVnaXN0ZXJGaWxlQnVmZmVyIiwiVWludDhBcnJheSIsIm9wZW4iLCJsb2dFbGFwc2VkVGltZSIsImNvbnNvbGUiLCJKU09OIiwic3RyaW5naWZ5IiwiX3gwIiwiX3gxIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2R1Y2tkYi13YXNtLWFkYXB0ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0ICogYXMgYXJyb3cgZnJvbSAnYXBhY2hlLWFycm93JztcbmltcG9ydCAqIGFzIGR1Y2tkYiBmcm9tICdAZHVja2RiL2R1Y2tkYi13YXNtJztcbmltcG9ydCB7QXN5bmNEdWNrREIsIER1Y2tEQkNvbmZpZywgQXN5bmNEdWNrREJDb25uZWN0aW9ufSBmcm9tICdAZHVja2RiL2R1Y2tkYi13YXNtJztcblxuaW1wb3J0IHtEYXRhYmFzZUFkYXB0ZXIsIERhdGFiYXNlQ29ubmVjdGlvbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmltcG9ydCB7bG9nRWxhcHNlZFRpbWV9IGZyb20gJy4uL3V0aWxzL3BlcmYnO1xuXG5jbGFzcyBDb25uZWN0aW9uIGltcGxlbWVudHMgRGF0YWJhc2VDb25uZWN0aW9uIHtcbiAgcHJpdmF0ZSBjb25uZWN0aW9uOiBBc3luY0R1Y2tEQkNvbm5lY3Rpb247XG5cbiAgY29uc3RydWN0b3IoY29ubmVjdGlvbjogQXN5bmNEdWNrREJDb25uZWN0aW9uKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgfVxuXG4gIGFzeW5jIHF1ZXJ5KHN0YXRlbWVudDogc3RyaW5nKTogUHJvbWlzZTxhcnJvdy5UYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24ucXVlcnkoc3RhdGVtZW50KTtcbiAgfVxuXG4gIGFzeW5jIGluc2VydEFycm93VGFibGUoYXJyb3dUYWJsZTogYXJyb3cuVGFibGUsIHBhcmFtczoge25hbWU6IHN0cmluZ30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uaW5zZXJ0QXJyb3dUYWJsZShhcnJvd1RhYmxlLCBwYXJhbXMpO1xuICB9XG5cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLmNsb3NlKCk7XG4gIH1cbn1cblxudHlwZSBEdWNrREJXYXNtQWRhcHRlclByb3BzID1cbiAgfCB7XG4gICAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgICBjb25maWc/OiBEdWNrREJDb25maWc7XG4gICAgfVxuICB8IFByb21pc2U8QXN5bmNEdWNrREI+O1xuXG5leHBvcnQgY2xhc3MgRHVja0RCV2FzbUFkYXB0ZXIgaW1wbGVtZW50cyBEYXRhYmFzZUFkYXB0ZXIge1xuICBwcml2YXRlIGR1Y2tEQjogUHJvbWlzZTxBc3luY0R1Y2tEQj47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRHVja0RCV2FzbUFkYXB0ZXJQcm9wcykge1xuICAgIC8vIHBhc3MgZXhpc3RpbmcgQXN5bmNEdWNrREIgb2JqZWN0IGNyZWF0ZWQgZWxzZXdoZXJlXG4gICAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBQcm9taXNlIHx8IG9wdGlvbnMgaW5zdGFuY2VvZiBBc3luY0R1Y2tEQikge1xuICAgICAgdGhpcy5kdWNrREIgPSBvcHRpb25zIGFzIGFueTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBvciBjcmVhdGUgYSBuZXcgQXN5bmNEdWNrREIgb2JqZWN0XG4gICAgY29uc3Qge2RlYnVnID0gZmFsc2UsIGNvbmZpZ30gPSBvcHRpb25zIHx8IHt9O1xuICAgIHRoaXMuZHVja0RCID0gaW5pdGlhbGl6ZUR1Y2tEYldhc20oY29uZmlnLCBkZWJ1Zyk7XG4gIH1cblxuICBhc3luYyBjb25uZWN0KCkge1xuICAgIGNvbnN0IGRiID0gYXdhaXQgdGhpcy5kdWNrREI7XG4gICAgY29uc3QgYyA9IGF3YWl0IGRiLmNvbm5lY3QoKTtcbiAgICByZXR1cm4gbmV3IENvbm5lY3Rpb24oYyk7XG4gIH1cblxuICBhc3luYyByZWdpc3RlckZpbGVUZXh0KGZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnQpIHtcbiAgICBjb25zdCBkYiA9IGF3YWl0IHRoaXMuZHVja0RCO1xuICAgIGF3YWl0IGRiLnJlZ2lzdGVyRmlsZVRleHQoZmlsZW5hbWUsIGNvbnRlbnQpO1xuICB9XG5cbiAgYXN5bmMgcmVnaXN0ZXJGaWxlSGFuZGxlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBoYW5kbGU6IGFueSxcbiAgICBwcm90b2NvbDogZHVja2RiLkR1Y2tEQkRhdGFQcm90b2NvbCxcbiAgICBkaXJlY3RJTzogYm9vbGVhblxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkYiA9IGF3YWl0IHRoaXMuZHVja0RCO1xuICAgIGF3YWl0IGRiLnJlZ2lzdGVyRmlsZUhhbmRsZShuYW1lLCBoYW5kbGUsIHByb3RvY29sLCBkaXJlY3RJTyk7XG4gIH1cbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIER1Y2tEQiB3aXRoIGEgYnJvd3Nlci1zcGVjaWZpYyBXYXNtIGJ1bmRsZS5cbiAqL1xuY29uc3QgaW5pdGlhbGl6ZUR1Y2tEYldhc20gPSBhc3luYyAoXG4gIGNvbmZpZz86IER1Y2tEQkNvbmZpZyxcbiAgZGVidWc/OiBib29sZWFuXG4pOiBQcm9taXNlPEFzeW5jRHVja0RCPiA9PiB7XG4gIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgLy8gU2VsZWN0IGEgYnVuZGxlIGJhc2VkIG9uIGJyb3dzZXIgY2hlY2tzXG4gIGNvbnN0IEpTREVMSVZSX0JVTkRMRVMgPSBkdWNrZGIuZ2V0SnNEZWxpdnJCdW5kbGVzKCk7XG4gIGNvbnN0IGJ1bmRsZSA9IGF3YWl0IGR1Y2tkYi5zZWxlY3RCdW5kbGUoSlNERUxJVlJfQlVORExFUyk7XG4gIGlmICghYnVuZGxlLm1haW5Xb3JrZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIER1Y2tEQicpO1xuICB9XG5cbiAgY29uc3Qgd29ya2VyX3VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoXG4gICAgbmV3IEJsb2IoW2BpbXBvcnRTY3JpcHRzKFwiJHtidW5kbGUubWFpbldvcmtlcn1cIik7YF0sIHtcbiAgICAgIHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnXG4gICAgfSlcbiAgKTtcblxuICAvLyBJbnN0YW50aWF0ZSB0aGUgYXN5bmMgdmVyc2lvbiBvZiBEdWNrREItd2FzbVxuICBjb25zdCB3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlcl91cmwpO1xuICBjb25zdCBsb2dnZXIgPSBkZWJ1ZyA/IG5ldyBkdWNrZGIuQ29uc29sZUxvZ2dlcigpIDogbmV3IGR1Y2tkYi5Wb2lkTG9nZ2VyKCk7XG4gIGNvbnN0IGRiID0gbmV3IEFzeW5jRHVja0RCKGxvZ2dlciwgd29ya2VyKTtcbiAgYXdhaXQgZGIuaW5zdGFudGlhdGUoYnVuZGxlLm1haW5Nb2R1bGUsIGJ1bmRsZS5wdGhyZWFkV29ya2VyKTtcbiAgVVJMLnJldm9rZU9iamVjdFVSTCh3b3JrZXJfdXJsKTtcblxuICBpZiAoY29uZmlnKSB7XG4gICAgaWYgKGNvbmZpZy5wYXRoKSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChjb25maWcucGF0aCk7XG4gICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCByZXMuYXJyYXlCdWZmZXIoKTtcbiAgICAgIGNvbnN0IGZpbGVOYW1lTWF0Y2ggPSBjb25maWcucGF0aC5tYXRjaCgvW14vXSokLyk7XG4gICAgICBpZiAoZmlsZU5hbWVNYXRjaCkge1xuICAgICAgICBjb25maWcucGF0aCA9IGZpbGVOYW1lTWF0Y2hbMF07XG4gICAgICB9XG4gICAgICBhd2FpdCBkYi5yZWdpc3RlckZpbGVCdWZmZXIoY29uZmlnLnBhdGgsIG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpO1xuICAgIH1cbiAgICBhd2FpdCBkYi5vcGVuKGNvbmZpZyk7XG4gIH1cblxuICBpZiAoZGVidWcpIHtcbiAgICBsb2dFbGFwc2VkVGltZSgnRHVja0RCIGluaXRpYWxpemVkJywgc3RhcnQpO1xuICAgIGlmIChjb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYER1Y2tEYkNvbmZpZzogJHtKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGI7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBSUEsSUFBQUEsV0FBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FB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
@@ -57,4 +57,4 @@ var _schemaPanel = require("./schema-panel");
57
57
  var _previewDataPanel = require("./preview-data-panel");
58
58
  var _tree = require("./tree");
59
59
  var _monacoEditor = _interopRequireDefault(require("./monaco-editor"));
60
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3FsUGFuZWwiLCJyZXF1aXJlIiwiX3NjaGVtYVBhbmVsIiwiX3ByZXZpZXdEYXRhUGFuZWwiLCJfdHJlZSIsIl9tb25hY29FZGl0b3IiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvaW5kZXgudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmV4cG9ydCB7U3FsUGFuZWx9IGZyb20gJy4vc3FsLXBhbmVsJztcbmV4cG9ydCB7U2NoZW1hUGFuZWwsIFNjaGVtYVBhbmVsRHJvcE1lc3NhZ2V9IGZyb20gJy4vc2NoZW1hLXBhbmVsJztcbmV4cG9ydCB7UHJldmlld0RhdGFQYW5lbH0gZnJvbSAnLi9wcmV2aWV3LWRhdGEtcGFuZWwnO1xuZXhwb3J0IHtUcmVlLCBEYXRhc2V0Tm9kZSwgQ29sdW1uTm9kZX0gZnJvbSAnLi90cmVlJztcbmV4cG9ydCB7ZGVmYXVsdCBhcyBNb25hY29FZGl0b3J9IGZyb20gJy4vbW9uYWNvLWVkaXRvcic7XG5cbmV4cG9ydCB0eXBlIHtTY2hlbWFTdWdnZXN0aW9ufSBmcm9tICcuL3NjaGVtYS1wYW5lbCc7XG5leHBvcnQgdHlwZSB7UHJldmlld0RhdGFQYW5lbFByb3BzLCBRdWVyeVJlc3VsdCwgRGF0YVRhYmxlU3R5bGV9IGZyb20gJy4vcHJldmlldy1kYXRhLXBhbmVsJztcbmV4cG9ydCB0eXBlIHtUcmVlTm9kZURhdGEsIFRyZWVOb2RlUHJvcHMsIFRyZWVQcm9wc30gZnJvbSAnLi90cmVlJztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsU0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsWUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsaUJBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLEtBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLGFBQUEsR0FBQUMsc0JBQUEsQ0FBQUwsT0FBQSIsImlnbm9yZUxpc3QiOltdfQ==
60
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3FsUGFuZWwiLCJyZXF1aXJlIiwiX3NjaGVtYVBhbmVsIiwiX3ByZXZpZXdEYXRhUGFuZWwiLCJfdHJlZSIsIl9tb25hY29FZGl0b3IiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvaW5kZXgudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmV4cG9ydCB7U3FsUGFuZWx9IGZyb20gJy4vc3FsLXBhbmVsJztcbmV4cG9ydCB7U2NoZW1hUGFuZWwsIFNjaGVtYVBhbmVsRHJvcE1lc3NhZ2V9IGZyb20gJy4vc2NoZW1hLXBhbmVsJztcbmV4cG9ydCB7UHJldmlld0RhdGFQYW5lbH0gZnJvbSAnLi9wcmV2aWV3LWRhdGEtcGFuZWwnO1xuZXhwb3J0IHtUcmVlLCBEYXRhc2V0Tm9kZSwgQ29sdW1uTm9kZX0gZnJvbSAnLi90cmVlJztcbmV4cG9ydCB7ZGVmYXVsdCBhcyBNb25hY29FZGl0b3J9IGZyb20gJy4vbW9uYWNvLWVkaXRvcic7XG5cbmV4cG9ydCB0eXBlIHtTY2hlbWFTdWdnZXN0aW9ufSBmcm9tICcuL3NjaGVtYS1wYW5lbCc7XG5leHBvcnQgdHlwZSB7UHJldmlld0RhdGFQYW5lbFByb3BzLCBRdWVyeVJlc3VsdCwgRGF0YVRhYmxlU3R5bGV9IGZyb20gJy4vcHJldmlldy1kYXRhLXBhbmVsJztcbmV4cG9ydCB0eXBlIHtUcmVlTm9kZURhdGEsIFRyZWVOb2RlUHJvcHMsIFRyZWVQcm9wc30gZnJvbSAnLi90cmVlJztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsU0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsWUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsaUJBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLEtBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLGFBQUEsR0FBQUMsc0JBQUEsQ0FBQUwsT0FBQSIsImlnbm9yZUxpc3QiOltdfQ==
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
+ var _react = _interopRequireWildcard(require("react"));
12
+ var _react2 = _interopRequireDefault(require("@monaco-editor/react"));
13
+ var monaco = _interopRequireWildcard(require("monaco-editor"));
14
+ var _uniq = _interopRequireDefault(require("es-toolkit/compat/uniq"));
15
+ var _uniqBy = _interopRequireDefault(require("es-toolkit/compat/uniqBy"));
16
+ 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" != _typeof(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); }
17
+ 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; }
18
+ 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; } // SPDX-License-Identifier: MIT
19
+ // Copyright contributors to the kepler.gl project
20
+ // import {tableSchema as DEFAULT_SCHEMA} from './table-schema';
21
+ var MONACO_OPTIONS = {
22
+ minimap: {
23
+ enabled: false
24
+ },
25
+ language: 'sql',
26
+ contextmenu: false,
27
+ renderLineHighlight: 'none',
28
+ scrollBeyondLastLine: false,
29
+ scrollbar: {
30
+ alwaysConsumeMouseWheel: false
31
+ },
32
+ overviewRulerLanes: 0,
33
+ automaticLayout: true,
34
+ acceptSuggestionOnEnter: 'on',
35
+ quickSuggestionsDelay: 400,
36
+ matchOnWordStartOnly: false,
37
+ tabCompletion: 'off',
38
+ lineNumbers: 'off'
39
+ };
40
+ function parseSqlAndFindTableNameAndAliases(sql) {
41
+ var regex = /\b(?:FROM|JOIN)\s+([^\s.]+(?:\.[^\s.]+)?)\s*(?:AS)?\s*([^\s,]+)?/gi;
42
+ var tables = [];
43
+ while (true) {
44
+ var match = regex.exec(sql);
45
+ if (!match) {
46
+ break;
47
+ }
48
+ var table_name = match[1];
49
+ if (!/\(/.test(table_name)) {
50
+ // exclude function calls
51
+ var alias = match[2];
52
+ if (alias && /on|where|inner|left|right|join/.test(alias)) {
53
+ alias = null;
54
+ }
55
+ tables.push({
56
+ table_name: table_name,
57
+ alias: alias || table_name
58
+ });
59
+ }
60
+ }
61
+ return tables;
62
+ }
63
+ var MonacoEditor = function MonacoEditor(_ref) {
64
+ var onRunQuery = _ref.onRunQuery,
65
+ onChange = _ref.onChange,
66
+ code = _ref.code,
67
+ tableSchema = _ref.tableSchema,
68
+ isReadOnly = _ref.isReadOnly;
69
+ // private editor?: monaco.editor.IStandaloneCodeEditor;
70
+ var schemaTableNames = (0, _react.useMemo)(function () {
71
+ return tableSchema ? (0, _uniq["default"])(tableSchema.map(function (d) {
72
+ return d.table_name;
73
+ })) : [];
74
+ }, [tableSchema]);
75
+ var schemaTableNamesSet = (0, _react.useMemo)(function () {
76
+ return new Set(schemaTableNames);
77
+ }, [schemaTableNames]);
78
+ var handleRunQueryRef = (0, _react.useRef)(onRunQuery);
79
+ handleRunQueryRef.current = onRunQuery;
80
+ var handleEditorDidMount = (0, _react.useCallback)(function (editor) {
81
+ // this.editor = editor;
82
+ editor.focus();
83
+ editor.addAction({
84
+ id: 'run-query',
85
+ label: 'Run Query',
86
+ keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter, monaco.KeyMod.Shift | monaco.KeyCode.Enter],
87
+ contextMenuGroupId: 'custom',
88
+ contextMenuOrder: 0,
89
+ run: function run() {
90
+ return handleRunQueryRef.current();
91
+ }
92
+ });
93
+ monaco.languages.registerCompletionItemProvider('*', {
94
+ provideCompletionItems: function provideCompletionItems(model, position, _context, _cancelationToken) {
95
+ var _thisLine$trim$split$, _exec, _exec2;
96
+ var suggestions = [{
97
+ label: 'myCustomSnippet',
98
+ kind: monaco.languages.CompletionItemKind.Snippet,
99
+ insertText: 'This is a piece of custom code',
100
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
101
+ documentation: 'This is a piece of custom code'
102
+ // TODO: range is missing
103
+ }];
104
+ var fullQueryText = model.getValue();
105
+ var tableNamesAndAliases = new Map(parseSqlAndFindTableNameAndAliases(fullQueryText).map(function (_ref2) {
106
+ var table_name = _ref2.table_name,
107
+ alias = _ref2.alias;
108
+ return [alias, table_name];
109
+ }));
110
+ var thisLine = model.getValueInRange({
111
+ startLineNumber: position.lineNumber,
112
+ startColumn: 1,
113
+ endLineNumber: position.lineNumber,
114
+ endColumn: position.column
115
+ });
116
+ var thisToken = ((_thisLine$trim$split$ = thisLine.trim().split(' ').slice(-1)) === null || _thisLine$trim$split$ === void 0 ? void 0 : _thisLine$trim$split$[0]) || '';
117
+ var lastTokenBeforeSpace = (_exec = /\s?(\w+)\s+\w+$/.exec(thisLine.trim())) === null || _exec === void 0 ? void 0 : _exec[1];
118
+ var lastTokenBeforeDot = (_exec2 = /(\w+)\.\w*$/.exec(thisToken)) === null || _exec2 === void 0 ? void 0 : _exec2[1];
119
+
120
+ // console.log(tableNamesAndAliases, thisToken, lastTokenBeforeSpace, lastTokenBeforeDot);
121
+
122
+ if (lastTokenBeforeSpace && /from|join|update|into/.test(lastTokenBeforeSpace)) {
123
+ suggestions.push.apply(suggestions, (0, _toConsumableArray2["default"])(schemaTableNames.map(function (table_name) {
124
+ return {
125
+ label: table_name,
126
+ kind: monaco.languages.CompletionItemKind.Field,
127
+ insertText: table_name
128
+ // TODO: range is missing
129
+ };
130
+ })));
131
+ }
132
+ if (lastTokenBeforeDot) {
133
+ var table_name = null;
134
+ if (schemaTableNamesSet.has(lastTokenBeforeDot)) {
135
+ table_name = lastTokenBeforeDot;
136
+ } else if (tableNamesAndAliases.get(lastTokenBeforeDot)) {
137
+ table_name = tableNamesAndAliases.get(lastTokenBeforeDot);
138
+ }
139
+ if (table_name && tableSchema) {
140
+ suggestions.push.apply(suggestions, (0, _toConsumableArray2["default"])(tableSchema.filter(function (d) {
141
+ return d.table_name === table_name;
142
+ }).map(function (_ref3) {
143
+ var column_name = _ref3.column_name;
144
+ return {
145
+ label: column_name,
146
+ kind: monaco.languages.CompletionItemKind.Field,
147
+ insertText: column_name
148
+ // TODO: range is missing
149
+ };
150
+ })));
151
+ }
152
+ }
153
+ return {
154
+ suggestions: (0, _uniqBy["default"])(suggestions, function (s) {
155
+ return s.insertText;
156
+ })
157
+ };
158
+ }
159
+ });
160
+ }, [tableSchema, schemaTableNames, schemaTableNamesSet]);
161
+ return /*#__PURE__*/_react["default"].createElement(_react2["default"], {
162
+ height: "100%",
163
+ theme: "vs-dark",
164
+ defaultLanguage: "sql",
165
+ defaultValue: code,
166
+ onChange: onChange,
167
+ onMount: handleEditorDidMount,
168
+ options: _objectSpread(_objectSpread({}, MONACO_OPTIONS), {}, {
169
+ readOnly: isReadOnly
170
+ })
171
+ });
172
+ };
173
+ var _default = exports["default"] = MonacoEditor;
174
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3QyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIm1vbmFjbyIsIl91bmlxIiwiX3VuaXFCeSIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJzZXQiLCJfdCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJNT05BQ09fT1BUSU9OUyIsIm1pbmltYXAiLCJlbmFibGVkIiwibGFuZ3VhZ2UiLCJjb250ZXh0bWVudSIsInJlbmRlckxpbmVIaWdobGlnaHQiLCJzY3JvbGxCZXlvbmRMYXN0TGluZSIsInNjcm9sbGJhciIsImFsd2F5c0NvbnN1bWVNb3VzZVdoZWVsIiwib3ZlcnZpZXdSdWxlckxhbmVzIiwiYXV0b21hdGljTGF5b3V0IiwiYWNjZXB0U3VnZ2VzdGlvbk9uRW50ZXIiLCJxdWlja1N1Z2dlc3Rpb25zRGVsYXkiLCJtYXRjaE9uV29yZFN0YXJ0T25seSIsInRhYkNvbXBsZXRpb24iLCJsaW5lTnVtYmVycyIsInBhcnNlU3FsQW5kRmluZFRhYmxlTmFtZUFuZEFsaWFzZXMiLCJzcWwiLCJyZWdleCIsInRhYmxlcyIsIm1hdGNoIiwiZXhlYyIsInRhYmxlX25hbWUiLCJ0ZXN0IiwiYWxpYXMiLCJNb25hY29FZGl0b3IiLCJfcmVmIiwib25SdW5RdWVyeSIsIm9uQ2hhbmdlIiwiY29kZSIsInRhYmxlU2NoZW1hIiwiaXNSZWFkT25seSIsInNjaGVtYVRhYmxlTmFtZXMiLCJ1c2VNZW1vIiwidW5pcSIsIm1hcCIsImQiLCJzY2hlbWFUYWJsZU5hbWVzU2V0IiwiU2V0IiwiaGFuZGxlUnVuUXVlcnlSZWYiLCJ1c2VSZWYiLCJjdXJyZW50IiwiaGFuZGxlRWRpdG9yRGlkTW91bnQiLCJ1c2VDYWxsYmFjayIsImVkaXRvciIsImZvY3VzIiwiYWRkQWN0aW9uIiwiaWQiLCJsYWJlbCIsImtleWJpbmRpbmdzIiwiS2V5TW9kIiwiQ3RybENtZCIsIktleUNvZGUiLCJFbnRlciIsIlNoaWZ0IiwiY29udGV4dE1lbnVHcm91cElkIiwiY29udGV4dE1lbnVPcmRlciIsInJ1biIsImxhbmd1YWdlcyIsInJlZ2lzdGVyQ29tcGxldGlvbkl0ZW1Qcm92aWRlciIsInByb3ZpZGVDb21wbGV0aW9uSXRlbXMiLCJtb2RlbCIsInBvc2l0aW9uIiwiX2NvbnRleHQiLCJfY2FuY2VsYXRpb25Ub2tlbiIsIl90aGlzTGluZSR0cmltJHNwbGl0JCIsIl9leGVjIiwiX2V4ZWMyIiwic3VnZ2VzdGlvbnMiLCJraW5kIiwiQ29tcGxldGlvbkl0ZW1LaW5kIiwiU25pcHBldCIsImluc2VydFRleHQiLCJpbnNlcnRUZXh0UnVsZXMiLCJDb21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlIiwiSW5zZXJ0QXNTbmlwcGV0IiwiZG9jdW1lbnRhdGlvbiIsImZ1bGxRdWVyeVRleHQiLCJnZXRWYWx1ZSIsInRhYmxlTmFtZXNBbmRBbGlhc2VzIiwiTWFwIiwiX3JlZjIiLCJ0aGlzTGluZSIsImdldFZhbHVlSW5SYW5nZSIsInN0YXJ0TGluZU51bWJlciIsImxpbmVOdW1iZXIiLCJzdGFydENvbHVtbiIsImVuZExpbmVOdW1iZXIiLCJlbmRDb2x1bW4iLCJjb2x1bW4iLCJ0aGlzVG9rZW4iLCJ0cmltIiwic3BsaXQiLCJzbGljZSIsImxhc3RUb2tlbkJlZm9yZVNwYWNlIiwibGFzdFRva2VuQmVmb3JlRG90IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsIkZpZWxkIiwiX3JlZjMiLCJjb2x1bW5fbmFtZSIsInVuaXFCeSIsInMiLCJjcmVhdGVFbGVtZW50IiwiaGVpZ2h0IiwidGhlbWUiLCJkZWZhdWx0TGFuZ3VhZ2UiLCJkZWZhdWx0VmFsdWUiLCJvbk1vdW50Iiwib3B0aW9ucyIsInJlYWRPbmx5IiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9uYWNvLWVkaXRvci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7dXNlQ2FsbGJhY2ssIHVzZU1lbW8sIHVzZVJlZn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEVkaXRvciwge09uQ2hhbmdlLCBPbk1vdW50fSBmcm9tICdAbW9uYWNvLWVkaXRvci9yZWFjdCc7XG5pbXBvcnQgKiBhcyBtb25hY28gZnJvbSAnbW9uYWNvLWVkaXRvcic7XG4vLyBpbXBvcnQge3RhYmxlU2NoZW1hIGFzIERFRkFVTFRfU0NIRU1BfSBmcm9tICcuL3RhYmxlLXNjaGVtYSc7XG5pbXBvcnQgdW5pcSBmcm9tICdlcy10b29sa2l0L2NvbXBhdC91bmlxJztcbmltcG9ydCB1bmlxQnkgZnJvbSAnZXMtdG9vbGtpdC9jb21wYXQvdW5pcUJ5JztcblxuY29uc3QgTU9OQUNPX09QVElPTlM6IG1vbmFjby5lZGl0b3IuSVN0YW5kYWxvbmVFZGl0b3JDb25zdHJ1Y3Rpb25PcHRpb25zID0ge1xuICBtaW5pbWFwOiB7ZW5hYmxlZDogZmFsc2V9LFxuICBsYW5ndWFnZTogJ3NxbCcsXG4gIGNvbnRleHRtZW51OiBmYWxzZSxcbiAgcmVuZGVyTGluZUhpZ2hsaWdodDogJ25vbmUnLFxuICBzY3JvbGxCZXlvbmRMYXN0TGluZTogZmFsc2UsXG4gIHNjcm9sbGJhcjoge2Fsd2F5c0NvbnN1bWVNb3VzZVdoZWVsOiBmYWxzZX0sXG4gIG92ZXJ2aWV3UnVsZXJMYW5lczogMCxcbiAgYXV0b21hdGljTGF5b3V0OiB0cnVlLFxuICBhY2NlcHRTdWdnZXN0aW9uT25FbnRlcjogJ29uJyxcbiAgcXVpY2tTdWdnZXN0aW9uc0RlbGF5OiA0MDAsXG4gIG1hdGNoT25Xb3JkU3RhcnRPbmx5OiBmYWxzZSxcbiAgdGFiQ29tcGxldGlvbjogJ29mZicsXG4gIGxpbmVOdW1iZXJzOiAnb2ZmJ1xufTtcblxuZnVuY3Rpb24gcGFyc2VTcWxBbmRGaW5kVGFibGVOYW1lQW5kQWxpYXNlcyhzcWw6IHN0cmluZykge1xuICBjb25zdCByZWdleCA9IC9cXGIoPzpGUk9NfEpPSU4pXFxzKyhbXlxccy5dKyg/OlxcLlteXFxzLl0rKT8pXFxzKig/OkFTKT9cXHMqKFteXFxzLF0rKT8vZ2k7XG4gIGNvbnN0IHRhYmxlczoge3RhYmxlX25hbWU6IHN0cmluZzsgYWxpYXM6IHN0cmluZ31bXSA9IFtdO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgbWF0Y2ggPSByZWdleC5leGVjKHNxbCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlX25hbWUgPSBtYXRjaFsxXTtcbiAgICBpZiAoIS9cXCgvLnRlc3QodGFibGVfbmFtZSkpIHtcbiAgICAgIC8vIGV4Y2x1ZGUgZnVuY3Rpb24gY2FsbHNcbiAgICAgIGxldCBhbGlhcyA9IG1hdGNoWzJdIGFzIHN0cmluZyB8IG51bGw7XG4gICAgICBpZiAoYWxpYXMgJiYgL29ufHdoZXJlfGlubmVyfGxlZnR8cmlnaHR8am9pbi8udGVzdChhbGlhcykpIHtcbiAgICAgICAgYWxpYXMgPSBudWxsO1xuICAgICAgfVxuICAgICAgdGFibGVzLnB1c2goe1xuICAgICAgICB0YWJsZV9uYW1lLFxuICAgICAgICBhbGlhczogYWxpYXMgfHwgdGFibGVfbmFtZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhYmxlcztcbn1cblxuaW50ZXJmYWNlIE1vbmFjb0VkaXRvclByb3BzIHtcbiAgY29kZTogc3RyaW5nO1xuICBpc1JlYWRPbmx5PzogYm9vbGVhbjtcbiAgb25DaGFuZ2U6IE9uQ2hhbmdlO1xuICBvblJ1blF1ZXJ5OiAoKSA9PiB2b2lkO1xuICB0YWJsZVNjaGVtYT86IHt0YWJsZV9uYW1lOiBzdHJpbmc7IGNvbHVtbl9uYW1lOiBzdHJpbmd9W107XG59XG5cbmNvbnN0IE1vbmFjb0VkaXRvcjogUmVhY3QuRkM8TW9uYWNvRWRpdG9yUHJvcHM+ID0gKHtcbiAgb25SdW5RdWVyeSxcbiAgb25DaGFuZ2UsXG4gIGNvZGUsXG4gIHRhYmxlU2NoZW1hLFxuICBpc1JlYWRPbmx5XG59KSA9PiB7XG4gIC8vIHByaXZhdGUgZWRpdG9yPzogbW9uYWNvLmVkaXRvci5JU3RhbmRhbG9uZUNvZGVFZGl0b3I7XG4gIGNvbnN0IHNjaGVtYVRhYmxlTmFtZXMgPSB1c2VNZW1vKFxuICAgICgpID0+ICh0YWJsZVNjaGVtYSA/IHVuaXEodGFibGVTY2hlbWEubWFwKGQgPT4gZC50YWJsZV9uYW1lKSkgOiBbXSksXG4gICAgW3RhYmxlU2NoZW1hXVxuICApO1xuICBjb25zdCBzY2hlbWFUYWJsZU5hbWVzU2V0ID0gdXNlTWVtbygoKSA9PiBuZXcgU2V0KHNjaGVtYVRhYmxlTmFtZXMpLCBbc2NoZW1hVGFibGVOYW1lc10pO1xuICBjb25zdCBoYW5kbGVSdW5RdWVyeVJlZiA9IHVzZVJlZihvblJ1blF1ZXJ5KTtcbiAgaGFuZGxlUnVuUXVlcnlSZWYuY3VycmVudCA9IG9uUnVuUXVlcnk7XG5cbiAgY29uc3QgaGFuZGxlRWRpdG9yRGlkTW91bnQ6IE9uTW91bnQgPSB1c2VDYWxsYmFjayhcbiAgICBlZGl0b3IgPT4ge1xuICAgICAgLy8gdGhpcy5lZGl0b3IgPSBlZGl0b3I7XG4gICAgICBlZGl0b3IuZm9jdXMoKTtcblxuICAgICAgZWRpdG9yLmFkZEFjdGlvbih7XG4gICAgICAgIGlkOiAncnVuLXF1ZXJ5JyxcbiAgICAgICAgbGFiZWw6ICdSdW4gUXVlcnknLFxuICAgICAgICBrZXliaW5kaW5nczogW1xuICAgICAgICAgIG1vbmFjby5LZXlNb2QuQ3RybENtZCB8IG1vbmFjby5LZXlDb2RlLkVudGVyLFxuICAgICAgICAgIG1vbmFjby5LZXlNb2QuU2hpZnQgfCBtb25hY28uS2V5Q29kZS5FbnRlclxuICAgICAgICBdLFxuICAgICAgICBjb250ZXh0TWVudUdyb3VwSWQ6ICdjdXN0b20nLFxuICAgICAgICBjb250ZXh0TWVudU9yZGVyOiAwLFxuICAgICAgICBydW46ICgpID0+IGhhbmRsZVJ1blF1ZXJ5UmVmLmN1cnJlbnQoKVxuICAgICAgfSk7XG5cbiAgICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb21wbGV0aW9uSXRlbVByb3ZpZGVyKCcqJywge1xuICAgICAgICBwcm92aWRlQ29tcGxldGlvbkl0ZW1zOiAobW9kZWwsIHBvc2l0aW9uLCBfY29udGV4dCwgX2NhbmNlbGF0aW9uVG9rZW4pID0+IHtcbiAgICAgICAgICBjb25zdCBzdWdnZXN0aW9uczogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbVtdID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ215Q3VzdG9tU25pcHBldCcsXG4gICAgICAgICAgICAgIGtpbmQ6IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kLlNuaXBwZXQsXG4gICAgICAgICAgICAgIGluc2VydFRleHQ6ICdUaGlzIGlzIGEgcGllY2Ugb2YgY3VzdG9tIGNvZGUnLFxuICAgICAgICAgICAgICBpbnNlcnRUZXh0UnVsZXM6IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1JbnNlcnRUZXh0UnVsZS5JbnNlcnRBc1NuaXBwZXQsXG4gICAgICAgICAgICAgIGRvY3VtZW50YXRpb246ICdUaGlzIGlzIGEgcGllY2Ugb2YgY3VzdG9tIGNvZGUnXG4gICAgICAgICAgICAgIC8vIFRPRE86IHJhbmdlIGlzIG1pc3NpbmdcbiAgICAgICAgICAgIH0gYXMgbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbVxuICAgICAgICAgIF07XG5cbiAgICAgICAgICBjb25zdCBmdWxsUXVlcnlUZXh0ID0gbW9kZWwuZ2V0VmFsdWUoKTtcblxuICAgICAgICAgIGNvbnN0IHRhYmxlTmFtZXNBbmRBbGlhc2VzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oXG4gICAgICAgICAgICBwYXJzZVNxbEFuZEZpbmRUYWJsZU5hbWVBbmRBbGlhc2VzKGZ1bGxRdWVyeVRleHQpLm1hcCgoe3RhYmxlX25hbWUsIGFsaWFzfSkgPT4gW1xuICAgICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgICAgdGFibGVfbmFtZVxuICAgICAgICAgICAgXSlcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3QgdGhpc0xpbmUgPSBtb2RlbC5nZXRWYWx1ZUluUmFuZ2Uoe1xuICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLFxuICAgICAgICAgICAgc3RhcnRDb2x1bW46IDEsXG4gICAgICAgICAgICBlbmRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLFxuICAgICAgICAgICAgZW5kQ29sdW1uOiBwb3NpdGlvbi5jb2x1bW5cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCB0aGlzVG9rZW4gPSB0aGlzTGluZS50cmltKCkuc3BsaXQoJyAnKS5zbGljZSgtMSk/LlswXSB8fCAnJztcblxuICAgICAgICAgIGNvbnN0IGxhc3RUb2tlbkJlZm9yZVNwYWNlID0gL1xccz8oXFx3KylcXHMrXFx3KyQvLmV4ZWModGhpc0xpbmUudHJpbSgpKT8uWzFdO1xuICAgICAgICAgIGNvbnN0IGxhc3RUb2tlbkJlZm9yZURvdCA9IC8oXFx3KylcXC5cXHcqJC8uZXhlYyh0aGlzVG9rZW4pPy5bMV07XG5cbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0YWJsZU5hbWVzQW5kQWxpYXNlcywgdGhpc1Rva2VuLCBsYXN0VG9rZW5CZWZvcmVTcGFjZSwgbGFzdFRva2VuQmVmb3JlRG90KTtcblxuICAgICAgICAgIGlmIChsYXN0VG9rZW5CZWZvcmVTcGFjZSAmJiAvZnJvbXxqb2lufHVwZGF0ZXxpbnRvLy50ZXN0KGxhc3RUb2tlbkJlZm9yZVNwYWNlKSkge1xuICAgICAgICAgICAgc3VnZ2VzdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgLi4uc2NoZW1hVGFibGVOYW1lcy5tYXAoXG4gICAgICAgICAgICAgICAgdGFibGVfbmFtZSA9PlxuICAgICAgICAgICAgICAgICAgKHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRhYmxlX25hbWUsXG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kLkZpZWxkLFxuICAgICAgICAgICAgICAgICAgICBpbnNlcnRUZXh0OiB0YWJsZV9uYW1lXG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHJhbmdlIGlzIG1pc3NpbmdcbiAgICAgICAgICAgICAgICAgIH0gYXMgbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobGFzdFRva2VuQmVmb3JlRG90KSB7XG4gICAgICAgICAgICBsZXQgdGFibGVfbmFtZSA9IG51bGwgYXMgc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgICAgIGlmIChzY2hlbWFUYWJsZU5hbWVzU2V0LmhhcyhsYXN0VG9rZW5CZWZvcmVEb3QpKSB7XG4gICAgICAgICAgICAgIHRhYmxlX25hbWUgPSBsYXN0VG9rZW5CZWZvcmVEb3Q7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRhYmxlTmFtZXNBbmRBbGlhc2VzLmdldChsYXN0VG9rZW5CZWZvcmVEb3QpKSB7XG4gICAgICAgICAgICAgIHRhYmxlX25hbWUgPSB0YWJsZU5hbWVzQW5kQWxpYXNlcy5nZXQobGFzdFRva2VuQmVmb3JlRG90KSBhcyBzdHJpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGFibGVfbmFtZSAmJiB0YWJsZVNjaGVtYSkge1xuICAgICAgICAgICAgICBzdWdnZXN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgIC4uLnRhYmxlU2NoZW1hXG4gICAgICAgICAgICAgICAgICAuZmlsdGVyKGQgPT4gZC50YWJsZV9uYW1lID09PSB0YWJsZV9uYW1lKVxuICAgICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICAgKHtjb2x1bW5fbmFtZX0pID0+XG4gICAgICAgICAgICAgICAgICAgICAgKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBjb2x1bW5fbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kLkZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0VGV4dDogY29sdW1uX25hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHJhbmdlIGlzIG1pc3NpbmdcbiAgICAgICAgICAgICAgICAgICAgICB9IGFzIG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW0pXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zOiB1bmlxQnkoc3VnZ2VzdGlvbnMsIHMgPT4gcy5pbnNlcnRUZXh0KVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgW3RhYmxlU2NoZW1hLCBzY2hlbWFUYWJsZU5hbWVzLCBzY2hlbWFUYWJsZU5hbWVzU2V0XVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPEVkaXRvclxuICAgICAgaGVpZ2h0PVwiMTAwJVwiXG4gICAgICB0aGVtZT1cInZzLWRhcmtcIlxuICAgICAgZGVmYXVsdExhbmd1YWdlPVwic3FsXCJcbiAgICAgIGRlZmF1bHRWYWx1ZT17Y29kZX1cbiAgICAgIG9uQ2hhbmdlPXtvbkNoYW5nZX1cbiAgICAgIG9uTW91bnQ9e2hhbmRsZUVkaXRvckRpZE1vdW50fVxuICAgICAgb3B0aW9ucz17e1xuICAgICAgICAuLi5NT05BQ09fT1BUSU9OUyxcbiAgICAgICAgcmVhZE9ubHk6IGlzUmVhZE9ubHlcbiAgICAgIH19XG4gICAgLz5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1vbmFjb0VkaXRvcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUosdUJBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFJLEtBQUEsR0FBQUYsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFLLE9BQUEsR0FBQUgsc0JBQUEsQ0FBQUYsT0FBQTtBQUE4QyxTQUFBRCx3QkFBQU8sQ0FBQSxFQUFBQyxDQUFBLDZCQUFBQyxPQUFBLE1BQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQVQsdUJBQUEsWUFBQUEsd0JBQUFPLENBQUEsRUFBQUMsQ0FBQSxTQUFBQSxDQUFBLElBQUFELENBQUEsSUFBQUEsQ0FBQSxDQUFBSyxVQUFBLFNBQUFMLENBQUEsTUFBQU0sQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsS0FBQUMsU0FBQSxtQkFBQVQsQ0FBQSxpQkFBQUEsQ0FBQSxnQkFBQVUsT0FBQSxDQUFBVixDQUFBLDBCQUFBQSxDQUFBLFNBQUFRLENBQUEsTUFBQUYsQ0FBQSxHQUFBTCxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxRQUFBRyxDQUFBLENBQUFLLEdB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