@kepler.gl/utils 3.0.0 → 3.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/package.json +14 -10
  2. package/dist/aggregate-utils.d.ts +0 -3
  3. package/dist/aggregate-utils.js +0 -75
  4. package/dist/arrow-data-container.d.ts +0 -54
  5. package/dist/arrow-data-container.js +0 -360
  6. package/dist/color-utils.d.ts +0 -51
  7. package/dist/color-utils.js +0 -161
  8. package/dist/data-container-interface.d.ts +0 -133
  9. package/dist/data-container-interface.js +0 -6
  10. package/dist/data-container-utils.d.ts +0 -30
  11. package/dist/data-container-utils.js +0 -88
  12. package/dist/data-row.d.ts +0 -59
  13. package/dist/data-row.js +0 -126
  14. package/dist/data-scale-utils.d.ts +0 -23
  15. package/dist/data-scale-utils.js +0 -62
  16. package/dist/data-utils.d.ts +0 -103
  17. package/dist/data-utils.js +0 -502
  18. package/dist/dataset-utils.d.ts +0 -116
  19. package/dist/dataset-utils.js +0 -614
  20. package/dist/dom-to-image.d.ts +0 -73
  21. package/dist/dom-to-image.js +0 -489
  22. package/dist/dom-utils.d.ts +0 -23
  23. package/dist/dom-utils.js +0 -434
  24. package/dist/effect-utils.d.ts +0 -23
  25. package/dist/effect-utils.js +0 -196
  26. package/dist/export-map-html.d.ts +0 -9
  27. package/dist/export-map-html.js +0 -28
  28. package/dist/export-utils.d.ts +0 -53
  29. package/dist/export-utils.js +0 -262
  30. package/dist/filter-utils.d.ts +0 -326
  31. package/dist/filter-utils.js +0 -1333
  32. package/dist/format.d.ts +0 -1
  33. package/dist/format.js +0 -17
  34. package/dist/gl-utils.d.ts +0 -1
  35. package/dist/gl-utils.js +0 -35
  36. package/dist/h3-utils.d.ts +0 -21
  37. package/dist/h3-utils.js +0 -81
  38. package/dist/index.d.ts +0 -36
  39. package/dist/index.js +0 -772
  40. package/dist/indexed-data-container.d.ts +0 -34
  41. package/dist/indexed-data-container.js +0 -254
  42. package/dist/locale-utils.d.ts +0 -2
  43. package/dist/locale-utils.js +0 -54
  44. package/dist/map-info-utils.d.ts +0 -1
  45. package/dist/map-info-utils.js +0 -15
  46. package/dist/map-style-utils/mapbox-gl-style-editor.d.ts +0 -65
  47. package/dist/map-style-utils/mapbox-gl-style-editor.js +0 -218
  48. package/dist/map-style-utils/mapbox-utils.d.ts +0 -9
  49. package/dist/map-style-utils/mapbox-utils.js +0 -48
  50. package/dist/map-utils.d.ts +0 -9
  51. package/dist/map-utils.js +0 -65
  52. package/dist/mapbox-utils.d.ts +0 -7
  53. package/dist/mapbox-utils.js +0 -22
  54. package/dist/noop.d.ts +0 -1
  55. package/dist/noop.js +0 -11
  56. package/dist/notifications-utils.d.ts +0 -42
  57. package/dist/notifications-utils.js +0 -85
  58. package/dist/observe-dimensions.d.ts +0 -15
  59. package/dist/observe-dimensions.js +0 -151
  60. package/dist/plot.d.ts +0 -6
  61. package/dist/plot.js +0 -31
  62. package/dist/projection-utils.d.ts +0 -21
  63. package/dist/projection-utils.js +0 -100
  64. package/dist/row-data-container.d.ts +0 -31
  65. package/dist/row-data-container.js +0 -252
  66. package/dist/searcher-utils.d.ts +0 -1
  67. package/dist/searcher-utils.js +0 -28
  68. package/dist/split-map-utils.d.ts +0 -32
  69. package/dist/split-map-utils.js +0 -114
  70. package/dist/time.d.ts +0 -16
  71. package/dist/time.js +0 -89
  72. package/dist/utils.d.ts +0 -116
  73. package/dist/utils.js +0 -305
package/dist/utils.js DELETED
@@ -1,305 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.generateHashId = generateHashId;
9
- exports.generateHashIdFromString = generateHashIdFromString;
10
- exports.isChrome = isChrome;
11
- exports.capitalizeFirstLetter = capitalizeFirstLetter;
12
- exports.camelToTitle = camelToTitle;
13
- exports.toArray = toArray;
14
- exports.isObject = isObject;
15
- exports.isPlainObject = isPlainObject;
16
- exports.getError = getError;
17
- exports.arrayInsert = arrayInsert;
18
- exports.hasMobileWidth = hasMobileWidth;
19
- exports.hasPortableWidth = hasPortableWidth;
20
- exports.isTest = isTest;
21
- exports.filterObjectByPredicate = filterObjectByPredicate;
22
- exports.isFunction = isFunction;
23
- exports.findById = findById;
24
- exports.arrayDifference = arrayDifference;
25
- exports.set = exports.insertValue = exports.camelize = void 0;
26
-
27
- var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray"));
28
-
29
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
30
-
31
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
32
-
33
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
34
-
35
- var _window = _interopRequireDefault(require("global/window"));
36
-
37
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
38
-
39
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
40
-
41
- /**
42
- * Generate a hash string based on number of character
43
- * @param {number} count
44
- * @returns {string} hash string
45
- */
46
- function generateHashId() {
47
- var count = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 6;
48
- return Math.random().toString(36).substr(count);
49
- }
50
- /**
51
- * Generate a hash string based on string
52
- * @param str
53
- * @returns
54
- */
55
-
56
-
57
- function generateHashIdFromString(str) {
58
- // generate hash string based on string
59
- var hash = 0;
60
- var i;
61
- var chr;
62
- var len;
63
- if (str.length === 0) return hash.toString();
64
-
65
- for (i = 0, len = str.length; i < len; i++) {
66
- chr = str.charCodeAt(i); // eslint-disable-next-line no-bitwise
67
-
68
- hash = (hash << 5) - hash + chr; // eslint-disable-next-line no-bitwise
69
-
70
- hash |= 0; // Convert to 32bit integer
71
- }
72
-
73
- return hash.toString(36);
74
- }
75
- /**
76
- * Detect chrome
77
- * @returns {boolean} - yes or no
78
- */
79
-
80
-
81
- function isChrome() {
82
- // Chrome 1+
83
- return _window["default"].chrome && _window["default"].chrome.webstore;
84
- }
85
- /**
86
- * Capitalize first letter of a string
87
- * @param {string} str
88
- * @returns {string}
89
- */
90
-
91
-
92
- function capitalizeFirstLetter(str) {
93
- return typeof str === 'string' ? str.charAt(0).toUpperCase() + str.slice(1) : str;
94
- }
95
- /**
96
- * Convert camel style names to title
97
- * strokeColor -> Stroke Color
98
- * @param {string} str
99
- * @returns {string}
100
- */
101
-
102
-
103
- function camelToTitle(str) {
104
- var breakWord = str.replace(/([A-Z])/g, ' $1');
105
- return capitalizeFirstLetter(breakWord);
106
- }
107
- /**
108
- * Convert names to camel style
109
- * Stroke Color -> strokeColor
110
- * @param {string} str
111
- * @returns {string}
112
- */
113
-
114
-
115
- var camelize = function camelize(str) {
116
- return str.replace(/(?:^\w|[A-Z]|\b\w|\s+)/g, function (match, index) {
117
- if (Number(match) === 0) return ''; // or if (/\s+/.test(match)) for white spaces
118
-
119
- return index === 0 ? match.toLowerCase() : match.toUpperCase();
120
- });
121
- };
122
- /**
123
- * Converts non-arrays to arrays. Leaves arrays alone. Converts
124
- * undefined values to empty arrays ([] instead of [undefined]).
125
- * Otherwise, just returns [item] for non-array items.
126
- *
127
- * @param {*} item
128
- * @returns {array} boom! much array. very indexed. so useful.
129
- */
130
-
131
-
132
- exports.camelize = camelize;
133
-
134
- function toArray(item) {
135
- if (Array.isArray(item)) {
136
- return item;
137
- }
138
-
139
- if (typeof item === 'undefined' || item === null) {
140
- return [];
141
- }
142
-
143
- return [item];
144
- }
145
- /**
146
- * immutably insert value to an Array or Object
147
- * @param {Array|Object} obj
148
- * @param {Number|String} key
149
- * @param {*} value
150
- * @returns {Array|Object}
151
- */
152
-
153
-
154
- var insertValue = function insertValue(obj, key, value) {
155
- if (Array.isArray(obj) && typeof key === 'number') {
156
- return [].concat((0, _toConsumableArray2["default"])(obj.slice(0, key)), [value], (0, _toConsumableArray2["default"])(obj.slice(key + 1, obj.length)));
157
- }
158
-
159
- return _objectSpread(_objectSpread({}, obj), {}, (0, _defineProperty2["default"])({}, key, value));
160
- };
161
- /**
162
- * check if value is a loose object including a plain object, array, function
163
- * @param {*} value
164
- */
165
-
166
-
167
- exports.insertValue = insertValue;
168
-
169
- function isObject(value) {
170
- return value !== null && ((0, _typeof2["default"])(value) === 'object' || typeof value === 'function');
171
- }
172
- /**
173
- * whether is an object
174
- * @returns {boolean} - yes or no
175
- */
176
-
177
-
178
- function isPlainObject(obj) {
179
- return obj === Object(obj) && typeof obj !== 'function' && !Array.isArray(obj);
180
- }
181
-
182
- var setPath = function setPath(_ref, value, obj) {
183
- var _ref2 = (0, _toArray2["default"])(_ref),
184
- key = _ref2[0],
185
- next = _ref2.slice(1);
186
-
187
- // is Object allows js object, array and function
188
- if (!isObject(obj)) {
189
- return obj;
190
- }
191
-
192
- if (next.length === 0) {
193
- return insertValue(obj, key, value);
194
- } // @ts-ignore
195
-
196
-
197
- return insertValue(obj, key, setPath(next, value, obj.hasOwnProperty(key) ? obj[key] : {}));
198
- };
199
- /**
200
- * Immutable version of _.set
201
- * @param {Array<String|Number>} path
202
- * @param {*} value
203
- * @param {Object} obj
204
- * @returns {Object}
205
- */
206
- // @ts-ignore
207
-
208
-
209
- var set = function set(path, value, obj) {
210
- return obj === null ? obj : setPath(path, value, obj);
211
- };
212
-
213
- exports.set = set;
214
-
215
- /**
216
- * Get error information of unknown type
217
- * Extracts as much human readable information as possible
218
- * Ensure result is an Error object suitable for throw or promise rejection
219
- *
220
- * @private
221
- * @param {*} err - Unknown error
222
- * @return {string} - human readable error msg
223
- */
224
- function getError(err) {
225
- if (!err) {
226
- return 'Something went wrong';
227
- }
228
-
229
- if (typeof err === 'string') {
230
- return err;
231
- } else if (err instanceof Error) {
232
- return err.message;
233
- } else if ((0, _typeof2["default"])(err) === 'object') {
234
- return err.error ? getError(err.error) : err.err ? getError(err.err) : err.message ? getError(err.message) : JSON.stringify(err);
235
- } // @ts-ignore
236
-
237
-
238
- return null;
239
- }
240
-
241
- function arrayInsert(arr, index, val) {
242
- if (!Array.isArray(arr)) {
243
- return arr;
244
- }
245
-
246
- return [].concat((0, _toConsumableArray2["default"])(arr.slice(0, index)), [val], (0, _toConsumableArray2["default"])(arr.slice(index)));
247
- }
248
-
249
- function hasMobileWidth(breakPointValues) {
250
- var mobileWidth = _window["default"].matchMedia("(max-width: ".concat(breakPointValues.palm, "px)"));
251
-
252
- return mobileWidth.matches;
253
- }
254
-
255
- function hasPortableWidth(breakPointValues) {
256
- var mobileWidth = _window["default"].matchMedia("(max-width: ".concat(breakPointValues.desk, "px)"));
257
-
258
- return mobileWidth.matches;
259
- }
260
-
261
- function isTest() {
262
- var _process, _process$env;
263
-
264
- return typeof process !== 'undefined' && ((_process = process) === null || _process === void 0 ? void 0 : (_process$env = _process.env) === null || _process$env === void 0 ? void 0 : _process$env.NODE_ENV) === 'test';
265
- }
266
- /**
267
- * Filters an object by an arbitrary predicate
268
- * Returns a new object containing all elements that match the predicate
269
- * @param {Object} obj Object to be filtered
270
- * @param {Function} predicate Predicate by which the object will be filtered
271
- * @returns {Object}
272
- */
273
-
274
-
275
- function filterObjectByPredicate(obj, predicate) {
276
- return Object.entries(obj).reduce(function (acc, entry) {
277
- return predicate(entry[0], entry[1]) ? _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, entry[0], entry[1])) : acc;
278
- }, {});
279
- }
280
-
281
- function isFunction(func) {
282
- return typeof func === 'function';
283
- }
284
-
285
- function findById(id) {
286
- return function (arr) {
287
- return arr.find(function (a) {
288
- return a.id === id;
289
- });
290
- };
291
- }
292
- /**
293
- * Returns array difference from
294
- */
295
-
296
-
297
- function arrayDifference(source) {
298
- return function (compare) {
299
- return source.reduce(function (acc, element) {
300
- var foundElement = findById(element.id)(compare);
301
- return foundElement ? [].concat((0, _toConsumableArray2["default"])(acc), [foundElement]) : acc;
302
- }, []);
303
- };
304
- }
305
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy50cyJdLCJuYW1lcyI6WyJnZW5lcmF0ZUhhc2hJZCIsImNvdW50IiwiTWF0aCIsInJhbmRvbSIsInRvU3RyaW5nIiwic3Vic3RyIiwiZ2VuZXJhdGVIYXNoSWRGcm9tU3RyaW5nIiwic3RyIiwiaGFzaCIsImkiLCJjaHIiLCJsZW4iLCJsZW5ndGgiLCJjaGFyQ29kZUF0IiwiaXNDaHJvbWUiLCJ3aW5kb3ciLCJjaHJvbWUiLCJ3ZWJzdG9yZSIsImNhcGl0YWxpemVGaXJzdExldHRlciIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJjYW1lbFRvVGl0bGUiLCJicmVha1dvcmQiLCJyZXBsYWNlIiwiY2FtZWxpemUiLCJtYXRjaCIsImluZGV4IiwiTnVtYmVyIiwidG9Mb3dlckNhc2UiLCJ0b0FycmF5IiwiaXRlbSIsIkFycmF5IiwiaXNBcnJheSIsImluc2VydFZhbHVlIiwib2JqIiwia2V5IiwidmFsdWUiLCJpc09iamVjdCIsImlzUGxhaW5PYmplY3QiLCJPYmplY3QiLCJzZXRQYXRoIiwibmV4dCIsImhhc093blByb3BlcnR5Iiwic2V0IiwicGF0aCIsImdldEVycm9yIiwiZXJyIiwiRXJyb3IiLCJtZXNzYWdlIiwiZXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwiYXJyYXlJbnNlcnQiLCJhcnIiLCJ2YWwiLCJoYXNNb2JpbGVXaWR0aCIsImJyZWFrUG9pbnRWYWx1ZXMiLCJtb2JpbGVXaWR0aCIsIm1hdGNoTWVkaWEiLCJwYWxtIiwibWF0Y2hlcyIsImhhc1BvcnRhYmxlV2lkdGgiLCJkZXNrIiwiaXNUZXN0IiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwiZmlsdGVyT2JqZWN0QnlQcmVkaWNhdGUiLCJwcmVkaWNhdGUiLCJlbnRyaWVzIiwicmVkdWNlIiwiYWNjIiwiZW50cnkiLCJpc0Z1bmN0aW9uIiwiZnVuYyIsImZpbmRCeUlkIiwiaWQiLCJmaW5kIiwiYSIsImFycmF5RGlmZmVyZW5jZSIsInNvdXJjZSIs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LEdBQS9DO0FBQ0QsS0FIRCxFQUdHLEVBSEgsQ0FEWTtBQUFBLEdBQWQ7QUFLRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB3aW5kb3cgZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5cbi8qKlxuICogR2VuZXJhdGUgYSBoYXNoIHN0cmluZyBiYXNlZCBvbiBudW1iZXIgb2YgY2hhcmFjdGVyXG4gKiBAcGFyYW0ge251bWJlcn0gY291bnRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IGhhc2ggc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUhhc2hJZChjb3VudDogbnVtYmVyID0gNik6IHN0cmluZyB7XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpXG4gICAgLnRvU3RyaW5nKDM2KVxuICAgIC5zdWJzdHIoY291bnQpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgaGFzaCBzdHJpbmcgYmFzZWQgb24gc3RyaW5nXG4gKiBAcGFyYW0gc3RyXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVIYXNoSWRGcm9tU3RyaW5nKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gZ2VuZXJhdGUgaGFzaCBzdHJpbmcgYmFzZWQgb24gc3RyaW5nXG4gIGxldCBoYXNoID0gMDtcbiAgbGV0IGk7XG4gIGxldCBjaHI7XG4gIGxldCBsZW47XG4gIGlmIChzdHIubGVuZ3RoID09PSAwKSByZXR1cm4gaGFzaC50b1N0cmluZygpO1xuICBmb3IgKGkgPSAwLCBsZW4gPSBzdHIubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjaHIgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBjaHI7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICBoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuICB9XG4gIHJldHVybiBoYXNoLnRvU3RyaW5nKDM2KTtcbn1cblxuLyoqXG4gKiBEZXRlY3QgY2hyb21lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB5ZXMgb3Igbm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2hyb21lKCk6IGJvb2xlYW4ge1xuICAvLyBDaHJvbWUgMStcbiAgcmV0dXJuIHdpbmRvdy5jaHJvbWUgJiYgd2luZG93LmNocm9tZS53ZWJzdG9yZTtcbn1cblxuLyoqXG4gKiBDYXBpdGFsaXplIGZpcnN0IGxldHRlciBvZiBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhcGl0YWxpemVGaXJzdExldHRlcihzdHIpIHtcbiAgcmV0dXJuIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnID8gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpIDogc3RyO1xufVxuXG4vKipcbiAqIENvbnZlcnQgY2FtZWwgc3R5bGUgbmFtZXMgdG8gdGl0bGVcbiAqIHN0cm9rZUNvbG9yIC0+IFN0cm9rZSBDb2xvclxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbWVsVG9UaXRsZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGJyZWFrV29yZCA9IHN0ci5yZXBsYWNlKC8oW0EtWl0pL2csICcgJDEnKTtcbiAgcmV0dXJuIGNhcGl0YWxpemVGaXJzdExldHRlcihicmVha1dvcmQpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgbmFtZXMgdG8gY2FtZWwgc3R5bGVcbiAqIFN0cm9rZSBDb2xvciAtPiBzdHJva2VDb2xvclxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IGNhbWVsaXplID0gKHN0cjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oPzpeXFx3fFtBLVpdfFxcYlxcd3xcXHMrKS9nLCAobWF0Y2gsIGluZGV4KSA9PiB7XG4gICAgaWYgKE51bWJlcihtYXRjaCkgPT09IDApIHJldHVybiAnJzsgLy8gb3IgaWYgKC9cXHMrLy50ZXN0KG1hdGNoKSkgZm9yIHdoaXRlIHNwYWNlc1xuICAgIHJldHVybiBpbmRleCA9PT0gMCA/IG1hdGNoLnRvTG93ZXJDYXNlKCkgOiBtYXRjaC50b1VwcGVyQ2FzZSgpO1xuICB9KTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgbm9uLWFycmF5cyB0byBhcnJheXMuICBMZWF2ZXMgYXJyYXlzIGFsb25lLiAgQ29udmVydHNcbiAqIHVuZGVmaW5lZCB2YWx1ZXMgdG8gZW1wdHkgYXJyYXlzIChbXSBpbnN0ZWFkIG9mIFt1bmRlZmluZWRdKS5cbiAqIE90aGVyd2lzZSwganVzdCByZXR1cm5zIFtpdGVtXSBmb3Igbm9uLWFycmF5IGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7Kn0gaXRlbVxuICogQHJldHVybnMge2FycmF5fSBib29tISBtdWNoIGFycmF5LiB2ZXJ5IGluZGV4ZWQuIHNvIHVzZWZ1bC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQXJyYXk8VD4oaXRlbTogVCB8IFRbXSk6IFRbXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgcmV0dXJuIGl0ZW07XG4gIH1cblxuICBpZiAodHlwZW9mIGl0ZW0gPT09ICd1bmRlZmluZWQnIHx8IGl0ZW0gPT09IG51bGwpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gW2l0ZW1dO1xufVxuXG4vKipcbiAqIGltbXV0YWJseSBpbnNlcnQgdmFsdWUgdG8gYW4gQXJyYXkgb3IgT2JqZWN0XG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gb2JqXG4gKiBAcGFyYW0ge051bWJlcnxTdHJpbmd9IGtleVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMge0FycmF5fE9iamVjdH1cbiAqL1xuZXhwb3J0IGNvbnN0IGluc2VydFZhbHVlID0gPFQgZXh0ZW5kcyBhbnlbXSB8IG9iamVjdD4oXG4gIG9iajogVCxcbiAga2V5OiBudW1iZXIgfCBzdHJpbmcsXG4gIHZhbHVlOiBhbnlcbik6IFQgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopICYmIHR5cGVvZiBrZXkgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIFsuLi5vYmouc2xpY2UoMCwga2V5KSwgdmFsdWUsIC4uLm9iai5zbGljZShrZXkgKyAxLCBvYmoubGVuZ3RoKV0gYXMgVDtcbiAgfVxuXG4gIHJldHVybiB7Li4ub2JqLCBba2V5XTogdmFsdWV9O1xufTtcblxuLyoqXG4gKiBjaGVjayBpZiB2YWx1ZSBpcyBhIGxvb3NlIG9iamVjdCBpbmNsdWRpbmcgYSBwbGFpbiBvYmplY3QsIGFycmF5LCBmdW5jdGlvblxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogd2hldGhlciBpcyBhbiBvYmplY3RcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHllcyBvciBub1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmo6IHVua25vd24pOiBvYmogaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gb2JqID09PSBPYmplY3Qob2JqKSAmJiB0eXBlb2Ygb2JqICE9PSAnZnVuY3Rpb24nICYmICFBcnJheS5pc0FycmF5KG9iaik7XG59XG5cbmNvbnN0IHNldFBhdGggPSA8VCBleHRlbmRzIGFueVtdIHwgb2JqZWN0PihcbiAgW2tleSwgLi4ubmV4dF06IChzdHJpbmcgfCBudW1iZXIpW10sXG4gIHZhbHVlOiBhbnksXG4gIG9iajogb2JqZWN0IHwgYW55W11cbik6IFQgPT4ge1xuICAvLyBpcyBPYmplY3QgYWxsb3dzIGpzIG9iamVjdCwgYXJyYXkgYW5kIGZ1bmN0aW9uXG4gIGlmICghaXNPYmplY3Qob2JqKSkge1xuICAgIHJldHVybiBvYmogYXMgVDtcbiAgfVxuXG4gIGlmIChuZXh0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBpbnNlcnRWYWx1ZShvYmosIGtleSwgdmFsdWUpIGFzIFQ7XG4gIH1cblxuICAvLyBAdHMtaWdub3JlXG4gIHJldHVybiBpbnNlcnRWYWx1ZShvYmosIGtleSwgc2V0UGF0aChuZXh0LCB2YWx1ZSwgb2JqLmhhc093blByb3BlcnR5KGtleSkgPyBvYmpba2V5XSA6IHt9KSk7XG59O1xuXG4vKipcbiAqIEltbXV0YWJsZSB2ZXJzaW9uIG9mIF8uc2V0XG4gKiBAcGFyYW0ge0FycmF5PFN0cmluZ3xOdW1iZXI+fSBwYXRoXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG4vLyBAdHMtaWdub3JlXG5leHBvcnQgY29uc3Qgc2V0ID0gPFQgZXh0ZW5kcyBhbnlbXSB8IG9iamVjdD4ocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSwgb2JqOiBUKTogVCA9PlxuICBvYmogPT09IG51bGwgPyBvYmogOiBzZXRQYXRoKHBhdGgsIHZhbHVlLCBvYmopO1xuXG50eXBlIEVycm9yT2JqZWN0ID0ge1xuICBlcnJvcj86IGFueTtcbiAgZXJyPzogYW55O1xuICBtZXNzYWdlPzogYW55O1xufTtcblxuLyoqXG4gKiBHZXQgZXJyb3IgaW5mb3JtYXRpb24gb2YgdW5rbm93biB0eXBlXG4gKiBFeHRyYWN0cyBhcyBtdWNoIGh1bWFuIHJlYWRhYmxlIGluZm9ybWF0aW9uIGFzIHBvc3NpYmxlXG4gKiBFbnN1cmUgcmVzdWx0IGlzIGFuIEVycm9yIG9iamVjdCBzdWl0YWJsZSBmb3IgdGhyb3cgb3IgcHJvbWlzZSByZWplY3Rpb25cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSAgZXJyIC0gVW5rbm93biBlcnJvclxuICogQHJldHVybiB7c3RyaW5nfSAtIGh1bWFuIHJlYWRhYmxlIGVycm9yIG1zZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXJyb3IoZXJyPzogRXJyb3IgfCBFcnJvck9iamVjdCB8IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghZXJyKSB7XG4gICAgcmV0dXJuICdTb21ldGhpbmcgd2VudCB3cm9uZyc7XG4gIH1cblxuICBpZiAodHlwZW9mIGVyciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZXJyO1xuICB9IGVsc2UgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIGVyci5tZXNzYWdlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlcnIgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGVyci5lcnJvclxuICAgICAgPyBnZXRFcnJvcihlcnIuZXJyb3IpXG4gICAgICA6IGVyci5lcnJcbiAgICAgID8gZ2V0RXJyb3IoZXJyLmVycilcbiAgICAgIDogZXJyLm1lc3NhZ2VcbiAgICAgID8gZ2V0RXJyb3IoZXJyLm1lc3NhZ2UpXG4gICAgICA6IEpTT04uc3RyaW5naWZ5KGVycik7XG4gIH1cblxuICAvLyBAdHMtaWdub3JlXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlJbnNlcnQ8VD4oYXJyOiBUW10sIGluZGV4OiBudW1iZXIsIHZhbDogVCk6IFRbXSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG4gIHJldHVybiBbLi4uYXJyLnNsaWNlKDAsIGluZGV4KSwgdmFsLCAuLi5hcnIuc2xpY2UoaW5kZXgpXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc01vYmlsZVdpZHRoKGJyZWFrUG9pbnRWYWx1ZXM6IHtwYWxtOiBudW1iZXI7IGRlc2s6IG51bWJlcn0pOiBib29sZWFuIHtcbiAgY29uc3QgbW9iaWxlV2lkdGggPSB3aW5kb3cubWF0Y2hNZWRpYShgKG1heC13aWR0aDogJHticmVha1BvaW50VmFsdWVzLnBhbG19cHgpYCk7XG4gIHJldHVybiBtb2JpbGVXaWR0aC5tYXRjaGVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzUG9ydGFibGVXaWR0aChicmVha1BvaW50VmFsdWVzOiB7cGFsbTogbnVtYmVyOyBkZXNrOiBudW1iZXJ9KTogYm9vbGVhbiB7XG4gIGNvbnN0IG1vYmlsZVdpZHRoID0gd2luZG93Lm1hdGNoTWVkaWEoYChtYXgtd2lkdGg6ICR7YnJlYWtQb2ludFZhbHVlcy5kZXNrfXB4KWApO1xuICByZXR1cm4gbW9iaWxlV2lkdGgubWF0Y2hlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGVzdCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzPy5lbnY/Lk5PREVfRU5WID09PSAndGVzdCc7XG59XG5cbi8qKlxuICogRmlsdGVycyBhbiBvYmplY3QgYnkgYW4gYXJiaXRyYXJ5IHByZWRpY2F0ZVxuICogUmV0dXJucyBhIG5ldyBvYmplY3QgY29udGFpbmluZyBhbGwgZWxlbWVudHMgdGhhdCBtYXRjaCB0aGUgcHJlZGljYXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIE9iamVjdCB0byBiZSBmaWx0ZXJlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFByZWRpY2F0ZSBieSB3aGljaCB0aGUgb2JqZWN0IHdpbGwgYmUgZmlsdGVyZWRcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJPYmplY3RCeVByZWRpY2F0ZShvYmosIHByZWRpY2F0ZSkge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMob2JqKS5yZWR1Y2UoXG4gICAgKGFjYywgZW50cnkpID0+IChwcmVkaWNhdGUoZW50cnlbMF0sIGVudHJ5WzFdKSA/IHsuLi5hY2MsIFtlbnRyeVswXV06IGVudHJ5WzFdfSA6IGFjYyksXG4gICAge31cbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRnVuY3Rpb24oZnVuYyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGZ1bmMgPT09ICdmdW5jdGlvbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQnlJZChpZDogc3RyaW5nKTogPFggZXh0ZW5kcyB7aWQ6IHN0cmluZ30+KGFycjogWFtdKSA9PiBYIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGFyciA9PiBhcnIuZmluZChhID0+IGEuaWQgPT09IGlkKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFycmF5IGRpZmZlcmVuY2UgZnJvbVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlEaWZmZXJlbmNlPFggZXh0ZW5kcyB7aWQ6IHN0cmluZ30+KHNvdXJjZTogWFtdKTogKGNvbXBhcmU6IFhbXSkgPT4gWFtdIHtcbiAgcmV0dXJuIGNvbXBhcmUgPT5cbiAgICBzb3VyY2UucmVkdWNlKChhY2MsIGVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IGZvdW5kRWxlbWVudCA9IGZpbmRCeUlkKGVsZW1lbnQuaWQpKGNvbXBhcmUpO1xuICAgICAgcmV0dXJuIGZvdW5kRWxlbWVudCA/IFsuLi5hY2MsIGZvdW5kRWxlbWVudF0gOiBhY2M7XG4gICAgfSwgW10gYXMgWFtdKTtcbn1cbiJdfQ==