@ohif/app 3.9.0-beta.52 → 3.9.0-beta.54

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 (27) hide show
  1. package/dist/{169.bundle.eeb9614e7b06f896c70f.js → 169.bundle.483057ed84ca3e92513a.js} +2 -2
  2. package/dist/{210.bundle.d69d940a6b0a5fd60a02.js → 210.bundle.23df9d395237def99256.js} +2 -2
  3. package/dist/{246.bundle.26883d5e7649848ac00f.js → 246.bundle.07aee1251a6cfac762d0.js} +2 -2
  4. package/dist/{281.bundle.f69da42cda732b1853f7.js → 281.bundle.80f169c084e30c148f09.js} +6 -6
  5. package/dist/{353.bundle.79e29af337df8bfc6ce0.js → 353.bundle.4371e55b06de8f3c7aa7.js} +2 -2
  6. package/dist/{360.bundle.48ee0dcf983460ccfa3f.js → 360.bundle.40c4f2cac5dc24cbd151.js} +5 -5
  7. package/dist/{372.bundle.ab285c12eeb9b509aea0.js → 372.bundle.d9ed2938305b951123a8.js} +2 -2
  8. package/dist/{376.bundle.79453127db5f42215b71.js → 376.bundle.4c934b0adf377e00de69.js} +2 -2
  9. package/dist/{502.bundle.5eaf758f5d2583c89175.js → 502.bundle.38ca85216c5168ce773b.js} +2 -2
  10. package/dist/{217.bundle.0062f653c3f106777a2f.js → 516.bundle.85aeaa0680375e6eedd1.js} +36 -6
  11. package/dist/{552.bundle.6b69034625105790fb87.js → 552.bundle.bf1485400629f36602a9.js} +4 -4
  12. package/dist/{571.bundle.a80609c9815339516d77.js → 571.bundle.2b4e21bc61d7685a5fdb.js} +1 -1
  13. package/dist/{591.bundle.08b3095d2bbea32d236a.js → 591.bundle.3b939d8f32f22c4e9978.js} +2 -2
  14. package/dist/{791.bundle.999d1d43103a61565916.js → 791.bundle.b5c3d922846354a1f244.js} +2 -2
  15. package/dist/{842.bundle.5f140089d52350155046.js → 842.bundle.24d9a57ef3a6f60abcd7.js} +2 -2
  16. package/dist/{888.bundle.0c078cfae635297cfcd5.js → 888.bundle.f624d032cdccc374fa84.js} +2 -2
  17. package/dist/{944.bundle.b28b6bf61814d7335b7a.js → 944.bundle.6b7e1773f5cf2637cf67.js} +2 -2
  18. package/dist/{962.bundle.33f3dcd6115d9f597657.js → 962.bundle.230a6e51c90ae71baa2f.js} +2 -2
  19. package/dist/{978.bundle.2c82f42354d37219849d.js → 978.bundle.60ae5483cf810ecd524a.js} +2 -2
  20. package/dist/{994.bundle.018b0c76da2b447ebcc1.js → 994.bundle.5dc798210cd5c4493e0e.js} +30 -9
  21. package/dist/{app.bundle.d781a60f8a0340af9dec.js → app.bundle.b0d7489a2dc221b7e9b4.js} +639 -40
  22. package/dist/assets/images/database.svg +8 -0
  23. package/dist/index.html +1 -1
  24. package/dist/sw.js +1 -1
  25. package/package.json +18 -18
  26. /package/dist/{153.bundle.8f00f4310208024890d2.js → 153.bundle.4263246744bdb7397061.js} +0 -0
  27. /package/dist/{217.css → 516.css} +0 -0
@@ -126,8 +126,8 @@ var ui_src = __webpack_require__(38604);
126
126
  var ui_next_src = __webpack_require__(51946);
127
127
  // EXTERNAL MODULE: ./state/index.js + 1 modules
128
128
  var state = __webpack_require__(52490);
129
- // EXTERNAL MODULE: ../../core/src/index.ts + 72 modules
130
- var core_src = __webpack_require__(63810);
129
+ // EXTERNAL MODULE: ../../core/src/index.ts + 74 modules
130
+ var core_src = __webpack_require__(84793);
131
131
  // EXTERNAL MODULE: ../node_modules/react-router/dist/index.js
132
132
  var react_router_dist = __webpack_require__(85066);
133
133
  // EXTERNAL MODULE: ./hooks/useSearchParams.ts
@@ -1048,8 +1048,8 @@ function WorkList({
1048
1048
  };
1049
1049
  });
1050
1050
  const hasStudies = numOfStudies > 0;
1051
- const versionNumber = "3.9.0-beta.52";
1052
- const commitHash = "f660f8e970c0226b34a9de10e2c57429dcce6763";
1051
+ const versionNumber = "3.9.0-beta.54";
1052
+ const commitHash = "2048b19484c0b1fae73f993cfaa814f861bbd230";
1053
1053
  const menuOptions = [{
1054
1054
  title: t('Header:About'),
1055
1055
  icon: 'info',
@@ -1933,7 +1933,7 @@ async function loadModule(module) {
1933
1933
  return imported.default;
1934
1934
  }
1935
1935
  if (module === "@ohif/extension-cornerstone") {
1936
- const imported = await Promise.all(/* import() */[__webpack_require__.e(428), __webpack_require__.e(818), __webpack_require__.e(497), __webpack_require__.e(993), __webpack_require__.e(604), __webpack_require__.e(793), __webpack_require__.e(10), __webpack_require__.e(217)]).then(__webpack_require__.bind(__webpack_require__, 21217));
1936
+ const imported = await Promise.all(/* import() */[__webpack_require__.e(428), __webpack_require__.e(818), __webpack_require__.e(497), __webpack_require__.e(993), __webpack_require__.e(604), __webpack_require__.e(793), __webpack_require__.e(10), __webpack_require__.e(516)]).then(__webpack_require__.bind(__webpack_require__, 15516));
1937
1937
  return imported.default;
1938
1938
  }
1939
1939
  if (module === "@ohif/extension-measurement-tracking") {
@@ -2891,7 +2891,7 @@ async function appInit(appConfigOrFunc, defaultExtensions, defaultModes) {
2891
2891
  appConfig
2892
2892
  });
2893
2893
  servicesManager.setExtensionManager(extensionManager);
2894
- servicesManager.registerServices([core_src/* UINotificationService */.ex.REGISTRATION, core_src/* UIModalService */.vq.REGISTRATION, core_src/* UIDialogService */.wA.REGISTRATION, core_src/* UIViewportDialogService */.Zi.REGISTRATION, core_src.MeasurementService.REGISTRATION, core_src/* DisplaySetService */.iY.REGISTRATION, [core_src/* CustomizationService */.wQ.REGISTRATION, appConfig.customizationService], core_src.ToolbarService.REGISTRATION, core_src/* ViewportGridService */.pK.REGISTRATION, core_src/* HangingProtocolService */.hy.REGISTRATION, core_src/* CineService */.d5.REGISTRATION, core_src/* UserAuthenticationService */.qS.REGISTRATION, core_src/* PanelService */.Ku.REGISTRATION, core_src/* WorkflowStepsService */.Og.REGISTRATION, core_src/* StateSyncService */.v.REGISTRATION]);
2894
+ servicesManager.registerServices([core_src/* UINotificationService */.ex.REGISTRATION, core_src/* UIModalService */.vq.REGISTRATION, core_src/* UIDialogService */.wA.REGISTRATION, core_src/* UIViewportDialogService */.Zi.REGISTRATION, core_src.MeasurementService.REGISTRATION, core_src/* DisplaySetService */.iY.REGISTRATION, [core_src/* CustomizationService */.wQ.REGISTRATION, appConfig.customizationService], core_src.ToolbarService.REGISTRATION, core_src/* ViewportGridService */.pK.REGISTRATION, core_src/* HangingProtocolService */.hy.REGISTRATION, core_src/* CineService */.d5.REGISTRATION, core_src/* UserAuthenticationService */.qS.REGISTRATION, core_src/* PanelService */.Ku.REGISTRATION, core_src/* WorkflowStepsService */.Og.REGISTRATION, core_src/* StateSyncService */.v.REGISTRATION, [core_src/* StudyPrefetcherService */.P_.REGISTRATION, appConfig.studyPrefetcher]]);
2895
2895
  core_src/* errorHandler */.Po.getHTTPErrorHandler = () => {
2896
2896
  if (typeof appConfig.httpErrorHandler === 'function') {
2897
2897
  return appConfig.httpErrorHandler;
@@ -5027,7 +5027,7 @@ const detectionOptions = {
5027
5027
  }
5028
5028
  });
5029
5029
  ;// CONCATENATED MODULE: ../../i18n/package.json
5030
- const package_namespaceObject = JSON.parse('{"i8":"3.9.0-beta.51"}');
5030
+ const package_namespaceObject = JSON.parse('{"i8":"3.9.0-beta.53"}');
5031
5031
  ;// CONCATENATED MODULE: ../../i18n/src/utils.js
5032
5032
  const languagesMap = {
5033
5033
  ar: 'Arabic',
@@ -5851,7 +5851,7 @@ i18next/* default */.Z.currentLanguage = () => ({
5851
5851
 
5852
5852
  /***/ }),
5853
5853
 
5854
- /***/ 84340:
5854
+ /***/ 28607:
5855
5855
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
5856
5856
 
5857
5857
  "use strict";
@@ -6094,6 +6094,41 @@ const SvgCloseIcon = ({
6094
6094
  })));
6095
6095
 
6096
6096
  /* harmony default export */ const closeIcon = (__webpack_require__.p + "assets/images/closeIcon.svg");
6097
+ ;// CONCATENATED MODULE: ../../ui/src/assets/icons/database.svg
6098
+ var database_g;
6099
+ function database_extends() { return database_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, database_extends.apply(null, arguments); }
6100
+
6101
+ const SvgDatabase = ({
6102
+ title,
6103
+ titleId,
6104
+ ...props
6105
+ }) => /*#__PURE__*/react.createElement("svg", database_extends({
6106
+ xmlns: "http://www.w3.org/2000/svg",
6107
+ width: 19,
6108
+ height: 19,
6109
+ viewBox: "0 0 19 19",
6110
+ "aria-labelledby": titleId
6111
+ }, props), title ? /*#__PURE__*/react.createElement("title", {
6112
+ id: titleId
6113
+ }, title) : null, database_g || (database_g = /*#__PURE__*/react.createElement("g", {
6114
+ fill: "none",
6115
+ stroke: "currentColor",
6116
+ strokeLinecap: "round",
6117
+ strokeLinejoin: "round",
6118
+ strokeWidth: 2,
6119
+ transform: "matrix(.84874 0 0 .84874 .136 .142)"
6120
+ }, /*#__PURE__*/react.createElement("ellipse", {
6121
+ cx: 11,
6122
+ cy: 4,
6123
+ rx: 9,
6124
+ ry: 3
6125
+ }), /*#__PURE__*/react.createElement("path", {
6126
+ d: "M2 4v14a9 3 0 0 0 18 0V4"
6127
+ }), /*#__PURE__*/react.createElement("path", {
6128
+ d: "M2 11a9 3 0 0 0 18 0"
6129
+ }))));
6130
+
6131
+ /* harmony default export */ const database = (__webpack_require__.p + "assets/images/database.svg");
6097
6132
  ;// CONCATENATED MODULE: ../../ui/src/assets/icons/dotted-circle.svg
6098
6133
  var dotted_circle_path;
6099
6134
  function dotted_circle_extends() { return dotted_circle_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, dotted_circle_extends.apply(null, arguments); }
@@ -11750,6 +11785,7 @@ const SvgToolWindowRegion = ({
11750
11785
 
11751
11786
 
11752
11787
 
11788
+
11753
11789
 
11754
11790
 
11755
11791
  const ICONS = {
@@ -11762,6 +11798,7 @@ const ICONS = {
11762
11798
  cancel: SvgCancel,
11763
11799
  clipboard: SvgClipboard,
11764
11800
  close: SvgCloseIcon,
11801
+ database: SvgDatabase,
11765
11802
  'dotted-circle': SvgDottedCircle,
11766
11803
  'circled-checkmark': SvgCircledCheckmark,
11767
11804
  'chevron-down': SvgChevronDown,
@@ -19646,8 +19683,8 @@ ViewportDialogProvider.propTypes = {
19646
19683
  // EXTERNAL MODULE: ../../../node_modules/lodash.merge/index.js
19647
19684
  var lodash_merge = __webpack_require__(12178);
19648
19685
  var lodash_merge_default = /*#__PURE__*/__webpack_require__.n(lodash_merge);
19649
- // EXTERNAL MODULE: ../../core/src/index.ts + 72 modules
19650
- var src = __webpack_require__(63810);
19686
+ // EXTERNAL MODULE: ../../core/src/index.ts + 74 modules
19687
+ var src = __webpack_require__(84793);
19651
19688
  ;// CONCATENATED MODULE: ../../ui/src/utils/viewportLabels.ts
19652
19689
  const viewportLabels = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
19653
19690
  /* harmony default export */ const utils_viewportLabels = (viewportLabels);
@@ -34219,6 +34256,7 @@ const Thumbnail = ({
34219
34256
  description,
34220
34257
  seriesNumber,
34221
34258
  numInstances,
34259
+ loadingProgress,
34222
34260
  countIcon,
34223
34261
  messages,
34224
34262
  dragData = {},
@@ -34278,7 +34316,12 @@ const Thumbnail = ({
34278
34316
  }, /*#__PURE__*/react.createElement(Icon/* default */.Z, {
34279
34317
  name: countIcon || 'group-layers',
34280
34318
  className: "mr-2 w-3"
34281
- }), ` ${numInstances}`), /*#__PURE__*/react.createElement(components_DisplaySetMessageListTooltip, {
34319
+ }), ` ${numInstances}`), /*#__PURE__*/react.createElement("div", {
34320
+ className: "flex mr-2 last:mr-0"
34321
+ }, loadingProgress && loadingProgress < 1 && /*#__PURE__*/react.createElement(react.Fragment, null, Math.round(loadingProgress * 100), "%"), loadingProgress && loadingProgress === 1 && /*#__PURE__*/react.createElement(Icon/* default */.Z, {
34322
+ name: 'database',
34323
+ className: "w-3"
34324
+ })), /*#__PURE__*/react.createElement(components_DisplaySetMessageListTooltip, {
34282
34325
  messages: messages,
34283
34326
  id: `display-set-tooltip-${displaySetInstanceUID}`
34284
34327
  })), /*#__PURE__*/react.createElement("div", {
@@ -34304,6 +34347,7 @@ Thumbnail.propTypes = {
34304
34347
  description: (prop_types_default()).string.isRequired,
34305
34348
  seriesNumber: StringNumber.isRequired,
34306
34349
  numInstances: (prop_types_default()).number.isRequired,
34350
+ loadingProgress: (prop_types_default()).number,
34307
34351
  messages: (prop_types_default()).object,
34308
34352
  isActive: (prop_types_default()).bool.isRequired,
34309
34353
  onClick: (prop_types_default()).func.isRequired,
@@ -34449,6 +34493,7 @@ function ThumbnailTracked({
34449
34493
  description,
34450
34494
  seriesNumber,
34451
34495
  numInstances,
34496
+ loadingProgress,
34452
34497
  countIcon,
34453
34498
  messages,
34454
34499
  dragData,
@@ -34501,6 +34546,7 @@ function ThumbnailTracked({
34501
34546
  messages: messages,
34502
34547
  numInstances: numInstances,
34503
34548
  countIcon: countIcon,
34549
+ loadingProgress: loadingProgress,
34504
34550
  isActive: isActive,
34505
34551
  onClick: onClick,
34506
34552
  onDoubleClick: onDoubleClick
@@ -34525,6 +34571,7 @@ ThumbnailTracked.propTypes = {
34525
34571
  description: (prop_types_default()).string.isRequired,
34526
34572
  seriesNumber: StringNumber.isRequired,
34527
34573
  numInstances: (prop_types_default()).number.isRequired,
34574
+ loadingProgress: (prop_types_default()).number,
34528
34575
  onClick: (prop_types_default()).func.isRequired,
34529
34576
  onDoubleClick: (prop_types_default()).func.isRequired,
34530
34577
  onClickUntrack: (prop_types_default()).func.isRequired,
@@ -34559,6 +34606,7 @@ const ThumbnailList = ({
34559
34606
  dragData,
34560
34607
  seriesNumber,
34561
34608
  numInstances,
34609
+ loadingProgress,
34562
34610
  modality,
34563
34611
  componentType,
34564
34612
  seriesDate,
@@ -34597,6 +34645,7 @@ const ThumbnailList = ({
34597
34645
  description: description,
34598
34646
  seriesNumber: seriesNumber,
34599
34647
  numInstances: numInstances,
34648
+ loadingProgress: loadingProgress,
34600
34649
  countIcon: countIcon,
34601
34650
  imageSrc: imageSrc,
34602
34651
  imageAltText: imageAltText,
@@ -60368,8 +60417,8 @@ const HeaderItem = ({
60368
60417
  }, children);
60369
60418
  };
60370
60419
  /* harmony default export */ const AllInOneMenu_HeaderItem = (HeaderItem);
60371
- // EXTERNAL MODULE: ../../ui/src/components/Icon/getIcon.js + 202 modules
60372
- var getIcon = __webpack_require__(84340);
60420
+ // EXTERNAL MODULE: ../../ui/src/components/Icon/getIcon.js + 203 modules
60421
+ var getIcon = __webpack_require__(28607);
60373
60422
  ;// CONCATENATED MODULE: ../../ui/src/components/AllInOneMenu/IconMenu.tsx
60374
60423
 
60375
60424
 
@@ -61440,7 +61489,7 @@ function _getImageOrientationPatient(image) {
61440
61489
 
61441
61490
  /***/ }),
61442
61491
 
61443
- /***/ 63810:
61492
+ /***/ 84793:
61444
61493
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
61445
61494
 
61446
61495
  "use strict";
@@ -61467,6 +61516,7 @@ __webpack_require__.d(__webpack_exports__, {
61467
61516
  H: () => (/* reexport */ ServiceProvidersManager),
61468
61517
  Xw: () => (/* reexport */ ServicesManager),
61469
61518
  v: () => (/* reexport */ services_StateSyncService),
61519
+ P_: () => (/* reexport */ StudyPrefetcherService),
61470
61520
  ToolbarService: () => (/* reexport */ ToolBarService),
61471
61521
  wA: () => (/* reexport */ services_UIDialogService),
61472
61522
  vq: () => (/* reexport */ services_UIModalService),
@@ -63808,8 +63858,8 @@ class ViewportGridService extends pubSubServiceInterface/* PubSubService */.h {
63808
63858
  // Just update a single viewport, but use the multi-viewport update for it.
63809
63859
  this.setDisplaySetsForViewports([props]);
63810
63860
  }
63811
- setDisplaySetsForViewports(props) {
63812
- this.serviceImplementation._setDisplaySetsForViewports(props);
63861
+ async setDisplaySetsForViewports(props) {
63862
+ await this.serviceImplementation._setDisplaySetsForViewports(props);
63813
63863
  const state = this.getState();
63814
63864
  const viewports = [];
63815
63865
  for (const viewport of props) {
@@ -67274,6 +67324,548 @@ WorkflowStepsService.REGISTRATION = {
67274
67324
  ;// CONCATENATED MODULE: ../../core/src/services/WorkflowStepsService/index.ts
67275
67325
 
67276
67326
  /* harmony default export */ const services_WorkflowStepsService = (WorkflowStepsService);
67327
+ ;// CONCATENATED MODULE: ../../core/src/services/StudyPrefetcherService/StudyPrefetcherService.ts
67328
+ var _StudyPrefetcherService;
67329
+
67330
+
67331
+ const IMAGE_REQUEST_TYPE = 'prefetch';
67332
+ const StudyPrefetcherService_EVENTS = {
67333
+ SERVICE_STARTED: 'event::studyPrefetcherService:started',
67334
+ SERVICE_STOPPED: 'event::studyPrefetcherService:stopped',
67335
+ DISPLAYSET_LOAD_PROGRESS: 'event::studyPrefetcherService:displaySetLoadProgress',
67336
+ DISPLAYSET_LOAD_COMPLETE: 'event::studyPrefetcherService:displaySetLoadComplete'
67337
+ };
67338
+
67339
+ /**
67340
+ * Order used for prefetching display set
67341
+ */
67342
+ var StudyPrefetchOrder = /*#__PURE__*/function (StudyPrefetchOrder) {
67343
+ StudyPrefetchOrder["closest"] = "closest";
67344
+ StudyPrefetchOrder["downward"] = "downward";
67345
+ StudyPrefetchOrder["upward"] = "upward";
67346
+ return StudyPrefetchOrder;
67347
+ }(StudyPrefetchOrder || {});
67348
+ /**
67349
+ * Study Prefetcher configuration
67350
+ */
67351
+ class StudyPrefetcherService extends pubSubServiceInterface/* PubSubService */.h {
67352
+ constructor({
67353
+ servicesManager,
67354
+ extensionManager,
67355
+ configuration
67356
+ }) {
67357
+ super(StudyPrefetcherService_EVENTS);
67358
+ this._extensionManager = void 0;
67359
+ this._servicesManager = void 0;
67360
+ this._subscriptions = void 0;
67361
+ this._activeDisplaySetsInstanceUIDs = [];
67362
+ this._pendingRequests = [];
67363
+ this._inflightRequests = new Map();
67364
+ this._isRunning = false;
67365
+ this._displaySetLoadingStates = new Map();
67366
+ this._imageIdsToDisplaySetsMap = new Map();
67367
+ this.config = {
67368
+ /* Enable/disable study prefetching service */
67369
+ enabled: false,
67370
+ /* Number of displaysets to be prefetched */
67371
+ displaySetsCount: 1,
67372
+ /**
67373
+ * Max number of concurrent prefetch requests
67374
+ * High numbers may impact on the time to load a new dropped series because
67375
+ * the browser will be busy with all prefetching requests. As soon as the
67376
+ * prefetch requests get fulfilled the new ones from the new dropped series
67377
+ * are sent to the server.
67378
+ *
67379
+ * TODO: abort all prefetch requests when a new series is loaded on a viewport.
67380
+ * (need to add support for `AbortController` on Cornerstone)
67381
+ * */
67382
+ maxNumPrefetchRequests: 10,
67383
+ /* Display sets prefetching order (closest, downward and upward) */
67384
+ order: StudyPrefetchOrder.downward
67385
+ };
67386
+ // Properties set by Cornerstone extension (initStudyPrefetcherService)
67387
+ this.requestType = IMAGE_REQUEST_TYPE;
67388
+ this.cache = void 0;
67389
+ this.imageLoadPoolManager = void 0;
67390
+ this.imageLoader = void 0;
67391
+ this.imageLoadEventsManager = void 0;
67392
+ this._servicesManager = servicesManager;
67393
+ this._extensionManager = extensionManager;
67394
+ this._subscriptions = [];
67395
+ Object.assign(this.config, configuration);
67396
+ }
67397
+ onModeEnter() {
67398
+ this._addEventListeners();
67399
+ }
67400
+
67401
+ /**
67402
+ * The onModeExit returns the service to the initial state.
67403
+ */
67404
+ onModeExit() {
67405
+ this._removeEventListeners();
67406
+ this._stopPrefetching();
67407
+ }
67408
+ _addImageLoadingEventsListeners() {
67409
+ const fnOnImageLoadCompleted = imageId => {
67410
+ // `sendNextRequests` must be called after image loaded/failed events
67411
+ // to make sure prefetch requests shall be sent as soon as the active
67412
+ // displaySets (active viewport) are loaded.
67413
+ //
67414
+ // PS: active display sets are not loaded by this service and that is why
67415
+ // the requests shall not be in the inflight queue.
67416
+ if (!this._inflightRequests.get(imageId)) {
67417
+ this._sendNextRequests();
67418
+ }
67419
+ };
67420
+ const fnImageLoadedEventListener = evt => {
67421
+ const {
67422
+ image
67423
+ } = evt.detail;
67424
+ const {
67425
+ imageId
67426
+ } = image;
67427
+ this._moveImageIdToLoadedSet(imageId);
67428
+ fnOnImageLoadCompleted(imageId);
67429
+ };
67430
+ const fnImageLoadFailedEventListener = evt => {
67431
+ const {
67432
+ imageId
67433
+ } = evt.detail;
67434
+ this._moveImageIdToFailedSet(imageId);
67435
+ fnOnImageLoadCompleted(imageId);
67436
+ };
67437
+ return this.imageLoadEventsManager.addEventListeners(fnImageLoadedEventListener, fnImageLoadFailedEventListener);
67438
+ }
67439
+ _addServicesListeners() {
67440
+ const {
67441
+ displaySetService,
67442
+ viewportGridService
67443
+ } = this._servicesManager.services;
67444
+
67445
+ // Restart the prefetcher after any change to the displaySets
67446
+ // (eg: sorting the displaySets on StudyBrowser)
67447
+ const displaySetsChangedSubscription = displaySetService.subscribe(displaySetService.EVENTS.DISPLAY_SETS_CHANGED, () => this._syncWithActiveViewport({
67448
+ forceRestart: true
67449
+ }));
67450
+
67451
+ // Loads new datasets when making a new viewport active
67452
+ const viewportGridActiveViewportIdSubscription = viewportGridService.subscribe(services_ViewportGridService.EVENTS.ACTIVE_VIEWPORT_ID_CHANGED, ({
67453
+ viewportId
67454
+ }) => this._syncWithActiveViewport({
67455
+ activeViewportId: viewportId
67456
+ }));
67457
+
67458
+ // Continue loading datasets after changing the layout (eg: from 1x1 to 2x1)
67459
+ const viewportGridLayoutChangedSubscription = viewportGridService.subscribe(services_ViewportGridService.EVENTS.LAYOUT_CHANGED, () => this._syncWithActiveViewport());
67460
+
67461
+ // Loads new datasets after loading a new display set on a viewport
67462
+ const viewportGridStateChangedSubscription = viewportGridService.subscribe(services_ViewportGridService.EVENTS.GRID_STATE_CHANGED, () => this._syncWithActiveViewport());
67463
+
67464
+ // Loads the first datasets right after opening the viewer
67465
+ const viewportGridViewportreadySubscription = viewportGridService.subscribe(services_ViewportGridService.EVENTS.VIEWPORTS_READY, () => {
67466
+ this._syncWithActiveViewport();
67467
+ this._startPrefetching();
67468
+ });
67469
+ return [displaySetsChangedSubscription, viewportGridActiveViewportIdSubscription, viewportGridLayoutChangedSubscription, viewportGridStateChangedSubscription, viewportGridViewportreadySubscription];
67470
+ }
67471
+ _addEventListeners() {
67472
+ const imageLoadingEventsSubscriptions = this._addImageLoadingEventsListeners();
67473
+ const servicesSubscriptions = this._addServicesListeners();
67474
+ this._subscriptions.push(...imageLoadingEventsSubscriptions);
67475
+ this._subscriptions.push(...servicesSubscriptions);
67476
+ }
67477
+ _removeEventListeners() {
67478
+ this._subscriptions.forEach(subscription => subscription.unsubscribe());
67479
+ this._subscriptions = [];
67480
+ }
67481
+ _syncWithActiveViewport({
67482
+ activeViewportId,
67483
+ forceRestart
67484
+ } = {}) {
67485
+ const {
67486
+ viewportGridService
67487
+ } = this._servicesManager.services;
67488
+ const viewportGridServiceState = viewportGridService.getState();
67489
+ const {
67490
+ viewports
67491
+ } = viewportGridServiceState;
67492
+ activeViewportId = activeViewportId ?? viewportGridServiceState.activeViewportId;
67493
+
67494
+ // If may be null when the viewer is loaded
67495
+ if (!activeViewportId) {
67496
+ return;
67497
+ }
67498
+ const activeViewport = viewports.get(activeViewportId);
67499
+ const displaySetUpdated = this._setActiveDisplaySetsUIDs(activeViewport.displaySetInstanceUIDs);
67500
+ if (forceRestart || displaySetUpdated) {
67501
+ this._restartPrefetching();
67502
+ }
67503
+ }
67504
+ _setActiveDisplaySetsUIDs(newActiveDisplaySetInstanceUIDs) {
67505
+ const sameDisplaySets = newActiveDisplaySetInstanceUIDs.length === this._activeDisplaySetsInstanceUIDs.length && newActiveDisplaySetInstanceUIDs.every(uid => this._activeDisplaySetsInstanceUIDs.includes(uid));
67506
+ if (sameDisplaySets) {
67507
+ return false;
67508
+ }
67509
+ this._activeDisplaySetsInstanceUIDs = [...newActiveDisplaySetInstanceUIDs];
67510
+ this._restartPrefetching();
67511
+ return true;
67512
+ }
67513
+ _areActiveDisplaySetsLoaded() {
67514
+ const {
67515
+ _activeDisplaySetsInstanceUIDs: displaySetsInstanceUIDs
67516
+ } = this;
67517
+ return displaySetsInstanceUIDs.length && displaySetsInstanceUIDs.every(displaySetsInstanceUID => this._displaySetLoadingStates.get(displaySetsInstanceUID).loadingProgress >= 1);
67518
+ }
67519
+ _getClosestDisplaySets(displaySets, activeDisplaySetIndex) {
67520
+ const sortedDisplaySets = [];
67521
+ let previousIndex = activeDisplaySetIndex - 1;
67522
+ let nextIndex = activeDisplaySetIndex + 1;
67523
+ while (previousIndex >= 0 || nextIndex < displaySets.length) {
67524
+ if (previousIndex >= 0) {
67525
+ sortedDisplaySets.push(displaySets[previousIndex]);
67526
+ previousIndex--;
67527
+ }
67528
+ if (nextIndex < displaySets.length) {
67529
+ sortedDisplaySets.push(displaySets[nextIndex]);
67530
+ nextIndex++;
67531
+ }
67532
+ }
67533
+ return sortedDisplaySets;
67534
+ }
67535
+ _getDownwardDisplaySets(displaySets, activeDisplaySetIndex) {
67536
+ const sortedDisplaySets = [];
67537
+ for (let i = activeDisplaySetIndex + 1; i < displaySets.length; i++) {
67538
+ sortedDisplaySets.push(displaySets[i]);
67539
+ }
67540
+ return sortedDisplaySets;
67541
+ }
67542
+ _getUpwardDisplaySets(displaySets, activeDisplaySetIndex) {
67543
+ const sortedDisplaySets = [];
67544
+ for (let i = activeDisplaySetIndex - 1; i >= 0 && i !== activeDisplaySetIndex; i--) {
67545
+ sortedDisplaySets.push(displaySets[i]);
67546
+ }
67547
+ return sortedDisplaySets;
67548
+ }
67549
+ _getSortedDisplaySetsToPrefetch(displaySets) {
67550
+ if (!this._activeDisplaySetsInstanceUIDs?.length) {
67551
+ return [];
67552
+ }
67553
+ const {
67554
+ displaySetsCount
67555
+ } = this.config;
67556
+ const activeDisplaySetsInstanceUIDs = this._activeDisplaySetsInstanceUIDs;
67557
+ const [activeDisplaySetUID] = activeDisplaySetsInstanceUIDs;
67558
+ const activeDisplaySetIndex = displaySets.findIndex(ds => ds.displaySetInstanceUID === activeDisplaySetUID);
67559
+ const getDisplaySetsFunctionsMap = {
67560
+ [StudyPrefetchOrder.closest]: this._getClosestDisplaySets,
67561
+ [StudyPrefetchOrder.downward]: this._getDownwardDisplaySets,
67562
+ [StudyPrefetchOrder.upward]: this._getUpwardDisplaySets
67563
+ };
67564
+ const {
67565
+ order
67566
+ } = this.config;
67567
+ const fnGetDisplaySets = getDisplaySetsFunctionsMap[order];
67568
+ if (!fnGetDisplaySets) {
67569
+ throw new Error(`Invalid order (${order})`);
67570
+ }
67571
+
67572
+ // Creates a `Set` to look for UIDs in O(1) instead of O(n)
67573
+ const uidsSet = new Set(activeDisplaySetsInstanceUIDs);
67574
+
67575
+ // Remove any active displaySet that may still be in the activeDisplaySetsInstanceUIDs.
67576
+ // That may happen when activeDisplaySetsInstanceUIDs has more than one element.
67577
+ return fnGetDisplaySets.call(this, displaySets, activeDisplaySetIndex).filter(ds => !uidsSet.has(ds.displaySetInstanceUID)).slice(0, displaySetsCount);
67578
+ }
67579
+ _getDisplaySets() {
67580
+ const {
67581
+ displaySetService
67582
+ } = this._servicesManager.services;
67583
+ const displaySets = [...displaySetService.getActiveDisplaySets()];
67584
+ let displaySetsToPrefetch = this._getSortedDisplaySetsToPrefetch(displaySets);
67585
+ return {
67586
+ displaySets,
67587
+ displaySetsToPrefetch
67588
+ };
67589
+ }
67590
+ _updateImageIdsDisplaySetMap(displaySetInstanceUID, imageIds) {
67591
+ for (const imageId of imageIds) {
67592
+ let displaySetsInstanceUIDsMap = this._imageIdsToDisplaySetsMap.get(imageId);
67593
+ if (!displaySetsInstanceUIDsMap) {
67594
+ displaySetsInstanceUIDsMap = new Set();
67595
+ this._imageIdsToDisplaySetsMap.set(imageId, displaySetsInstanceUIDsMap);
67596
+ }
67597
+ displaySetsInstanceUIDsMap.add(displaySetInstanceUID);
67598
+ }
67599
+ }
67600
+ _getImageIdsForDisplaySet(displaySet) {
67601
+ const dataSource = this._extensionManager.getActiveDataSource()[0];
67602
+ return dataSource.getImageIdsForDisplaySet(displaySet);
67603
+ }
67604
+ _updateDisplaySetLoadingProgress(displaySetLoadingState) {
67605
+ const {
67606
+ numInstances,
67607
+ loadedImageIds,
67608
+ failedImageIds
67609
+ } = displaySetLoadingState;
67610
+ const loadingProgress = (loadedImageIds.size + failedImageIds.size) / numInstances;
67611
+ displaySetLoadingState.loadingProgress = loadingProgress;
67612
+ }
67613
+ _addDisplaySetLoadingState(displaySet) {
67614
+ const {
67615
+ displaySetInstanceUID
67616
+ } = displaySet;
67617
+ const imageIds = this._getImageIdsForDisplaySet(displaySet);
67618
+ let displaySetLoadingState = this._displaySetLoadingStates.get(displaySetInstanceUID);
67619
+ if (displaySetLoadingState) {
67620
+ return;
67621
+ }
67622
+ const pendingImageIds = new Set(imageIds);
67623
+ const loadedImageIds = new Set();
67624
+
67625
+ // Needs to check which image is already loaded to update the progress properly
67626
+ // because some images may already be loaded (thumbnails and viewports).
67627
+ for (const imageId of imageIds) {
67628
+ if (this.cache.isImageCached(imageId)) {
67629
+ loadedImageIds.add(imageId);
67630
+ } else {
67631
+ pendingImageIds.add(imageId);
67632
+ }
67633
+ }
67634
+ displaySetLoadingState = {
67635
+ displaySetInstanceUID,
67636
+ numInstances: imageIds.length,
67637
+ pendingImageIds,
67638
+ loadedImageIds,
67639
+ failedImageIds: new Set(),
67640
+ loadingProgress: 0
67641
+ };
67642
+ this._updateDisplaySetLoadingProgress(displaySetLoadingState);
67643
+ this._displaySetLoadingStates.set(displaySetInstanceUID, displaySetLoadingState);
67644
+ this._updateImageIdsDisplaySetMap(displaySetInstanceUID, imageIds);
67645
+
67646
+ // Notify the UI that something is already loaded (eg: update StudyBrowser)
67647
+ if (loadedImageIds.size) {
67648
+ this._triggerDisplaySetEvents(displaySetInstanceUID);
67649
+ }
67650
+ }
67651
+ _loadDisplaySets() {
67652
+ const {
67653
+ displaySets,
67654
+ displaySetsToPrefetch
67655
+ } = this._getDisplaySets();
67656
+ displaySets.forEach(displaySet => this._addDisplaySetLoadingState(displaySet));
67657
+ displaySetsToPrefetch.forEach(displaySet => this._enqueueDisplaySetImagesRequests(displaySet));
67658
+ }
67659
+ _moveImageIdToLoadedSet(imageId) {
67660
+ const displaySetsInstanceUIDs = this._imageIdsToDisplaySetsMap.get(imageId);
67661
+ if (!displaySetsInstanceUIDs) {
67662
+ return;
67663
+ }
67664
+ for (const displaySetInstanceUID of Array.from(displaySetsInstanceUIDs.values())) {
67665
+ const displaySetLoadingState = this._displaySetLoadingStates.get(displaySetInstanceUID);
67666
+ const {
67667
+ pendingImageIds,
67668
+ loadedImageIds
67669
+ } = displaySetLoadingState;
67670
+ pendingImageIds.delete(imageId);
67671
+ loadedImageIds.add(imageId);
67672
+ this._updateDisplaySetLoadingProgress(displaySetLoadingState);
67673
+ this._triggerDisplaySetEvents(displaySetInstanceUID);
67674
+ }
67675
+ return true;
67676
+ }
67677
+ _moveImageIdToFailedSet(imageId) {
67678
+ const displaySetsInstanceUIDs = this._imageIdsToDisplaySetsMap.get(imageId);
67679
+ if (!displaySetsInstanceUIDs) {
67680
+ return;
67681
+ }
67682
+ for (const displaySetInstanceUID of Array.from(displaySetsInstanceUIDs.values())) {
67683
+ const displaySetLoadingState = this._displaySetLoadingStates.get(displaySetInstanceUID);
67684
+ const {
67685
+ pendingImageIds,
67686
+ failedImageIds
67687
+ } = displaySetLoadingState;
67688
+ pendingImageIds.delete(imageId);
67689
+ failedImageIds.add(imageId);
67690
+ this._updateDisplaySetLoadingProgress(displaySetLoadingState);
67691
+ this._triggerDisplaySetEvents(displaySetInstanceUID);
67692
+ }
67693
+ return true;
67694
+ }
67695
+ _triggerDisplaySetEvents(displaySetInstanceUID) {
67696
+ const displaySetLoadingState = this._displaySetLoadingStates.get(displaySetInstanceUID);
67697
+ const {
67698
+ loadingProgress,
67699
+ numInstances
67700
+ } = displaySetLoadingState;
67701
+ this._broadcastEvent(this.EVENTS.DISPLAYSET_LOAD_PROGRESS, {
67702
+ displaySetInstanceUID,
67703
+ numInstances,
67704
+ loadingProgress
67705
+ });
67706
+ if (loadingProgress >= 1) {
67707
+ this._broadcastEvent(this.EVENTS.DISPLAYSET_LOAD_COMPLETE, {
67708
+ displaySetInstanceUID
67709
+ });
67710
+ }
67711
+ }
67712
+ _onImagePrefetchSuccess(imageRequest) {
67713
+ if (imageRequest.aborted) {
67714
+ return;
67715
+ }
67716
+ const {
67717
+ imageId
67718
+ } = imageRequest;
67719
+ this._inflightRequests.delete(imageId);
67720
+ this._moveImageIdToLoadedSet(imageId);
67721
+
67722
+ // `sendNextRequests` must be called after removing the request from the inflight
67723
+ // queue otherwise it shall not be able to send the request (maxNumPrefetchRequests)
67724
+ this._sendNextRequests();
67725
+ }
67726
+ _onImagePrefetchFailed(imageRequest, error) {
67727
+ if (imageRequest.aborted) {
67728
+ return;
67729
+ }
67730
+ console.warn(`An error ocurred when trying to load "${imageRequest.imageId}"`, error);
67731
+ const {
67732
+ imageId
67733
+ } = imageRequest;
67734
+ this._inflightRequests.delete(imageId);
67735
+ this._moveImageIdToFailedSet(imageId);
67736
+
67737
+ // `sendNextRequests` must be called after removing the request from the inflight
67738
+ // queue otherwise it shall not be able to send the request (maxNumPrefetchRequests)
67739
+ this._sendNextRequests();
67740
+ }
67741
+ async _sendNextRequests() {
67742
+ // If the service has stopped with async requests in progress this method may
67743
+ // get called again when each of those requests are fulfilled.
67744
+ if (!this._isRunning) {
67745
+ return;
67746
+ }
67747
+
67748
+ // Does not send any prefetch request until the active display sets are loaded
67749
+ if (!this._areActiveDisplaySetsLoaded()) {
67750
+ return;
67751
+ }
67752
+ const {
67753
+ _pendingRequests: pendingRequests,
67754
+ _inflightRequests: inflightRequests
67755
+ } = this;
67756
+ const {
67757
+ maxNumPrefetchRequests
67758
+ } = this.config;
67759
+ if (!pendingRequests.length || inflightRequests.size >= maxNumPrefetchRequests) {
67760
+ return;
67761
+ }
67762
+ const numImageRequests = Math.min(pendingRequests.length, maxNumPrefetchRequests - inflightRequests.size);
67763
+ const imageRequests = this._pendingRequests.splice(0, numImageRequests);
67764
+ imageRequests.forEach(imageRequest => {
67765
+ const {
67766
+ imageId
67767
+ } = imageRequest;
67768
+ const options = {
67769
+ priority: -5,
67770
+ requestType: this.requestType,
67771
+ additionalDetails: {
67772
+ imageId
67773
+ },
67774
+ preScale: {
67775
+ enabled: true
67776
+ }
67777
+ };
67778
+ this.imageLoadPoolManager.addRequest(async () => this.imageLoader.loadAndCacheImage(imageId, options).then(_image => this._onImagePrefetchSuccess(imageRequest), error => this._onImagePrefetchFailed(imageRequest, error)), this.requestType, {
67779
+ imageId
67780
+ });
67781
+ inflightRequests.set(imageId, imageRequest);
67782
+ });
67783
+ }
67784
+ _enqueueDisplaySetImagesRequests(displaySet) {
67785
+ const {
67786
+ displaySetInstanceUID
67787
+ } = displaySet;
67788
+ const imageIds = this._getImageIdsForDisplaySet(displaySet);
67789
+ imageIds.forEach(imageId => {
67790
+ if (this.cache.isImageCached(imageId)) {
67791
+ this._moveImageIdToLoadedSet(imageId);
67792
+ return;
67793
+ }
67794
+ this._pendingRequests.push({
67795
+ displaySetInstanceUID,
67796
+ imageId,
67797
+ aborted: false
67798
+ });
67799
+ });
67800
+ }
67801
+
67802
+ /**
67803
+ * Start prefetching the display sets based on the active viewport and app configuration.
67804
+ */
67805
+ _startPrefetching() {
67806
+ if (this._isRunning) {
67807
+ return;
67808
+ }
67809
+ if (!this.config.enabled) {
67810
+ console.log('StudyPrefetcher is not enabled');
67811
+ return;
67812
+ }
67813
+ this._isRunning = true;
67814
+ this._loadDisplaySets();
67815
+ this._sendNextRequests();
67816
+ this._broadcastEvent(this.EVENTS.SERVICE_STARTED, {});
67817
+ }
67818
+
67819
+ /**
67820
+ * Stop prefetching the display sets.
67821
+ * All internal variables are cleared but activeDisplaySetsInstanceUIDs otherwise restart would not work.
67822
+ */
67823
+ _stopPrefetching() {
67824
+ if (!this._isRunning) {
67825
+ return;
67826
+ }
67827
+ this._isRunning = false;
67828
+
67829
+ // Mark all inflight requests as aborted before clearing the map.
67830
+ this._inflightRequests.forEach(inflightRequest => inflightRequest.aborted = true);
67831
+ this._pendingRequests = [];
67832
+ this._displaySetLoadingStates.clear();
67833
+ this._imageIdsToDisplaySetsMap.clear();
67834
+ this._inflightRequests.clear();
67835
+ this.imageLoadPoolManager.clearRequestStack(IMAGE_REQUEST_TYPE);
67836
+ this._broadcastEvent(this.EVENTS.SERVICE_STOPPED, {});
67837
+ }
67838
+
67839
+ /**
67840
+ * Restart prefetching in case it is already running.
67841
+ */
67842
+ _restartPrefetching() {
67843
+ if (this._isRunning) {
67844
+ this._stopPrefetching();
67845
+ this._startPrefetching();
67846
+ }
67847
+ }
67848
+ }
67849
+ _StudyPrefetcherService = StudyPrefetcherService;
67850
+ StudyPrefetcherService.REGISTRATION = {
67851
+ name: 'studyPrefetcherService',
67852
+ altName: 'StudyPrefetcherService',
67853
+ create: ({
67854
+ configuration,
67855
+ servicesManager,
67856
+ extensionManager
67857
+ }) => {
67858
+ return new _StudyPrefetcherService({
67859
+ servicesManager,
67860
+ extensionManager,
67861
+ configuration
67862
+ });
67863
+ }
67864
+ };
67865
+
67866
+ ;// CONCATENATED MODULE: ../../core/src/services/StudyPrefetcherService/index.ts
67867
+
67868
+
67277
67869
  ;// CONCATENATED MODULE: ../../core/src/services/index.ts
67278
67870
 
67279
67871
 
@@ -67294,6 +67886,7 @@ WorkflowStepsService.REGISTRATION = {
67294
67886
 
67295
67887
 
67296
67888
 
67889
+
67297
67890
 
67298
67891
  ;// CONCATENATED MODULE: ../../core/src/extensions/ExtensionManager.ts
67299
67892
 
@@ -67626,6 +68219,11 @@ class ExtensionManager extends pubSubServiceInterface/* PubSubService */.h {
67626
68219
  getRegisteredExtensionIds() {
67627
68220
  return [...this.registeredExtensionIds];
67628
68221
  }
68222
+ getUniqueServicesList(servicesManager) {
68223
+ // Make sure only one service instance is returned because almost all services are
68224
+ // registered with different keys (eg: StudyPrefetcherService and studyPrefetcherService)
68225
+ return Array.from(new Set(Object.values(servicesManager.services)));
68226
+ }
67629
68227
 
67630
68228
  /**
67631
68229
  * Calls all the services and extension on mode enters.
@@ -67641,11 +68239,12 @@ class ExtensionManager extends pubSubServiceInterface/* PubSubService */.h {
67641
68239
  _hotkeysManager,
67642
68240
  _extensionLifeCycleHooks
67643
68241
  } = this;
68242
+ const services = this.getUniqueServicesList(_servicesManager);
67644
68243
 
67645
68244
  // The onModeEnter of the service must occur BEFORE the extension
67646
68245
  // onModeEnter in order to reset the state to a standard state
67647
68246
  // before the extension restores and cached data.
67648
- for (const service of Object.values(_servicesManager.services)) {
68247
+ for (const service of services) {
67649
68248
  service?.onModeEnter?.();
67650
68249
  }
67651
68250
  registeredExtensionIds.forEach(extensionId => {
@@ -67666,6 +68265,7 @@ class ExtensionManager extends pubSubServiceInterface/* PubSubService */.h {
67666
68265
  _commandsManager,
67667
68266
  _extensionLifeCycleHooks
67668
68267
  } = this;
68268
+ const services = this.getUniqueServicesList(_servicesManager);
67669
68269
  registeredExtensionIds.forEach(extensionId => {
67670
68270
  const onModeExit = _extensionLifeCycleHooks.onModeExit[extensionId];
67671
68271
  if (typeof onModeExit === 'function') {
@@ -67678,7 +68278,7 @@ class ExtensionManager extends pubSubServiceInterface/* PubSubService */.h {
67678
68278
 
67679
68279
  // The service onModeExit calls must occur after the extension ones
67680
68280
  // so that extension ones can store/restore data.
67681
- for (const service of Object.values(_servicesManager.services)) {
68281
+ for (const service of services) {
67682
68282
  try {
67683
68283
  service?.onModeExit?.();
67684
68284
  } catch (e) {
@@ -69857,7 +70457,8 @@ const OHIF = {
69857
70457
  PubSubService: pubSubServiceInterface/* PubSubService */.h,
69858
70458
  PanelService: services_PanelService,
69859
70459
  useToolbar: useToolbar,
69860
- WorkflowStepsService: services_WorkflowStepsService
70460
+ WorkflowStepsService: services_WorkflowStepsService,
70461
+ StudyPrefetcherService: StudyPrefetcherService
69861
70462
  };
69862
70463
 
69863
70464
 
@@ -187534,7 +188135,7 @@ ContextMenu.propTypes = {
187534
188135
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(43001);
187535
188136
  /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3827);
187536
188137
  /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
187537
- /* harmony import */ var _getIcon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(84340);
188138
+ /* harmony import */ var _getIcon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(28607);
187538
188139
 
187539
188140
 
187540
188141
 
@@ -374956,7 +375557,8 @@ module.exports = function regexTester(regex) {
374956
375557
  /***/ ((__unused_webpack_module, exports) => {
374957
375558
 
374958
375559
  "use strict";
374959
- /** @license React v0.19.1
375560
+ /**
375561
+ * @license React
374960
375562
  * scheduler.production.min.js
374961
375563
  *
374962
375564
  * Copyright (c) Facebook, Inc. and its affiliates.
@@ -374964,19 +375566,16 @@ module.exports = function regexTester(regex) {
374964
375566
  * This source code is licensed under the MIT license found in the
374965
375567
  * LICENSE file in the root directory of this source tree.
374966
375568
  */
374967
-
374968
- var f,g,h,k,l;
374969
- if("undefined"===typeof window||"function"!==typeof MessageChannel){var p=null,q=null,t=function(){if(null!==p)try{var a=exports.unstable_now();p(!0,a);p=null}catch(b){throw setTimeout(t,0),b;}},u=Date.now();exports.unstable_now=function(){return Date.now()-u};f=function(a){null!==p?setTimeout(f,0,a):(p=a,setTimeout(t,0))};g=function(a,b){q=setTimeout(a,b)};h=function(){clearTimeout(q)};k=function(){return!1};l=exports.unstable_forceFrameRate=function(){}}else{var w=window.performance,x=window.Date,
374970
- y=window.setTimeout,z=window.clearTimeout;if("undefined"!==typeof console){var A=window.cancelAnimationFrame;"function"!==typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills");"function"!==typeof A&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills")}if("object"===
374971
- typeof w&&"function"===typeof w.now)exports.unstable_now=function(){return w.now()};else{var B=x.now();exports.unstable_now=function(){return x.now()-B}}var C=!1,D=null,E=-1,F=5,G=0;k=function(){return exports.unstable_now()>=G};l=function(){};exports.unstable_forceFrameRate=function(a){0>a||125<a?console.error("forceFrameRate takes a positive int between 0 and 125, forcing framerates higher than 125 fps is not unsupported"):F=0<a?Math.floor(1E3/a):5};var H=new MessageChannel,I=H.port2;H.port1.onmessage=
374972
- function(){if(null!==D){var a=exports.unstable_now();G=a+F;try{D(!0,a)?I.postMessage(null):(C=!1,D=null)}catch(b){throw I.postMessage(null),b;}}else C=!1};f=function(a){D=a;C||(C=!0,I.postMessage(null))};g=function(a,b){E=y(function(){a(exports.unstable_now())},b)};h=function(){z(E);E=-1}}function J(a,b){var c=a.length;a.push(b);a:for(;;){var d=c-1>>>1,e=a[d];if(void 0!==e&&0<K(e,b))a[d]=b,a[c]=e,c=d;else break a}}function L(a){a=a[0];return void 0===a?null:a}
374973
- function M(a){var b=a[0];if(void 0!==b){var c=a.pop();if(c!==b){a[0]=c;a:for(var d=0,e=a.length;d<e;){var m=2*(d+1)-1,n=a[m],v=m+1,r=a[v];if(void 0!==n&&0>K(n,c))void 0!==r&&0>K(r,n)?(a[d]=r,a[v]=c,d=v):(a[d]=n,a[m]=c,d=m);else if(void 0!==r&&0>K(r,c))a[d]=r,a[v]=c,d=v;else break a}}return b}return null}function K(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}var N=[],O=[],P=1,Q=null,R=3,S=!1,T=!1,U=!1;
374974
- function V(a){for(var b=L(O);null!==b;){if(null===b.callback)M(O);else if(b.startTime<=a)M(O),b.sortIndex=b.expirationTime,J(N,b);else break;b=L(O)}}function W(a){U=!1;V(a);if(!T)if(null!==L(N))T=!0,f(X);else{var b=L(O);null!==b&&g(W,b.startTime-a)}}
374975
- function X(a,b){T=!1;U&&(U=!1,h());S=!0;var c=R;try{V(b);for(Q=L(N);null!==Q&&(!(Q.expirationTime>b)||a&&!k());){var d=Q.callback;if(null!==d){Q.callback=null;R=Q.priorityLevel;var e=d(Q.expirationTime<=b);b=exports.unstable_now();"function"===typeof e?Q.callback=e:Q===L(N)&&M(N);V(b)}else M(N);Q=L(N)}if(null!==Q)var m=!0;else{var n=L(O);null!==n&&g(W,n.startTime-b);m=!1}return m}finally{Q=null,R=c,S=!1}}
374976
- function Y(a){switch(a){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1E4;default:return 5E3}}var Z=l;exports.unstable_IdlePriority=5;exports.unstable_ImmediatePriority=1;exports.unstable_LowPriority=4;exports.unstable_NormalPriority=3;exports.unstable_Profiling=null;exports.unstable_UserBlockingPriority=2;exports.unstable_cancelCallback=function(a){a.callback=null};exports.unstable_continueExecution=function(){T||S||(T=!0,f(X))};
374977
- exports.unstable_getCurrentPriorityLevel=function(){return R};exports.unstable_getFirstCallbackNode=function(){return L(N)};exports.unstable_next=function(a){switch(R){case 1:case 2:case 3:var b=3;break;default:b=R}var c=R;R=b;try{return a()}finally{R=c}};exports.unstable_pauseExecution=function(){};exports.unstable_requestPaint=Z;exports.unstable_runWithPriority=function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=R;R=a;try{return b()}finally{R=c}};
374978
- exports.unstable_scheduleCallback=function(a,b,c){var d=exports.unstable_now();if("object"===typeof c&&null!==c){var e=c.delay;e="number"===typeof e&&0<e?d+e:d;c="number"===typeof c.timeout?c.timeout:Y(a)}else c=Y(a),e=d;c=e+c;a={id:P++,callback:b,priorityLevel:a,startTime:e,expirationTime:c,sortIndex:-1};e>d?(a.sortIndex=e,J(O,a),null===L(N)&&a===L(O)&&(U?h():U=!0,g(W,e-d))):(a.sortIndex=c,J(N,a),T||S||(T=!0,f(X)));return a};
374979
- exports.unstable_shouldYield=function(){var a=exports.unstable_now();V(a);var b=L(N);return b!==Q&&null!==Q&&null!==b&&null!==b.callback&&b.startTime<=a&&b.expirationTime<Q.expirationTime||k()};exports.unstable_wrapCallback=function(a){var b=R;return function(){var c=R;R=b;try{return a.apply(this,arguments)}finally{R=c}}};
375569
+ function f(a,b){var c=a.length;a.push(b);a:for(;0<c;){var d=c-1>>>1,e=a[d];if(0<g(e,b))a[d]=b,a[c]=e,c=d;else break a}}function h(a){return 0===a.length?null:a[0]}function k(a){if(0===a.length)return null;var b=a[0],c=a.pop();if(c!==b){a[0]=c;a:for(var d=0,e=a.length,w=e>>>1;d<w;){var m=2*(d+1)-1,C=a[m],n=m+1,x=a[n];if(0>g(C,c))n<e&&0>g(x,C)?(a[d]=x,a[n]=c,d=n):(a[d]=C,a[m]=c,d=m);else if(n<e&&0>g(x,c))a[d]=x,a[n]=c,d=n;else break a}}return b}
375570
+ function g(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}if("object"===typeof performance&&"function"===typeof performance.now){var l=performance;exports.unstable_now=function(){return l.now()}}else{var p=Date,q=p.now();exports.unstable_now=function(){return p.now()-q}}var r=[],t=[],u=1,v=null,y=3,z=!1,A=!1,B=!1,D="function"===typeof setTimeout?setTimeout:null,E="function"===typeof clearTimeout?clearTimeout:null,F="undefined"!==typeof setImmediate?setImmediate:null;
375571
+ "undefined"!==typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function G(a){for(var b=h(t);null!==b;){if(null===b.callback)k(t);else if(b.startTime<=a)k(t),b.sortIndex=b.expirationTime,f(r,b);else break;b=h(t)}}function H(a){B=!1;G(a);if(!A)if(null!==h(r))A=!0,I(J);else{var b=h(t);null!==b&&K(H,b.startTime-a)}}
375572
+ function J(a,b){A=!1;B&&(B=!1,E(L),L=-1);z=!0;var c=y;try{G(b);for(v=h(r);null!==v&&(!(v.expirationTime>b)||a&&!M());){var d=v.callback;if("function"===typeof d){v.callback=null;y=v.priorityLevel;var e=d(v.expirationTime<=b);b=exports.unstable_now();"function"===typeof e?v.callback=e:v===h(r)&&k(r);G(b)}else k(r);v=h(r)}if(null!==v)var w=!0;else{var m=h(t);null!==m&&K(H,m.startTime-b);w=!1}return w}finally{v=null,y=c,z=!1}}var N=!1,O=null,L=-1,P=5,Q=-1;
375573
+ function M(){return exports.unstable_now()-Q<P?!1:!0}function R(){if(null!==O){var a=exports.unstable_now();Q=a;var b=!0;try{b=O(!0,a)}finally{b?S():(N=!1,O=null)}}else N=!1}var S;if("function"===typeof F)S=function(){F(R)};else if("undefined"!==typeof MessageChannel){var T=new MessageChannel,U=T.port2;T.port1.onmessage=R;S=function(){U.postMessage(null)}}else S=function(){D(R,0)};function I(a){O=a;N||(N=!0,S())}function K(a,b){L=D(function(){a(exports.unstable_now())},b)}
375574
+ exports.unstable_IdlePriority=5;exports.unstable_ImmediatePriority=1;exports.unstable_LowPriority=4;exports.unstable_NormalPriority=3;exports.unstable_Profiling=null;exports.unstable_UserBlockingPriority=2;exports.unstable_cancelCallback=function(a){a.callback=null};exports.unstable_continueExecution=function(){A||z||(A=!0,I(J))};
375575
+ exports.unstable_forceFrameRate=function(a){0>a||125<a?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):P=0<a?Math.floor(1E3/a):5};exports.unstable_getCurrentPriorityLevel=function(){return y};exports.unstable_getFirstCallbackNode=function(){return h(r)};exports.unstable_next=function(a){switch(y){case 1:case 2:case 3:var b=3;break;default:b=y}var c=y;y=b;try{return a()}finally{y=c}};exports.unstable_pauseExecution=function(){};
375576
+ exports.unstable_requestPaint=function(){};exports.unstable_runWithPriority=function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=y;y=a;try{return b()}finally{y=c}};
375577
+ exports.unstable_scheduleCallback=function(a,b,c){var d=exports.unstable_now();"object"===typeof c&&null!==c?(c=c.delay,c="number"===typeof c&&0<c?d+c:d):c=d;switch(a){case 1:var e=-1;break;case 2:e=250;break;case 5:e=1073741823;break;case 4:e=1E4;break;default:e=5E3}e=c+e;a={id:u++,callback:b,priorityLevel:a,startTime:c,expirationTime:e,sortIndex:-1};c>d?(a.sortIndex=c,f(t,a),null===h(r)&&a===h(t)&&(B?(E(L),L=-1):B=!0,K(H,c-d))):(a.sortIndex=e,f(r,a),A||z||(A=!0,I(J)));return a};
375578
+ exports.unstable_shouldYield=M;exports.unstable_wrapCallback=function(a){var b=y;return function(){var c=y;y=b;try{return a.apply(this,arguments)}finally{y=c}}};
374980
375579
 
374981
375580
 
374982
375581
  /***/ }),
@@ -393227,7 +393826,7 @@ function __disposeResources(env) {
393227
393826
  /******/ // This function allow to reference async chunks
393228
393827
  /******/ __webpack_require__.u = (chunkId) => {
393229
393828
  /******/ // return url for filenames based on template
393230
- /******/ return "" + ({"158":"histogram-worker","607":"suv-peak-worker","985":"polySeg"}[chunkId] || chunkId) + ".bundle." + {"10":"c626810bd199ab63f3a2","153":"8f00f4310208024890d2","158":"e7e9fea2c3236b0e747a","169":"eeb9614e7b06f896c70f","202":"bb0e8196739bb896dc9e","210":"d69d940a6b0a5fd60a02","217":"0062f653c3f106777a2f","246":"26883d5e7649848ac00f","281":"f69da42cda732b1853f7","286":"985c5ebbb2158c7e59ab","315":"f7f9e6c76811f8a6a30f","353":"79e29af337df8bfc6ce0","360":"48ee0dcf983460ccfa3f","372":"ab285c12eeb9b509aea0","376":"79453127db5f42215b71","412":"836f106f6e2896dc42a5","417":"abf8bcee0f246002acb9","428":"744fc5865b2d747de88a","497":"ee102d6243f984113f08","498":"bb47c493dd02451f77ef","502":"5eaf758f5d2583c89175","530":"87f8b13ff55bf7b2a6d1","552":"6b69034625105790fb87","571":"a80609c9815339516d77","591":"08b3095d2bbea32d236a","604":"83f50929b208c60e48da","607":"eb11e71db02e52601ecf","658":"358716d6aee4c190f2cd","757":"1900204cf3e21d28e3b0","791":"999d1d43103a61565916","793":"c92f52ddff0e3bf506e6","818":"cda4e369fdee5459a544","831":"9e1a3495947e5bb49756","842":"5f140089d52350155046","888":"0c078cfae635297cfcd5","931":"f6fa2a436ace89ebf60f","944":"b28b6bf61814d7335b7a","962":"33f3dcd6115d9f597657","978":"2c82f42354d37219849d","985":"b25c61224998018d0f79","993":"aa31ebda5a5f62c44de5","994":"018b0c76da2b447ebcc1"}[chunkId] + ".js";
393829
+ /******/ return "" + ({"158":"histogram-worker","607":"suv-peak-worker","985":"polySeg"}[chunkId] || chunkId) + ".bundle." + {"10":"c626810bd199ab63f3a2","153":"4263246744bdb7397061","158":"e7e9fea2c3236b0e747a","169":"483057ed84ca3e92513a","202":"bb0e8196739bb896dc9e","210":"23df9d395237def99256","246":"07aee1251a6cfac762d0","281":"80f169c084e30c148f09","286":"985c5ebbb2158c7e59ab","315":"f7f9e6c76811f8a6a30f","353":"4371e55b06de8f3c7aa7","360":"40c4f2cac5dc24cbd151","372":"d9ed2938305b951123a8","376":"4c934b0adf377e00de69","412":"836f106f6e2896dc42a5","417":"abf8bcee0f246002acb9","428":"744fc5865b2d747de88a","497":"ee102d6243f984113f08","498":"bb47c493dd02451f77ef","502":"38ca85216c5168ce773b","516":"85aeaa0680375e6eedd1","530":"87f8b13ff55bf7b2a6d1","552":"bf1485400629f36602a9","571":"2b4e21bc61d7685a5fdb","591":"3b939d8f32f22c4e9978","604":"83f50929b208c60e48da","607":"eb11e71db02e52601ecf","658":"358716d6aee4c190f2cd","757":"1900204cf3e21d28e3b0","791":"b5c3d922846354a1f244","793":"c92f52ddff0e3bf506e6","818":"cda4e369fdee5459a544","831":"9e1a3495947e5bb49756","842":"24d9a57ef3a6f60abcd7","888":"f624d032cdccc374fa84","931":"f6fa2a436ace89ebf60f","944":"6b7e1773f5cf2637cf67","962":"230a6e51c90ae71baa2f","978":"60ae5483cf810ecd524a","985":"b25c61224998018d0f79","993":"aa31ebda5a5f62c44de5","994":"5dc798210cd5c4493e0e"}[chunkId] + ".js";
393231
393830
  /******/ };
393232
393831
  /******/ })();
393233
393832
  /******/
@@ -393399,7 +393998,7 @@ function __disposeResources(env) {
393399
393998
  /******/ };
393400
393999
  /******/
393401
394000
  /******/ __webpack_require__.f.miniCss = (chunkId, promises) => {
393402
- /******/ var cssChunks = {"169":1,"210":1,"217":1,"286":1,"552":1,"757":1,"994":1};
394001
+ /******/ var cssChunks = {"169":1,"210":1,"286":1,"516":1,"552":1,"757":1,"994":1};
393403
394002
  /******/ if(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);
393404
394003
  /******/ else if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {
393405
394004
  /******/ promises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(() => {
@@ -393414,7 +394013,7 @@ function __disposeResources(env) {
393414
394013
  /******/ // no hmr
393415
394014
  /******/
393416
394015
  /******/ __webpack_require__.F.miniCss = (chunkId) => {
393417
- /******/ if((!__webpack_require__.o(installedCssChunks, chunkId) || installedCssChunks[chunkId] === undefined) && /^(2(10|17|86)|143|169|552|757|994)$/.test(chunkId)) {
394016
+ /******/ if((!__webpack_require__.o(installedCssChunks, chunkId) || installedCssChunks[chunkId] === undefined) && /^(143|169|210|286|516|552|757|994)$/.test(chunkId)) {
393418
394017
  /******/ installedCssChunks[chunkId] = null;
393419
394018
  /******/ var link = document.createElement('link');
393420
394019
  /******/
@@ -393549,12 +394148,12 @@ function __disposeResources(env) {
393549
394148
  /******/ "210": [
393550
394149
  /******/ 315
393551
394150
  /******/ ],
393552
- /******/ "217": [
393553
- /******/ 169
393554
- /******/ ],
393555
394151
  /******/ "360": [
393556
394152
  /******/ 571
393557
394153
  /******/ ],
394154
+ /******/ "516": [
394155
+ /******/ 169
394156
+ /******/ ],
393558
394157
  /******/ "591": [
393559
394158
  /******/ 412
393560
394159
  /******/ ],