kepler.gl 3.1.0-alpha.6 → 3.1.0

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 (190) hide show
  1. package/dist/src/actions/src/action-types.d.ts +2 -0
  2. package/dist/src/actions/src/ui-state-actions.d.ts +16 -0
  3. package/dist/src/ai-assistant/src/actions.d.ts +1 -1
  4. package/dist/src/ai-assistant/src/components/ai-assistant-component.d.ts +2 -1
  5. package/dist/src/ai-assistant/src/constants.d.ts +3 -3
  6. package/dist/src/ai-assistant/src/reducers/index.d.ts +1 -1
  7. package/dist/src/ai-assistant/src/tools/basemap-functions.d.ts +1 -1
  8. package/dist/src/ai-assistant/src/tools/filter-function.d.ts +1 -1
  9. package/dist/src/ai-assistant/src/tools/layer-creation-function.d.ts +1 -1
  10. package/dist/src/ai-assistant/src/tools/layer-style-function.d.ts +1 -1
  11. package/dist/src/ai-assistant/src/tools/loadurl-function.d.ts +1 -1
  12. package/dist/src/ai-assistant/src/tools/utils.d.ts +73 -0
  13. package/dist/src/components/src/common/data-table/index.d.ts +1 -1
  14. package/dist/src/components/src/common/data-table/option-dropdown.d.ts +3 -3
  15. package/dist/src/components/src/common/file-uploader/file-drop.d.ts +2 -2
  16. package/dist/src/components/src/kepler-gl.d.ts +5 -0
  17. package/dist/src/components/src/loading-indicator.d.ts +13 -0
  18. package/dist/src/components/src/map-container.d.ts +3 -0
  19. package/dist/src/constants/src/default-settings.d.ts +1 -0
  20. package/dist/src/duckdb/src/plugin.d.ts +1 -0
  21. package/dist/src/duckdb/src/table/duckdb-table-utils.d.ts +13 -0
  22. package/dist/src/duckdb/src/table/duckdb-table.d.ts +7 -2
  23. package/dist/src/reducers/src/ui-state-updaters.d.ts +10 -0
  24. package/dist/src/reducers/src/vis-state-updaters.d.ts +1 -0
  25. package/dist/src/reducers/src/vis-state.d.ts +4 -0
  26. package/dist/src/utils/src/application-config.d.ts +2 -0
  27. package/dist/src/utils/src/observe-dimensions.d.ts +2 -1
  28. package/package.json +5 -3
  29. package/src/actions/dist/action-types.d.ts +2 -0
  30. package/src/actions/dist/action-types.js +2 -1
  31. package/src/actions/dist/ui-state-actions.d.ts +16 -0
  32. package/src/actions/dist/ui-state-actions.js +17 -2
  33. package/src/actions/package.json +8 -8
  34. package/src/actions/src/action-types.ts +1 -0
  35. package/src/actions/src/ui-state-actions.ts +22 -0
  36. package/src/ai-assistant/README.md +76 -0
  37. package/src/ai-assistant/dist/actions.d.ts +1 -1
  38. package/src/ai-assistant/dist/actions.js +2 -2
  39. package/src/ai-assistant/dist/components/ai-assistant-component.d.ts +2 -1
  40. package/src/ai-assistant/dist/components/ai-assistant-component.js +64 -23
  41. package/src/ai-assistant/dist/components/ai-assistant-config.js +67 -54
  42. package/src/ai-assistant/dist/constants.d.ts +3 -3
  43. package/src/ai-assistant/dist/constants.js +4 -4
  44. package/src/ai-assistant/dist/reducers/index.d.ts +1 -1
  45. package/src/ai-assistant/dist/reducers/index.js +2 -2
  46. package/src/ai-assistant/dist/tools/basemap-functions.d.ts +1 -1
  47. package/src/ai-assistant/dist/tools/basemap-functions.js +1 -1
  48. package/src/ai-assistant/dist/tools/filter-function.d.ts +1 -1
  49. package/src/ai-assistant/dist/tools/filter-function.js +9 -6
  50. package/src/ai-assistant/dist/tools/layer-creation-function.d.ts +1 -1
  51. package/src/ai-assistant/dist/tools/layer-creation-function.js +1 -1
  52. package/src/ai-assistant/dist/tools/layer-style-function.d.ts +1 -1
  53. package/src/ai-assistant/dist/tools/layer-style-function.js +1 -1
  54. package/src/ai-assistant/dist/tools/loadurl-function.d.ts +1 -1
  55. package/src/ai-assistant/dist/tools/loadurl-function.js +1 -1
  56. package/src/ai-assistant/dist/tools/utils.d.ts +73 -0
  57. package/src/ai-assistant/dist/tools/utils.js +211 -3
  58. package/src/ai-assistant/package.json +13 -9
  59. package/src/ai-assistant/src/actions.ts +2 -2
  60. package/src/ai-assistant/src/components/ai-assistant-component.tsx +56 -23
  61. package/src/ai-assistant/src/components/ai-assistant-config.tsx +63 -46
  62. package/src/ai-assistant/src/config/models.json +32 -0
  63. package/src/ai-assistant/src/constants.ts +7 -2
  64. package/src/ai-assistant/src/reducers/index.ts +2 -2
  65. package/src/ai-assistant/src/tools/basemap-functions.tsx +1 -1
  66. package/src/ai-assistant/src/tools/filter-function.tsx +11 -7
  67. package/src/ai-assistant/src/tools/layer-creation-function.tsx +1 -1
  68. package/src/ai-assistant/src/tools/layer-style-function.tsx +1 -1
  69. package/src/ai-assistant/src/tools/loadurl-function.tsx +1 -1
  70. package/src/ai-assistant/src/tools/utils.ts +212 -2
  71. package/src/cloud-providers/package.json +2 -2
  72. package/src/common-utils/package.json +3 -3
  73. package/src/components/dist/common/data-table/header-cell.js +10 -10
  74. package/src/components/dist/common/data-table/index.d.ts +1 -1
  75. package/src/components/dist/common/data-table/index.js +1 -1
  76. package/src/components/dist/common/data-table/option-dropdown.d.ts +3 -3
  77. package/src/components/dist/common/data-table/option-dropdown.js +5 -5
  78. package/src/components/dist/common/file-uploader/file-drop.d.ts +2 -2
  79. package/src/components/dist/common/file-uploader/file-drop.js +1 -1
  80. package/src/components/dist/common/portaled.js +1 -1
  81. package/src/components/dist/editor/editor.js +1 -1
  82. package/src/components/dist/kepler-gl.d.ts +5 -0
  83. package/src/components/dist/kepler-gl.js +7 -2
  84. package/src/components/dist/loading-indicator.d.ts +13 -0
  85. package/src/components/dist/loading-indicator.js +40 -0
  86. package/src/components/dist/map-container.d.ts +3 -0
  87. package/src/components/dist/map-container.js +11 -3
  88. package/src/components/dist/modals/save-map-modal.js +4 -3
  89. package/src/components/package.json +15 -15
  90. package/src/components/src/common/data-table/header-cell.tsx +5 -3
  91. package/src/components/src/common/data-table/index.tsx +1 -1
  92. package/src/components/src/common/data-table/option-dropdown.tsx +7 -7
  93. package/src/components/src/common/file-uploader/file-drop.tsx +11 -11
  94. package/src/components/src/common/portaled.tsx +12 -12
  95. package/src/components/src/editor/editor.tsx +3 -3
  96. package/src/components/src/kepler-gl.tsx +7 -2
  97. package/src/components/src/loading-indicator.tsx +49 -0
  98. package/src/components/src/map-container.tsx +19 -1
  99. package/src/components/src/modals/save-map-modal.tsx +6 -2
  100. package/src/constants/dist/default-settings.d.ts +1 -0
  101. package/src/constants/dist/default-settings.js +13 -9
  102. package/src/constants/dist/keyevent.js +1 -1
  103. package/src/constants/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/72/80/7a7c561d7985e92aab7b9683e7baf5a0286b353a8f2609c4c71099f668d012be027929e4bbac937f9aa0c9a61be3bd4405136f582895f05aa0313c8efa42 +1 -0
  104. package/src/constants/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/8f/f6/b66955867599392dc69ff1db64419e83c087a82c2e3d4b6418d49ac6bc80e3200dd6c86cdfd4a2cf98ce573f71a5281b86ba3df8a7210e02544f63054191 +1 -0
  105. package/src/constants/node_modules/.cache/terser-webpack-plugin/index-v5/bd/ba/47ea8fcb11ecd5cd47ad867052e58b1f7e0c8dc5f8918a36fe90eaf45981 +2 -0
  106. package/src/constants/node_modules/.cache/terser-webpack-plugin/index-v5/f0/6e/aadf3c48345aa72e7b2fb92e8c9788d04986b55caf83daa3fbd749c37c44 +2 -0
  107. package/src/constants/package.json +2 -2
  108. package/src/constants/src/default-settings.ts +11 -5
  109. package/src/constants/src/keyevent.ts +2 -2
  110. package/src/constants/umd/keplergl.min.js +1 -1
  111. package/src/deckgl-arrow-layers/package.json +1 -1
  112. package/src/deckgl-layers/package.json +4 -4
  113. package/src/duckdb/dist/components/preview-data-panel.js +2 -11
  114. package/src/duckdb/dist/components/sql-panel.js +7 -3
  115. package/src/duckdb/dist/components/tree.js +5 -4
  116. package/src/duckdb/dist/plugin.d.ts +1 -0
  117. package/src/duckdb/dist/plugin.js +9 -2
  118. package/src/duckdb/dist/processors/data-processor.js +4 -5
  119. package/src/duckdb/dist/table/duckdb-table-utils.d.ts +13 -0
  120. package/src/duckdb/dist/table/duckdb-table-utils.js +110 -0
  121. package/src/duckdb/dist/table/duckdb-table.d.ts +7 -2
  122. package/src/duckdb/dist/table/duckdb-table.js +189 -44
  123. package/src/duckdb/package.json +6 -6
  124. package/src/duckdb/src/components/preview-data-panel.tsx +0 -5
  125. package/src/duckdb/src/components/sql-panel.tsx +4 -2
  126. package/src/duckdb/src/components/tree.tsx +5 -1
  127. package/src/duckdb/src/plugin.ts +8 -1
  128. package/src/duckdb/src/processors/data-processor.ts +3 -4
  129. package/src/duckdb/src/table/duckdb-table-utils.ts +106 -0
  130. package/src/duckdb/src/table/duckdb-table.ts +134 -33
  131. package/src/effects/package.json +5 -5
  132. package/src/layers/dist/icon-layer/icon-layer.js +1 -1
  133. package/src/layers/dist/index.d.ts +3 -0
  134. package/src/layers/dist/index.js +6 -7
  135. package/src/layers/dist/point-layer/point-layer.d.ts +1 -1
  136. package/src/layers/dist/point-layer/point-layer.js +8 -2
  137. package/src/layers/package.json +9 -9
  138. package/src/layers/src/icon-layer/icon-layer.ts +8 -10
  139. package/src/layers/src/index.ts +5 -5
  140. package/src/layers/src/point-layer/point-layer.ts +6 -1
  141. package/src/localization/package.json +1 -1
  142. package/src/processors/dist/data-processor.js +2 -4
  143. package/src/processors/package.json +7 -7
  144. package/src/processors/src/data-processor.ts +1 -3
  145. package/src/reducers/dist/ui-state-updaters.d.ts +10 -0
  146. package/src/reducers/dist/ui-state-updaters.js +22 -2
  147. package/src/reducers/dist/ui-state.js +2 -2
  148. package/src/reducers/dist/vis-state-updaters.d.ts +1 -0
  149. package/src/reducers/dist/vis-state-updaters.js +21 -5
  150. package/src/reducers/dist/vis-state.d.ts +4 -0
  151. package/src/reducers/package.json +16 -16
  152. package/src/reducers/src/ui-state-updaters.ts +24 -0
  153. package/src/reducers/src/ui-state.ts +3 -1
  154. package/src/reducers/src/vis-state-updaters.ts +24 -5
  155. package/src/schemas/dist/dataset-schema.js +38 -2
  156. package/src/schemas/package.json +8 -7
  157. package/src/schemas/src/dataset-schema.ts +43 -1
  158. package/src/styles/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/5f/aa/96c67b383dbcd2b95625113a5389c6078fd8a53e6fc73a054229709f2dac1e0a409e7117049485a569fbebf8434a319451842671398904bfe1a7f7b5991c +1 -0
  159. package/src/styles/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/af/aa/228fbff58007b23eea5eb6cc7d2da1f0af1d8a7024129a416ea88b4df0ad7afc7aec93b09f3dd42a98f1d6a6f4dce6b53204818da85ef5becc42f928a64d +1 -0
  160. package/src/styles/node_modules/.cache/terser-webpack-plugin/index-v5/40/72/cac221d8459e6b743bc62ecdb370ed854b21ec30d3f7f4c06c7d1d7ffde2 +2 -0
  161. package/src/styles/node_modules/.cache/terser-webpack-plugin/index-v5/c1/39/f7cd1d5947ec6e5d82bfa07041271344eb02f9e67bf5823acf2f22c2d01f +2 -0
  162. package/src/styles/package.json +2 -2
  163. package/src/styles/umd/keplergl.min.js +1 -1
  164. package/src/table/dist/dataset-utils.js +10 -4
  165. package/src/table/package.json +5 -5
  166. package/src/table/src/dataset-utils.ts +7 -1
  167. package/src/tasks/package.json +2 -2
  168. package/src/types/package.json +1 -1
  169. package/src/types/reducers.d.ts +2 -0
  170. package/src/utils/dist/application-config.d.ts +2 -0
  171. package/src/utils/dist/application-config.js +4 -2
  172. package/src/utils/dist/data-utils.js +14 -2
  173. package/src/utils/dist/dataset-utils.js +5 -3
  174. package/src/utils/dist/dom-to-image.js +1 -1
  175. package/src/utils/dist/dom-utils.js +1 -1
  176. package/src/utils/dist/map-style-utils/mapbox-gl-style-editor.js +7 -1
  177. package/src/utils/dist/observe-dimensions.d.ts +2 -1
  178. package/src/utils/dist/observe-dimensions.js +10 -4
  179. package/src/utils/dist/utils.js +1 -1
  180. package/src/utils/package.json +4 -4
  181. package/src/utils/src/application-config.ts +9 -1
  182. package/src/utils/src/data-utils.ts +13 -1
  183. package/src/utils/src/dataset-utils.ts +1 -1
  184. package/src/utils/src/dom-to-image.ts +5 -6
  185. package/src/utils/src/dom-utils.ts +15 -15
  186. package/src/utils/src/map-style-utils/mapbox-gl-style-editor.ts +6 -0
  187. package/src/utils/src/observe-dimensions.ts +9 -4
  188. package/src/utils/src/utils.ts +8 -8
  189. package/umd/keplergl.min.css +1 -1
  190. package/umd/keplergl.min.js +1499 -1428
@@ -20,13 +20,14 @@ var _imagePreview = _interopRequireDefault(require("../common/image-preview"));
20
20
  var _localization = require("@kepler.gl/localization");
21
21
  var _modal = require("../common/modal");
22
22
  var _useCloudListProvider2 = require("../hooks/use-cloud-list-provider");
23
- var _templateObject; // SPDX-License-Identifier: MIT
23
+ var _templateObject, _templateObject2; // SPDX-License-Identifier: MIT
24
24
  // Copyright contributors to the kepler.gl project
25
25
  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); }
26
26
  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; }
27
27
  var StyledSaveMapModal = _styledComponents["default"].div.attrs({
28
28
  className: 'save-map-modal'
29
29
  })(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n .save-map-modal-content {\n min-height: 400px;\n flex-direction: column;\n }\n\n .description {\n width: 300px;\n }\n\n .image-preview-panel {\n width: 300px;\n\n .image-preview {\n padding: 0;\n }\n }\n\n .map-info-panel {\n flex-direction: column;\n }\n\n .save-map-modal-description {\n .modal-section-subtitle {\n margin-left: 6px;\n }\n }\n"])));
30
+ var StyledCompactExportSection = (0, _styledComponents["default"])(_styledComponents2.StyledExportSection)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n margin: 5px 0;\n"])));
30
31
  var nop = function nop() {
31
32
  return;
32
33
  };
@@ -148,7 +149,7 @@ function SaveMapModalFactory() {
148
149
  target: "_blank",
149
150
  rel: "noopener noreferrer",
150
151
  style: PROVIDER_MANAGER_URL_STYLE
151
- }, "Go to your Kepler.gl ", provider.displayName, " page"))) : null, /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledExportSection, null, /*#__PURE__*/_react["default"].createElement("div", {
152
+ }, "Go to your Kepler.gl ", provider.displayName, " page"))) : null, /*#__PURE__*/_react["default"].createElement(StyledCompactExportSection, null, /*#__PURE__*/_react["default"].createElement("div", {
152
153
  className: "description image-preview-panel"
153
154
  }, /*#__PURE__*/_react["default"].createElement(_imagePreview["default"], {
154
155
  exportImage: exportImage,
@@ -176,4 +177,4 @@ function SaveMapModalFactory() {
176
177
  return SaveMapModal;
177
178
  }
178
179
  var _default = exports["default"] = SaveMapModalFactory;
179
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfaW1hZ2VNb2RhbENvbnRhaW5lciIsIl9mbGV4Q29udGFpbmVyIiwiX3N0YXR1c1BhbmVsIiwiX3Byb3ZpZGVyU2VsZWN0IiwiX2NvbnN0YW50cyIsIl9zdHlsZWRDb21wb25lbnRzMiIsIl9pbWFnZVByZXZpZXciLCJfbG9jYWxpemF0aW9uIiwiX21vZGFsIiwiX3VzZUNsb3VkTGlzdFByb3ZpZGVyMiIsIl90ZW1wbGF0ZU9iamVjdCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIlN0eWxlZFNhdmVNYXBNb2RhbCIsInN0eWxlZCIsImRpdiIsImF0dHJzIiwiY2xhc3NOYW1lIiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJub3AiLCJURVhUX0FSRUFfTElHSFRfU1RZTEUiLCJyZXNpemUiLCJNYXBJbmZvUGFuZWwiLCJleHBvcnRzIiwiX3JlZiIsIm1hcEluZm8iLCJjaGFyYWN0ZXJMaW1pdHMiLCJvbkNoYW5nZUlucHV0IiwiX21hcEluZm8kZGVzY3JpcHRpb24iLCJkZXNjcmlwdGlvbiIsIl9tYXBJbmZvJHRpdGxlIiwidGl0bGUiLCJjcmVhdGVFbGVtZW50IiwiZGF0YVRlc3RJZHMiLCJwcm92aWRlck1hcEluZm9QYW5lbCIsIlN0eWxlZE1vZGFsU2VjdGlvbiIsIklucHV0TGlnaHQiLCJpZCIsInR5cGUiLCJ2YWx1ZSIsIm9uQ2hhbmdlIiwicGxhY2Vob2xkZXIiLCJGbGV4Q29udGFpbmVyIiwiVGV4dEFyZWFMaWdodCIsInJvd3MiLCJzdHlsZSIsIlN0eWxlZE1vZGFsSW5wdXRGb290bm90ZSIsImVycm9yIiwiQm9vbGVhbiIsImxlbmd0aCIsIk51bWJlciIsIk1BUF9JTkZPX0NIQVJBQ1RFUiIsIlNhdmVNYXBIZWFkZXIiLCJfcmVmMiIsImNsb3VkUHJvdmlkZXJzIiwiU3R5bGVkRXhwb3J0U2VjdGlvbiIsIkZvcm1hdHRlZE1lc3NhZ2UiLCJQcm92aWRlclNlbGVjdCIsIlNUWUxFRF9FWFBPUlRfU0VDVElPTl9TVFlMRSIsIm1hcmdpbiIsIlBST1ZJREVSX01BTkFHRVJfVVJMX1NUWUxFIiwidGV4dERlY29yYXRpb24iLCJTYXZlTWFwTW9kYWxGYWN0b3J5IiwiU2F2ZU1hcE1vZGFsIiwiX3JlZjMiLCJleHBvcnRJbWFnZSIsIl9yZWYzJGNoYXJhY3RlckxpbWl0cyIsImlzUHJvdmlkZXJMb2FkaW5nIiwicHJvdmlkZXJFcnJvciIsIl9yZWYzJG9uVXBkYXRlSW1hZ2VTZSIsIm9uVXBkYXRlSW1hZ2VTZXR0aW5nIiwiY2xlYW51cEV4cG9ydEltYWdlIiwib25TZXRNYXBJbmZvIiwib25DYW5jZWwiLCJvbkNvbmZpcm0iLCJfdXNlQ2xvdWRMaXN0UHJvdmlkZXIiLCJ1c2VDbG91ZExpc3RQcm92aWRlciIsInByb3ZpZGVyIiwia2V5IiwiX3JlZjQiLCJ0YXJnZXQiLCJfZGVmaW5lUHJvcGVydHkyIiwiY29uZmlybUJ1dHRvbiIsInVzZU1lbW8iLCJsYXJnZSIsImRpc2FibGVkIiwiY2hpbGRyZW4iLCJjb25maXJtIiwidXNlQ2FsbGJhY2siLCJTdHlsZWRNb2RhbENvbnRlbnQiLCJGcmFnbWVudCIsImdldE1hbmFnZW1lbnRVcmwiLCJocmVmIiwicmVsIiwiZGlzcGxheU5hbWUiLCJ3aWR0aCIsIk1BUF9USFVNQk5BSUxfRElNRU5TSU9OIiwic2hvd0RpbWVuc2lvbiIsInByb3ZpZGVyTG9hZGluZyIsIlVwbG9hZEFuaW1hdGlvbiIsImljb24iLCJpc0xvYWRpbmciLCJtZXNzYWdlIiwicHJvdmlkZXJJY29uIiwiTW9kYWxGb290ZXIiLCJjYW5jZWwiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RhbHMvc2F2ZS1tYXAtbW9kYWwudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VNZW1vfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBJbWFnZU1vZGFsQ29udGFpbmVyLCB7SW1hZ2VNb2RhbENvbnRhaW5lclByb3BzfSBmcm9tICcuL2ltYWdlLW1vZGFsLWNvbnRhaW5lcic7XG5pbXBvcnQge0ZsZXhDb250YWluZXJ9IGZyb20gJy4uL2NvbW1vbi9mbGV4LWNvbnRhaW5lcic7XG5pbXBvcnQgU3RhdHVzUGFuZWwsIHtVcGxvYWRBbmltYXRpb259IGZyb20gJy4vc3RhdHVzLXBhbmVsJztcbmltcG9ydCB7UHJvdmlkZXJTZWxlY3R9IGZyb20gJy4vY2xvdWQtY29tcG9uZW50cy9wcm92aWRlci1zZWxlY3QnO1xuaW1wb3J0IHtcbiAgTUFQX1RIVU1CTkFJTF9ESU1FTlNJT04sXG4gIE1BUF9JTkZPX0NIQVJBQ1RFUixcbiAgRXhwb3J0SW1hZ2UsXG4gIGRhdGFUZXN0SWRzXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcblxuaW1wb3J0IHtcbiAgU3R5bGVkTW9kYWxDb250ZW50LFxuICBJbnB1dExpZ2h0LFxuICBUZXh0QXJlYUxpZ2h0LFxuICBTdHlsZWRFeHBvcnRTZWN0aW9uLFxuICBTdHlsZWRNb2RhbFNlY3Rpb24sXG4gIFN0eWxlZE1vZGFsSW5wdXRGb290bm90ZVxufSBmcm9tICcuLi9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IEltYWdlUHJldmlldyBmcm9tICcuLi9jb21tb24vaW1hZ2UtcHJldmlldyc7XG5pbXBvcnQge0Zvcm1hdHRlZE1lc3NhZ2V9IGZyb20gJ0BrZXBsZXIuZ2wvbG9jYWxpemF0aW9uJztcbmltcG9ydCB7TWFwSW5mb30gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge1Byb3ZpZGVyfSBmcm9tICdAa2VwbGVyLmdsL2Nsb3VkLXByb3ZpZGVycyc7XG5pbXBvcnQge3NldE1hcEluZm8sIGNsZWFudXBFeHBvcnRJbWFnZSBhcyBjbGVhbnVwRXhwb3J0SW1hZ2VBY3Rpb259IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge01vZGFsRm9vdGVyfSBmcm9tICcuLi9jb21tb24vbW9kYWwnO1xuaW1wb3J0IHt1c2VDbG91ZExpc3RQcm92aWRlcn0gZnJvbSAnLi4vaG9va3MvdXNlLWNsb3VkLWxpc3QtcHJvdmlkZXInO1xuXG5jb25zdCBTdHlsZWRTYXZlTWFwTW9kYWwgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnc2F2ZS1tYXAtbW9kYWwnXG59KWBcbiAgLnNhdmUtbWFwLW1vZGFsLWNvbnRlbnQge1xuICAgIG1pbi1oZWlnaHQ6IDQwMHB4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIH1cblxuICAuZGVzY3JpcHRpb24ge1xuICAgIHdpZHRoOiAzMDBweDtcbiAgfVxuXG4gIC5pbWFnZS1wcmV2aWV3LXBhbmVsIHtcbiAgICB3aWR0aDogMzAwcHg7XG5cbiAgICAuaW1hZ2UtcHJldmlldyB7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgIH1cbiAgfVxuXG4gIC5tYXAtaW5mby1wYW5lbCB7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgfVxuXG4gIC5zYXZlLW1hcC1tb2RhbC1kZXNjcmlwdGlvbiB7XG4gICAgLm1vZGFsLXNlY3Rpb24tc3VidGl0bGUge1xuICAgICAgbWFyZ2luLWxlZnQ6IDZweDtcbiAgICB9XG4gIH1cbmA7XG5cbmNvbnN0IG5vcCA9ICgpID0+IHtcbiAgcmV0dXJuO1xufTtcbmNvbnN0IFRFWFRfQVJFQV9MSUdIVF9TVFlMRSA9IHtyZXNpemU6ICdub25lJ307XG5cbnR5cGUgQ2hhcmFjdGVyTGltaXRzID0ge1xuICB0aXRsZT86IG51bWJlcjtcbiAgZGVzY3JpcHRpb24/OiBudW1iZXI7XG59O1xuXG50eXBlIFNhdmVNYXBNb2RhbFByb3BzID0ge1xuICBtYXBJbmZvOiBNYXBJbmZvO1xuICBleHBvcnRJbWFnZTogRXhwb3J0SW1hZ2U7XG4gIGlzUHJvdmlkZXJMb2FkaW5nOiBib29sZWFuO1xuICBwcm92aWRlckVycm9yPzogRXJyb3I7XG4gIGNoYXJhY3RlckxpbWl0cz86IENoYXJhY3RlckxpbWl0cztcblxuICAvLyBjYWxsYmFja3NcbiAgb25VcGRhdGVJbWFnZVNldHRpbmc6IEltYWdlTW9kYWxDb250YWluZXJQcm9wc1snb25VcGRhdGVJbWFnZVNldHRpbmcnXTtcbiAgY2xlYW51cEV4cG9ydEltYWdlOiB0eXBlb2YgY2xlYW51cEV4cG9ydEltYWdlQWN0aW9uO1xuICBvblNldE1hcEluZm86IHR5cGVvZiBzZXRNYXBJbmZvO1xuICBvbkNvbmZpcm06IChwcm92aWRlcjogUHJvdmlkZXIpID0+IHZvaWQ7XG4gIG9uQ2FuY2VsOiAoKSA9PiB2b2lkO1xufTtcblxudHlwZSBNYXBJbmZvUGFuZWxQcm9wcyA9IFBpY2s8U2F2ZU1hcE1vZGFsUHJvcHMsICdtYXBJbmZvJyB8ICdjaGFyYWN0ZXJMaW1pdHMnPiAmIHtcbiAgb25DaGFuZ2VJbnB1dDogKFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBldmVudDogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTFRleHRBcmVhRWxlbWVudCB8IEhUTUxJbnB1dEVsZW1lbnQ+XG4gICkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCBjb25zdCBNYXBJbmZvUGFuZWw6IFJlYWN0LkZDPE1hcEluZm9QYW5lbFByb3BzPiA9ICh7XG4gIG1hcEluZm8sXG4gIGNoYXJhY3RlckxpbWl0cyxcbiAgb25DaGFuZ2VJbnB1dFxufSkgPT4ge1xuICBjb25zdCB7ZGVzY3JpcHRpb24gPSAnJywgdGl0bGUgPSAnJ30gPSBtYXBJbmZvO1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwic2VsZWN0aW9uIG1hcC1pbmZvLXBhbmVsXCIgZGF0YS10ZXN0aWQ9e2RhdGFUZXN0SWRzLnByb3ZpZGVyTWFwSW5mb1BhbmVsfT5cbiAgICAgIDxTdHlsZWRNb2RhbFNlY3Rpb24gY2xhc3NOYW1lPVwic2F2ZS1tYXAtbW9kYWwtbmFtZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLXNlY3Rpb24tdGl0bGVcIj5OYW1lKjwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxJbnB1dExpZ2h0XG4gICAgICAgICAgICBpZD1cIm1hcC10aXRsZVwiXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICB2YWx1ZT17dGl0bGV9XG4gICAgICAgICAgICBvbkNoYW5nZT17ZSA9PiBvbkNoYW5nZUlucHV0KCd0aXRsZScsIGUpfVxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUeXBlIG1hcCB0aXRsZVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L1N0eWxlZE1vZGFsU2VjdGlvbj5cbiAgICAgIDxTdHlsZWRNb2RhbFNlY3Rpb24+XG4gICAgICAgIDxGbGV4Q29udGFpbmVyIGNsYXNzTmFtZT1cInNhdmUtbWFwLW1vZGFsLWRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtb2RhbC1zZWN0aW9uLXRpdGxlXCI+RGVzY3JpcHRpb248L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLXNlY3Rpb24tc3VidGl0bGVcIj4ob3B0aW9uYWwpPC9kaXY+XG4gICAgICAgIDwvRmxleENvbnRhaW5lcj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8VGV4dEFyZWFMaWdodFxuICAgICAgICAgICAgcm93cz17M31cbiAgICAgICAgICAgIGlkPVwibWFwLWRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgIHN0eWxlPXtURVhUX0FSRUFfTElHSFRfU1RZTEUgYXMgUmVhY3QuQ1NTUHJvcGVydGllc31cbiAgICAgICAgICAgIHZhbHVlPXtkZXNjcmlwdGlvbn1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IG9uQ2hhbmdlSW5wdXQoJ2Rlc2NyaXB0aW9uJywgZSl9XG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlR5cGUgbWFwIGRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPFN0eWxlZE1vZGFsSW5wdXRGb290bm90ZVxuICAgICAgICAgIGVycm9yPXtcbiAgICAgICAgICAgIEJvb2xlYW4oY2hhcmFjdGVyTGltaXRzPy5kZXNjcmlwdGlvbikgJiZcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLmxlbmd0aCA+IE51bWJlcihjaGFyYWN0ZXJMaW1pdHM/LmRlc2NyaXB0aW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgPlxuICAgICAgICAgIHtkZXNjcmlwdGlvbi5sZW5ndGh9L3tjaGFyYWN0ZXJMaW1pdHM/LmRlc2NyaXB0aW9uIHx8IE1BUF9JTkZPX0NIQVJBQ1RFUi5kZXNjcmlwdGlvbn17JyAnfVxuICAgICAgICAgIGNoYXJhY3RlcnNcbiAgICAgICAgPC9TdHlsZWRNb2RhbElucHV0Rm9vdG5vdGU+XG4gICAgICA8L1N0eWxlZE1vZGFsU2VjdGlvbj5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmNvbnN0IFNhdmVNYXBIZWFkZXIgPSAoe2Nsb3VkUHJvdmlkZXJzfSkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxTdHlsZWRFeHBvcnRTZWN0aW9uPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJkZXNjcmlwdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRpdGxlXCI+XG4gICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2UgaWQ9eydtb2RhbC5zYXZlTWFwLnRpdGxlJ30gLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3VidGl0bGVcIj5cbiAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17J21vZGFsLnNhdmVNYXAuc3VidGl0bGUnfSAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPFByb3ZpZGVyU2VsZWN0IGNsb3VkUHJvdmlkZXJzPXtjbG91ZFByb3ZpZGVyc30gLz5cbiAgICA8L1N0eWxlZEV4cG9ydFNlY3Rpb24+XG4gICk7XG59O1xuXG5jb25zdCBTVFlMRURfRVhQT1JUX1NFQ1RJT05fU1RZTEUgPSB7bWFyZ2luOiAnMnB4IDAnfTtcbmNvbnN0IFBST1ZJREVSX01BTkFHRVJfVVJMX1NUWUxFID0ge3RleHREZWNvcmF0aW9uOiAndW5kZXJsaW5lJ307XG5cbmZ1bmN0aW9uIFNhdmVNYXBNb2RhbEZhY3RvcnkoKSB7XG4gIGNvbnN0IFNhdmVNYXBNb2RhbDogUmVhY3QuRkM8U2F2ZU1hcE1vZGFsUHJvcHM+ID0gKHtcbiAgICBtYXBJbmZvLFxuICAgIGV4cG9ydEltYWdlLFxuICAgIGNoYXJhY3RlckxpbWl0cyA9IE1BUF9JTkZPX0NIQVJBQ1RFUixcbiAgICBpc1Byb3ZpZGVyTG9hZGluZyxcbiAgICBwcm92aWRlckVycm9yLFxuICAgIG9uVXBkYXRlSW1hZ2VTZXR0aW5nID0gbm9wLFxuICAgIGNsZWFudXBFeHBvcnRJbWFnZSxcbiAgICBvblNldE1hcEluZm8sXG4gICAgb25DYW5jZWwsXG4gICAgb25Db25maXJtXG4gIH0pID0+IHtcbiAgICBjb25zdCB7cHJvdmlkZXIsIGNsb3VkUHJvdmlkZXJzfSA9IHVzZUNsb3VkTGlzdFByb3ZpZGVyKCk7XG5cbiAgICBjb25zdCBvbkNoYW5nZUlucHV0ID0gKFxuICAgICAga2V5OiBzdHJpbmcsXG4gICAgICB7dGFyZ2V0OiB7dmFsdWV9fTogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTFRleHRBcmVhRWxlbWVudCB8IEhUTUxJbnB1dEVsZW1lbnQ+XG4gICAgKSA9PiB7XG4gICAgICBvblNldE1hcEluZm8oe1trZXldOiB2YWx1ZX0pO1xuICAgIH07XG5cbiAgICBjb25zdCBjb25maXJtQnV0dG9uID0gdXNlTWVtbyhcbiAgICAgICgpID0+ICh7XG4gICAgICAgIGxhcmdlOiB0cnVlLFxuICAgICAgICBkaXNhYmxlZDogQm9vbGVhbighKHByb3ZpZGVyICYmIG1hcEluZm8udGl0bGUpKSxcbiAgICAgICAgY2hpbGRyZW46ICdtb2RhbC5idXR0b24uc2F2ZSdcbiAgICAgIH0pLFxuICAgICAgW3Byb3ZpZGVyLCBtYXBJbmZvXVxuICAgICk7XG5cbiAgICBjb25zdCBjb25maXJtID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgaWYgKHByb3ZpZGVyKSB7XG4gICAgICAgIG9uQ29uZmlybShwcm92aWRlcik7XG4gICAgICB9XG4gICAgfSwgW29uQ29uZmlybSwgcHJvdmlkZXJdKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8SW1hZ2VNb2RhbENvbnRhaW5lclxuICAgICAgICBwcm92aWRlcj17cHJvdmlkZXJ9XG4gICAgICAgIG9uVXBkYXRlSW1hZ2VTZXR0aW5nPXtvblVwZGF0ZUltYWdlU2V0dGluZ31cbiAgICAgICAgY2xlYW51cEV4cG9ydEltYWdlPXtjbGVhbnVwRXhwb3J0SW1hZ2V9XG4gICAgICA+XG4gICAgICAgIDxTdHlsZWRTYXZlTWFwTW9kYWw+XG4gICAgICAgICAgPFN0eWxlZE1vZGFsQ29udGVudCBjbGFzc05hbWU9XCJzYXZlLW1hcC1tb2RhbC1jb250ZW50XCI+XG4gICAgICAgICAgICA8U2F2ZU1hcEhlYWRlciBjbG91ZFByb3ZpZGVycz17Y2xvdWRQcm92aWRlcnN9IC8+XG4gICAgICAgICAgICB7cHJvdmlkZXIgJiYgKFxuICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgIHtwcm92aWRlci5nZXRNYW5hZ2VtZW50VXJsID8gKFxuICAgICAgICAgICAgICAgICAgPFN0eWxlZEV4cG9ydFNlY3Rpb24gc3R5bGU9e1NUWUxFRF9FWFBPUlRfU0VDVElPTl9TVFlMRX0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2VsZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleT17MX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e3Byb3ZpZGVyLmdldE1hbmFnZW1lbnRVcmwoKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXtQUk9WSURFUl9NQU5BR0VSX1VSTF9TVFlMRX1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICBHbyB0byB5b3VyIEtlcGxlci5nbCB7cHJvdmlkZXIuZGlzcGxheU5hbWV9IHBhZ2VcbiAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9TdHlsZWRFeHBvcnRTZWN0aW9uPlxuICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgIDxTdHlsZWRFeHBvcnRTZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJkZXNjcmlwdGlvbiBpbWFnZS1wcmV2aWV3LXBhbmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxJbWFnZVByZXZpZXdcbiAgICAgICAgICAgICAgICAgICAgICBleHBvcnRJbWFnZT17ZXhwb3J0SW1hZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg9e01BUF9USFVNQk5BSUxfRElNRU5TSU9OLndpZHRofVxuICAgICAgICAgICAgICAgICAgICAgIHNob3dEaW1lbnNpb249e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB7aXNQcm92aWRlckxvYWRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD17ZGF0YVRlc3RJZHMucHJvdmlkZXJMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInNlbGVjdGlvbiBtYXAtc2F2aW5nLWFuaW1hdGlvblwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8VXBsb2FkQW5pbWF0aW9uIGljb249e3Byb3ZpZGVyICYmIHByb3ZpZGVyLmljb259IC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgPE1hcEluZm9QYW5lbFxuICAgICAgICAgICAgICAgICAgICAgIG1hcEluZm89e21hcEluZm99XG4gICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyTGltaXRzPXtjaGFyYWN0ZXJMaW1pdHN9XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2VJbnB1dD17b25DaGFuZ2VJbnB1dH1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9TdHlsZWRFeHBvcnRTZWN0aW9uPlxuICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7cHJvdmlkZXJFcnJvciA/IChcbiAgICAgICAgICAgICAgPFN0YXR1c1BhbmVsXG4gICAgICAgICAgICAgICAgaXNMb2FkaW5nPXtmYWxzZX1cbiAgICAgICAgICAgICAgICBlcnJvcj17cHJvdmlkZXJFcnJvci5tZXNzYWdlfVxuICAgICAgICAgICAgICAgIHByb3ZpZGVySWNvbj17cHJvdmlkZXIgJiYgcHJvdmlkZXIuaWNvbn1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgIDwvU3R5bGVkTW9kYWxDb250ZW50PlxuICAgICAgICA8L1N0eWxlZFNhdmVNYXBNb2RhbD5cbiAgICAgICAgPE1vZGFsRm9vdGVyIGNhbmNlbD17b25DYW5jZWx9IGNvbmZpcm09e2NvbmZpcm19IGNvbmZpcm1CdXR0b249e2NvbmZpcm1CdXR0b259IC8+XG4gICAgICA8L0ltYWdlTW9kYWxDb250YWluZXI+XG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gU2F2ZU1hcE1vZGFsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBTYXZlTWFwTW9kYWxGYWN0b3J5O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLG9CQUFBLEdBQUFELHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSSxjQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxZQUFBLEdBQUFOLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTSxlQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxVQUFBLEdBQUFQLE9BQUE7QUFPQSxJQUFBUSxrQkFBQSxHQUFBUixPQUFBO0FBUUEsSUFBQVMsYUFBQSxHQUFBUCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVUsYUFBQSxHQUFBVixPQUFBO0FBSUEsSUFBQVcsTUFBQSxHQUFBWCxPQUFBO0FBQ0EsSUFBQVksc0JBQUEsR0FBQVosT0FBQTtBQUFzRSxJQUFBYSxlQUFBLEVBOUJ0RTtBQUNBO0FBQUEsU0FBQUMseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FB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
180
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfaW1hZ2VNb2RhbENvbnRhaW5lciIsIl9mbGV4Q29udGFpbmVyIiwiX3N0YXR1c1BhbmVsIiwiX3Byb3ZpZGVyU2VsZWN0IiwiX2NvbnN0YW50cyIsIl9zdHlsZWRDb21wb25lbnRzMiIsIl9pbWFnZVByZXZpZXciLCJfbG9jYWxpemF0aW9uIiwiX21vZGFsIiwiX3VzZUNsb3VkTGlzdFByb3ZpZGVyMiIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJTdHlsZWRTYXZlTWFwTW9kYWwiLCJzdHlsZWQiLCJkaXYiLCJhdHRycyIsImNsYXNzTmFtZSIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwiU3R5bGVkQ29tcGFjdEV4cG9ydFNlY3Rpb24iLCJTdHlsZWRFeHBvcnRTZWN0aW9uIiwibm9wIiwiVEVYVF9BUkVBX0xJR0hUX1NUWUxFIiwicmVzaXplIiwiTWFwSW5mb1BhbmVsIiwiZXhwb3J0cyIsIl9yZWYiLCJtYXBJbmZvIiwiY2hhcmFjdGVyTGltaXRzIiwib25DaGFuZ2VJbnB1dCIsIl9tYXBJbmZvJGRlc2NyaXB0aW9uIiwiZGVzY3JpcHRpb24iLCJfbWFwSW5mbyR0aXRsZSIsInRpdGxlIiwiY3JlYXRlRWxlbWVudCIsImRhdGFUZXN0SWRzIiwicHJvdmlkZXJNYXBJbmZvUGFuZWwiLCJTdHlsZWRNb2RhbFNlY3Rpb24iLCJJbnB1dExpZ2h0IiwiaWQiLCJ0eXBlIiwidmFsdWUiLCJvbkNoYW5nZSIsInBsYWNlaG9sZGVyIiwiRmxleENvbnRhaW5lciIsIlRleHRBcmVhTGlnaHQiLCJyb3dzIiwic3R5bGUiLCJTdHlsZWRNb2RhbElucHV0Rm9vdG5vdGUiLCJlcnJvciIsIkJvb2xlYW4iLCJsZW5ndGgiLCJOdW1iZXIiLCJNQVBfSU5GT19DSEFSQUNURVIiLCJTYXZlTWFwSGVhZGVyIiwiX3JlZjIiLCJjbG91ZFByb3ZpZGVycyIsIkZvcm1hdHRlZE1lc3NhZ2UiLCJQcm92aWRlclNlbGVjdCIsIlNUWUxFRF9FWFBPUlRfU0VDVElPTl9TVFlMRSIsIm1hcmdpbiIsIlBST1ZJREVSX01BTkFHRVJfVVJMX1NUWUxFIiwidGV4dERlY29yYXRpb24iLCJTYXZlTWFwTW9kYWxGYWN0b3J5IiwiU2F2ZU1hcE1vZGFsIiwiX3JlZjMiLCJleHBvcnRJbWFnZSIsIl9yZWYzJGNoYXJhY3RlckxpbWl0cyIsImlzUHJvdmlkZXJMb2FkaW5nIiwicHJvdmlkZXJFcnJvciIsIl9yZWYzJG9uVXBkYXRlSW1hZ2VTZSIsIm9uVXBkYXRlSW1hZ2VTZXR0aW5nIiwiY2xlYW51cEV4cG9ydEltYWdlIiwib25TZXRNYXBJbmZvIiwib25DYW5jZWwiLCJvbkNvbmZpcm0iLCJfdXNlQ2xvdWRMaXN0UHJvdmlkZXIiLCJ1c2VDbG91ZExpc3RQcm92aWRlciIsInByb3ZpZGVyIiwia2V5IiwiX3JlZjQiLCJ0YXJnZXQiLCJfZGVmaW5lUHJvcGVydHkyIiwiY29uZmlybUJ1dHRvbiIsInVzZU1lbW8iLCJsYXJnZSIsImRpc2FibGVkIiwiY2hpbGRyZW4iLCJjb25maXJtIiwidXNlQ2FsbGJhY2siLCJTdHlsZWRNb2RhbENvbnRlbnQiLCJGcmFnbWVudCIsImdldE1hbmFnZW1lbnRVcmwiLCJocmVmIiwicmVsIiwiZGlzcGxheU5hbWUiLCJ3aWR0aCIsIk1BUF9USFVNQk5BSUxfRElNRU5TSU9OIiwic2hvd0RpbWVuc2lvbiIsInByb3ZpZGVyTG9hZGluZyIsIlVwbG9hZEFuaW1hdGlvbiIsImljb24iLCJpc0xvYWRpbmciLCJtZXNzYWdlIiwicHJvdmlkZXJJY29uIiwiTW9kYWxGb290ZXIiLCJjYW5jZWwiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RhbHMvc2F2ZS1tYXAtbW9kYWwudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VNZW1vfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBJbWFnZU1vZGFsQ29udGFpbmVyLCB7SW1hZ2VNb2RhbENvbnRhaW5lclByb3BzfSBmcm9tICcuL2ltYWdlLW1vZGFsLWNvbnRhaW5lcic7XG5pbXBvcnQge0ZsZXhDb250YWluZXJ9IGZyb20gJy4uL2NvbW1vbi9mbGV4LWNvbnRhaW5lcic7XG5pbXBvcnQgU3RhdHVzUGFuZWwsIHtVcGxvYWRBbmltYXRpb259IGZyb20gJy4vc3RhdHVzLXBhbmVsJztcbmltcG9ydCB7UHJvdmlkZXJTZWxlY3R9IGZyb20gJy4vY2xvdWQtY29tcG9uZW50cy9wcm92aWRlci1zZWxlY3QnO1xuaW1wb3J0IHtcbiAgTUFQX1RIVU1CTkFJTF9ESU1FTlNJT04sXG4gIE1BUF9JTkZPX0NIQVJBQ1RFUixcbiAgRXhwb3J0SW1hZ2UsXG4gIGRhdGFUZXN0SWRzXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcblxuaW1wb3J0IHtcbiAgU3R5bGVkTW9kYWxDb250ZW50LFxuICBJbnB1dExpZ2h0LFxuICBUZXh0QXJlYUxpZ2h0LFxuICBTdHlsZWRFeHBvcnRTZWN0aW9uLFxuICBTdHlsZWRNb2RhbFNlY3Rpb24sXG4gIFN0eWxlZE1vZGFsSW5wdXRGb290bm90ZVxufSBmcm9tICcuLi9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IEltYWdlUHJldmlldyBmcm9tICcuLi9jb21tb24vaW1hZ2UtcHJldmlldyc7XG5pbXBvcnQge0Zvcm1hdHRlZE1lc3NhZ2V9IGZyb20gJ0BrZXBsZXIuZ2wvbG9jYWxpemF0aW9uJztcbmltcG9ydCB7TWFwSW5mb30gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge1Byb3ZpZGVyfSBmcm9tICdAa2VwbGVyLmdsL2Nsb3VkLXByb3ZpZGVycyc7XG5pbXBvcnQge3NldE1hcEluZm8sIGNsZWFudXBFeHBvcnRJbWFnZSBhcyBjbGVhbnVwRXhwb3J0SW1hZ2VBY3Rpb259IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge01vZGFsRm9vdGVyfSBmcm9tICcuLi9jb21tb24vbW9kYWwnO1xuaW1wb3J0IHt1c2VDbG91ZExpc3RQcm92aWRlcn0gZnJvbSAnLi4vaG9va3MvdXNlLWNsb3VkLWxpc3QtcHJvdmlkZXInO1xuXG5jb25zdCBTdHlsZWRTYXZlTWFwTW9kYWwgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnc2F2ZS1tYXAtbW9kYWwnXG59KWBcbiAgLnNhdmUtbWFwLW1vZGFsLWNvbnRlbnQge1xuICAgIG1pbi1oZWlnaHQ6IDQwMHB4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIH1cblxuICAuZGVzY3JpcHRpb24ge1xuICAgIHdpZHRoOiAzMDBweDtcbiAgfVxuXG4gIC5pbWFnZS1wcmV2aWV3LXBhbmVsIHtcbiAgICB3aWR0aDogMzAwcHg7XG5cbiAgICAuaW1hZ2UtcHJldmlldyB7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgIH1cbiAgfVxuXG4gIC5tYXAtaW5mby1wYW5lbCB7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgfVxuXG4gIC5zYXZlLW1hcC1tb2RhbC1kZXNjcmlwdGlvbiB7XG4gICAgLm1vZGFsLXNlY3Rpb24tc3VidGl0bGUge1xuICAgICAgbWFyZ2luLWxlZnQ6IDZweDtcbiAgICB9XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZENvbXBhY3RFeHBvcnRTZWN0aW9uID0gc3R5bGVkKFN0eWxlZEV4cG9ydFNlY3Rpb24pYFxuICBtYXJnaW46IDVweCAwO1xuYDtcblxuY29uc3Qgbm9wID0gKCkgPT4ge1xuICByZXR1cm47XG59O1xuY29uc3QgVEVYVF9BUkVBX0xJR0hUX1NUWUxFID0ge3Jlc2l6ZTogJ25vbmUnfTtcblxudHlwZSBDaGFyYWN0ZXJMaW1pdHMgPSB7XG4gIHRpdGxlPzogbnVtYmVyO1xuICBkZXNjcmlwdGlvbj86IG51bWJlcjtcbn07XG5cbnR5cGUgU2F2ZU1hcE1vZGFsUHJvcHMgPSB7XG4gIG1hcEluZm86IE1hcEluZm87XG4gIGV4cG9ydEltYWdlOiBFeHBvcnRJbWFnZTtcbiAgaXNQcm92aWRlckxvYWRpbmc6IGJvb2xlYW47XG4gIHByb3ZpZGVyRXJyb3I/OiBFcnJvcjtcbiAgY2hhcmFjdGVyTGltaXRzPzogQ2hhcmFjdGVyTGltaXRzO1xuXG4gIC8vIGNhbGxiYWNrc1xuICBvblVwZGF0ZUltYWdlU2V0dGluZzogSW1hZ2VNb2RhbENvbnRhaW5lclByb3BzWydvblVwZGF0ZUltYWdlU2V0dGluZyddO1xuICBjbGVhbnVwRXhwb3J0SW1hZ2U6IHR5cGVvZiBjbGVhbnVwRXhwb3J0SW1hZ2VBY3Rpb247XG4gIG9uU2V0TWFwSW5mbzogdHlwZW9mIHNldE1hcEluZm87XG4gIG9uQ29uZmlybTogKHByb3ZpZGVyOiBQcm92aWRlcikgPT4gdm9pZDtcbiAgb25DYW5jZWw6ICgpID0+IHZvaWQ7XG59O1xuXG50eXBlIE1hcEluZm9QYW5lbFByb3BzID0gUGljazxTYXZlTWFwTW9kYWxQcm9wcywgJ21hcEluZm8nIHwgJ2NoYXJhY3RlckxpbWl0cyc+ICYge1xuICBvbkNoYW5nZUlucHV0OiAoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGV2ZW50OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MVGV4dEFyZWFFbGVtZW50IHwgSFRNTElucHV0RWxlbWVudD5cbiAgKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IGNvbnN0IE1hcEluZm9QYW5lbDogUmVhY3QuRkM8TWFwSW5mb1BhbmVsUHJvcHM+ID0gKHtcbiAgbWFwSW5mbyxcbiAgY2hhcmFjdGVyTGltaXRzLFxuICBvbkNoYW5nZUlucHV0XG59KSA9PiB7XG4gIGNvbnN0IHtkZXNjcmlwdGlvbiA9ICcnLCB0aXRsZSA9ICcnfSA9IG1hcEluZm87XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJzZWxlY3Rpb24gbWFwLWluZm8tcGFuZWxcIiBkYXRhLXRlc3RpZD17ZGF0YVRlc3RJZHMucHJvdmlkZXJNYXBJbmZvUGFuZWx9PlxuICAgICAgPFN0eWxlZE1vZGFsU2VjdGlvbiBjbGFzc05hbWU9XCJzYXZlLW1hcC1tb2RhbC1uYW1lXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtc2VjdGlvbi10aXRsZVwiPk5hbWUqPC9kaXY+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPElucHV0TGlnaHRcbiAgICAgICAgICAgIGlkPVwibWFwLXRpdGxlXCJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIHZhbHVlPXt0aXRsZX1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IG9uQ2hhbmdlSW5wdXQoJ3RpdGxlJywgZSl9XG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlR5cGUgbWFwIHRpdGxlXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvU3R5bGVkTW9kYWxTZWN0aW9uPlxuICAgICAgPFN0eWxlZE1vZGFsU2VjdGlvbj5cbiAgICAgICAgPEZsZXhDb250YWluZXIgY2xhc3NOYW1lPVwic2F2ZS1tYXAtbW9kYWwtZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1vZGFsLXNlY3Rpb24tdGl0bGVcIj5EZXNjcmlwdGlvbjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibW9kYWwtc2VjdGlvbi1zdWJ0aXRsZVwiPihvcHRpb25hbCk8L2Rpdj5cbiAgICAgICAgPC9GbGV4Q29udGFpbmVyPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxUZXh0QXJlYUxpZ2h0XG4gICAgICAgICAgICByb3dzPXszfVxuICAgICAgICAgICAgaWQ9XCJtYXAtZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgc3R5bGU9e1RFWFRfQVJFQV9MSUdIVF9TVFlMRSBhcyBSZWFjdC5DU1NQcm9wZXJ0aWVzfVxuICAgICAgICAgICAgdmFsdWU9e2Rlc2NyaXB0aW9ufVxuICAgICAgICAgICAgb25DaGFuZ2U9e2UgPT4gb25DaGFuZ2VJbnB1dCgnZGVzY3JpcHRpb24nLCBlKX1cbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZSBtYXAgZGVzY3JpcHRpb25cIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8U3R5bGVkTW9kYWxJbnB1dEZvb3Rub3RlXG4gICAgICAgICAgZXJyb3I9e1xuICAgICAgICAgICAgQm9vbGVhbihjaGFyYWN0ZXJMaW1pdHM/LmRlc2NyaXB0aW9uKSAmJlxuICAgICAgICAgICAgZGVzY3JpcHRpb24ubGVuZ3RoID4gTnVtYmVyKGNoYXJhY3RlckxpbWl0cz8uZGVzY3JpcHRpb24pXG4gICAgICAgICAgfVxuICAgICAgICA+XG4gICAgICAgICAge2Rlc2NyaXB0aW9uLmxlbmd0aH0ve2NoYXJhY3RlckxpbWl0cz8uZGVzY3JpcHRpb24gfHwgTUFQX0lORk9fQ0hBUkFDVEVSLmRlc2NyaXB0aW9ufXsnICd9XG4gICAgICAgICAgY2hhcmFjdGVyc1xuICAgICAgICA8L1N0eWxlZE1vZGFsSW5wdXRGb290bm90ZT5cbiAgICAgIDwvU3R5bGVkTW9kYWxTZWN0aW9uPlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuY29uc3QgU2F2ZU1hcEhlYWRlciA9ICh7Y2xvdWRQcm92aWRlcnN9KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPFN0eWxlZEV4cG9ydFNlY3Rpb24+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImRlc2NyaXB0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGl0bGVcIj5cbiAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17J21vZGFsLnNhdmVNYXAudGl0bGUnfSAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzdWJ0aXRsZVwiPlxuICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXsnbW9kYWwuc2F2ZU1hcC5zdWJ0aXRsZSd9IC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8UHJvdmlkZXJTZWxlY3QgY2xvdWRQcm92aWRlcnM9e2Nsb3VkUHJvdmlkZXJzfSAvPlxuICAgIDwvU3R5bGVkRXhwb3J0U2VjdGlvbj5cbiAgKTtcbn07XG5cbmNvbnN0IFNUWUxFRF9FWFBPUlRfU0VDVElPTl9TVFlMRSA9IHttYXJnaW46ICcycHggMCd9O1xuY29uc3QgUFJPVklERVJfTUFOQUdFUl9VUkxfU1RZTEUgPSB7dGV4dERlY29yYXRpb246ICd1bmRlcmxpbmUnfTtcblxuZnVuY3Rpb24gU2F2ZU1hcE1vZGFsRmFjdG9yeSgpIHtcbiAgY29uc3QgU2F2ZU1hcE1vZGFsOiBSZWFjdC5GQzxTYXZlTWFwTW9kYWxQcm9wcz4gPSAoe1xuICAgIG1hcEluZm8sXG4gICAgZXhwb3J0SW1hZ2UsXG4gICAgY2hhcmFjdGVyTGltaXRzID0gTUFQX0lORk9fQ0hBUkFDVEVSLFxuICAgIGlzUHJvdmlkZXJMb2FkaW5nLFxuICAgIHByb3ZpZGVyRXJyb3IsXG4gICAgb25VcGRhdGVJbWFnZVNldHRpbmcgPSBub3AsXG4gICAgY2xlYW51cEV4cG9ydEltYWdlLFxuICAgIG9uU2V0TWFwSW5mbyxcbiAgICBvbkNhbmNlbCxcbiAgICBvbkNvbmZpcm1cbiAgfSkgPT4ge1xuICAgIGNvbnN0IHtwcm92aWRlciwgY2xvdWRQcm92aWRlcnN9ID0gdXNlQ2xvdWRMaXN0UHJvdmlkZXIoKTtcblxuICAgIGNvbnN0IG9uQ2hhbmdlSW5wdXQgPSAoXG4gICAgICBrZXk6IHN0cmluZyxcbiAgICAgIHt0YXJnZXQ6IHt2YWx1ZX19OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MVGV4dEFyZWFFbGVtZW50IHwgSFRNTElucHV0RWxlbWVudD5cbiAgICApID0+IHtcbiAgICAgIG9uU2V0TWFwSW5mbyh7W2tleV06IHZhbHVlfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGNvbmZpcm1CdXR0b24gPSB1c2VNZW1vKFxuICAgICAgKCkgPT4gKHtcbiAgICAgICAgbGFyZ2U6IHRydWUsXG4gICAgICAgIGRpc2FibGVkOiBCb29sZWFuKCEocHJvdmlkZXIgJiYgbWFwSW5mby50aXRsZSkpLFxuICAgICAgICBjaGlsZHJlbjogJ21vZGFsLmJ1dHRvbi5zYXZlJ1xuICAgICAgfSksXG4gICAgICBbcHJvdmlkZXIsIG1hcEluZm9dXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbmZpcm0gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICBpZiAocHJvdmlkZXIpIHtcbiAgICAgICAgb25Db25maXJtKHByb3ZpZGVyKTtcbiAgICAgIH1cbiAgICB9LCBbb25Db25maXJtLCBwcm92aWRlcl0pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxJbWFnZU1vZGFsQ29udGFpbmVyXG4gICAgICAgIHByb3ZpZGVyPXtwcm92aWRlcn1cbiAgICAgICAgb25VcGRhdGVJbWFnZVNldHRpbmc9e29uVXBkYXRlSW1hZ2VTZXR0aW5nfVxuICAgICAgICBjbGVhbnVwRXhwb3J0SW1hZ2U9e2NsZWFudXBFeHBvcnRJbWFnZX1cbiAgICAgID5cbiAgICAgICAgPFN0eWxlZFNhdmVNYXBNb2RhbD5cbiAgICAgICAgICA8U3R5bGVkTW9kYWxDb250ZW50IGNsYXNzTmFtZT1cInNhdmUtbWFwLW1vZGFsLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxTYXZlTWFwSGVhZGVyIGNsb3VkUHJvdmlkZXJzPXtjbG91ZFByb3ZpZGVyc30gLz5cbiAgICAgICAgICAgIHtwcm92aWRlciAmJiAoXG4gICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAge3Byb3ZpZGVyLmdldE1hbmFnZW1lbnRVcmwgPyAoXG4gICAgICAgICAgICAgICAgICA8U3R5bGVkRXhwb3J0U2VjdGlvbiBzdHlsZT17U1RZTEVEX0VYUE9SVF9TRUNUSU9OX1NUWUxFfT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzZWxlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAga2V5PXsxfVxuICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj17cHJvdmlkZXIuZ2V0TWFuYWdlbWVudFVybCgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e1BST1ZJREVSX01BTkFHRVJfVVJMX1NUWUxFfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIEdvIHRvIHlvdXIgS2VwbGVyLmdsIHtwcm92aWRlci5kaXNwbGF5TmFtZX0gcGFnZVxuICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L1N0eWxlZEV4cG9ydFNlY3Rpb24+XG4gICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgPFN0eWxlZENvbXBhY3RFeHBvcnRTZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJkZXNjcmlwdGlvbiBpbWFnZS1wcmV2aWV3LXBhbmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxJbWFnZVByZXZpZXdcbiAgICAgICAgICAgICAgICAgICAgICBleHBvcnRJbWFnZT17ZXhwb3J0SW1hZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg9e01BUF9USFVNQk5BSUxfRElNRU5TSU9OLndpZHRofVxuICAgICAgICAgICAgICAgICAgICAgIHNob3dEaW1lbnNpb249e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB7aXNQcm92aWRlckxvYWRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD17ZGF0YVRlc3RJZHMucHJvdmlkZXJMb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInNlbGVjdGlvbiBtYXAtc2F2aW5nLWFuaW1hdGlvblwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8VXBsb2FkQW5pbWF0aW9uIGljb249e3Byb3ZpZGVyICYmIHByb3ZpZGVyLmljb259IC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgPE1hcEluZm9QYW5lbFxuICAgICAgICAgICAgICAgICAgICAgIG1hcEluZm89e21hcEluZm99XG4gICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyTGltaXRzPXtjaGFyYWN0ZXJMaW1pdHN9XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2VJbnB1dD17b25DaGFuZ2VJbnB1dH1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9TdHlsZWRDb21wYWN0RXhwb3J0U2VjdGlvbj5cbiAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge3Byb3ZpZGVyRXJyb3IgPyAoXG4gICAgICAgICAgICAgIDxTdGF0dXNQYW5lbFxuICAgICAgICAgICAgICAgIGlzTG9hZGluZz17ZmFsc2V9XG4gICAgICAgICAgICAgICAgZXJyb3I9e3Byb3ZpZGVyRXJyb3IubWVzc2FnZX1cbiAgICAgICAgICAgICAgICBwcm92aWRlckljb249e3Byb3ZpZGVyICYmIHByb3ZpZGVyLmljb259XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICA8L1N0eWxlZE1vZGFsQ29udGVudD5cbiAgICAgICAgPC9TdHlsZWRTYXZlTWFwTW9kYWw+XG4gICAgICAgIDxNb2RhbEZvb3RlciBjYW5jZWw9e29uQ2FuY2VsfSBjb25maXJtPXtjb25maXJtfSBjb25maXJtQnV0dG9uPXtjb25maXJtQnV0dG9ufSAvPlxuICAgICAgPC9JbWFnZU1vZGFsQ29udGFpbmVyPlxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFNhdmVNYXBNb2RhbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgU2F2ZU1hcE1vZGFsRmFjdG9yeTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxvQkFBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUksY0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssWUFBQSxHQUFBTix1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU0sZUFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sVUFBQSxHQUFBUCxPQUFBO0FBT0EsSUFBQVEsa0JBQUEsR0FBQVIsT0FBQTtBQVFBLElBQUFTLGFBQUEsR0FBQVAsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFVLGFBQUEsR0FBQVYsT0FBQTtBQUlBLElBQUFXLE1BQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLHNCQUFBLEdBQUFaLE9BQUE7QUFBc0UsSUFBQWEsZUFBQSxFQUFBQyxnQkFBQSxF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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kepler.gl/components",
3
3
  "author": "Shan He <shan@uber.com>",
4
- "version": "3.1.0-alpha.6",
4
+ "version": "3.1.0",
5
5
  "description": "kepler.gl constants used by kepler.gl components, actions and reducers",
6
6
  "license": "MIT",
7
7
  "main": "dist/index.js",
@@ -38,20 +38,20 @@
38
38
  "@dnd-kit/utilities": "^3.2.2",
39
39
  "@emotion/is-prop-valid": "^1.2.1",
40
40
  "@floating-ui/react": "0.25.1",
41
- "@kepler.gl/actions": "3.1.0-alpha.6",
42
- "@kepler.gl/cloud-providers": "3.1.0-alpha.6",
43
- "@kepler.gl/common-utils": "3.1.0-alpha.6",
44
- "@kepler.gl/constants": "3.1.0-alpha.6",
45
- "@kepler.gl/effects": "3.1.0-alpha.6",
46
- "@kepler.gl/layers": "3.1.0-alpha.6",
47
- "@kepler.gl/localization": "3.1.0-alpha.6",
48
- "@kepler.gl/processors": "3.1.0-alpha.6",
49
- "@kepler.gl/reducers": "3.1.0-alpha.6",
50
- "@kepler.gl/schemas": "3.1.0-alpha.6",
51
- "@kepler.gl/styles": "3.1.0-alpha.6",
52
- "@kepler.gl/table": "3.1.0-alpha.6",
53
- "@kepler.gl/types": "3.1.0-alpha.6",
54
- "@kepler.gl/utils": "3.1.0-alpha.6",
41
+ "@kepler.gl/actions": "3.1.0",
42
+ "@kepler.gl/cloud-providers": "3.1.0",
43
+ "@kepler.gl/common-utils": "3.1.0",
44
+ "@kepler.gl/constants": "3.1.0",
45
+ "@kepler.gl/effects": "3.1.0",
46
+ "@kepler.gl/layers": "3.1.0",
47
+ "@kepler.gl/localization": "3.1.0",
48
+ "@kepler.gl/processors": "3.1.0",
49
+ "@kepler.gl/reducers": "3.1.0",
50
+ "@kepler.gl/schemas": "3.1.0",
51
+ "@kepler.gl/styles": "3.1.0",
52
+ "@kepler.gl/table": "3.1.0",
53
+ "@kepler.gl/types": "3.1.0",
54
+ "@kepler.gl/utils": "3.1.0",
55
55
  "@loaders.gl/mvt": "^4.3.2",
56
56
  "@loaders.gl/pmtiles": "^4.3.2",
57
57
  "@mapbox/mapbox-sdk": "^0.15.3",
@@ -128,7 +128,7 @@ const HeaderCellFactory = (FieldToken: React.FC<FieldTokenProps>) => {
128
128
  const onCopy = useCallback(() => copyTableColumn(column), [copyTableColumn, column]);
129
129
  const onSetDisplayFormat = useCallback(
130
130
  displayFormat => {
131
- setColumnDisplayFormat({[column]: displayFormat.format});
131
+ setColumnDisplayFormat?.({[column]: displayFormat.format});
132
132
  },
133
133
  [column, setColumnDisplayFormat]
134
134
  );
@@ -195,10 +195,12 @@ const HeaderCellFactory = (FieldToken: React.FC<FieldTokenProps>) => {
195
195
  column={column}
196
196
  colMeta={colMeta}
197
197
  toggleMoreOptions={toggleMoreOptions}
198
- sortTableColumn={mode => sortTableColumn(column, mode)}
198
+ sortTableColumn={
199
+ sortTableColumn ? mode => sortTableColumn(column, mode) : undefined
200
+ }
199
201
  pinTableColumn={onPin}
200
202
  copyTableColumn={onCopy}
201
- setDisplayFormat={onSetDisplayFormat}
203
+ setDisplayFormat={setColumnDisplayFormat ? onSetDisplayFormat : undefined}
202
204
  />
203
205
  </section>
204
206
  </>
@@ -389,7 +389,7 @@ export interface DataTableProps {
389
389
  sortColumn: SortColumn;
390
390
  sortTableColumn: (column: string, mode?: string) => void;
391
391
  pinTableColumn: (column: string) => void;
392
- setColumnDisplayFormat: (formats: {[key: string]: string}) => void;
392
+ setColumnDisplayFormat?: (formats: {[key: string]: string}) => void;
393
393
  copyTableColumn: (column: string) => void;
394
394
  sortOrder?: number[] | null;
395
395
  showStats?: boolean;
@@ -70,7 +70,7 @@ export type FormatterDropdownProps = {
70
70
  top: number;
71
71
  isOpened: boolean;
72
72
  displayFormat?: string;
73
- setDisplayFormat: (displayFormat: TooltipFormat) => void;
73
+ setDisplayFormat?: (displayFormat: TooltipFormat) => void;
74
74
  onClose: () => void;
75
75
  formatLabels: TooltipFormat[];
76
76
  };
@@ -91,7 +91,7 @@ export const FormatterDropdown: React.FC<FormatterDropdownProps> = (
91
91
 
92
92
  const onSelectDisplayFormat = useCallback(
93
93
  result => {
94
- setDisplayFormat(result);
94
+ setDisplayFormat?.(result);
95
95
  onClose();
96
96
  },
97
97
  [setDisplayFormat, onClose]
@@ -117,10 +117,10 @@ export interface OptionDropdownProps {
117
117
  column: string;
118
118
  colMeta: ColMeta;
119
119
  toggleMoreOptions: (column: string) => void;
120
- sortTableColumn: (sort: string) => void;
120
+ sortTableColumn?: (sort: string) => void;
121
121
  pinTableColumn: () => void;
122
122
  copyTableColumn: () => void;
123
- setDisplayFormat: (displayFormat: any) => void;
123
+ setDisplayFormat?: (displayFormat: any) => void;
124
124
  sortMode?: string;
125
125
  isSorted?: string;
126
126
  isPinned?: boolean;
@@ -142,13 +142,13 @@ const OptionDropdown = (props: OptionDropdownProps) => {
142
142
  ({value}) => {
143
143
  switch (value) {
144
144
  case TABLE_OPTION.SORT_ASC:
145
- sortTableColumn(SORT_ORDER.ASCENDING);
145
+ sortTableColumn?.(SORT_ORDER.ASCENDING);
146
146
  break;
147
147
  case TABLE_OPTION.SORT_DES:
148
- sortTableColumn(SORT_ORDER.DESCENDING);
148
+ sortTableColumn?.(SORT_ORDER.DESCENDING);
149
149
  break;
150
150
  case TABLE_OPTION.UNSORT:
151
- sortTableColumn(SORT_ORDER.UNSORT);
151
+ sortTableColumn?.(SORT_ORDER.UNSORT);
152
152
  break;
153
153
  case TABLE_OPTION.PIN:
154
154
  pinTableColumn();
@@ -6,11 +6,11 @@
6
6
  * For React 16.8 compatibility
7
7
  */
8
8
  import React, {ReactNode} from 'react';
9
- import window from 'global/window';
9
+ import Window from 'global/window';
10
10
 
11
11
  export type FileDropProps = {
12
12
  dropEffect?: 'copy' | 'move' | 'link' | 'none';
13
- frame?: typeof document | typeof window | HTMLElement;
13
+ frame?: typeof document | typeof Window | HTMLElement;
14
14
  className?: string;
15
15
  targetClassName?: string;
16
16
  draggingOverFrameClassName?: string;
@@ -29,10 +29,10 @@ export type FileDropProps = {
29
29
  /** @augments React.PureComponent<FileDropProps> */
30
30
  class FileDrop extends React.PureComponent<FileDropProps> {
31
31
  static isIE = () =>
32
- window &&
33
- window.navigator &&
34
- ((window.navigator.userAgent || []).includes('MSIE') ||
35
- (window.navigator.appVersion || []).includes('Trident/'));
32
+ Window &&
33
+ Window.navigator &&
34
+ ((Window.navigator.userAgent || []).includes('MSIE') ||
35
+ (Window.navigator.appVersion || []).includes('Trident/'));
36
36
 
37
37
  static eventHasFiles = event => {
38
38
  // In most browsers this is an array, but in IE11 it's an Object :(
@@ -52,7 +52,7 @@ class FileDrop extends React.PureComponent<FileDropProps> {
52
52
 
53
53
  static defaultProps = {
54
54
  dropEffect: 'copy',
55
- frame: window ? window.document : undefined,
55
+ frame: Window ? Window.document : undefined,
56
56
  className: 'file-drop',
57
57
  targetClassName: 'file-drop-target',
58
58
  draggingOverFrameClassName: 'file-drop-dragging-over-frame',
@@ -65,8 +65,8 @@ class FileDrop extends React.PureComponent<FileDropProps> {
65
65
  componentDidMount() {
66
66
  this.startFrameListeners(this.props.frame);
67
67
  this.resetDragging();
68
- window.addEventListener('dragover', this.handleWindowDragOverOrDrop);
69
- window.addEventListener('drop', this.handleWindowDragOverOrDrop);
68
+ Window.addEventListener('dragover', this.handleWindowDragOverOrDrop);
69
+ Window.addEventListener('drop', this.handleWindowDragOverOrDrop);
70
70
  }
71
71
 
72
72
  componentDidUpdate(prevProps) {
@@ -79,8 +79,8 @@ class FileDrop extends React.PureComponent<FileDropProps> {
79
79
 
80
80
  componentWillUnmount() {
81
81
  this.stopFrameListeners(this.props.frame);
82
- window.removeEventListener('dragover', this.handleWindowDragOverOrDrop);
83
- window.removeEventListener('drop', this.handleWindowDragOverOrDrop);
82
+ Window.removeEventListener('dragover', this.handleWindowDragOverOrDrop);
83
+ Window.removeEventListener('drop', this.handleWindowDragOverOrDrop);
84
84
  }
85
85
 
86
86
  resetDragging = () => {
@@ -9,7 +9,7 @@ import {canUseDOM} from 'exenv';
9
9
  import {withTheme} from 'styled-components';
10
10
  import {RootContext} from '../context';
11
11
  import Modal from 'react-modal';
12
- import window from 'global/window';
12
+ import Window from 'global/window';
13
13
  import {theme} from '@kepler.gl/styles';
14
14
 
15
15
  const listeners = {};
@@ -18,19 +18,19 @@ const startListening = () => Object.keys(listeners).forEach(key => listeners[key
18
18
 
19
19
  const getPageOffset = () => ({
20
20
  x:
21
- window.pageXOffset !== undefined
22
- ? window.pageXOffset
21
+ Window.pageXOffset !== undefined
22
+ ? Window.pageXOffset
23
23
  : (document.documentElement || document.body.parentNode || document.body).scrollLeft,
24
24
  y:
25
- window.pageYOffset !== undefined
26
- ? window.pageYOffset
25
+ Window.pageYOffset !== undefined
26
+ ? Window.pageYOffset
27
27
  : (document.documentElement || document.body.parentNode || document.body).scrollTop
28
28
  });
29
29
 
30
30
  const addEventListeners = () => {
31
31
  if (document && document.body)
32
32
  document.body.addEventListener('mousewheel', debounce(startListening, 100, {leading: true}));
33
- window.addEventListener('resize', debounce(startListening, 50, {leading: true}));
33
+ Window.addEventListener('resize', debounce(startListening, 50, {leading: true}));
34
34
  };
35
35
 
36
36
  interface GetChildPosProps {
@@ -56,21 +56,21 @@ export const getChildPos = ({offsets, rect, childRect, pageOffset, padding}: Get
56
56
  top: pageOffset.y + rect.top + (topOffset || 0),
57
57
  ...(anchorLeft
58
58
  ? {left: pageOffset.x + rect.left + (leftOffset || 0)}
59
- : {right: window.innerWidth - rect.right - pageOffset.x + (rightOffset || 0)})
59
+ : {right: Window.innerWidth - rect.right - pageOffset.x + (rightOffset || 0)})
60
60
  };
61
61
 
62
62
  const leftOrRight = anchorLeft ? 'left' : 'right';
63
63
 
64
64
  if (pos[leftOrRight] && pos[leftOrRight] < 0) {
65
65
  pos[leftOrRight] = padding;
66
- } else if (pos[leftOrRight] && pos[leftOrRight] + childRect.width > window.innerWidth) {
67
- pos[leftOrRight] = window.innerWidth - childRect.width - padding;
66
+ } else if (pos[leftOrRight] && pos[leftOrRight] + childRect.width > Window.innerWidth) {
67
+ pos[leftOrRight] = Window.innerWidth - childRect.width - padding;
68
68
  }
69
69
 
70
70
  if (pos.top < 0) {
71
71
  pos.top = padding;
72
- } else if (pos.top + childRect.height > window.innerHeight) {
73
- pos.top = window.innerHeight - childRect.height - padding;
72
+ } else if (pos.top + childRect.height > Window.innerHeight) {
73
+ pos.top = Window.innerHeight - childRect.height - padding;
74
74
  }
75
75
 
76
76
  return pos;
@@ -183,7 +183,7 @@ class Portaled extends Component<PortaledProps, PortaledState> {
183
183
  const didOpen = this.props.isOpened && !prevProps.isOpened;
184
184
  const didClose = !this.props.isOpened && prevProps.isOpened;
185
185
  if (didOpen || didClose) {
186
- window.requestAnimationFrame(() => {
186
+ Window.requestAnimationFrame(() => {
187
187
  if (this._unmounted) return;
188
188
  this.setState({isVisible: Boolean(didOpen)});
189
189
  });
@@ -4,7 +4,7 @@
4
4
  import React, {Component, CSSProperties, KeyboardEvent} from 'react';
5
5
  import {createPortal} from 'react-dom';
6
6
  import styled from 'styled-components';
7
- import window from 'global/window';
7
+ import Window from 'global/window';
8
8
  import classnames from 'classnames';
9
9
  import get from 'lodash.get';
10
10
  import {createSelector} from 'reselect';
@@ -102,11 +102,11 @@ export default function EditorFactory(
102
102
  state = {};
103
103
 
104
104
  componentDidMount() {
105
- window.addEventListener('keydown', this._onKeyPressed);
105
+ Window.addEventListener('keydown', this._onKeyPressed);
106
106
  }
107
107
 
108
108
  componentWillUnmount() {
109
- window.removeEventListener('keydown', this._onKeyPressed);
109
+ Window.removeEventListener('keydown', this._onKeyPressed);
110
110
  }
111
111
 
112
112
  layerSelector = (props: EditorProps) => props.layers;
@@ -65,7 +65,8 @@ import {
65
65
  mergeMessages,
66
66
  observeDimensions,
67
67
  unobserveDimensions,
68
- hasPortableWidth
68
+ hasPortableWidth,
69
+ getApplicationConfig
69
70
  } from '@kepler.gl/utils';
70
71
 
71
72
  import {theme as basicTheme, themeLT, themeBS, breakPointValues} from '@kepler.gl/styles';
@@ -181,6 +182,8 @@ export const mapFieldsSelector = (props: KeplerGLProps, index = 0) => ({
181
182
  mapControls: props.uiState.mapControls,
182
183
  readOnly: props.uiState.readOnly,
183
184
  locale: props.uiState.locale,
185
+ isLoadingIndicatorVisible: Number(props.uiState.loadingIndicatorValue) > 0,
186
+ sidePanelWidth: props.sidePanelWidth ? props.sidePanelWidth : DEFAULT_KEPLER_GL_PROPS.width,
184
187
 
185
188
  // mapStyle
186
189
  topMapContainerProps: props.topMapContainerProps,
@@ -445,7 +448,9 @@ function KeplerGlFactory(
445
448
  };
446
449
 
447
450
  componentDidMount() {
448
- this._validateMapboxToken();
451
+ if (getApplicationConfig().baseMapLibraryConfig?.['mapbox']?.mapLibName === 'Mapbox') {
452
+ this._validateMapboxToken();
453
+ }
449
454
  this._loadMapStyle();
450
455
  if (typeof this.props.onKeplerGlInitialized === 'function') {
451
456
  this.props.onKeplerGlInitialized();
@@ -0,0 +1,49 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // Copyright contributors to the kepler.gl project
3
+
4
+ import React, {PropsWithChildren} from 'react';
5
+ import styled, {withTheme} from 'styled-components';
6
+
7
+ type StyledContainerProps = {
8
+ isVisible?: boolean;
9
+ left: number;
10
+ };
11
+
12
+ export const StyledContainer = styled.div<StyledContainerProps>`
13
+ position: absolute;
14
+ left: ${props => props.left}px;
15
+ bottom: ${props => props.theme.sidePanel.margin.left}px;
16
+ z-index: 1;
17
+ color: ${props => props.theme.textColorHl};
18
+ opacity: ${props => (props.isVisible ? 1 : 0)};
19
+ transition: opacity 0.5s ease-in-out;
20
+ background-color: ${props => props.theme.sidePanelBg};
21
+ border-radius: 0px;
22
+ padding-left: 3px;
23
+ padding-right: 3px;
24
+ font-size: 12px;
25
+ `;
26
+
27
+ type LoadingIndicatorProps = {
28
+ isVisible?: boolean;
29
+ activeSidePanel?: boolean;
30
+ sidePanelWidth?: number;
31
+ };
32
+
33
+ const LoadingIndicator: React.FC<PropsWithChildren<LoadingIndicatorProps> & {theme: any}> = ({
34
+ isVisible,
35
+ children,
36
+ activeSidePanel,
37
+ sidePanelWidth,
38
+ theme
39
+ }) => {
40
+ const left = (activeSidePanel ? sidePanelWidth || 0 : 0) + theme.sidePanel.margin.left;
41
+
42
+ return (
43
+ <StyledContainer isVisible={isVisible} left={left}>
44
+ {children}
45
+ </StyledContainer>
46
+ );
47
+ };
48
+
49
+ export default withTheme(LoadingIndicator) as React.FC<PropsWithChildren<LoadingIndicatorProps>>;
@@ -91,6 +91,8 @@ import {
91
91
  } from '@kepler.gl/reducers';
92
92
  import {VisState} from '@kepler.gl/schemas';
93
93
 
94
+ import LoadingIndicator from './loading-indicator';
95
+
94
96
  // Debounce the propagation of viewport change and mouse moves to redux store.
95
97
  // This is to avoid too many renders of other components when the map is
96
98
  // being panned/zoomed (leading to laggy basemap/deck syncing).
@@ -324,6 +326,10 @@ export interface MapContainerProps {
324
326
  deleteMapLabels?: (containerId: string, layerId: string) => void;
325
327
  containerId?: number;
326
328
 
329
+ isLoadingIndicatorVisible?: boolean;
330
+ activeSidePanel: string | null;
331
+ sidePanelWidth?: number;
332
+
327
333
  locale?: any;
328
334
  theme?: any;
329
335
  editor?: any;
@@ -1022,7 +1028,10 @@ export default function MapContainerFactory(
1022
1028
  topMapContainerProps,
1023
1029
  theme,
1024
1030
  datasetAttributions = [],
1025
- containerId = 0
1031
+ containerId = 0,
1032
+ isLoadingIndicatorVisible,
1033
+ activeSidePanel,
1034
+ sidePanelWidth
1026
1035
  } = this.props;
1027
1036
 
1028
1037
  const {layers, datasets, editor, interactionConfig} = visState;
@@ -1144,6 +1153,15 @@ export default function MapContainerFactory(
1144
1153
  )
1145
1154
  : null}
1146
1155
  {this._renderMapPopover()}
1156
+ {primary !== isSplit ? (
1157
+ <LoadingIndicator
1158
+ isVisible={Boolean(isLoadingIndicatorVisible)}
1159
+ activeSidePanel={Boolean(activeSidePanel)}
1160
+ sidePanelWidth={sidePanelWidth}
1161
+ >
1162
+ Loading...
1163
+ </LoadingIndicator>
1164
+ ) : null}
1147
1165
  {this.props.primary ? (
1148
1166
  <Attribution
1149
1167
  showBaseMapLibLogo={this.state.showBaseMapAttribution}
@@ -61,6 +61,10 @@ const StyledSaveMapModal = styled.div.attrs({
61
61
  }
62
62
  `;
63
63
 
64
+ const StyledCompactExportSection = styled(StyledExportSection)`
65
+ margin: 5px 0;
66
+ `;
67
+
64
68
  const nop = () => {
65
69
  return;
66
70
  };
@@ -224,7 +228,7 @@ function SaveMapModalFactory() {
224
228
  </div>
225
229
  </StyledExportSection>
226
230
  ) : null}
227
- <StyledExportSection>
231
+ <StyledCompactExportSection>
228
232
  <div className="description image-preview-panel">
229
233
  <ImagePreview
230
234
  exportImage={exportImage}
@@ -246,7 +250,7 @@ function SaveMapModalFactory() {
246
250
  onChangeInput={onChangeInput}
247
251
  />
248
252
  )}
249
- </StyledExportSection>
253
+ </StyledCompactExportSection>
250
254
  </>
251
255
  )}
252
256
  {providerError ? (
@@ -791,6 +791,7 @@ export declare const DATASET_FORMATS: {
791
791
  csv: "csv";
792
792
  keplergl: "keplergl";
793
793
  arrow: "arrow";
794
+ duckdb: "duckdb";
794
795
  };
795
796
  export declare const MAP_CONTROLS: {
796
797
  visibleLayers: "visibleLayers";