@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.
- package/dist/cjs/adapters/duckdb-wasm-adapter.js +258 -0
- package/dist/{components → cjs/components}/index.js +1 -1
- package/dist/cjs/components/monaco-editor.js +174 -0
- package/dist/cjs/components/preview-data-panel.js +127 -0
- package/dist/cjs/components/schema-panel.js +170 -0
- package/dist/cjs/components/sql-panel.js +395 -0
- package/dist/cjs/components/tree.js +90 -0
- package/dist/{index.js → cjs/index.js} +1 -1
- package/dist/{plugin.js → cjs/plugin.js} +2 -2
- package/dist/cjs/processors/data-processor.js +353 -0
- package/dist/cjs/table/duckdb-table-utils.js +670 -0
- package/dist/cjs/table/duckdb-table.js +482 -0
- package/dist/{table → cjs/table}/index.js +1 -1
- package/dist/cjs/utils/perf.js +46 -0
- package/dist/esm/adapters/duckdb-wasm-adapter.js +251 -0
- package/dist/esm/components/index.js +9 -0
- package/dist/esm/components/monaco-editor.js +167 -0
- package/dist/esm/components/preview-data-panel.js +120 -0
- package/dist/esm/components/schema-panel.js +164 -0
- package/dist/esm/components/sql-panel.js +388 -0
- package/dist/esm/components/tree.js +82 -0
- package/dist/esm/index.js +9 -0
- package/dist/esm/plugin.js +22 -0
- package/dist/esm/processors/data-processor.js +342 -0
- package/dist/esm/table/duckdb-table-utils.js +645 -0
- package/dist/esm/table/duckdb-table.js +477 -0
- package/dist/esm/table/index.js +5 -0
- package/dist/esm/utils/perf.js +40 -0
- package/dist/table/duckdb-table-utils.d.ts +7 -0
- package/package.json +28 -24
- package/dist/adapters/duckdb-wasm-adapter.js +0 -259
- package/dist/components/monaco-editor.js +0 -175
- package/dist/components/preview-data-panel.js +0 -128
- package/dist/components/schema-panel.js +0 -171
- package/dist/components/sql-panel.js +0 -396
- package/dist/components/tree.js +0 -91
- package/dist/processors/data-processor.js +0 -353
- package/dist/table/duckdb-table-utils.js +0 -669
- package/dist/table/duckdb-table.js +0 -480
- package/dist/utils/perf.js +0 -46
|
@@ -1,396 +0,0 @@
|
|
|
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.SqlPanel = void 0;
|
|
9
|
-
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
10
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
11
|
-
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
12
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
13
|
-
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
|
|
14
|
-
var _react = _interopRequireWildcard(require("react"));
|
|
15
|
-
var _reactRedux = require("react-redux");
|
|
16
|
-
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
17
|
-
var _reactResizablePanels = require("react-resizable-panels");
|
|
18
|
-
var _actions = require("@kepler.gl/actions");
|
|
19
|
-
var _commonUtils = require("@kepler.gl/common-utils");
|
|
20
|
-
var _components = require("@kepler.gl/components");
|
|
21
|
-
var _processors = require("@kepler.gl/processors");
|
|
22
|
-
var _styles = require("@kepler.gl/styles");
|
|
23
|
-
var _utils = require("@kepler.gl/utils");
|
|
24
|
-
var _monacoEditor = _interopRequireDefault(require("./monaco-editor"));
|
|
25
|
-
var _schemaPanel = require("./schema-panel");
|
|
26
|
-
var _previewDataPanel = require("./preview-data-panel");
|
|
27
|
-
var _duckdbTableUtils = require("../table/duckdb-table-utils");
|
|
28
|
-
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12; // SPDX-License-Identifier: MIT
|
|
29
|
-
// Copyright contributors to the kepler.gl project
|
|
30
|
-
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
31
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
|
32
|
-
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
33
|
-
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
34
|
-
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
35
|
-
var StyledSqlPanel = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n height: 100%;\n background-color: ", ";\n border-left: 1px solid #333;\n"])), _styles.sidePanelBg);
|
|
36
|
-
var StyledSqlActions = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n flex: 0 0 50px;\n display: flex;\n padding-top: 12px;\n align-items: center;\n flex-direction: column;\n justify-content: flex-start;\n border-bottom: 1px solid #333;\n"])));
|
|
37
|
-
var StyledSqlEditor = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: row;\n flex: 1;\n min-width: 0; // Prevents flex child from overflowing\n height: 100%;\n"])));
|
|
38
|
-
var StyledEditorPanel = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n display: flex;\n height: 100%;\n flex-direction: row;\n gap: 5px;\n flex-grow: 1;\n"])), _styles.sidePanelBg);
|
|
39
|
-
var StyledDataPanel = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n height: 100%;\n background: white;\n"])));
|
|
40
|
-
var StyledEditor = _styledComponents["default"].div(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n padding: 12px 12px 12px 0;\n background-color: rgb(30, 30, 30);\n opacity: ", ";\n width: 100%;\n height: 100%;\n min-height: 0; // Prevents flex child from overflowing\n"])), function (props) {
|
|
41
|
-
return props.isRunning ? 0.5 : 1;
|
|
42
|
-
});
|
|
43
|
-
var StyledResultActions = _styledComponents["default"].div(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["\n background-color: white;\n padding: 2px 12px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 12px;\n"])));
|
|
44
|
-
var StyledResizeHandle = (0, _styledComponents["default"])(_reactResizablePanels.PanelResizeHandle)(_templateObject8 || (_templateObject8 = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n width: 4px;\n cursor: col-resize;\n\n &:hover {\n background-color: #555;\n }\n"])), _styles.panelBorderColor);
|
|
45
|
-
var StyledVerticalResizeHandle = (0, _styledComponents["default"])(_reactResizablePanels.PanelResizeHandle)(_templateObject9 || (_templateObject9 = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n height: 4px;\n cursor: row-resize;\n\n &:hover {\n background-color: #555;\n }\n"])), _styles.panelBorderColor);
|
|
46
|
-
var StyledLoadingContainer = _styledComponents["default"].div(_templateObject10 || (_templateObject10 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n"])));
|
|
47
|
-
var StyledErrorContainer = _styledComponents["default"].pre(_templateObject11 || (_templateObject11 = (0, _taggedTemplateLiteral2["default"])(["\n padding: 12px;\n color: red;\n font-size: 12px;\n background-color: ", ";\n height: 100%;\n overflow: auto;\n"])), _styles.sidePanelBg);
|
|
48
|
-
var StyledFileDropArea = (0, _styledComponents["default"])(_components.FileDrop)(_templateObject12 || (_templateObject12 = (0, _taggedTemplateLiteral2["default"])(["\n height: 100%;\n border-width: 1px;\n border: 1px ", "\n ", ";\n .file-drop-target {\n height: 100%;\n }\n"])), function (props) {
|
|
49
|
-
return props.dragOver ? 'solid' : 'dashed';
|
|
50
|
-
}, function (props) {
|
|
51
|
-
return props.dragOver ? props.theme.subtextColorLT : 'transparent';
|
|
52
|
-
});
|
|
53
|
-
var SCHEMA_PANEL_STYLE = {
|
|
54
|
-
overflow: 'auto'
|
|
55
|
-
};
|
|
56
|
-
var SqlPanel = exports.SqlPanel = function SqlPanel(_ref) {
|
|
57
|
-
var _ref$initialSql = _ref.initialSql,
|
|
58
|
-
initialSql = _ref$initialSql === void 0 ? '' : _ref$initialSql;
|
|
59
|
-
var _useState = (0, _react.useState)(function () {
|
|
60
|
-
var params = new URLSearchParams(window.location.search);
|
|
61
|
-
return params.get('sql') || initialSql;
|
|
62
|
-
}),
|
|
63
|
-
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
64
|
-
sql = _useState2[0],
|
|
65
|
-
setSql = _useState2[1];
|
|
66
|
-
var _useState3 = (0, _react.useState)(null),
|
|
67
|
-
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
|
|
68
|
-
droppedFile = _useState4[0],
|
|
69
|
-
setDroppedFile = _useState4[1];
|
|
70
|
-
var _useState5 = (0, _react.useState)(false),
|
|
71
|
-
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
|
|
72
|
-
dragState = _useState6[0],
|
|
73
|
-
setDragState = _useState6[1];
|
|
74
|
-
var _useState7 = (0, _react.useState)(null),
|
|
75
|
-
_useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
|
|
76
|
-
result = _useState8[0],
|
|
77
|
-
setResult = _useState8[1];
|
|
78
|
-
var _useState9 = (0, _react.useState)(0),
|
|
79
|
-
_useState10 = (0, _slicedToArray2["default"])(_useState9, 2),
|
|
80
|
-
schemaUpdateTrigger = _useState10[0],
|
|
81
|
-
setSchemaUpdateTrigger = _useState10[1];
|
|
82
|
-
var _useState11 = (0, _react.useState)(null),
|
|
83
|
-
_useState12 = (0, _slicedToArray2["default"])(_useState11, 2),
|
|
84
|
-
error = _useState12[0],
|
|
85
|
-
setError = _useState12[1];
|
|
86
|
-
var _useState13 = (0, _react.useState)(0),
|
|
87
|
-
_useState14 = (0, _slicedToArray2["default"])(_useState13, 2),
|
|
88
|
-
counter = _useState14[0],
|
|
89
|
-
setCounter = _useState14[1];
|
|
90
|
-
var _useState15 = (0, _react.useState)([]),
|
|
91
|
-
_useState16 = (0, _slicedToArray2["default"])(_useState15, 2),
|
|
92
|
-
tableSchema = _useState16[0],
|
|
93
|
-
setTableSchema = _useState16[1];
|
|
94
|
-
var _useState17 = (0, _react.useState)(false),
|
|
95
|
-
_useState18 = (0, _slicedToArray2["default"])(_useState17, 2),
|
|
96
|
-
isRunning = _useState18[0],
|
|
97
|
-
setIsRunning = _useState18[1];
|
|
98
|
-
var _useState19 = (0, _react.useState)(function () {
|
|
99
|
-
return (0, _utils.isAppleDevice)();
|
|
100
|
-
}),
|
|
101
|
-
_useState20 = (0, _slicedToArray2["default"])(_useState19, 1),
|
|
102
|
-
isMac = _useState20[0];
|
|
103
|
-
var dispatch = (0, _reactRedux.useDispatch)();
|
|
104
|
-
var droppedFileAreaRef = (0, _react.useRef)(null);
|
|
105
|
-
(0, _react.useEffect)(function () {
|
|
106
|
-
var currentUrl = new URL(window.location.href);
|
|
107
|
-
if (sql) {
|
|
108
|
-
currentUrl.searchParams.set('sql', sql);
|
|
109
|
-
} else {
|
|
110
|
-
currentUrl.searchParams["delete"]('sql');
|
|
111
|
-
}
|
|
112
|
-
window.history.replaceState({}, '', currentUrl.toString());
|
|
113
|
-
}, [sql]);
|
|
114
|
-
var runQuery = (0, _react.useCallback)( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
115
|
-
var adjustedQuery, db, connection, tempTableName, sqlStatements, arrowResult, tableDuckDBTypes, _iterator, _step, statement, isLastQuery, duckDbColumns, _adjustedQuery;
|
|
116
|
-
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
117
|
-
while (1) switch (_context.prev = _context.next) {
|
|
118
|
-
case 0:
|
|
119
|
-
setIsRunning(true);
|
|
120
|
-
_context.prev = 1;
|
|
121
|
-
adjustedQuery = sql ? (0, _duckdbTableUtils.removeSQLComments)(sql) : null;
|
|
122
|
-
if (adjustedQuery) {
|
|
123
|
-
_context.next = 6;
|
|
124
|
-
break;
|
|
125
|
-
}
|
|
126
|
-
setError(new Error('Query is empty'));
|
|
127
|
-
return _context.abrupt("return");
|
|
128
|
-
case 6:
|
|
129
|
-
db = (0, _utils.getApplicationConfig)().database;
|
|
130
|
-
if (db) {
|
|
131
|
-
_context.next = 10;
|
|
132
|
-
break;
|
|
133
|
-
}
|
|
134
|
-
setError(new Error('The database is not configured properly.'));
|
|
135
|
-
return _context.abrupt("return");
|
|
136
|
-
case 10:
|
|
137
|
-
_context.next = 12;
|
|
138
|
-
return db.connect();
|
|
139
|
-
case 12:
|
|
140
|
-
connection = _context.sent;
|
|
141
|
-
// TODO find a cheap way to get DuckDb types with a single query to a remote resource - temp table? cte?
|
|
142
|
-
tempTableName = 'temp_keplergl_table'; // remove comments
|
|
143
|
-
sqlStatements = (0, _duckdbTableUtils.splitSqlStatements)(adjustedQuery);
|
|
144
|
-
arrowResult = null;
|
|
145
|
-
tableDuckDBTypes = {};
|
|
146
|
-
_iterator = _createForOfIteratorHelper(sqlStatements);
|
|
147
|
-
_context.prev = 18;
|
|
148
|
-
_iterator.s();
|
|
149
|
-
case 20:
|
|
150
|
-
if ((_step = _iterator.n()).done) {
|
|
151
|
-
_context.next = 48;
|
|
152
|
-
break;
|
|
153
|
-
}
|
|
154
|
-
statement = _step.value;
|
|
155
|
-
isLastQuery = statement === sqlStatements[sqlStatements.length - 1];
|
|
156
|
-
_context.t0 = isLastQuery;
|
|
157
|
-
if (!_context.t0) {
|
|
158
|
-
_context.next = 28;
|
|
159
|
-
break;
|
|
160
|
-
}
|
|
161
|
-
_context.next = 27;
|
|
162
|
-
return (0, _duckdbTableUtils.checkIsSelectQuery)(connection, statement);
|
|
163
|
-
case 27:
|
|
164
|
-
_context.t0 = _context.sent;
|
|
165
|
-
case 28:
|
|
166
|
-
if (!_context.t0) {
|
|
167
|
-
_context.next = 44;
|
|
168
|
-
break;
|
|
169
|
-
}
|
|
170
|
-
_context.next = 31;
|
|
171
|
-
return connection.query("CREATE OR REPLACE TABLE '".concat(tempTableName, "' AS ").concat(statement));
|
|
172
|
-
case 31:
|
|
173
|
-
_context.next = 33;
|
|
174
|
-
return (0, _duckdbTableUtils.getDuckDBColumnTypes)(connection, tempTableName);
|
|
175
|
-
case 33:
|
|
176
|
-
duckDbColumns = _context.sent;
|
|
177
|
-
tableDuckDBTypes = (0, _duckdbTableUtils.getDuckDBColumnTypesMap)(duckDbColumns);
|
|
178
|
-
|
|
179
|
-
// 3) cast GEOMETRY columns to WKB and BigInt to double.
|
|
180
|
-
_adjustedQuery = (0, _duckdbTableUtils.castDuckDBTypesForKepler)(tempTableName, duckDbColumns);
|
|
181
|
-
_context.next = 38;
|
|
182
|
-
return connection.query(_adjustedQuery);
|
|
183
|
-
case 38:
|
|
184
|
-
arrowResult = _context.sent;
|
|
185
|
-
// 4) set geoarrow extension for the arrow table as DuckDB doesn't support the geoarrow extension.
|
|
186
|
-
(0, _duckdbTableUtils.setGeoArrowWKBExtension)(arrowResult, duckDbColumns);
|
|
187
|
-
|
|
188
|
-
// 5) remove temp table
|
|
189
|
-
_context.next = 42;
|
|
190
|
-
return connection.query("DROP TABLE ".concat(tempTableName, ";"));
|
|
191
|
-
case 42:
|
|
192
|
-
_context.next = 46;
|
|
193
|
-
break;
|
|
194
|
-
case 44:
|
|
195
|
-
_context.next = 46;
|
|
196
|
-
return connection.query(statement);
|
|
197
|
-
case 46:
|
|
198
|
-
_context.next = 20;
|
|
199
|
-
break;
|
|
200
|
-
case 48:
|
|
201
|
-
_context.next = 53;
|
|
202
|
-
break;
|
|
203
|
-
case 50:
|
|
204
|
-
_context.prev = 50;
|
|
205
|
-
_context.t1 = _context["catch"](18);
|
|
206
|
-
_iterator.e(_context.t1);
|
|
207
|
-
case 53:
|
|
208
|
-
_context.prev = 53;
|
|
209
|
-
_iterator.f();
|
|
210
|
-
return _context.finish(53);
|
|
211
|
-
case 56:
|
|
212
|
-
// Show preview only for the result of the last query
|
|
213
|
-
if (arrowResult) {
|
|
214
|
-
setResult({
|
|
215
|
-
table: arrowResult,
|
|
216
|
-
tableDuckDBTypes: tableDuckDBTypes
|
|
217
|
-
});
|
|
218
|
-
setError(null);
|
|
219
|
-
}
|
|
220
|
-
_context.next = 59;
|
|
221
|
-
return connection.close();
|
|
222
|
-
case 59:
|
|
223
|
-
_context.next = 64;
|
|
224
|
-
break;
|
|
225
|
-
case 61:
|
|
226
|
-
_context.prev = 61;
|
|
227
|
-
_context.t2 = _context["catch"](1);
|
|
228
|
-
setError(_context.t2);
|
|
229
|
-
case 64:
|
|
230
|
-
_context.prev = 64;
|
|
231
|
-
setIsRunning(false);
|
|
232
|
-
return _context.finish(64);
|
|
233
|
-
case 67:
|
|
234
|
-
// Indicate that there may be a possible change in DuckDB.
|
|
235
|
-
setSchemaUpdateTrigger(Date.now());
|
|
236
|
-
case 68:
|
|
237
|
-
case "end":
|
|
238
|
-
return _context.stop();
|
|
239
|
-
}
|
|
240
|
-
}, _callee, null, [[1, 61, 64, 67], [18, 50, 53, 56]]);
|
|
241
|
-
})), [sql]);
|
|
242
|
-
var onChange = (0, _react.useCallback)(function (value) {
|
|
243
|
-
setSql(value);
|
|
244
|
-
}, [setSql]);
|
|
245
|
-
var onAddResultToMap = (0, _react.useCallback)(function () {
|
|
246
|
-
if (!result) return;
|
|
247
|
-
var keplerFields = (0, _processors.arrowSchemaToFields)(result.table, result.tableDuckDBTypes);
|
|
248
|
-
var datasetToAdd = {
|
|
249
|
-
data: {
|
|
250
|
-
fields: keplerFields,
|
|
251
|
-
// TODO type AddDataToMapPayload -> rows -> + arrow.Table
|
|
252
|
-
rows: result.table
|
|
253
|
-
},
|
|
254
|
-
info: {
|
|
255
|
-
id: (0, _commonUtils.generateHashId)(),
|
|
256
|
-
label: "query_result".concat(counter > 0 ? "_".concat(counter) : ''),
|
|
257
|
-
format: 'arrow'
|
|
258
|
-
}
|
|
259
|
-
};
|
|
260
|
-
dispatch((0, _actions.addDataToMap)({
|
|
261
|
-
datasets: [datasetToAdd]
|
|
262
|
-
}));
|
|
263
|
-
setCounter(counter + 1);
|
|
264
|
-
}, [result, counter, dispatch]);
|
|
265
|
-
var isValidFileType = (0, _react.useCallback)(function (filename) {
|
|
266
|
-
var fileExt = _duckdbTableUtils.SUPPORTED_DUCKDB_DROP_EXTENSIONS.find(function (ext) {
|
|
267
|
-
return filename.endsWith(ext);
|
|
268
|
-
});
|
|
269
|
-
return Boolean(fileExt);
|
|
270
|
-
}, []);
|
|
271
|
-
var createTableFromDroppedFile = (0, _react.useCallback)( /*#__PURE__*/function () {
|
|
272
|
-
var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(droppedFile) {
|
|
273
|
-
var _error;
|
|
274
|
-
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
|
275
|
-
while (1) switch (_context2.prev = _context2.next) {
|
|
276
|
-
case 0:
|
|
277
|
-
if (!droppedFile) {
|
|
278
|
-
_context2.next = 5;
|
|
279
|
-
break;
|
|
280
|
-
}
|
|
281
|
-
_context2.next = 3;
|
|
282
|
-
return (0, _duckdbTableUtils.tableFromFile)(droppedFile);
|
|
283
|
-
case 3:
|
|
284
|
-
_error = _context2.sent;
|
|
285
|
-
if (_error) {
|
|
286
|
-
setError(_error);
|
|
287
|
-
} else {
|
|
288
|
-
setError(null);
|
|
289
|
-
}
|
|
290
|
-
case 5:
|
|
291
|
-
setDroppedFile(null);
|
|
292
|
-
setDragState(false);
|
|
293
|
-
case 7:
|
|
294
|
-
case "end":
|
|
295
|
-
return _context2.stop();
|
|
296
|
-
}
|
|
297
|
-
}, _callee2);
|
|
298
|
-
}));
|
|
299
|
-
return function (_x) {
|
|
300
|
-
return _ref3.apply(this, arguments);
|
|
301
|
-
};
|
|
302
|
-
}(), []);
|
|
303
|
-
(0, _react.useEffect)(function () {
|
|
304
|
-
createTableFromDroppedFile(droppedFile);
|
|
305
|
-
}, [droppedFile, createTableFromDroppedFile]);
|
|
306
|
-
var handleFileInput = (0, _react.useCallback)(function (fileList, event) {
|
|
307
|
-
if (event) {
|
|
308
|
-
event.preventDefault();
|
|
309
|
-
event.stopPropagation();
|
|
310
|
-
}
|
|
311
|
-
var files = (0, _toConsumableArray2["default"])(fileList).filter(Boolean);
|
|
312
|
-
var disableExtensionFilter = false;
|
|
313
|
-
var filesToLoad = [];
|
|
314
|
-
var errorFiles = [];
|
|
315
|
-
var _iterator2 = _createForOfIteratorHelper(files),
|
|
316
|
-
_step2;
|
|
317
|
-
try {
|
|
318
|
-
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
319
|
-
var file = _step2.value;
|
|
320
|
-
if (disableExtensionFilter || isValidFileType(file.name)) {
|
|
321
|
-
filesToLoad.push(file);
|
|
322
|
-
} else {
|
|
323
|
-
errorFiles.push(file.name);
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
} catch (err) {
|
|
327
|
-
_iterator2.e(err);
|
|
328
|
-
} finally {
|
|
329
|
-
_iterator2.f();
|
|
330
|
-
}
|
|
331
|
-
if (filesToLoad.length > 0) {
|
|
332
|
-
setDroppedFile(filesToLoad[0]);
|
|
333
|
-
} else if (errorFiles.length > 0) {
|
|
334
|
-
setError(new Error("Unsupported file formats: ".concat(errorFiles.join(', '))));
|
|
335
|
-
}
|
|
336
|
-
}, [isValidFileType]);
|
|
337
|
-
return /*#__PURE__*/_react["default"].createElement(StyledSqlPanel, null, /*#__PURE__*/_react["default"].createElement(_reactResizablePanels.PanelGroup, {
|
|
338
|
-
direction: "horizontal"
|
|
339
|
-
}, /*#__PURE__*/_react["default"].createElement(_reactResizablePanels.Panel, {
|
|
340
|
-
defaultSize: 20,
|
|
341
|
-
minSize: 15,
|
|
342
|
-
style: SCHEMA_PANEL_STYLE,
|
|
343
|
-
className: "schema-panel"
|
|
344
|
-
}, /*#__PURE__*/_react["default"].createElement(StyledFileDropArea, {
|
|
345
|
-
dragOver: dragState,
|
|
346
|
-
onDragOver: function onDragOver() {
|
|
347
|
-
return setDragState(true);
|
|
348
|
-
},
|
|
349
|
-
onDragLeave: function onDragLeave() {
|
|
350
|
-
return setDragState(false);
|
|
351
|
-
},
|
|
352
|
-
frame: droppedFileAreaRef.current || document,
|
|
353
|
-
onDrop: handleFileInput,
|
|
354
|
-
className: "file-uploader__file-drop"
|
|
355
|
-
}, /*#__PURE__*/_react["default"].createElement(_schemaPanel.SchemaPanel, {
|
|
356
|
-
setTableSchema: setTableSchema,
|
|
357
|
-
droppedFile: droppedFile,
|
|
358
|
-
schemaUpdateTrigger: schemaUpdateTrigger
|
|
359
|
-
}))), /*#__PURE__*/_react["default"].createElement(StyledResizeHandle, null), /*#__PURE__*/_react["default"].createElement(_reactResizablePanels.Panel, {
|
|
360
|
-
minSize: 40
|
|
361
|
-
}, /*#__PURE__*/_react["default"].createElement(StyledSqlEditor, null, /*#__PURE__*/_react["default"].createElement(_reactResizablePanels.PanelGroup, {
|
|
362
|
-
direction: "vertical"
|
|
363
|
-
}, /*#__PURE__*/_react["default"].createElement(_reactResizablePanels.Panel, {
|
|
364
|
-
defaultSize: 30,
|
|
365
|
-
className: "editor-panel"
|
|
366
|
-
}, /*#__PURE__*/_react["default"].createElement(StyledEditorPanel, null, /*#__PURE__*/_react["default"].createElement(StyledSqlActions, null, /*#__PURE__*/_react["default"].createElement(_components.IconButton, {
|
|
367
|
-
"data-tip": true,
|
|
368
|
-
"data-for": "run-query-tooltip",
|
|
369
|
-
onClick: runQuery,
|
|
370
|
-
disabled: isRunning || !sql
|
|
371
|
-
}, /*#__PURE__*/_react["default"].createElement(_components.Icons.Play, {
|
|
372
|
-
height: "18px"
|
|
373
|
-
}), /*#__PURE__*/_react["default"].createElement(_components.Tooltip, {
|
|
374
|
-
id: "run-query-tooltip",
|
|
375
|
-
place: "top",
|
|
376
|
-
effect: "solid"
|
|
377
|
-
}, "Run Query (", isMac ? '⌘Enter' : 'Ctrl+Enter', " or Shift+Enter)"))), /*#__PURE__*/_react["default"].createElement(StyledEditor, {
|
|
378
|
-
isRunning: isRunning
|
|
379
|
-
}, /*#__PURE__*/_react["default"].createElement(_monacoEditor["default"], {
|
|
380
|
-
isReadOnly: isRunning,
|
|
381
|
-
onRunQuery: runQuery,
|
|
382
|
-
onChange: onChange,
|
|
383
|
-
tableSchema: tableSchema,
|
|
384
|
-
code: sql
|
|
385
|
-
})))), /*#__PURE__*/_react["default"].createElement(StyledVerticalResizeHandle, null), /*#__PURE__*/_react["default"].createElement(_reactResizablePanels.Panel, {
|
|
386
|
-
className: "preview-panel"
|
|
387
|
-
}, isRunning ? /*#__PURE__*/_react["default"].createElement(StyledLoadingContainer, null, /*#__PURE__*/_react["default"].createElement(_components.LoadingSpinner, null)) : error ? /*#__PURE__*/_react["default"].createElement(StyledErrorContainer, null, /*#__PURE__*/_react["default"].createElement("div", null, error.message)) : result ? /*#__PURE__*/_react["default"].createElement(StyledDataPanel, null, /*#__PURE__*/_react["default"].createElement(StyledResultActions, null, /*#__PURE__*/_react["default"].createElement(_components.Button, {
|
|
388
|
-
secondary: true,
|
|
389
|
-
onClick: onAddResultToMap
|
|
390
|
-
}, "Add to Map"), /*#__PURE__*/_react["default"].createElement("div", null, result.table.numRows, " rows")), /*#__PURE__*/_react["default"].createElement(_previewDataPanel.PreviewDataPanel, {
|
|
391
|
-
result: result,
|
|
392
|
-
dataTableStyle: {},
|
|
393
|
-
onAddResultToMap: onAddResultToMap
|
|
394
|
-
})) : null))))));
|
|
395
|
-
};
|
|
396
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RSZWR1eCIsIl9zdHlsZWRDb21wb25lbnRzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9yZWFjdFJlc2l6YWJsZVBhbmVscyIsIl9hY3Rpb25zIiwiX2NvbW1vblV0aWxzIiwiX2NvbXBvbmVudHMiLCJfcHJvY2Vzc29ycyIsIl9zdHlsZXMiLCJfdXRpbHMiLCJfbW9uYWNvRWRpdG9yIiwiX3NjaGVtYVBhbmVsIiwiX3ByZXZpZXdEYXRhUGFuZWwiLCJfZHVja2RiVGFibGVVdGlscyIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfdGVtcGxhdGVPYmplY3QzIiwiX3RlbXBsYXRlT2JqZWN0NCIsIl90ZW1wbGF0ZU9iamVjdDUiLCJfdGVtcGxhdGVPYmplY3Q2IiwiX3RlbXBsYXRlT2JqZWN0NyIsIl90ZW1wbGF0ZU9iamVjdDgiLCJfdGVtcGxhdGVPYmplY3Q5IiwiX3RlbXBsYXRlT2JqZWN0MTAiLCJfdGVtcGxhdGVPYmplY3QxMSIsIl90ZW1wbGF0ZU9iamVjdDEyIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJkb25lIiwidmFsdWUiLCJmIiwiVHlwZUVycm9yIiwibyIsIm5leHQiLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJmcm9tIiwidGVzdCIsIlN0eWxlZFNxbFBhbmVsIiwic3R5bGVkIiwiZGl2IiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJzaWRlUGFuZWxCZyIsIlN0eWxlZFNxbEFjdGlvbnMiLCJTdHlsZWRTcWxFZGl0b3IiLCJTdHlsZWRFZGl0b3JQYW5lbCIsIlN0eWxlZERhdGFQYW5lbCIsIlN0eWxlZEVkaXRvciIsInByb3BzIiwiaXNSdW5uaW5nIiwiU3R5bGVkUmVzdWx0QWN0aW9ucyIsIlN0eWxlZFJlc2l6ZUhhbmRsZSIsIlBhbmVsUmVzaXplSGFuZGxlIiwicGFuZWxCb3JkZXJDb2xvciIsIlN0eWxlZFZlcnRpY2FsUmVzaXplSGFuZGxlIiwiU3R5bGVkTG9hZGluZ0NvbnRhaW5lciIsIlN0eWxlZEVycm9yQ29udGFpbmVyIiwicHJlIiwiU3R5bGVkRmlsZURyb3BBcmVhIiwiRmlsZURyb3AiLCJkcmFnT3ZlciIsInRoZW1lIiwic3VidGV4dENvbG9yTFQiLCJTQ0hFTUFfUEFORUxfU1RZTEUiLCJvdmVyZmxvdyIsIlNxbFBhbmVsIiwiZXhwb3J0cyIsIl9yZWYiLCJfcmVmJGluaXRpYWxTcWwiLCJpbml0aWFsU3FsIiwiX3VzZVN0YXRlIiwidXNlU3RhdGUiLCJwYXJhbXMiLCJVUkxTZWFyY2hQYXJhbXMiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsInNlYXJjaCIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheTIiLCJzcWwiLCJzZXRTcWwiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsImRyb3BwZWRGaWxlIiwic2V0RHJvcHBlZEZpbGUiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImRyYWdTdGF0ZSIsInNldERyYWdTdGF0ZSIsIl91c2VTdGF0ZTciLCJfdXNlU3RhdGU4IiwicmVzdWx0Iiwic2V0UmVzdWx0IiwiX3VzZVN0YXRlOSIsIl91c2VTdGF0ZTEwIiwic2NoZW1hVXBkYXRlVHJpZ2dlciIsInNldFNjaGVtYVVwZGF0ZVRyaWdnZXIiLCJfdXNlU3RhdGUxMSIsIl91c2VTdGF0ZTEyIiwiZXJyb3IiLCJzZXRFcnJvciIsIl91c2VTdGF0ZTEzIiwiX3VzZVN0YXRlMTQiLCJjb3VudGVyIiwic2V0Q291bnRlciIsIl91c2VTdGF0ZTE1IiwiX3VzZVN0YXRlMTYiLCJ0YWJsZVNjaGVtYSIsInNldFRhYmxlU2NoZW1hIiwiX3VzZVN0YXRlMTciLCJfdXNlU3RhdGUxOCIsInNldElzUnVubmluZyIsIl91c2VTdGF0ZTE5IiwiaXNBcHBsZURldmljZSIsIl91c2VTdGF0ZTIwIiwiaXNNYWMiLCJkaXNwYXRjaCIsInVzZURpc3BhdGNoIiwiZHJvcHBlZEZpbGVBcmVhUmVmIiwidXNlUmVmIiwidXNlRWZmZWN0IiwiY3VycmVudFVybCIsIlVSTCIsImhyZWYiLCJzZWFyY2hQYXJhbXMiLCJoaXN0b3J5IiwicmVwbGFjZVN0YXRlIiwicnVuUXVlcnkiLCJ1c2VDYWxsYmFjayIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiYWRqdXN0ZWRRdWVyeSIsImRiIiwiY29ubmVjdGlvbiIsInRlbXBUYWJsZU5hbWUiLCJzcWxTdGF0ZW1lbnRzIiwiYXJyb3dSZXN1bHQiLCJ0YWJsZUR1Y2tEQlR5cGVzIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJzdGF0ZW1lbnQiLCJpc0xhc3RRdWVyeSIsImR1Y2tEYkNvbHVtbnMiLCJfYWRqdXN0ZWRRdWVyeSIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwicHJldiIsInJlbW92ZVNRTENvbW1lbnRzIiwiRXJyb3IiLCJhYnJ1cHQiLCJnZXRBcHBsaWNhdGlvbkNvbmZpZyIsImRhdGFiYXNlIiwiY29ubmVjdCIsInNlbnQiLCJzcGxpdFNxbFN0YXRlbWVudHMiLCJ0MCIsImNoZWNrSXNTZWxlY3RRdWVyeSIsInF1ZXJ5IiwiY29uY2F0IiwiZ2V0RHVja0RCQ29sdW1uVHlwZXMiLCJnZXREdWNrREJDb2x1bW5UeXBlc01hcCIsImNhc3REdWNrREJUeXBlc0ZvcktlcGxlciIsInNldEdlb0Fycm93V0tCRXh0ZW5zaW9uIiwidDEiLCJmaW5pc2giLCJ0YWJsZSIsImNsb3NlIiwidDIiLCJEYXRlIiwibm93Iiwic3RvcCIsIm9uQ2hhbmdlIiwib25BZGRSZXN1bHRUb01hcCIsImtlcGxlckZpZWxkcyIsImFycm93U2NoZW1hVG9GaWVsZHMiLCJkYXRhc2V0VG9BZGQiLCJkYXRhIiwiZmllbGRzIiwicm93cyIsImluZm8iLCJpZCIsImdlbmVyYXRlSGFzaElkIiwibGFiZWwiLCJmb3JtYXQiLCJhZGREYXRhVG9NYXAiLCJkYXRhc2V0cyIsImlzVmFsaWRGaWxlVHlwZSIsImZpbGVuYW1lIiwiZmlsZUV4dCIsIlNVUFBPUlRFRF9EVUNLREJfRFJPUF9FWFRFTlNJT05TIiwiZmluZCIsImV4dCIsImVuZHNXaXRoIiwiQm9vbGVhbiIsImNyZWF0ZVRhYmxlRnJvbURyb3BwZWRGaWxlIiwiX3JlZjMiLCJfY2FsbGVlMiIsIl9lcnJvciIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiIsInRhYmxlRnJvbUZpbGUiLCJfeCIsImFwcGx5IiwiYXJndW1lbnRzIiwiaGFuZGxlRmlsZUlucHV0IiwiZmlsZUxpc3QiLCJldmVudCIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwiZmlsZXMiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwiZmlsdGVyIiwiZGlzYWJsZUV4dGVuc2lvbkZpbHRlciIsImZpbGVzVG9Mb2FkIiwiZXJyb3JGaWxlcyIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJmaWxlIiwicHVzaCIsImVyciIsImpvaW4iLCJjcmVhdGVFbGVtZW50IiwiUGFuZWxHcm91cCIsImRpcmVjdGlvbiIsIlBhbmVsIiwiZGVmYXVsdFNpemUiLCJtaW5TaXplIiwic3R5bGUiLCJjbGFzc05hbWUiLCJvbkRyYWdPdmVyIiwib25EcmFnTGVhdmUiLCJmcmFtZSIsImN1cnJlbnQiLCJkb2N1bWVudCIsIm9uRHJvcCIsIlNjaGVtYVBhbmVsIiwiSWNvbkJ1dHRvbiIsIm9uQ2xpY2siLCJkaXNhYmxlZCIsIkljb25zIiwiUGxheSIsImhlaWdodCIsIlRvb2x0aXAiLCJwbGFjZSIsImVmZmVjdCIsImlzUmVhZE9ubHkiLCJvblJ1blF1ZXJ5IiwiY29kZSIsIkxvYWRpbmdTcGlubmVyIiwibWVzc2FnZSIsIkJ1dHRvbiIsInNlY29uZGFyeSIsIm51bVJvd3MiLCJQcmV2aWV3RGF0YVBhbmVsIiwiZGF0YVRhYmxlU3R5bGUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9zcWwtcGFuZWwudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCAqIGFzIGFycm93IGZyb20gJ2FwYWNoZS1hcnJvdyc7XG5pbXBvcnQgUmVhY3QsIHt1c2VDYWxsYmFjaywgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlUmVmfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge3VzZURpc3BhdGNofSBmcm9tICdyZWFjdC1yZWR1eCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7UGFuZWwsIFBhbmVsR3JvdXAsIFBhbmVsUmVzaXplSGFuZGxlfSBmcm9tICdyZWFjdC1yZXNpemFibGUtcGFuZWxzJztcblxuaW1wb3J0IHthZGREYXRhVG9NYXB9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge2dlbmVyYXRlSGFzaElkfSBmcm9tICdAa2VwbGVyLmdsL2NvbW1vbi11dGlscyc7XG5pbXBvcnQge0J1dHRvbiwgRmlsZURyb3AsIEljb25CdXR0b24sIEljb25zLCBMb2FkaW5nU3Bpbm5lciwgVG9vbHRpcH0gZnJvbSAnQGtlcGxlci5nbC9jb21wb25lbnRzJztcbmltcG9ydCB7YXJyb3dTY2hlbWFUb0ZpZWxkc30gZnJvbSAnQGtlcGxlci5nbC9wcm9jZXNzb3JzJztcbmltcG9ydCB7c2lkZVBhbmVsQmcsIHBhbmVsQm9yZGVyQ29sb3J9IGZyb20gJ0BrZXBsZXIuZ2wvc3R5bGVzJztcbmltcG9ydCB7aXNBcHBsZURldmljZSwgZ2V0QXBwbGljYXRpb25Db25maWd9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuXG5pbXBvcnQgTW9uYWNvRWRpdG9yIGZyb20gJy4vbW9uYWNvLWVkaXRvcic7XG5pbXBvcnQge1NjaGVtYVBhbmVsLCBTY2hlbWFTdWdnZXN0aW9ufSBmcm9tICcuL3NjaGVtYS1wYW5lbCc7XG5pbXBvcnQge1ByZXZpZXdEYXRhUGFuZWwsIFF1ZXJ5UmVzdWx0fSBmcm9tICcuL3ByZXZpZXctZGF0YS1wYW5lbCc7XG5cbmltcG9ydCB7XG4gIGNhc3REdWNrREJUeXBlc0ZvcktlcGxlcixcbiAgZ2V0RHVja0RCQ29sdW1uVHlwZXMsXG4gIGdldER1Y2tEQkNvbHVtblR5cGVzTWFwLFxuICBzZXRHZW9BcnJvd1dLQkV4dGVuc2lvbixcbiAgc3BsaXRTcWxTdGF0ZW1lbnRzLFxuICBjaGVja0lzU2VsZWN0UXVlcnksXG4gIHJlbW92ZVNRTENvbW1lbnRzLFxuICB0YWJsZUZyb21GaWxlLFxuICBTVVBQT1JURURfRFVDS0RCX0RST1BfRVhURU5TSU9OU1xufSBmcm9tICcuLi90YWJsZS9kdWNrZGItdGFibGUtdXRpbHMnO1xuXG5jb25zdCBTdHlsZWRTcWxQYW5lbCA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtzaWRlUGFuZWxCZ307XG4gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgIzMzMztcbmA7XG5cbmNvbnN0IFN0eWxlZFNxbEFjdGlvbnMgPSBzdHlsZWQuZGl2YFxuICBmbGV4OiAwIDAgNTBweDtcbiAgZGlzcGxheTogZmxleDtcbiAgcGFkZGluZy10b3A6IDEycHg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMzMzM7XG5gO1xuXG5jb25zdCBTdHlsZWRTcWxFZGl0b3IgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBmbGV4OiAxO1xuICBtaW4td2lkdGg6IDA7IC8vIFByZXZlbnRzIGZsZXggY2hpbGQgZnJvbSBvdmVyZmxvd2luZ1xuICBoZWlnaHQ6IDEwMCU7XG5gO1xuXG5jb25zdCBTdHlsZWRFZGl0b3JQYW5lbCA9IHN0eWxlZC5kaXZgXG4gIGJhY2tncm91bmQtY29sb3I6ICR7c2lkZVBhbmVsQmd9O1xuICBkaXNwbGF5OiBmbGV4O1xuICBoZWlnaHQ6IDEwMCU7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGdhcDogNXB4O1xuICBmbGV4LWdyb3c6IDE7XG5gO1xuXG5jb25zdCBTdHlsZWREYXRhUGFuZWwgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJhY2tncm91bmQ6IHdoaXRlO1xuYDtcblxuY29uc3QgU3R5bGVkRWRpdG9yID0gc3R5bGVkLmRpdjx7aXNSdW5uaW5nOiBib29sZWFufT5gXG4gIGRpc3BsYXk6IGZsZXg7XG4gIHBhZGRpbmc6IDEycHggMTJweCAxMnB4IDA7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigzMCwgMzAsIDMwKTtcbiAgb3BhY2l0eTogJHtwcm9wcyA9PiAocHJvcHMuaXNSdW5uaW5nID8gMC41IDogMSl9O1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtaW4taGVpZ2h0OiAwOyAvLyBQcmV2ZW50cyBmbGV4IGNoaWxkIGZyb20gb3ZlcmZsb3dpbmdcbmA7XG5cbmNvbnN0IFN0eWxlZFJlc3VsdEFjdGlvbnMgPSBzdHlsZWQuZGl2YFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgcGFkZGluZzogMnB4IDEycHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZm9udC1zaXplOiAxMnB4O1xuYDtcblxuY29uc3QgU3R5bGVkUmVzaXplSGFuZGxlID0gc3R5bGVkKFBhbmVsUmVzaXplSGFuZGxlKWBcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtwYW5lbEJvcmRlckNvbG9yfTtcbiAgd2lkdGg6IDRweDtcbiAgY3Vyc29yOiBjb2wtcmVzaXplO1xuXG4gICY6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM1NTU7XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZFZlcnRpY2FsUmVzaXplSGFuZGxlID0gc3R5bGVkKFBhbmVsUmVzaXplSGFuZGxlKWBcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtwYW5lbEJvcmRlckNvbG9yfTtcbiAgaGVpZ2h0OiA0cHg7XG4gIGN1cnNvcjogcm93LXJlc2l6ZTtcblxuICAmOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTU1O1xuICB9XG5gO1xuXG5jb25zdCBTdHlsZWRMb2FkaW5nQ29udGFpbmVyID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGhlaWdodDogMTAwJTtcbmA7XG5cbmNvbnN0IFN0eWxlZEVycm9yQ29udGFpbmVyID0gc3R5bGVkLnByZWBcbiAgcGFkZGluZzogMTJweDtcbiAgY29sb3I6IHJlZDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAke3NpZGVQYW5lbEJnfTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBvdmVyZmxvdzogYXV0bztcbmA7XG5cbmludGVyZmFjZSBTdHlsZWREcmFnUGFuZWxQcm9wcyB7XG4gIGRyYWdPdmVyPzogYm9vbGVhbjtcbn1cblxuY29uc3QgU3R5bGVkRmlsZURyb3BBcmVhID0gc3R5bGVkKEZpbGVEcm9wKTxTdHlsZWREcmFnUGFuZWxQcm9wcz5gXG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIGJvcmRlcjogMXB4ICR7cHJvcHMgPT4gKHByb3BzLmRyYWdPdmVyID8gJ3NvbGlkJyA6ICdkYXNoZWQnKX1cbiAgICAke3Byb3BzID0+IChwcm9wcy5kcmFnT3ZlciA/IHByb3BzLnRoZW1lLnN1YnRleHRDb2xvckxUIDogJ3RyYW5zcGFyZW50Jyl9O1xuICAuZmlsZS1kcm9wLXRhcmdldCB7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICB9XG5gO1xuXG50eXBlIFNxbFBhbmVsUHJvcHMgPSB7XG4gIGluaXRpYWxTcWw/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBTQ0hFTUFfUEFORUxfU1RZTEUgPSB7b3ZlcmZsb3c6ICdhdXRvJ307XG5cbmV4cG9ydCBjb25zdCBTcWxQYW5lbDogUmVhY3QuRkM8U3FsUGFuZWxQcm9wcz4gPSAoe2luaXRpYWxTcWwgPSAnJ30pID0+IHtcbiAgY29uc3QgW3NxbCwgc2V0U3FsXSA9IHVzZVN0YXRlKCgpID0+IHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgIHJldHVybiBwYXJhbXMuZ2V0KCdzcWwnKSB8fCBpbml0aWFsU3FsO1xuICB9KTtcbiAgY29uc3QgW2Ryb3BwZWRGaWxlLCBzZXREcm9wcGVkRmlsZV0gPSB1c2VTdGF0ZTxGaWxlIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtkcmFnU3RhdGUsIHNldERyYWdTdGF0ZV0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtyZXN1bHQsIHNldFJlc3VsdF0gPSB1c2VTdGF0ZTxudWxsIHwgUXVlcnlSZXN1bHQ+KG51bGwpO1xuICBjb25zdCBbc2NoZW1hVXBkYXRlVHJpZ2dlciwgc2V0U2NoZW1hVXBkYXRlVHJpZ2dlcl0gPSB1c2VTdGF0ZTxudW1iZXI+KDApO1xuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPEVycm9yIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtjb3VudGVyLCBzZXRDb3VudGVyXSA9IHVzZVN0YXRlKDApO1xuICBjb25zdCBbdGFibGVTY2hlbWEsIHNldFRhYmxlU2NoZW1hXSA9IHVzZVN0YXRlPFNjaGVtYVN1Z2dlc3Rpb25bXT4oW10pO1xuICBjb25zdCBbaXNSdW5uaW5nLCBzZXRJc1J1bm5pbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbaXNNYWNdID0gdXNlU3RhdGUoKCkgPT4gaXNBcHBsZURldmljZSgpKTtcbiAgY29uc3QgZGlzcGF0Y2ggPSB1c2VEaXNwYXRjaCgpO1xuXG4gIGNvbnN0IGRyb3BwZWRGaWxlQXJlYVJlZiA9IHVzZVJlZihudWxsKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRVcmwgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICBpZiAoc3FsKSB7XG4gICAgICBjdXJyZW50VXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3NxbCcsIHNxbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRVcmwuc2VhcmNoUGFyYW1zLmRlbGV0ZSgnc3FsJyk7XG4gICAgfVxuICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgJycsIGN1cnJlbnRVcmwudG9TdHJpbmcoKSk7XG4gIH0sIFtzcWxdKTtcblxuICBjb25zdCBydW5RdWVyeSA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBzZXRJc1J1bm5pbmcodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFkanVzdGVkUXVlcnkgPSBzcWwgPyByZW1vdmVTUUxDb21tZW50cyhzcWwpIDogbnVsbDtcbiAgICAgIGlmICghYWRqdXN0ZWRRdWVyeSkge1xuICAgICAgICBzZXRFcnJvcihuZXcgRXJyb3IoJ1F1ZXJ5IGlzIGVtcHR5JykpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRiID0gZ2V0QXBwbGljYXRpb25Db25maWcoKS5kYXRhYmFzZTtcbiAgICAgIGlmICghZGIpIHtcbiAgICAgICAgc2V0RXJyb3IobmV3IEVycm9yKCdUaGUgZGF0YWJhc2UgaXMgbm90IGNvbmZpZ3VyZWQgcHJvcGVybHkuJykpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gYXdhaXQgZGIuY29ubmVjdCgpO1xuXG4gICAgICAvLyBUT0RPIGZpbmQgYSBjaGVhcCB3YXkgdG8gZ2V0IER1Y2tEYiB0eXBlcyB3aXRoIGEgc2luZ2xlIHF1ZXJ5IHRvIGEgcmVtb3RlIHJlc291cmNlIC0gdGVtcCB0YWJsZT8gY3RlP1xuICAgICAgY29uc3QgdGVtcFRhYmxlTmFtZSA9ICd0ZW1wX2tlcGxlcmdsX3RhYmxlJztcblxuICAgICAgLy8gcmVtb3ZlIGNvbW1lbnRzXG4gICAgICBjb25zdCBzcWxTdGF0ZW1lbnRzID0gc3BsaXRTcWxTdGF0ZW1lbnRzKGFkanVzdGVkUXVlcnkpO1xuXG4gICAgICBsZXQgYXJyb3dSZXN1bHQ6IGFycm93LlRhYmxlIHwgbnVsbCA9IG51bGw7XG4gICAgICBsZXQgdGFibGVEdWNrREJUeXBlcyA9IHt9O1xuXG4gICAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzcWxTdGF0ZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IGlzTGFzdFF1ZXJ5ID0gc3RhdGVtZW50ID09PSBzcWxTdGF0ZW1lbnRzW3NxbFN0YXRlbWVudHMubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChpc0xhc3RRdWVyeSAmJiAoYXdhaXQgY2hlY2tJc1NlbGVjdFF1ZXJ5KGNvbm5lY3Rpb24sIHN0YXRlbWVudCkpKSB7XG4gICAgICAgICAgLy8gMSkgY3JlYXRlIHRlbXAgdGFibGUgZnJvbSB0aGUgb3JpZ2luYWwgcXVlcnkuXG4gICAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5xdWVyeShgQ1JFQVRFIE9SIFJFUExBQ0UgVEFCTEUgJyR7dGVtcFRhYmxlTmFtZX0nIEFTICR7c3RhdGVtZW50fWApO1xuXG4gICAgICAgICAgLy8gMikgcXVlcnkgZHVja2RiIHR5cGVzIGFuZCBkZXRlY3QgY2FuZGlkYXRlIGNvbHVtbnMgZm9yIFNUX2FzV0tCIHRyYW5zZm9ybS5cbiAgICAgICAgICBjb25zdCBkdWNrRGJDb2x1bW5zID0gYXdhaXQgZ2V0RHVja0RCQ29sdW1uVHlwZXMoY29ubmVjdGlvbiwgdGVtcFRhYmxlTmFtZSk7XG4gICAgICAgICAgdGFibGVEdWNrREJUeXBlcyA9IGdldER1Y2tEQkNvbHVtblR5cGVzTWFwKGR1Y2tEYkNvbHVtbnMpO1xuXG4gICAgICAgICAgLy8gMykgY2FzdCBHRU9NRVRSWSBjb2x1bW5zIHRvIFdLQiBhbmQgQmlnSW50IHRvIGRvdWJsZS5cbiAgICAgICAgICBjb25zdCBhZGp1c3RlZFF1ZXJ5ID0gY2FzdER1Y2tEQlR5cGVzRm9yS2VwbGVyKHRlbXBUYWJsZU5hbWUsIGR1Y2tEYkNvbHVtbnMpO1xuICAgICAgICAgIGFycm93UmVzdWx0ID0gYXdhaXQgY29ubmVjdGlvbi5xdWVyeShhZGp1c3RlZFF1ZXJ5KTtcblxuICAgICAgICAgIC8vIDQpIHNldCBnZW9hcnJvdyBleHRlbnNpb24gZm9yIHRoZSBhcnJvdyB0YWJsZSBhcyBEdWNrREIgZG9lc24ndCBzdXBwb3J0IHRoZSBnZW9hcnJvdyBleHRlbnNpb24uXG4gICAgICAgICAgc2V0R2VvQXJyb3dXS0JFeHRlbnNpb24oYXJyb3dSZXN1bHQsIGR1Y2tEYkNvbHVtbnMpO1xuXG4gICAgICAgICAgLy8gNSkgcmVtb3ZlIHRlbXAgdGFibGVcbiAgICAgICAgICBhd2FpdCBjb25uZWN0aW9uLnF1ZXJ5KGBEUk9QIFRBQkxFICR7dGVtcFRhYmxlTmFtZX07YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5xdWVyeShzdGF0ZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3cgcHJldmlldyBvbmx5IGZvciB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IHF1ZXJ5XG4gICAgICBpZiAoYXJyb3dSZXN1bHQpIHtcbiAgICAgICAgc2V0UmVzdWx0KHt0YWJsZTogYXJyb3dSZXN1bHQsIHRhYmxlRHVja0RCVHlwZXN9KTtcbiAgICAgICAgc2V0RXJyb3IobnVsbCk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uY2xvc2UoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzZXRFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0SXNSdW5uaW5nKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBJbmRpY2F0ZSB0aGF0IHRoZXJlIG1heSBiZSBhIHBvc3NpYmxlIGNoYW5nZSBpbiBEdWNrREIuXG4gICAgc2V0U2NoZW1hVXBkYXRlVHJpZ2dlcihEYXRlLm5vdygpKTtcbiAgfSwgW3NxbF0pO1xuXG4gIGNvbnN0IG9uQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgdmFsdWUgPT4ge1xuICAgICAgc2V0U3FsKHZhbHVlKTtcbiAgICB9LFxuICAgIFtzZXRTcWxdXG4gICk7XG5cbiAgY29uc3Qgb25BZGRSZXN1bHRUb01hcCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoIXJlc3VsdCkgcmV0dXJuO1xuXG4gICAgY29uc3Qga2VwbGVyRmllbGRzID0gYXJyb3dTY2hlbWFUb0ZpZWxkcyhyZXN1bHQudGFibGUsIHJlc3VsdC50YWJsZUR1Y2tEQlR5cGVzKTtcblxuICAgIGNvbnN0IGRhdGFzZXRUb0FkZCA9IHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgZmllbGRzOiBrZXBsZXJGaWVsZHMsXG4gICAgICAgIC8vIFRPRE8gdHlwZSBBZGREYXRhVG9NYXBQYXlsb2FkIC0+IHJvd3MgLT4gKyBhcnJvdy5UYWJsZVxuICAgICAgICByb3dzOiByZXN1bHQudGFibGUgYXMgYW55XG4gICAgICB9LFxuICAgICAgaW5mbzoge1xuICAgICAgICBpZDogZ2VuZXJhdGVIYXNoSWQoKSxcbiAgICAgICAgbGFiZWw6IGBxdWVyeV9yZXN1bHQke2NvdW50ZXIgPiAwID8gYF8ke2NvdW50ZXJ9YCA6ICcnfWAsXG4gICAgICAgIGZvcm1hdDogJ2Fycm93J1xuICAgICAgfVxuICAgIH07XG5cbiAgICBkaXNwYXRjaChhZGREYXRhVG9NYXAoe2RhdGFzZXRzOiBbZGF0YXNldFRvQWRkXX0pKTtcbiAgICBzZXRDb3VudGVyKGNvdW50ZXIgKyAxKTtcbiAgfSwgW3Jlc3VsdCwgY291bnRlciwgZGlzcGF0Y2hdKTtcblxuICBjb25zdCBpc1ZhbGlkRmlsZVR5cGUgPSB1c2VDYWxsYmFjayhmaWxlbmFtZSA9PiB7XG4gICAgY29uc3QgZmlsZUV4dCA9IFNVUFBPUlRFRF9EVUNLREJfRFJPUF9FWFRFTlNJT05TLmZpbmQoZXh0ID0+IGZpbGVuYW1lLmVuZHNXaXRoKGV4dCkpO1xuICAgIHJldHVybiBCb29sZWFuKGZpbGVFeHQpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgY3JlYXRlVGFibGVGcm9tRHJvcHBlZEZpbGUgPSB1c2VDYWxsYmFjayhhc3luYyAoZHJvcHBlZEZpbGU6IEZpbGUgfCBudWxsKSA9PiB7XG4gICAgaWYgKGRyb3BwZWRGaWxlKSB7XG4gICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHRhYmxlRnJvbUZpbGUoZHJvcHBlZEZpbGUpO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHNldEVycm9yKGVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldEVycm9yKG51bGwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNldERyb3BwZWRGaWxlKG51bGwpO1xuICAgIHNldERyYWdTdGF0ZShmYWxzZSk7XG4gIH0sIFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNyZWF0ZVRhYmxlRnJvbURyb3BwZWRGaWxlKGRyb3BwZWRGaWxlKTtcbiAgfSwgW2Ryb3BwZWRGaWxlLCBjcmVhdGVUYWJsZUZyb21Ecm9wcGVkRmlsZV0pO1xuXG4gIGNvbnN0IGhhbmRsZUZpbGVJbnB1dCA9IHVzZUNhbGxiYWNrKFxuICAgIChmaWxlTGlzdDogRmlsZUxpc3QsIGV2ZW50OiBEcmFnRXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsZXMgPSBbLi4uZmlsZUxpc3RdLmZpbHRlcihCb29sZWFuKTtcblxuICAgICAgY29uc3QgZGlzYWJsZUV4dGVuc2lvbkZpbHRlciA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBmaWxlc1RvTG9hZDogRmlsZVtdID0gW107XG4gICAgICBjb25zdCBlcnJvckZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGlmIChkaXNhYmxlRXh0ZW5zaW9uRmlsdGVyIHx8IGlzVmFsaWRGaWxlVHlwZShmaWxlLm5hbWUpKSB7XG4gICAgICAgICAgZmlsZXNUb0xvYWQucHVzaChmaWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvckZpbGVzLnB1c2goZmlsZS5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZXNUb0xvYWQubGVuZ3RoID4gMCkge1xuICAgICAgICBzZXREcm9wcGVkRmlsZShmaWxlc1RvTG9hZFswXSk7XG4gICAgICB9IGVsc2UgaWYgKGVycm9yRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBzZXRFcnJvcihuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGZpbGUgZm9ybWF0czogJHtlcnJvckZpbGVzLmpvaW4oJywgJyl9YCkpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2lzVmFsaWRGaWxlVHlwZV1cbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxTdHlsZWRTcWxQYW5lbD5cbiAgICAgIDxQYW5lbEdyb3VwIGRpcmVjdGlvbj1cImhvcml6b250YWxcIj5cbiAgICAgICAgPFBhbmVsIGRlZmF1bHRTaXplPXsyMH0gbWluU2l6ZT17MTV9IHN0eWxlPXtTQ0hFTUFfUEFORUxfU1RZTEV9IGNsYXNzTmFtZT1cInNjaGVtYS1wYW5lbFwiPlxuICAgICAgICAgIDxTdHlsZWRGaWxlRHJvcEFyZWFcbiAgICAgICAgICAgIGRyYWdPdmVyPXtkcmFnU3RhdGV9XG4gICAgICAgICAgICBvbkRyYWdPdmVyPXsoKSA9PiBzZXREcmFnU3RhdGUodHJ1ZSl9XG4gICAgICAgICAgICBvbkRyYWdMZWF2ZT17KCkgPT4gc2V0RHJhZ1N0YXRlKGZhbHNlKX1cbiAgICAgICAgICAgIGZyYW1lPXtkcm9wcGVkRmlsZUFyZWFSZWYuY3VycmVudCB8fCBkb2N1bWVudH1cbiAgICAgICAgICAgIG9uRHJvcD17aGFuZGxlRmlsZUlucHV0fVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmlsZS11cGxvYWRlcl9fZmlsZS1kcm9wXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8U2NoZW1hUGFuZWxcbiAgICAgICAgICAgICAgc2V0VGFibGVTY2hlbWE9e3NldFRhYmxlU2NoZW1hfVxuICAgICAgICAgICAgICBkcm9wcGVkRmlsZT17ZHJvcHBlZEZpbGV9XG4gICAgICAgICAgICAgIHNjaGVtYVVwZGF0ZVRyaWdnZXI9e3NjaGVtYVVwZGF0ZVRyaWdnZXJ9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvU3R5bGVkRmlsZURyb3BBcmVhPlxuICAgICAgICA8L1BhbmVsPlxuXG4gICAgICAgIDxTdHlsZWRSZXNpemVIYW5kbGUgLz5cblxuICAgICAgICA8UGFuZWwgbWluU2l6ZT17NDB9PlxuICAgICAgICAgIDxTdHlsZWRTcWxFZGl0b3I+XG4gICAgICAgICAgICA8UGFuZWxHcm91cCBkaXJlY3Rpb249XCJ2ZXJ0aWNhbFwiPlxuICAgICAgICAgICAgICA8UGFuZWwgZGVmYXVsdFNpemU9ezMwfSBjbGFzc05hbWU9XCJlZGl0b3ItcGFuZWxcIj5cbiAgICAgICAgICAgICAgICA8U3R5bGVkRWRpdG9yUGFuZWw+XG4gICAgICAgICAgICAgICAgICA8U3R5bGVkU3FsQWN0aW9ucz5cbiAgICAgICAgICAgICAgICAgICAgPEljb25CdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRpcFxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtZm9yPVwicnVuLXF1ZXJ5LXRvb2x0aXBcIlxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3J1blF1ZXJ5fVxuICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc1J1bm5pbmcgfHwgIXNxbH1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxJY29ucy5QbGF5IGhlaWdodD1cIjE4cHhcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxUb29sdGlwIGlkPVwicnVuLXF1ZXJ5LXRvb2x0aXBcIiBwbGFjZT1cInRvcFwiIGVmZmVjdD1cInNvbGlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBSdW4gUXVlcnkgKHtpc01hYyA/ICfijJhFbnRlcicgOiAnQ3RybCtFbnRlcid9IG9yIFNoaWZ0K0VudGVyKVxuICAgICAgICAgICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICAgICAgICAgPC9JY29uQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9TdHlsZWRTcWxBY3Rpb25zPlxuICAgICAgICAgICAgICAgICAgPFN0eWxlZEVkaXRvciBpc1J1bm5pbmc9e2lzUnVubmluZ30+XG4gICAgICAgICAgICAgICAgICAgIDxNb25hY29FZGl0b3JcbiAgICAgICAgICAgICAgICAgICAgICBpc1JlYWRPbmx5PXtpc1J1bm5pbmd9XG4gICAgICAgICAgICAgICAgICAgICAgb25SdW5RdWVyeT17cnVuUXVlcnl9XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgIHRhYmxlU2NoZW1hPXt0YWJsZVNjaGVtYX1cbiAgICAgICAgICAgICAgICAgICAgICBjb2RlPXtzcWx9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L1N0eWxlZEVkaXRvcj5cbiAgICAgICAgICAgICAgICA8L1N0eWxlZEVkaXRvclBhbmVsPlxuICAgICAgICAgICAgICA8L1BhbmVsPlxuXG4gICAgICAgICAgICAgIDxTdHlsZWRWZXJ0aWNhbFJlc2l6ZUhhbmRsZSAvPlxuICAgICAgICAgICAgICA8UGFuZWwgY2xhc3NOYW1lPVwicHJldmlldy1wYW5lbFwiPlxuICAgICAgICAgICAgICAgIHtpc1J1bm5pbmcgPyAoXG4gICAgICAgICAgICAgICAgICA8U3R5bGVkTG9hZGluZ0NvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPExvYWRpbmdTcGlubmVyIC8+XG4gICAgICAgICAgICAgICAgICA8L1N0eWxlZExvYWRpbmdDb250YWluZXI+XG4gICAgICAgICAgICAgICAgKSA6IGVycm9yID8gKFxuICAgICAgICAgICAgICAgICAgPFN0eWxlZEVycm9yQ29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PntlcnJvci5tZXNzYWdlfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9TdHlsZWRFcnJvckNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICApIDogcmVzdWx0ID8gKFxuICAgICAgICAgICAgICAgICAgPFN0eWxlZERhdGFQYW5lbD5cbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFJlc3VsdEFjdGlvbnM+XG4gICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvbiBzZWNvbmRhcnkgb25DbGljaz17b25BZGRSZXN1bHRUb01hcH0+XG4gICAgICAgICAgICAgICAgICAgICAgICBBZGQgdG8gTWFwXG4gICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdj57cmVzdWx0LnRhYmxlLm51bVJvd3N9IHJvd3M8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9TdHlsZWRSZXN1bHRBY3Rpb25zPlxuICAgICAgICAgICAgICAgICAgICA8UHJldmlld0RhdGFQYW5lbFxuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdD17cmVzdWx0fVxuICAgICAgICAgICAgICAgICAgICAgIGRhdGFUYWJsZVN0eWxlPXt7fX1cbiAgICAgICAgICAgICAgICAgICAgICBvbkFkZFJlc3VsdFRvTWFwPXtvbkFkZFJlc3VsdFRvTWFwfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9TdHlsZWREYXRhUGFuZWw+XG4gICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgIDwvUGFuZWw+XG4gICAgICAgICAgICA8L1BhbmVsR3JvdXA+XG4gICAgICAgICAgPC9TdHlsZWRTcWxFZGl0b3I+XG4gICAgICAgIDwvUGFuZWw+XG4gICAgICA8L1BhbmVsR3JvdXA+XG4gICAgPC9TdHlsZWRTcWxQYW5lbD5cbiAgKTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFJQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxXQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxpQkFBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUkscUJBQUEsR0FBQUosT0FBQTtBQUVBLElBQUFLLFFBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFlBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFdBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLFdBQUEsR0FBQVIsT0FBQTtBQUNBLElBQUFTLE9BQUEsR0FBQVQsT0FBQTtBQUNBLElBQUFVLE1BQUEsR0FBQVYsT0FBQTtBQUVBLElBQUFXLGFBQUEsR0FBQVIsc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFZLFlBQUEsR0FBQVosT0FBQTtBQUNBLElBQUFhLGlCQUFBLEdBQUFiLE9BQUE7QUFFQSxJ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RUFBTyxHQUFDLGFBQzlDLEVBQUNwSSxLQUFLLEdBQUcsUUFBUSxHQUFHLFlBQVksRUFBQyxrQkFDckMsQ0FDQyxDQUNJLENBQUMsZUFDbkJySixNQUFBLFlBQUFrUSxhQUFBLENBQUNqTCxZQUFZO0lBQUNFLFNBQVMsRUFBRUE7RUFBVSxnQkFDakNuRixNQUFBLFlBQUFrUSxhQUFBLENBQUNyUCxhQUFBLFdBQVk7SUFDWDZRLFVBQVUsRUFBRXZNLFNBQVU7SUFDdEJ3TSxVQUFVLEVBQUUxSCxRQUFTO0lBQ3JCK0MsUUFBUSxFQUFFQSxRQUFTO0lBQ25CbkUsV0FBVyxFQUFFQSxXQUFZO0lBQ3pCK0ksSUFBSSxFQUFFM0s7RUFBSSxDQUNYLENBQ1csQ0FDRyxDQUNkLENBQUMsZUFFUmpILE1BQUEsWUFBQWtRLGFBQUEsQ0FBQzFLLDBCQUEwQixNQUFFLENBQUMsZUFDOUJ4RixNQUFBLFlBQUFrUSxhQUFBLENBQUM1UCxxQkFBQSxDQUFBK1AsS0FBSztJQUFDSSxTQUFTLEVBQUM7RUFBZSxHQUM3QnRMLFNBQVMsZ0JBQ1JuRixNQUFBLFlBQUFrUSxhQUFBLENBQUN6SyxzQkFBc0IscUJBQ3JCekYsTUFBQSxZQUFBa1EsYUFBQSxDQUFDelAsV0FBQSxDQUFBb1IsY0FBYyxNQUFFLENBQ0ssQ0FBQyxHQUN2QnhKLEtBQUssZ0JBQ1BySSxNQUFBLFlBQUFrUSxhQUFBLENBQUN4SyxvQkFBb0IscUJBQ25CMUYsTUFBQSxZQUFBa1EsYUFBQSxjQUFNN0gsS0FBSyxDQUFDeUosT0FBYSxDQUNMLENBQUMsR0FDckJqSyxNQUFNLGdCQUNSN0gsTUFBQSxZQUFBa1EsYUFBQSxDQUFDbEwsZUFBZSxxQkFDZGhGLE1BQUEsWUFBQWtRLGFBQUEsQ0FBQzlLLG1CQUFtQixxQkFDbEJwRixNQUFBLFlBQUFrUSxhQUFBLENBQUN6UCxXQUFBLENBQUFzUixNQUFNO0lBQUNDLFNBQVM7SUFBQ2QsT0FBTyxFQUFFakU7RUFBaUIsR0FBQyxZQUVyQyxDQUFDLGVBQ1RqTixNQUFBLFlBQUFrUSxhQUFBLGNBQU1ySSxNQUFNLENBQUM2RSxLQUFLLENBQUN1RixPQUFPLEVBQUMsT0FBVSxDQUNsQixDQUFDLGVBQ3RCalMsTUFBQSxZQUFBa1EsYUFBQSxDQUFDblAsaUJBQUEsQ0FBQW1SLGdCQUFnQjtJQUNmckssTUFBTSxFQUFFQSxNQUFPO0lBQ2ZzSyxjQUFjLEVBQUUsQ0FBQyxDQUFFO0lBQ25CbEYsZ0JBQWdCLEVBQUVBO0VBQWlCLENBQ3BDLENBQ2MsQ0FBQyxHQUNoQixJQUNDLENBQ0csQ0FDRyxDQUNaLENBQ0csQ0FDRSxDQUFDO0FBRXJCLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
|
package/dist/components/tree.js
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
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.DatasetNode = exports.ColumnNode = void 0;
|
|
9
|
-
exports.Tree = Tree;
|
|
10
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
11
|
-
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
|
|
12
|
-
var _reactCollapsible = require("@radix-ui/react-collapsible");
|
|
13
|
-
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
14
|
-
var _react = _interopRequireWildcard(require("react"));
|
|
15
|
-
var _classnames = _interopRequireDefault(require("classnames"));
|
|
16
|
-
var _components = require("@kepler.gl/components");
|
|
17
|
-
var _templateObject, _templateObject2, _templateObject3; // SPDX-License-Identifier: MIT
|
|
18
|
-
// Copyright contributors to the kepler.gl project
|
|
19
|
-
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
20
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
|
21
|
-
// TODO: consider using react-vtree/react-window for virtualization
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Component that renders a generic tree.
|
|
25
|
-
* @param treeData - The tree data.
|
|
26
|
-
* @param renderNode - A function that renders a tree node.
|
|
27
|
-
*/
|
|
28
|
-
function Tree(props) {
|
|
29
|
-
var treeData = props.treeData,
|
|
30
|
-
renderNode = props.renderNode;
|
|
31
|
-
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
32
|
-
className: "flex flex-col"
|
|
33
|
-
}, /*#__PURE__*/_react["default"].createElement(TreeNode, {
|
|
34
|
-
treeData: treeData,
|
|
35
|
-
renderNode: renderNode
|
|
36
|
-
}));
|
|
37
|
-
}
|
|
38
|
-
var StyledCollapsibleTriggerContent = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n width: 100%;\n cursor: pointer;\n align-items: center;\n"])));
|
|
39
|
-
/**
|
|
40
|
-
* Component that renders a tree node.
|
|
41
|
-
*/
|
|
42
|
-
function TreeNode(props) {
|
|
43
|
-
var treeData = props.treeData,
|
|
44
|
-
renderNode = props.renderNode;
|
|
45
|
-
var children = treeData.children;
|
|
46
|
-
var _useState = (0, _react.useState)(Boolean(treeData.isOpen)),
|
|
47
|
-
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
48
|
-
isOpen = _useState2[0],
|
|
49
|
-
setIsOpen = _useState2[1];
|
|
50
|
-
(0, _react.useEffect)(function () {
|
|
51
|
-
setIsOpen(Boolean(treeData.isOpen));
|
|
52
|
-
}, [treeData.isOpen]);
|
|
53
|
-
if (!children) {
|
|
54
|
-
return renderNode(treeData, isOpen);
|
|
55
|
-
}
|
|
56
|
-
return /*#__PURE__*/_react["default"].createElement(_reactCollapsible.Collapsible, {
|
|
57
|
-
open: isOpen,
|
|
58
|
-
onOpenChange: setIsOpen
|
|
59
|
-
}, /*#__PURE__*/_react["default"].createElement(_reactCollapsible.CollapsibleTrigger, {
|
|
60
|
-
className: "w-full",
|
|
61
|
-
asChild: true
|
|
62
|
-
}, /*#__PURE__*/_react["default"].createElement(StyledCollapsibleTriggerContent, null, /*#__PURE__*/_react["default"].createElement(_components.Icons.ArrowRight, {
|
|
63
|
-
className: (0, _classnames["default"])('flex-shrink-0 text-gray-500', {
|
|
64
|
-
'rotate-90 transform': isOpen
|
|
65
|
-
}),
|
|
66
|
-
height: "18px"
|
|
67
|
-
}), renderNode(treeData, isOpen))), /*#__PURE__*/_react["default"].createElement(_reactCollapsible.CollapsibleContent, {
|
|
68
|
-
className: "pl-4"
|
|
69
|
-
}, isOpen ? children.map(function (child) {
|
|
70
|
-
return /*#__PURE__*/_react["default"].createElement(TreeNode, {
|
|
71
|
-
key: child.key,
|
|
72
|
-
treeData: child,
|
|
73
|
-
renderNode: renderNode
|
|
74
|
-
});
|
|
75
|
-
}) : null));
|
|
76
|
-
}
|
|
77
|
-
var StyledDatasetNode = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n font-weight: bold;\n"])));
|
|
78
|
-
var DatasetNode = exports.DatasetNode = function DatasetNode(_ref) {
|
|
79
|
-
var node = _ref.node;
|
|
80
|
-
return /*#__PURE__*/_react["default"].createElement(StyledDatasetNode, null, node.object.tableName);
|
|
81
|
-
};
|
|
82
|
-
var StyledColumnNode = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n padding: 4px 0;\n margin-left: 16px;\n\n .column-name {\n margin-left: 8px;\n }\n"])));
|
|
83
|
-
var ColumnNode = exports.ColumnNode = function ColumnNode(_ref2) {
|
|
84
|
-
var node = _ref2.node;
|
|
85
|
-
return /*#__PURE__*/_react["default"].createElement(StyledColumnNode, null, /*#__PURE__*/_react["default"].createElement(_components.FieldToken, {
|
|
86
|
-
type: node.object.fieldType
|
|
87
|
-
}), /*#__PURE__*/_react["default"].createElement("div", {
|
|
88
|
-
className: "column-name"
|
|
89
|
-
}, node.object.name));
|
|
90
|
-
};
|
|
91
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3RDb2xsYXBzaWJsZSIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9jbGFzc25hbWVzIiwiX2NvbXBvbmVudHMiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX3RlbXBsYXRlT2JqZWN0MyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIlRyZWUiLCJwcm9wcyIsInRyZWVEYXRhIiwicmVuZGVyTm9kZSIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJUcmVlTm9kZSIsIlN0eWxlZENvbGxhcHNpYmxlVHJpZ2dlckNvbnRlbnQiLCJzdHlsZWQiLCJkaXYiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsImNoaWxkcmVuIiwiX3VzZVN0YXRlIiwidXNlU3RhdGUiLCJCb29sZWFuIiwiaXNPcGVuIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5MiIsInNldElzT3BlbiIsInVzZUVmZmVjdCIsIkNvbGxhcHNpYmxlIiwib3BlbiIsIm9uT3BlbkNoYW5nZSIsIkNvbGxhcHNpYmxlVHJpZ2dlciIsImFzQ2hpbGQiLCJJY29ucyIsIkFycm93UmlnaHQiLCJjbGFzc05hbWVzIiwiaGVpZ2h0IiwiQ29sbGFwc2libGVDb250ZW50IiwibWFwIiwiY2hpbGQiLCJrZXkiLCJTdHlsZWREYXRhc2V0Tm9kZSIsIkRhdGFzZXROb2RlIiwiZXhwb3J0cyIsIl9yZWYiLCJub2RlIiwib2JqZWN0IiwidGFibGVOYW1lIiwiU3R5bGVkQ29sdW1uTm9kZSIsIkNvbHVtbk5vZGUiLCJfcmVmMiIsIkZpZWxkVG9rZW4iLCJ0eXBlIiwiZmllbGRUeXBlIiwibmFtZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL3RyZWUudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7Q29sbGFwc2libGUsIENvbGxhcHNpYmxlVHJpZ2dlciwgQ29sbGFwc2libGVDb250ZW50fSBmcm9tICdAcmFkaXgtdWkvcmVhY3QtY29sbGFwc2libGUnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgUmVhY3QsIHt1c2VFZmZlY3QsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcblxuaW1wb3J0IHtJY29ucywgRmllbGRUb2tlbn0gZnJvbSAnQGtlcGxlci5nbC9jb21wb25lbnRzJztcblxuZXhwb3J0IHR5cGUgVHJlZU5vZGVEYXRhPFQ+ID0ge1xuICBrZXk6IHN0cmluZztcbiAgb2JqZWN0OiBUO1xuICBjaGlsZHJlbj86IFRyZWVOb2RlRGF0YTxUPltdO1xuICBpc09wZW4/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgVHJlZVByb3BzPFQ+ID0ge1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG4gIHRyZWVEYXRhOiBUcmVlTm9kZURhdGE8VD47XG4gIHJlbmRlck5vZGU6IFRyZWVOb2RlUHJvcHM8VD5bJ3JlbmRlck5vZGUnXTtcbn07XG5cbi8vIFRPRE86IGNvbnNpZGVyIHVzaW5nIHJlYWN0LXZ0cmVlL3JlYWN0LXdpbmRvdyBmb3IgdmlydHVhbGl6YXRpb25cblxuLyoqXG4gKiBDb21wb25lbnQgdGhhdCByZW5kZXJzIGEgZ2VuZXJpYyB0cmVlLlxuICogQHBhcmFtIHRyZWVEYXRhIC0gVGhlIHRyZWUgZGF0YS5cbiAqIEBwYXJhbSByZW5kZXJOb2RlIC0gQSBmdW5jdGlvbiB0aGF0IHJlbmRlcnMgYSB0cmVlIG5vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBUcmVlPFQ+KHByb3BzOiBUcmVlUHJvcHM8VD4pOiBSZWFjdC5SZWFjdEVsZW1lbnQge1xuICBjb25zdCB7dHJlZURhdGEsIHJlbmRlck5vZGV9ID0gcHJvcHM7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sXCI+XG4gICAgICA8VHJlZU5vZGU8VD4gdHJlZURhdGE9e3RyZWVEYXRhfSByZW5kZXJOb2RlPXtyZW5kZXJOb2RlfSAvPlxuICAgIDwvZGl2PlxuICApO1xufVxuXG5leHBvcnQgdHlwZSBUcmVlTm9kZVByb3BzPFQ+ID0ge1xuICB0cmVlRGF0YTogVHJlZU5vZGVEYXRhPFQ+O1xuICByZW5kZXJOb2RlOiAobm9kZTogVHJlZU5vZGVEYXRhPFQ+LCBpc09wZW46IGJvb2xlYW4pID0+IEpTWC5FbGVtZW50IHwgbnVsbDtcbn07XG5cbmNvbnN0IFN0eWxlZENvbGxhcHNpYmxlVHJpZ2dlckNvbnRlbnQgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICB3aWR0aDogMTAwJTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuYDtcbi8qKlxuICogQ29tcG9uZW50IHRoYXQgcmVuZGVycyBhIHRyZWUgbm9kZS5cbiAqL1xuZnVuY3Rpb24gVHJlZU5vZGU8VD4ocHJvcHM6IFRyZWVOb2RlUHJvcHM8VD4pOiBKU1guRWxlbWVudCB8IG51bGwge1xuICBjb25zdCB7dHJlZURhdGEsIHJlbmRlck5vZGV9ID0gcHJvcHM7XG4gIGNvbnN0IHtjaGlsZHJlbn0gPSB0cmVlRGF0YTtcbiAgY29uc3QgW2lzT3Blbiwgc2V0SXNPcGVuXSA9IHVzZVN0YXRlKEJvb2xlYW4odHJlZURhdGEuaXNPcGVuKSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0SXNPcGVuKEJvb2xlYW4odHJlZURhdGEuaXNPcGVuKSk7XG4gIH0sIFt0cmVlRGF0YS5pc09wZW5dKTtcbiAgaWYgKCFjaGlsZHJlbikge1xuICAgIHJldHVybiByZW5kZXJOb2RlKHRyZWVEYXRhLCBpc09wZW4pO1xuICB9XG4gIHJldHVybiAoXG4gICAgPENvbGxhcHNpYmxlIG9wZW49e2lzT3Blbn0gb25PcGVuQ2hhbmdlPXtzZXRJc09wZW59PlxuICAgICAgPENvbGxhcHNpYmxlVHJpZ2dlciBjbGFzc05hbWU9XCJ3LWZ1bGxcIiBhc0NoaWxkPlxuICAgICAgICA8U3R5bGVkQ29sbGFwc2libGVUcmlnZ2VyQ29udGVudD5cbiAgICAgICAgICA8SWNvbnMuQXJyb3dSaWdodFxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKCdmbGV4LXNocmluay0wIHRleHQtZ3JheS01MDAnLCB7J3JvdGF0ZS05MCB0cmFuc2Zvcm0nOiBpc09wZW59KX1cbiAgICAgICAgICAgIGhlaWdodD1cIjE4cHhcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAge3JlbmRlck5vZGUodHJlZURhdGEsIGlzT3Blbil9XG4gICAgICAgIDwvU3R5bGVkQ29sbGFwc2libGVUcmlnZ2VyQ29udGVudD5cbiAgICAgIDwvQ29sbGFwc2libGVUcmlnZ2VyPlxuICAgICAgPENvbGxhcHNpYmxlQ29udGVudCBjbGFzc05hbWU9XCJwbC00XCI+XG4gICAgICAgIHtpc09wZW5cbiAgICAgICAgICA/IGNoaWxkcmVuLm1hcChjaGlsZCA9PiAoXG4gICAgICAgICAgICAgIDxUcmVlTm9kZTxUPiBrZXk9e2NoaWxkLmtleX0gdHJlZURhdGE9e2NoaWxkfSByZW5kZXJOb2RlPXtyZW5kZXJOb2RlfSAvPlxuICAgICAgICAgICAgKSlcbiAgICAgICAgICA6IG51bGx9XG4gICAgICA8L0NvbGxhcHNpYmxlQ29udGVudD5cbiAgICA8L0NvbGxhcHNpYmxlPlxuICApO1xufVxuXG5jb25zdCBTdHlsZWREYXRhc2V0Tm9kZSA9IHN0eWxlZC5kaXZgXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuYDtcblxuZXhwb3J0IGNvbnN0IERhdGFzZXROb2RlID0gKHtub2RlfSkgPT4ge1xuICByZXR1cm4gPFN0eWxlZERhdGFzZXROb2RlPntub2RlLm9iamVjdC50YWJsZU5hbWV9PC9TdHlsZWREYXRhc2V0Tm9kZT47XG59O1xuXG5jb25zdCBTdHlsZWRDb2x1bW5Ob2RlID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgcGFkZGluZzogNHB4IDA7XG4gIG1hcmdpbi1sZWZ0OiAxNnB4O1xuXG4gIC5jb2x1bW4tbmFtZSB7XG4gICAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgfVxuYDtcbmV4cG9ydCBjb25zdCBDb2x1bW5Ob2RlID0gKHtub2RlfSkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxTdHlsZWRDb2x1bW5Ob2RlPlxuICAgICAgPEZpZWxkVG9rZW4gdHlwZT17bm9kZS5vYmplY3QuZmllbGRUeXBlfSAvPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2x1bW4tbmFtZVwiPntub2RlLm9iamVjdC5uYW1lfTwvZGl2PlxuICAgIDwvU3R5bGVkQ29sdW1uTm9kZT5cbiAgKTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsaUJBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxNQUFBLEdBQUFDLHVCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBSyxXQUFBLEdBQUFILHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBTSxXQUFBLEdBQUFOLE9BQUE7QUFBd0QsSUFBQU8sZUFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQVJ4RDtBQUNBO0FBQUEsU0FBQUMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFB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
|