diff --git a/package-lock.json b/package-lock.json
index 35fa2131d4c03e9e96ccdf50f97ee680cdcd0645..132ac32edbcf52bf846ff0160a0e9da66158e7d9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,9 +10,15 @@
         "@amcharts/amcharts5": "^5.0.3",
         "@babel/runtime": "^7.15.4",
         "@date-io/moment": "^1.3.11",
+        "@emotion/react": "^11.7.1",
+        "@emotion/styled": "^11.6.0",
         "@material-ui/core": "^4.12.3",
         "@material-ui/icons": "^4.11.2",
         "@material-ui/pickers": "^3.3.10",
+        "@mui/icons-material": "^5.2.5",
+        "@mui/lab": "^5.0.0-alpha.64",
+        "@mui/material": "^5.2.8",
+        "@mui/styles": "^5.2.3",
         "@nosferatu500/react-sortable-tree": "^3.0.5",
         "@shakacode/recompose": "^0.30.3",
         "@turf/buffer": "^6.3.0",
@@ -57,7 +63,7 @@
         "react-sortable-tree-theme-file-explorer": "git+https://github.com/SemanticComputing/react-sortable-tree-theme-file-explorer.git#e60a5a73b4c5892b1dcd598a27a72bd3ebbd5e96",
         "react-virtualized": "^9.22.3",
         "react-wordcloud": "^1.2.7",
-        "redux": "^4.1.0",
+        "redux": "^4.1.2",
         "redux-observable": "^2.0.0",
         "reselect": "^4.0.0",
         "rxjs": "^7.2.0",
@@ -188,7 +194,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz",
       "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==",
-      "dev": true,
       "dependencies": {
         "@babel/highlight": "^7.16.0"
       },
@@ -200,7 +205,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.0.tgz",
       "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==",
-      "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
@@ -209,7 +213,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz",
       "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==",
-      "dev": true,
       "dependencies": {
         "@babel/code-frame": "^7.16.0",
         "@babel/generator": "^7.16.0",
@@ -257,7 +260,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz",
       "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==",
-      "dev": true,
       "dependencies": {
         "@babel/types": "^7.16.0",
         "jsesc": "^2.5.1",
@@ -296,7 +298,6 @@
       "version": "7.16.3",
       "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz",
       "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==",
-      "dev": true,
       "dependencies": {
         "@babel/compat-data": "^7.16.0",
         "@babel/helper-validator-option": "^7.14.5",
@@ -381,7 +382,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz",
       "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==",
-      "dev": true,
       "dependencies": {
         "@babel/helper-get-function-arity": "^7.16.0",
         "@babel/template": "^7.16.0",
@@ -395,7 +395,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz",
       "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==",
-      "dev": true,
       "dependencies": {
         "@babel/types": "^7.16.0"
       },
@@ -407,7 +406,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz",
       "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==",
-      "dev": true,
       "dependencies": {
         "@babel/types": "^7.16.0"
       },
@@ -419,7 +417,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz",
       "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==",
-      "dev": true,
       "dependencies": {
         "@babel/types": "^7.16.0"
       },
@@ -431,7 +428,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz",
       "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==",
-      "dev": true,
       "dependencies": {
         "@babel/types": "^7.16.0"
       },
@@ -443,7 +439,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz",
       "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==",
-      "dev": true,
       "dependencies": {
         "@babel/helper-module-imports": "^7.16.0",
         "@babel/helper-replace-supers": "^7.16.0",
@@ -462,7 +457,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz",
       "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==",
-      "dev": true,
       "dependencies": {
         "@babel/types": "^7.16.0"
       },
@@ -474,7 +468,6 @@
       "version": "7.14.5",
       "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz",
       "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==",
-      "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
@@ -497,7 +490,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz",
       "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==",
-      "dev": true,
       "dependencies": {
         "@babel/helper-member-expression-to-functions": "^7.16.0",
         "@babel/helper-optimise-call-expression": "^7.16.0",
@@ -512,7 +504,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz",
       "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==",
-      "dev": true,
       "dependencies": {
         "@babel/types": "^7.16.0"
       },
@@ -536,7 +527,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz",
       "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==",
-      "dev": true,
       "dependencies": {
         "@babel/types": "^7.16.0"
       },
@@ -548,7 +538,6 @@
       "version": "7.15.7",
       "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
       "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==",
-      "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
@@ -557,7 +546,6 @@
       "version": "7.14.5",
       "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz",
       "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==",
-      "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
@@ -581,7 +569,6 @@
       "version": "7.16.3",
       "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz",
       "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==",
-      "dev": true,
       "dependencies": {
         "@babel/template": "^7.16.0",
         "@babel/traverse": "^7.16.3",
@@ -595,7 +582,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz",
       "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==",
-      "dev": true,
       "dependencies": {
         "@babel/helper-validator-identifier": "^7.15.7",
         "chalk": "^2.0.0",
@@ -632,7 +618,6 @@
       "version": "7.16.3",
       "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.3.tgz",
       "integrity": "sha512-dcNwU1O4sx57ClvLBVFbEgx0UZWfd0JQX5X6fxFRCLHelFBGXFfSz6Y0FAq2PEwUqlqLkdVjVr4VASEOuUnLJw==",
-      "dev": true,
       "bin": {
         "parser": "bin/babel-parser.js"
       },
@@ -999,7 +984,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz",
       "integrity": "sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==",
-      "dev": true,
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.14.5"
       },
@@ -1859,7 +1843,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz",
       "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==",
-      "dev": true,
       "dependencies": {
         "@babel/code-frame": "^7.16.0",
         "@babel/parser": "^7.16.0",
@@ -1873,7 +1856,6 @@
       "version": "7.16.3",
       "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz",
       "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==",
-      "dev": true,
       "dependencies": {
         "@babel/code-frame": "^7.16.0",
         "@babel/generator": "^7.16.0",
@@ -1893,7 +1875,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz",
       "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==",
-      "dev": true,
       "dependencies": {
         "@babel/helper-validator-identifier": "^7.15.7",
         "to-fast-properties": "^2.0.0"
@@ -1907,6 +1888,69 @@
       "resolved": "https://registry.npmjs.org/@date-io/core/-/core-1.3.13.tgz",
       "integrity": "sha512-AlEKV7TxjeK+jxWVKcCFrfYAk8spX9aCyiToFIiLPtfQbsjmRGLIhb5VZgptQcJdHtLXo7+m0DuurwFgUToQuA=="
     },
+    "node_modules/@date-io/date-fns": {
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.11.0.tgz",
+      "integrity": "sha512-mPQ71plBeFrArvBSHtjWMHXA89IUbZ6kuo2dsjlRC/1uNOybo91spIb+wTu03NxKTl8ut07s0jJ9svF71afpRg==",
+      "dependencies": {
+        "@date-io/core": "^2.11.0"
+      },
+      "peerDependencies": {
+        "date-fns": "^2.0.0"
+      },
+      "peerDependenciesMeta": {
+        "date-fns": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@date-io/date-fns/node_modules/@date-io/core": {
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.11.0.tgz",
+      "integrity": "sha512-DvPBnNoeuLaoSJZaxgpu54qzRhRKjSYVyQjhznTFrllKuDpm0sDFjHo6lvNLCM/cfMx2gb2PM2zY2kc9C8nmuw=="
+    },
+    "node_modules/@date-io/dayjs": {
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-2.11.0.tgz",
+      "integrity": "sha512-w67vRK56NZJIKhJM/CrNbfnIcuMvR3ApfxzNZiCZ5w29sxgBDeKuX4M+P7A9r5HXOMGcsOcpgaoTDINNGkdpGQ==",
+      "dependencies": {
+        "@date-io/core": "^2.11.0"
+      },
+      "peerDependencies": {
+        "dayjs": "^1.8.17"
+      },
+      "peerDependenciesMeta": {
+        "dayjs": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@date-io/dayjs/node_modules/@date-io/core": {
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.11.0.tgz",
+      "integrity": "sha512-DvPBnNoeuLaoSJZaxgpu54qzRhRKjSYVyQjhznTFrllKuDpm0sDFjHo6lvNLCM/cfMx2gb2PM2zY2kc9C8nmuw=="
+    },
+    "node_modules/@date-io/luxon": {
+      "version": "2.11.1",
+      "resolved": "https://registry.npmjs.org/@date-io/luxon/-/luxon-2.11.1.tgz",
+      "integrity": "sha512-JUXo01kdPQxLORxqdENrgdUhooKgDUggsNRSdi2BcUhASIY2KGwwWXu8ikVHHGkw+DUF4FOEKGfkQd0RHSvX6g==",
+      "dependencies": {
+        "@date-io/core": "^2.11.0"
+      },
+      "peerDependencies": {
+        "luxon": "^1.21.3 || ^2.x"
+      },
+      "peerDependenciesMeta": {
+        "luxon": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@date-io/luxon/node_modules/@date-io/core": {
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.11.0.tgz",
+      "integrity": "sha512-DvPBnNoeuLaoSJZaxgpu54qzRhRKjSYVyQjhznTFrllKuDpm0sDFjHo6lvNLCM/cfMx2gb2PM2zY2kc9C8nmuw=="
+    },
     "node_modules/@date-io/moment": {
       "version": "1.3.13",
       "resolved": "https://registry.npmjs.org/@date-io/moment/-/moment-1.3.13.tgz",
@@ -2108,6 +2152,56 @@
         "node": ">=10.0.0"
       }
     },
+    "node_modules/@emotion/babel-plugin": {
+      "version": "11.7.2",
+      "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz",
+      "integrity": "sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ==",
+      "dependencies": {
+        "@babel/helper-module-imports": "^7.12.13",
+        "@babel/plugin-syntax-jsx": "^7.12.13",
+        "@babel/runtime": "^7.13.10",
+        "@emotion/hash": "^0.8.0",
+        "@emotion/memoize": "^0.7.5",
+        "@emotion/serialize": "^1.0.2",
+        "babel-plugin-macros": "^2.6.1",
+        "convert-source-map": "^1.5.0",
+        "escape-string-regexp": "^4.0.0",
+        "find-root": "^1.1.0",
+        "source-map": "^0.5.7",
+        "stylis": "4.0.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@emotion/babel-plugin/node_modules/@emotion/memoize": {
+      "version": "0.7.5",
+      "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz",
+      "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ=="
+    },
+    "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@emotion/cache": {
+      "version": "11.7.1",
+      "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz",
+      "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==",
+      "dependencies": {
+        "@emotion/memoize": "^0.7.4",
+        "@emotion/sheet": "^1.1.0",
+        "@emotion/utils": "^1.0.0",
+        "@emotion/weak-memoize": "^0.2.5",
+        "stylis": "4.0.13"
+      }
+    },
     "node_modules/@emotion/hash": {
       "version": "0.8.0",
       "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
@@ -2125,8 +2219,103 @@
     "node_modules/@emotion/memoize": {
       "version": "0.7.4",
       "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
-      "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==",
-      "optional": true
+      "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw=="
+    },
+    "node_modules/@emotion/react": {
+      "version": "11.7.1",
+      "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.7.1.tgz",
+      "integrity": "sha512-DV2Xe3yhkF1yT4uAUoJcYL1AmrnO5SVsdfvu+fBuS7IbByDeTVx9+wFmvx9Idzv7/78+9Mgx2Hcmr7Fex3tIyw==",
+      "dependencies": {
+        "@babel/runtime": "^7.13.10",
+        "@emotion/cache": "^11.7.1",
+        "@emotion/serialize": "^1.0.2",
+        "@emotion/sheet": "^1.1.0",
+        "@emotion/utils": "^1.0.0",
+        "@emotion/weak-memoize": "^0.2.5",
+        "hoist-non-react-statics": "^3.3.1"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0",
+        "react": ">=16.8.0"
+      },
+      "peerDependenciesMeta": {
+        "@babel/core": {
+          "optional": true
+        },
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@emotion/serialize": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.2.tgz",
+      "integrity": "sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==",
+      "dependencies": {
+        "@emotion/hash": "^0.8.0",
+        "@emotion/memoize": "^0.7.4",
+        "@emotion/unitless": "^0.7.5",
+        "@emotion/utils": "^1.0.0",
+        "csstype": "^3.0.2"
+      }
+    },
+    "node_modules/@emotion/serialize/node_modules/csstype": {
+      "version": "3.0.10",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz",
+      "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA=="
+    },
+    "node_modules/@emotion/sheet": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz",
+      "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g=="
+    },
+    "node_modules/@emotion/styled": {
+      "version": "11.6.0",
+      "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.6.0.tgz",
+      "integrity": "sha512-mxVtVyIOTmCAkFbwIp+nCjTXJNgcz4VWkOYQro87jE2QBTydnkiYusMrRGFtzuruiGK4dDaNORk4gH049iiQuw==",
+      "dependencies": {
+        "@babel/runtime": "^7.13.10",
+        "@emotion/babel-plugin": "^11.3.0",
+        "@emotion/is-prop-valid": "^1.1.1",
+        "@emotion/serialize": "^1.0.2",
+        "@emotion/utils": "^1.0.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0",
+        "@emotion/react": "^11.0.0-rc.0",
+        "react": ">=16.8.0"
+      },
+      "peerDependenciesMeta": {
+        "@babel/core": {
+          "optional": true
+        },
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@emotion/styled/node_modules/@emotion/is-prop-valid": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.1.tgz",
+      "integrity": "sha512-bW1Tos67CZkOURLc0OalnfxtSXQJMrAMV0jZTVGJUPSOd4qgjF3+tTD5CwJM13PHA8cltGW1WGbbvV9NpvUZPw==",
+      "dependencies": {
+        "@emotion/memoize": "^0.7.4"
+      }
+    },
+    "node_modules/@emotion/unitless": {
+      "version": "0.7.5",
+      "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
+      "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
+    },
+    "node_modules/@emotion/utils": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz",
+      "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA=="
+    },
+    "node_modules/@emotion/weak-memoize": {
+      "version": "0.2.5",
+      "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz",
+      "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA=="
     },
     "node_modules/@eslint/eslintrc": {
       "version": "0.3.0",
@@ -2806,33 +2995,409 @@
         "gl-matrix": "~3.3.0"
       }
     },
-    "node_modules/@math.gl/geospatial/node_modules/gl-matrix": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.3.0.tgz",
-      "integrity": "sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA=="
+    "node_modules/@math.gl/geospatial/node_modules/gl-matrix": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.3.0.tgz",
+      "integrity": "sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA=="
+    },
+    "node_modules/@math.gl/polygon": {
+      "version": "3.5.6",
+      "resolved": "https://registry.npmjs.org/@math.gl/polygon/-/polygon-3.5.6.tgz",
+      "integrity": "sha512-CUGPmD8Y9elPRsb4+wG0nuElbEYcTK+Azks96M9zleMaOACUDqUY6D4rDtqpyEIeqcun85Aq+7eV/rjVMahWgA==",
+      "dependencies": {
+        "@math.gl/core": "3.5.6"
+      }
+    },
+    "node_modules/@math.gl/web-mercator": {
+      "version": "3.5.6",
+      "resolved": "https://registry.npmjs.org/@math.gl/web-mercator/-/web-mercator-3.5.6.tgz",
+      "integrity": "sha512-siWHLJGp9o8fDEM1t0Rby+JXftl6il0z3927liWGzkHqFftXPHY858ShPy45ThDU8q5lyCftg8aVgrv4nfD+Zw==",
+      "dependencies": {
+        "@babel/runtime": "^7.12.0",
+        "gl-matrix": "~3.3.0"
+      }
+    },
+    "node_modules/@math.gl/web-mercator/node_modules/gl-matrix": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.3.0.tgz",
+      "integrity": "sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA=="
+    },
+    "node_modules/@mui/base": {
+      "version": "5.0.0-alpha.64",
+      "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.64.tgz",
+      "integrity": "sha512-lqUFbAyYPl3uDaTxGWIUWx9Zin5APv5Rrn/oUcnm/71Isd5dJ94zoGHCTdNy2sxhDRcXRshsdC2dfdwIWxhkZA==",
+      "dependencies": {
+        "@babel/runtime": "^7.16.3",
+        "@emotion/is-prop-valid": "^1.1.1",
+        "@mui/utils": "^5.2.3",
+        "@popperjs/core": "^2.4.4",
+        "clsx": "^1.1.1",
+        "prop-types": "^15.7.2",
+        "react-is": "^17.0.2"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/mui"
+      },
+      "peerDependencies": {
+        "@types/react": "^16.8.6 || ^17.0.0",
+        "react": "^17.0.2",
+        "react-dom": "^17.0.2"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@mui/base/node_modules/@emotion/is-prop-valid": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.1.tgz",
+      "integrity": "sha512-bW1Tos67CZkOURLc0OalnfxtSXQJMrAMV0jZTVGJUPSOd4qgjF3+tTD5CwJM13PHA8cltGW1WGbbvV9NpvUZPw==",
+      "dependencies": {
+        "@emotion/memoize": "^0.7.4"
+      }
+    },
+    "node_modules/@mui/icons-material": {
+      "version": "5.2.5",
+      "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.2.5.tgz",
+      "integrity": "sha512-uQiUz+l0xy+2jExyKyU19MkMAR2F7bQFcsQ5hdqAtsB14Jw2zlmIAD55mV6f0NxKCut7Rx6cA3ZpfzlzAfoK8Q==",
+      "dependencies": {
+        "@babel/runtime": "^7.16.3"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/mui"
+      },
+      "peerDependencies": {
+        "@mui/material": "^5.0.0",
+        "@types/react": "^16.8.6 || ^17.0.0",
+        "react": "^17.0.2"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@mui/lab": {
+      "version": "5.0.0-alpha.64",
+      "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.64.tgz",
+      "integrity": "sha512-YqTWT4TBHSGyV3dS4/TQctpKh0s4CDgWNrA2UnEnXFAfXmFET2Zm6W06fJ1VZDmJfyCVD8Wq0WsiwVZj4ay+Uw==",
+      "dependencies": {
+        "@babel/runtime": "^7.16.3",
+        "@date-io/date-fns": "^2.11.0",
+        "@date-io/dayjs": "^2.11.0",
+        "@date-io/luxon": "^2.11.1",
+        "@date-io/moment": "^2.11.0",
+        "@mui/base": "5.0.0-alpha.64",
+        "@mui/system": "^5.2.8",
+        "@mui/utils": "^5.2.3",
+        "clsx": "^1.1.1",
+        "prop-types": "^15.7.2",
+        "react-is": "^17.0.2",
+        "react-transition-group": "^4.4.2",
+        "rifm": "^0.12.1"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/mui"
+      },
+      "peerDependencies": {
+        "@mui/material": "^5.0.0",
+        "@types/react": "^16.8.6 || ^17.0.0",
+        "date-fns": "^2.25.0",
+        "dayjs": "^1.10.7",
+        "luxon": "^1.28.0 || ^2.0.0",
+        "moment": "^2.29.1",
+        "react": "^17.0.2",
+        "react-dom": "^17.0.2"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "date-fns": {
+          "optional": true
+        },
+        "dayjs": {
+          "optional": true
+        },
+        "luxon": {
+          "optional": true
+        },
+        "moment": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@mui/lab/node_modules/@date-io/core": {
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.11.0.tgz",
+      "integrity": "sha512-DvPBnNoeuLaoSJZaxgpu54qzRhRKjSYVyQjhznTFrllKuDpm0sDFjHo6lvNLCM/cfMx2gb2PM2zY2kc9C8nmuw=="
+    },
+    "node_modules/@mui/lab/node_modules/@date-io/moment": {
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/@date-io/moment/-/moment-2.11.0.tgz",
+      "integrity": "sha512-QSL+83qezQ9Ty0dtFgAkk6eC0GMl/lgYfDajeVUDB3zVA2A038hzczRLBg29ifnBGhQMPABxuOafgWwhDjlarg==",
+      "dependencies": {
+        "@date-io/core": "^2.11.0"
+      },
+      "peerDependencies": {
+        "moment": "^2.24.0"
+      },
+      "peerDependenciesMeta": {
+        "moment": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@mui/lab/node_modules/rifm": {
+      "version": "0.12.1",
+      "resolved": "https://registry.npmjs.org/rifm/-/rifm-0.12.1.tgz",
+      "integrity": "sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg==",
+      "peerDependencies": {
+        "react": ">=16.8"
+      }
+    },
+    "node_modules/@mui/material": {
+      "version": "5.2.8",
+      "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.2.8.tgz",
+      "integrity": "sha512-GYNYoTDw3C07D1rkB9pTS3xMH3gL0p3kb27SVMrMqP3AWrFxfrS73OnsonJh6Uy/F22pYX6rJxiFOhPq5+i4Eg==",
+      "dependencies": {
+        "@babel/runtime": "^7.16.3",
+        "@mui/base": "5.0.0-alpha.64",
+        "@mui/system": "^5.2.8",
+        "@mui/types": "^7.1.0",
+        "@mui/utils": "^5.2.3",
+        "@types/react-transition-group": "^4.4.4",
+        "clsx": "^1.1.1",
+        "csstype": "^3.0.10",
+        "hoist-non-react-statics": "^3.3.2",
+        "prop-types": "^15.7.2",
+        "react-is": "^17.0.2",
+        "react-transition-group": "^4.4.2"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/mui"
+      },
+      "peerDependencies": {
+        "@emotion/react": "^11.5.0",
+        "@emotion/styled": "^11.3.0",
+        "@types/react": "^16.8.6 || ^17.0.0",
+        "react": "^17.0.2",
+        "react-dom": "^17.0.2"
+      },
+      "peerDependenciesMeta": {
+        "@emotion/react": {
+          "optional": true
+        },
+        "@emotion/styled": {
+          "optional": true
+        },
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@mui/material/node_modules/csstype": {
+      "version": "3.0.10",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz",
+      "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA=="
+    },
+    "node_modules/@mui/private-theming": {
+      "version": "5.2.3",
+      "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.2.3.tgz",
+      "integrity": "sha512-Lc1Cmu8lSsYZiXADi9PBb17Ho82ZbseHQujUFAcp6bCJ5x/d+87JYCIpCBMagPu/isRlFCwbziuXPmz7WOzJPQ==",
+      "dependencies": {
+        "@babel/runtime": "^7.16.3",
+        "@mui/utils": "^5.2.3",
+        "prop-types": "^15.7.2"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/mui"
+      },
+      "peerDependencies": {
+        "@types/react": "^16.8.6 || ^17.0.0",
+        "react": "^17.0.2"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@mui/styled-engine": {
+      "version": "5.2.6",
+      "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.2.6.tgz",
+      "integrity": "sha512-bqAhli8eGS6v2qxivy2/4K0Ag8o//jsu1G2G6QcieFiT6y7oIF/nd/6Tvw6OSm3roOTifVQWNKwkt1yFWhGS+w==",
+      "dependencies": {
+        "@babel/runtime": "^7.16.3",
+        "@emotion/cache": "^11.7.1",
+        "prop-types": "^15.7.2"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/mui"
+      },
+      "peerDependencies": {
+        "@emotion/react": "^11.4.1",
+        "@emotion/styled": "^11.3.0",
+        "react": "^17.0.2"
+      },
+      "peerDependenciesMeta": {
+        "@emotion/react": {
+          "optional": true
+        },
+        "@emotion/styled": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@mui/styles": {
+      "version": "5.2.3",
+      "resolved": "https://registry.npmjs.org/@mui/styles/-/styles-5.2.3.tgz",
+      "integrity": "sha512-Art4qjlEI9H2h34mLL8s+CE9nWZWZbuJLbNpievaIM6DGuayz3DYkJHcH5mXJYFPhTNoe9IQYbpyKofjE0YVag==",
+      "dependencies": {
+        "@babel/runtime": "^7.16.3",
+        "@emotion/hash": "^0.8.0",
+        "@mui/private-theming": "^5.2.3",
+        "@mui/types": "^7.1.0",
+        "@mui/utils": "^5.2.3",
+        "clsx": "^1.1.1",
+        "csstype": "^3.0.10",
+        "hoist-non-react-statics": "^3.3.2",
+        "jss": "^10.8.2",
+        "jss-plugin-camel-case": "^10.8.2",
+        "jss-plugin-default-unit": "^10.8.2",
+        "jss-plugin-global": "^10.8.2",
+        "jss-plugin-nested": "^10.8.2",
+        "jss-plugin-props-sort": "^10.8.2",
+        "jss-plugin-rule-value-function": "^10.8.2",
+        "jss-plugin-vendor-prefixer": "^10.8.2",
+        "prop-types": "^15.7.2"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/mui"
+      },
+      "peerDependencies": {
+        "@types/react": "^16.8.6 || ^17.0.0",
+        "react": "^17.0.2"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@mui/styles/node_modules/csstype": {
+      "version": "3.0.10",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz",
+      "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA=="
+    },
+    "node_modules/@mui/system": {
+      "version": "5.2.8",
+      "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.2.8.tgz",
+      "integrity": "sha512-tje1HRubQUk+cDJBG5F83X1j0XzVe+qhellKxByrJVOEEDHoSpbc8UW+NCLSuBBHvOikxihuv3SS4VOWOo2/BQ==",
+      "dependencies": {
+        "@babel/runtime": "^7.16.3",
+        "@mui/private-theming": "^5.2.3",
+        "@mui/styled-engine": "^5.2.6",
+        "@mui/types": "^7.1.0",
+        "@mui/utils": "^5.2.3",
+        "clsx": "^1.1.1",
+        "csstype": "^3.0.10",
+        "prop-types": "^15.7.2"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/mui"
+      },
+      "peerDependencies": {
+        "@emotion/react": "^11.5.0",
+        "@emotion/styled": "^11.3.0",
+        "@types/react": "^16.8.6 || ^17.0.0",
+        "react": "^17.0.2"
+      },
+      "peerDependenciesMeta": {
+        "@emotion/react": {
+          "optional": true
+        },
+        "@emotion/styled": {
+          "optional": true
+        },
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@mui/system/node_modules/csstype": {
+      "version": "3.0.10",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz",
+      "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA=="
     },
-    "node_modules/@math.gl/polygon": {
-      "version": "3.5.6",
-      "resolved": "https://registry.npmjs.org/@math.gl/polygon/-/polygon-3.5.6.tgz",
-      "integrity": "sha512-CUGPmD8Y9elPRsb4+wG0nuElbEYcTK+Azks96M9zleMaOACUDqUY6D4rDtqpyEIeqcun85Aq+7eV/rjVMahWgA==",
-      "dependencies": {
-        "@math.gl/core": "3.5.6"
+    "node_modules/@mui/types": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.0.tgz",
+      "integrity": "sha512-Hh7ALdq/GjfIwLvqH3XftuY3bcKhupktTm+S6qRIDGOtPtRuq2L21VWzOK4p7kblirK0XgGVH5BLwa6u8z/6QQ==",
+      "peerDependencies": {
+        "@types/react": "*"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
       }
     },
-    "node_modules/@math.gl/web-mercator": {
-      "version": "3.5.6",
-      "resolved": "https://registry.npmjs.org/@math.gl/web-mercator/-/web-mercator-3.5.6.tgz",
-      "integrity": "sha512-siWHLJGp9o8fDEM1t0Rby+JXftl6il0z3927liWGzkHqFftXPHY858ShPy45ThDU8q5lyCftg8aVgrv4nfD+Zw==",
+    "node_modules/@mui/utils": {
+      "version": "5.2.3",
+      "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.2.3.tgz",
+      "integrity": "sha512-sQujlajIS0zQKcGIS6tZR0L1R+ib26B6UtuEn+cZqwKHsPo3feuS+SkdscYBdcCdMbrZs4gj8WIJHl2z6tbSzQ==",
       "dependencies": {
-        "@babel/runtime": "^7.12.0",
-        "gl-matrix": "~3.3.0"
+        "@babel/runtime": "^7.16.3",
+        "@types/prop-types": "^15.7.4",
+        "@types/react-is": "^16.7.1 || ^17.0.0",
+        "prop-types": "^15.7.2",
+        "react-is": "^17.0.2"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/mui"
+      },
+      "peerDependencies": {
+        "react": "^17.0.2"
       }
     },
-    "node_modules/@math.gl/web-mercator/node_modules/gl-matrix": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.3.0.tgz",
-      "integrity": "sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA=="
-    },
     "node_modules/@nicolo-ribaudo/chokidar-2": {
       "version": "2.1.8-no-fsevents.3",
       "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz",
@@ -3064,6 +3629,15 @@
         "@types/node": "*"
       }
     },
+    "node_modules/@types/bonjour": {
+      "version": "3.5.10",
+      "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz",
+      "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==",
+      "dev": true,
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
     "node_modules/@types/connect": {
       "version": "3.4.35",
       "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
@@ -3072,6 +3646,16 @@
         "@types/node": "*"
       }
     },
+    "node_modules/@types/connect-history-api-fallback": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz",
+      "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==",
+      "dev": true,
+      "dependencies": {
+        "@types/express-serve-static-core": "*",
+        "@types/node": "*"
+      }
+    },
     "node_modules/@types/d3": {
       "version": "6.7.5",
       "resolved": "https://registry.npmjs.org/@types/d3/-/d3-6.7.5.tgz",
@@ -3454,6 +4038,11 @@
       "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz",
       "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw=="
     },
+    "node_modules/@types/parse-json": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
+      "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
+    },
     "node_modules/@types/polylabel": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/@types/polylabel/-/polylabel-1.0.5.tgz",
@@ -3484,6 +4073,14 @@
         "csstype": "^3.0.2"
       }
     },
+    "node_modules/@types/react-is": {
+      "version": "17.0.3",
+      "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz",
+      "integrity": "sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==",
+      "dependencies": {
+        "@types/react": "*"
+      }
+    },
     "node_modules/@types/react-redux": {
       "version": "7.1.20",
       "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.20.tgz",
@@ -3528,6 +4125,15 @@
       "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
       "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
     },
+    "node_modules/@types/serve-index": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz",
+      "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==",
+      "dev": true,
+      "dependencies": {
+        "@types/express": "*"
+      }
+    },
     "node_modules/@types/serve-static": {
       "version": "1.13.10",
       "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
@@ -3537,6 +4143,15 @@
         "@types/node": "*"
       }
     },
+    "node_modules/@types/sockjs": {
+      "version": "0.3.33",
+      "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz",
+      "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==",
+      "dev": true,
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
     "node_modules/@types/source-list-map": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz",
@@ -3628,6 +4243,15 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/@types/ws": {
+      "version": "8.2.2",
+      "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz",
+      "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==",
+      "dev": true,
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
     "node_modules/@webassemblyjs/ast": {
       "version": "1.11.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
@@ -4408,6 +5032,16 @@
         "object.assign": "^4.1.0"
       }
     },
+    "node_modules/babel-plugin-macros": {
+      "version": "2.8.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz",
+      "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "cosmiconfig": "^6.0.0",
+        "resolve": "^1.12.0"
+      }
+    },
     "node_modules/babel-plugin-polyfill-corejs2": {
       "version": "0.2.3",
       "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz",
@@ -4661,7 +5295,6 @@
       "version": "4.17.6",
       "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.6.tgz",
       "integrity": "sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==",
-      "dev": true,
       "dependencies": {
         "caniuse-lite": "^1.0.30001274",
         "electron-to-chromium": "^1.3.886",
@@ -4769,7 +5402,6 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
       "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
-      "dev": true,
       "engines": {
         "node": ">=6"
       }
@@ -4788,7 +5420,6 @@
       "version": "1.0.30001279",
       "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001279.tgz",
       "integrity": "sha512-VfEHpzHEXj6/CxggTwSFoZBBYGQfQv9Cf42KPlO79sWXCD1QNKWKsKzFeWL7QpZHJQYAvocqV6Rty1yJMkqWLQ==",
-      "dev": true,
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/browserslist"
@@ -5501,6 +6132,38 @@
       "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
       "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
     },
+    "node_modules/cosmiconfig": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
+      "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+      "dependencies": {
+        "@types/parse-json": "^4.0.0",
+        "import-fresh": "^3.1.0",
+        "parse-json": "^5.0.0",
+        "path-type": "^4.0.0",
+        "yaml": "^1.7.2"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/cosmiconfig/node_modules/parse-json": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+      "dependencies": {
+        "@babel/code-frame": "^7.0.0",
+        "error-ex": "^1.3.1",
+        "json-parse-even-better-errors": "^2.3.0",
+        "lines-and-columns": "^1.1.6"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/crc-32": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz",
@@ -6256,7 +6919,6 @@
       "version": "4.3.2",
       "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
       "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
-      "dev": true,
       "dependencies": {
         "ms": "2.1.2"
       },
@@ -6657,8 +7319,7 @@
     "node_modules/electron-to-chromium": {
       "version": "1.3.893",
       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.893.tgz",
-      "integrity": "sha512-ChtwF7qB03INq1SyMpue08wc6cve+ktj2UC/Y7se9vB+JryfzziJeYwsgb8jLaCA5GMkHCdn5M62PfSMWhifZg==",
-      "dev": true
+      "integrity": "sha512-ChtwF7qB03INq1SyMpue08wc6cve+ktj2UC/Y7se9vB+JryfzziJeYwsgb8jLaCA5GMkHCdn5M62PfSMWhifZg=="
     },
     "node_modules/emoji-regex": {
       "version": "8.0.0",
@@ -6729,7 +7390,6 @@
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
       "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
-      "dev": true,
       "dependencies": {
         "is-arrayish": "^0.2.1"
       }
@@ -6866,7 +7526,6 @@
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
       "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
-      "dev": true,
       "engines": {
         "node": ">=6"
       }
@@ -8037,6 +8696,11 @@
         "node": ">=4.0.0"
       }
     },
+    "node_modules/find-root": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
+      "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
+    },
     "node_modules/find-up": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
@@ -8097,9 +8761,9 @@
       "dev": true
     },
     "node_modules/follow-redirects": {
-      "version": "1.14.5",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz",
-      "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==",
+      "version": "1.14.7",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz",
+      "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==",
       "funding": [
         {
           "type": "individual",
@@ -8268,7 +8932,6 @@
       "version": "1.0.0-beta.2",
       "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
       "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
-      "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
@@ -8391,7 +9054,6 @@
       "version": "11.12.0",
       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
       "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-      "dev": true,
       "engines": {
         "node": ">=4"
       }
@@ -8446,12 +9108,12 @@
       }
     },
     "node_modules/google-p12-pem": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.2.tgz",
-      "integrity": "sha512-tjf3IQIt7tWCDsa0ofDQ1qqSCNzahXDxdAGJDbruWqu3eCg5CKLYKN+hi0s6lfvzYZ1GDVr+oDF9OOWlDSdf0A==",
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.3.tgz",
+      "integrity": "sha512-MC0jISvzymxePDVembypNefkAQp+DRP7dBE+zNUPaIjEspIlYg0++OrsNr248V9tPbz6iqtZ7rX1hxWA5B8qBQ==",
       "dev": true,
       "dependencies": {
-        "node-forge": "^0.10.0"
+        "node-forge": "^1.0.0"
       },
       "bin": {
         "gp12-pem": "build/src/bin/gp12-pem.js"
@@ -9100,7 +9762,6 @@
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
       "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
-      "dev": true,
       "dependencies": {
         "parent-module": "^1.0.0",
         "resolve-from": "^4.0.0"
@@ -9343,8 +10004,7 @@
     "node_modules/is-arrayish": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
-      "dev": true
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
     },
     "node_modules/is-bigint": {
       "version": "1.0.4",
@@ -9752,7 +10412,6 @@
       "version": "2.5.2",
       "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
       "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
-      "dev": true,
       "bin": {
         "jsesc": "bin/jsesc"
       },
@@ -9783,6 +10442,11 @@
       "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
       "dev": true
     },
+    "node_modules/json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+    },
     "node_modules/json-schema-ref-parser": {
       "version": "9.0.9",
       "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz",
@@ -9809,7 +10473,6 @@
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
       "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
-      "dev": true,
       "dependencies": {
         "minimist": "^1.2.5"
       },
@@ -10057,6 +10720,11 @@
         "tiny-inflate": "^1.0.0"
       }
     },
+    "node_modules/lines-and-columns": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
+    },
     "node_modules/load-json-file": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
@@ -10326,9 +10994,9 @@
       }
     },
     "node_modules/memfs": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.3.0.tgz",
-      "integrity": "sha512-BEE62uMfKOavX3iG7GYX43QJ+hAeeWnwIAuJ/R6q96jaMtiLzhsxHJC8B1L7fK7Pt/vXDRwb3SG/yBpNGDPqzg==",
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz",
+      "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==",
       "dev": true,
       "dependencies": {
         "fs-monkey": "1.0.3"
@@ -10510,8 +11178,7 @@
     "node_modules/ms": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
     },
     "node_modules/multer": {
       "version": "1.4.3",
@@ -10658,12 +11325,12 @@
       }
     },
     "node_modules/node-forge": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
-      "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz",
+      "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==",
       "dev": true,
       "engines": {
-        "node": ">= 6.0.0"
+        "node": ">= 6.13.0"
       }
     },
     "node_modules/node-modules-regexp": {
@@ -10678,8 +11345,7 @@
     "node_modules/node-releases": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
-      "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==",
-      "dev": true
+      "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA=="
     },
     "node_modules/normalize-package-data": {
       "version": "2.5.0",
@@ -11065,7 +11731,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
       "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
-      "dev": true,
       "dependencies": {
         "callsites": "^3.0.0"
       },
@@ -11160,7 +11825,6 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
       "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-      "dev": true,
       "engines": {
         "node": ">=8"
       }
@@ -11222,8 +11886,7 @@
     "node_modules/picocolors": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
-      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
-      "dev": true
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
     },
     "node_modules/picomatch": {
       "version": "2.3.0",
@@ -12584,9 +13247,9 @@
       "dev": true
     },
     "node_modules/reselect": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.2.tgz",
-      "integrity": "sha512-wg60ebcPOtxcptIUfrr7Jt3h4BR86cCW3R7y4qt65lnNb4yz4QgrXcbSioVsIOYguyz42+XTHIyJ5TEruzkFgQ=="
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.5.tgz",
+      "integrity": "sha512-uVdlz8J7OO+ASpBYoz1Zypgx0KasCY20H+N8JD13oUMtPvSHQuscrHop4KbXrbsBcdB9Ds7lVK7eRkBIfO43vQ=="
     },
     "node_modules/resize-observer-polyfill": {
       "version": "1.5.1",
@@ -12630,7 +13293,6 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
       "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
-      "dev": true,
       "engines": {
         "node": ">=4"
       }
@@ -12952,19 +13614,21 @@
       "dev": true
     },
     "node_modules/selfsigned": {
-      "version": "1.10.11",
-      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz",
-      "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz",
+      "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==",
       "dev": true,
       "dependencies": {
-        "node-forge": "^0.10.0"
+        "node-forge": "^1.2.0"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
     "node_modules/semver": {
       "version": "6.3.0",
       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
       "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "dev": true,
       "bin": {
         "semver": "bin/semver.js"
       }
@@ -13989,9 +14653,9 @@
       }
     },
     "node_modules/stylis": {
-      "version": "4.0.10",
-      "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.10.tgz",
-      "integrity": "sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg=="
+      "version": "4.0.13",
+      "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz",
+      "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag=="
     },
     "node_modules/subscribe-event": {
       "version": "1.1.1",
@@ -14417,7 +15081,6 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
       "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
-      "dev": true,
       "engines": {
         "node": ">=4"
       }
@@ -14649,38 +15312,12 @@
         "punycode": "^2.1.0"
       }
     },
-    "node_modules/url": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
-      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
-      "dev": true,
-      "dependencies": {
-        "punycode": "1.3.2",
-        "querystring": "0.2.0"
-      }
-    },
     "node_modules/url-template": {
       "version": "2.0.8",
       "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz",
       "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=",
       "dev": true
     },
-    "node_modules/url/node_modules/punycode": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
-      "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
-      "dev": true
-    },
-    "node_modules/url/node_modules/querystring": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
-      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
-      "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
-      "dev": true,
-      "engines": {
-        "node": ">=0.4.x"
-      }
-    },
     "node_modules/use-debounce": {
       "version": "7.0.1",
       "resolved": "https://registry.npmjs.org/use-debounce/-/use-debounce-7.0.1.tgz",
@@ -15050,16 +15687,16 @@
       }
     },
     "node_modules/webpack-dev-middleware": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.2.1.tgz",
-      "integrity": "sha512-Kx1X+36Rn9JaZcQMrJ7qN3PMAuKmEDD9ZISjUj3Cgq4A6PtwYsC4mpaKotSRYH3iOF6HsUa8viHKS59FlyVifQ==",
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz",
+      "integrity": "sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg==",
       "dev": true,
       "dependencies": {
         "colorette": "^2.0.10",
         "memfs": "^3.2.2",
         "mime-types": "^2.1.31",
         "range-parser": "^1.2.1",
-        "schema-utils": "^3.1.0"
+        "schema-utils": "^4.0.0"
       },
       "engines": {
         "node": ">= 12.13.0"
@@ -15072,18 +15709,53 @@
         "webpack": "^4.0.0 || ^5.0.0"
       }
     },
+    "node_modules/webpack-dev-middleware/node_modules/ajv": {
+      "version": "8.9.0",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz",
+      "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==",
+      "dev": true,
+      "dependencies": {
+        "fast-deep-equal": "^3.1.1",
+        "json-schema-traverse": "^1.0.0",
+        "require-from-string": "^2.0.2",
+        "uri-js": "^4.2.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+      "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+      "dev": true,
+      "dependencies": {
+        "fast-deep-equal": "^3.1.3"
+      },
+      "peerDependencies": {
+        "ajv": "^8.8.2"
+      }
+    },
+    "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+      "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+      "dev": true
+    },
     "node_modules/webpack-dev-middleware/node_modules/schema-utils": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
-      "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
+      "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
       "dev": true,
       "dependencies": {
-        "@types/json-schema": "^7.0.8",
-        "ajv": "^6.12.5",
-        "ajv-keywords": "^3.5.2"
+        "@types/json-schema": "^7.0.9",
+        "ajv": "^8.8.0",
+        "ajv-formats": "^2.1.1",
+        "ajv-keywords": "^5.0.0"
       },
       "engines": {
-        "node": ">= 10.13.0"
+        "node": ">= 12.13.0"
       },
       "funding": {
         "type": "opencollective",
@@ -15091,11 +15763,16 @@
       }
     },
     "node_modules/webpack-dev-server": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.6.0.tgz",
-      "integrity": "sha512-oojcBIKvx3Ya7qs1/AVWHDgmP1Xml8rGsEBnSobxU/UJSX1xP1GPM3MwsAnDzvqcVmVki8tV7lbcsjEjk0PtYg==",
+      "version": "4.7.3",
+      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz",
+      "integrity": "sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q==",
       "dev": true,
       "dependencies": {
+        "@types/bonjour": "^3.5.9",
+        "@types/connect-history-api-fallback": "^1.3.5",
+        "@types/serve-index": "^1.9.1",
+        "@types/sockjs": "^0.3.33",
+        "@types/ws": "^8.2.2",
         "ansi-html-community": "^0.0.8",
         "bonjour": "^3.5.0",
         "chokidar": "^3.5.2",
@@ -15113,13 +15790,12 @@
         "p-retry": "^4.5.0",
         "portfinder": "^1.0.28",
         "schema-utils": "^4.0.0",
-        "selfsigned": "^1.10.11",
+        "selfsigned": "^2.0.0",
         "serve-index": "^1.9.1",
         "sockjs": "^0.3.21",
         "spdy": "^4.0.2",
         "strip-ansi": "^7.0.0",
-        "url": "^0.11.0",
-        "webpack-dev-middleware": "^5.2.1",
+        "webpack-dev-middleware": "^5.3.0",
         "ws": "^8.1.0"
       },
       "bin": {
@@ -15607,6 +16283,14 @@
       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
       "dev": true
     },
+    "node_modules/yaml": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
     "node_modules/yargs": {
       "version": "16.2.0",
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
@@ -15721,7 +16405,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz",
       "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==",
-      "dev": true,
       "requires": {
         "@babel/highlight": "^7.16.0"
       }
@@ -15729,14 +16412,12 @@
     "@babel/compat-data": {
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.0.tgz",
-      "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==",
-      "dev": true
+      "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew=="
     },
     "@babel/core": {
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz",
       "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==",
-      "dev": true,
       "requires": {
         "@babel/code-frame": "^7.16.0",
         "@babel/generator": "^7.16.0",
@@ -15770,7 +16451,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz",
       "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==",
-      "dev": true,
       "requires": {
         "@babel/types": "^7.16.0",
         "jsesc": "^2.5.1",
@@ -15800,7 +16480,6 @@
       "version": "7.16.3",
       "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz",
       "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==",
-      "dev": true,
       "requires": {
         "@babel/compat-data": "^7.16.0",
         "@babel/helper-validator-option": "^7.14.5",
@@ -15861,7 +16540,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz",
       "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==",
-      "dev": true,
       "requires": {
         "@babel/helper-get-function-arity": "^7.16.0",
         "@babel/template": "^7.16.0",
@@ -15872,7 +16550,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz",
       "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==",
-      "dev": true,
       "requires": {
         "@babel/types": "^7.16.0"
       }
@@ -15881,7 +16558,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz",
       "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==",
-      "dev": true,
       "requires": {
         "@babel/types": "^7.16.0"
       }
@@ -15890,7 +16566,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz",
       "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==",
-      "dev": true,
       "requires": {
         "@babel/types": "^7.16.0"
       }
@@ -15899,7 +16574,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz",
       "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==",
-      "dev": true,
       "requires": {
         "@babel/types": "^7.16.0"
       }
@@ -15908,7 +16582,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz",
       "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==",
-      "dev": true,
       "requires": {
         "@babel/helper-module-imports": "^7.16.0",
         "@babel/helper-replace-supers": "^7.16.0",
@@ -15924,7 +16597,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz",
       "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==",
-      "dev": true,
       "requires": {
         "@babel/types": "^7.16.0"
       }
@@ -15932,8 +16604,7 @@
     "@babel/helper-plugin-utils": {
       "version": "7.14.5",
       "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz",
-      "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==",
-      "dev": true
+      "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ=="
     },
     "@babel/helper-remap-async-to-generator": {
       "version": "7.16.0",
@@ -15950,7 +16621,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz",
       "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==",
-      "dev": true,
       "requires": {
         "@babel/helper-member-expression-to-functions": "^7.16.0",
         "@babel/helper-optimise-call-expression": "^7.16.0",
@@ -15962,7 +16632,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz",
       "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==",
-      "dev": true,
       "requires": {
         "@babel/types": "^7.16.0"
       }
@@ -15980,7 +16649,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz",
       "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==",
-      "dev": true,
       "requires": {
         "@babel/types": "^7.16.0"
       }
@@ -15988,14 +16656,12 @@
     "@babel/helper-validator-identifier": {
       "version": "7.15.7",
       "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
-      "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==",
-      "dev": true
+      "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w=="
     },
     "@babel/helper-validator-option": {
       "version": "7.14.5",
       "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz",
-      "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==",
-      "dev": true
+      "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow=="
     },
     "@babel/helper-wrap-function": {
       "version": "7.16.0",
@@ -16013,7 +16679,6 @@
       "version": "7.16.3",
       "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz",
       "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==",
-      "dev": true,
       "requires": {
         "@babel/template": "^7.16.0",
         "@babel/traverse": "^7.16.3",
@@ -16024,7 +16689,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz",
       "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==",
-      "dev": true,
       "requires": {
         "@babel/helper-validator-identifier": "^7.15.7",
         "chalk": "^2.0.0",
@@ -16048,8 +16712,7 @@
     "@babel/parser": {
       "version": "7.16.3",
       "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.3.tgz",
-      "integrity": "sha512-dcNwU1O4sx57ClvLBVFbEgx0UZWfd0JQX5X6fxFRCLHelFBGXFfSz6Y0FAq2PEwUqlqLkdVjVr4VASEOuUnLJw==",
-      "dev": true
+      "integrity": "sha512-dcNwU1O4sx57ClvLBVFbEgx0UZWfd0JQX5X6fxFRCLHelFBGXFfSz6Y0FAq2PEwUqlqLkdVjVr4VASEOuUnLJw=="
     },
     "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
       "version": "7.16.2",
@@ -16287,7 +16950,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz",
       "integrity": "sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==",
-      "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.14.5"
       }
@@ -16865,7 +17527,6 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz",
       "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==",
-      "dev": true,
       "requires": {
         "@babel/code-frame": "^7.16.0",
         "@babel/parser": "^7.16.0",
@@ -16876,7 +17537,6 @@
       "version": "7.16.3",
       "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz",
       "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==",
-      "dev": true,
       "requires": {
         "@babel/code-frame": "^7.16.0",
         "@babel/generator": "^7.16.0",
@@ -16893,16 +17553,60 @@
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz",
       "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==",
-      "dev": true,
       "requires": {
         "@babel/helper-validator-identifier": "^7.15.7",
         "to-fast-properties": "^2.0.0"
       }
     },
-    "@date-io/core": {
-      "version": "1.3.13",
-      "resolved": "https://registry.npmjs.org/@date-io/core/-/core-1.3.13.tgz",
-      "integrity": "sha512-AlEKV7TxjeK+jxWVKcCFrfYAk8spX9aCyiToFIiLPtfQbsjmRGLIhb5VZgptQcJdHtLXo7+m0DuurwFgUToQuA=="
+    "@date-io/core": {
+      "version": "1.3.13",
+      "resolved": "https://registry.npmjs.org/@date-io/core/-/core-1.3.13.tgz",
+      "integrity": "sha512-AlEKV7TxjeK+jxWVKcCFrfYAk8spX9aCyiToFIiLPtfQbsjmRGLIhb5VZgptQcJdHtLXo7+m0DuurwFgUToQuA=="
+    },
+    "@date-io/date-fns": {
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.11.0.tgz",
+      "integrity": "sha512-mPQ71plBeFrArvBSHtjWMHXA89IUbZ6kuo2dsjlRC/1uNOybo91spIb+wTu03NxKTl8ut07s0jJ9svF71afpRg==",
+      "requires": {
+        "@date-io/core": "^2.11.0"
+      },
+      "dependencies": {
+        "@date-io/core": {
+          "version": "2.11.0",
+          "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.11.0.tgz",
+          "integrity": "sha512-DvPBnNoeuLaoSJZaxgpu54qzRhRKjSYVyQjhznTFrllKuDpm0sDFjHo6lvNLCM/cfMx2gb2PM2zY2kc9C8nmuw=="
+        }
+      }
+    },
+    "@date-io/dayjs": {
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-2.11.0.tgz",
+      "integrity": "sha512-w67vRK56NZJIKhJM/CrNbfnIcuMvR3ApfxzNZiCZ5w29sxgBDeKuX4M+P7A9r5HXOMGcsOcpgaoTDINNGkdpGQ==",
+      "requires": {
+        "@date-io/core": "^2.11.0"
+      },
+      "dependencies": {
+        "@date-io/core": {
+          "version": "2.11.0",
+          "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.11.0.tgz",
+          "integrity": "sha512-DvPBnNoeuLaoSJZaxgpu54qzRhRKjSYVyQjhznTFrllKuDpm0sDFjHo6lvNLCM/cfMx2gb2PM2zY2kc9C8nmuw=="
+        }
+      }
+    },
+    "@date-io/luxon": {
+      "version": "2.11.1",
+      "resolved": "https://registry.npmjs.org/@date-io/luxon/-/luxon-2.11.1.tgz",
+      "integrity": "sha512-JUXo01kdPQxLORxqdENrgdUhooKgDUggsNRSdi2BcUhASIY2KGwwWXu8ikVHHGkw+DUF4FOEKGfkQd0RHSvX6g==",
+      "requires": {
+        "@date-io/core": "^2.11.0"
+      },
+      "dependencies": {
+        "@date-io/core": {
+          "version": "2.11.0",
+          "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.11.0.tgz",
+          "integrity": "sha512-DvPBnNoeuLaoSJZaxgpu54qzRhRKjSYVyQjhznTFrllKuDpm0sDFjHo6lvNLCM/cfMx2gb2PM2zY2kc9C8nmuw=="
+        }
+      }
     },
     "@date-io/moment": {
       "version": "1.3.13",
@@ -17050,6 +17754,49 @@
       "integrity": "sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA==",
       "dev": true
     },
+    "@emotion/babel-plugin": {
+      "version": "11.7.2",
+      "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz",
+      "integrity": "sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ==",
+      "requires": {
+        "@babel/helper-module-imports": "^7.12.13",
+        "@babel/plugin-syntax-jsx": "^7.12.13",
+        "@babel/runtime": "^7.13.10",
+        "@emotion/hash": "^0.8.0",
+        "@emotion/memoize": "^0.7.5",
+        "@emotion/serialize": "^1.0.2",
+        "babel-plugin-macros": "^2.6.1",
+        "convert-source-map": "^1.5.0",
+        "escape-string-regexp": "^4.0.0",
+        "find-root": "^1.1.0",
+        "source-map": "^0.5.7",
+        "stylis": "4.0.13"
+      },
+      "dependencies": {
+        "@emotion/memoize": {
+          "version": "0.7.5",
+          "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz",
+          "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ=="
+        },
+        "escape-string-regexp": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+          "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
+        }
+      }
+    },
+    "@emotion/cache": {
+      "version": "11.7.1",
+      "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz",
+      "integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==",
+      "requires": {
+        "@emotion/memoize": "^0.7.4",
+        "@emotion/sheet": "^1.1.0",
+        "@emotion/utils": "^1.0.0",
+        "@emotion/weak-memoize": "^0.2.5",
+        "stylis": "4.0.13"
+      }
+    },
     "@emotion/hash": {
       "version": "0.8.0",
       "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
@@ -17067,8 +17814,82 @@
     "@emotion/memoize": {
       "version": "0.7.4",
       "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
-      "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==",
-      "optional": true
+      "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw=="
+    },
+    "@emotion/react": {
+      "version": "11.7.1",
+      "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.7.1.tgz",
+      "integrity": "sha512-DV2Xe3yhkF1yT4uAUoJcYL1AmrnO5SVsdfvu+fBuS7IbByDeTVx9+wFmvx9Idzv7/78+9Mgx2Hcmr7Fex3tIyw==",
+      "requires": {
+        "@babel/runtime": "^7.13.10",
+        "@emotion/cache": "^11.7.1",
+        "@emotion/serialize": "^1.0.2",
+        "@emotion/sheet": "^1.1.0",
+        "@emotion/utils": "^1.0.0",
+        "@emotion/weak-memoize": "^0.2.5",
+        "hoist-non-react-statics": "^3.3.1"
+      }
+    },
+    "@emotion/serialize": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.2.tgz",
+      "integrity": "sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==",
+      "requires": {
+        "@emotion/hash": "^0.8.0",
+        "@emotion/memoize": "^0.7.4",
+        "@emotion/unitless": "^0.7.5",
+        "@emotion/utils": "^1.0.0",
+        "csstype": "^3.0.2"
+      },
+      "dependencies": {
+        "csstype": {
+          "version": "3.0.10",
+          "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz",
+          "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA=="
+        }
+      }
+    },
+    "@emotion/sheet": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz",
+      "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g=="
+    },
+    "@emotion/styled": {
+      "version": "11.6.0",
+      "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.6.0.tgz",
+      "integrity": "sha512-mxVtVyIOTmCAkFbwIp+nCjTXJNgcz4VWkOYQro87jE2QBTydnkiYusMrRGFtzuruiGK4dDaNORk4gH049iiQuw==",
+      "requires": {
+        "@babel/runtime": "^7.13.10",
+        "@emotion/babel-plugin": "^11.3.0",
+        "@emotion/is-prop-valid": "^1.1.1",
+        "@emotion/serialize": "^1.0.2",
+        "@emotion/utils": "^1.0.0"
+      },
+      "dependencies": {
+        "@emotion/is-prop-valid": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.1.tgz",
+          "integrity": "sha512-bW1Tos67CZkOURLc0OalnfxtSXQJMrAMV0jZTVGJUPSOd4qgjF3+tTD5CwJM13PHA8cltGW1WGbbvV9NpvUZPw==",
+          "requires": {
+            "@emotion/memoize": "^0.7.4"
+          }
+        }
+      }
+    },
+    "@emotion/unitless": {
+      "version": "0.7.5",
+      "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
+      "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
+    },
+    "@emotion/utils": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz",
+      "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA=="
+    },
+    "@emotion/weak-memoize": {
+      "version": "0.2.5",
+      "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz",
+      "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA=="
     },
     "@eslint/eslintrc": {
       "version": "0.3.0",
@@ -17650,6 +18471,196 @@
         }
       }
     },
+    "@mui/base": {
+      "version": "5.0.0-alpha.64",
+      "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.64.tgz",
+      "integrity": "sha512-lqUFbAyYPl3uDaTxGWIUWx9Zin5APv5Rrn/oUcnm/71Isd5dJ94zoGHCTdNy2sxhDRcXRshsdC2dfdwIWxhkZA==",
+      "requires": {
+        "@babel/runtime": "^7.16.3",
+        "@emotion/is-prop-valid": "^1.1.1",
+        "@mui/utils": "^5.2.3",
+        "@popperjs/core": "^2.4.4",
+        "clsx": "^1.1.1",
+        "prop-types": "^15.7.2",
+        "react-is": "^17.0.2"
+      },
+      "dependencies": {
+        "@emotion/is-prop-valid": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.1.tgz",
+          "integrity": "sha512-bW1Tos67CZkOURLc0OalnfxtSXQJMrAMV0jZTVGJUPSOd4qgjF3+tTD5CwJM13PHA8cltGW1WGbbvV9NpvUZPw==",
+          "requires": {
+            "@emotion/memoize": "^0.7.4"
+          }
+        }
+      }
+    },
+    "@mui/icons-material": {
+      "version": "5.2.5",
+      "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.2.5.tgz",
+      "integrity": "sha512-uQiUz+l0xy+2jExyKyU19MkMAR2F7bQFcsQ5hdqAtsB14Jw2zlmIAD55mV6f0NxKCut7Rx6cA3ZpfzlzAfoK8Q==",
+      "requires": {
+        "@babel/runtime": "^7.16.3"
+      }
+    },
+    "@mui/lab": {
+      "version": "5.0.0-alpha.64",
+      "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.64.tgz",
+      "integrity": "sha512-YqTWT4TBHSGyV3dS4/TQctpKh0s4CDgWNrA2UnEnXFAfXmFET2Zm6W06fJ1VZDmJfyCVD8Wq0WsiwVZj4ay+Uw==",
+      "requires": {
+        "@babel/runtime": "^7.16.3",
+        "@date-io/date-fns": "^2.11.0",
+        "@date-io/dayjs": "^2.11.0",
+        "@date-io/luxon": "^2.11.1",
+        "@date-io/moment": "^2.11.0",
+        "@mui/base": "5.0.0-alpha.64",
+        "@mui/system": "^5.2.8",
+        "@mui/utils": "^5.2.3",
+        "clsx": "^1.1.1",
+        "prop-types": "^15.7.2",
+        "react-is": "^17.0.2",
+        "react-transition-group": "^4.4.2",
+        "rifm": "^0.12.1"
+      },
+      "dependencies": {
+        "@date-io/core": {
+          "version": "2.11.0",
+          "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.11.0.tgz",
+          "integrity": "sha512-DvPBnNoeuLaoSJZaxgpu54qzRhRKjSYVyQjhznTFrllKuDpm0sDFjHo6lvNLCM/cfMx2gb2PM2zY2kc9C8nmuw=="
+        },
+        "@date-io/moment": {
+          "version": "2.11.0",
+          "resolved": "https://registry.npmjs.org/@date-io/moment/-/moment-2.11.0.tgz",
+          "integrity": "sha512-QSL+83qezQ9Ty0dtFgAkk6eC0GMl/lgYfDajeVUDB3zVA2A038hzczRLBg29ifnBGhQMPABxuOafgWwhDjlarg==",
+          "requires": {
+            "@date-io/core": "^2.11.0"
+          }
+        },
+        "rifm": {
+          "version": "0.12.1",
+          "resolved": "https://registry.npmjs.org/rifm/-/rifm-0.12.1.tgz",
+          "integrity": "sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg==",
+          "requires": {}
+        }
+      }
+    },
+    "@mui/material": {
+      "version": "5.2.8",
+      "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.2.8.tgz",
+      "integrity": "sha512-GYNYoTDw3C07D1rkB9pTS3xMH3gL0p3kb27SVMrMqP3AWrFxfrS73OnsonJh6Uy/F22pYX6rJxiFOhPq5+i4Eg==",
+      "requires": {
+        "@babel/runtime": "^7.16.3",
+        "@mui/base": "5.0.0-alpha.64",
+        "@mui/system": "^5.2.8",
+        "@mui/types": "^7.1.0",
+        "@mui/utils": "^5.2.3",
+        "@types/react-transition-group": "^4.4.4",
+        "clsx": "^1.1.1",
+        "csstype": "^3.0.10",
+        "hoist-non-react-statics": "^3.3.2",
+        "prop-types": "^15.7.2",
+        "react-is": "^17.0.2",
+        "react-transition-group": "^4.4.2"
+      },
+      "dependencies": {
+        "csstype": {
+          "version": "3.0.10",
+          "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz",
+          "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA=="
+        }
+      }
+    },
+    "@mui/private-theming": {
+      "version": "5.2.3",
+      "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.2.3.tgz",
+      "integrity": "sha512-Lc1Cmu8lSsYZiXADi9PBb17Ho82ZbseHQujUFAcp6bCJ5x/d+87JYCIpCBMagPu/isRlFCwbziuXPmz7WOzJPQ==",
+      "requires": {
+        "@babel/runtime": "^7.16.3",
+        "@mui/utils": "^5.2.3",
+        "prop-types": "^15.7.2"
+      }
+    },
+    "@mui/styled-engine": {
+      "version": "5.2.6",
+      "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.2.6.tgz",
+      "integrity": "sha512-bqAhli8eGS6v2qxivy2/4K0Ag8o//jsu1G2G6QcieFiT6y7oIF/nd/6Tvw6OSm3roOTifVQWNKwkt1yFWhGS+w==",
+      "requires": {
+        "@babel/runtime": "^7.16.3",
+        "@emotion/cache": "^11.7.1",
+        "prop-types": "^15.7.2"
+      }
+    },
+    "@mui/styles": {
+      "version": "5.2.3",
+      "resolved": "https://registry.npmjs.org/@mui/styles/-/styles-5.2.3.tgz",
+      "integrity": "sha512-Art4qjlEI9H2h34mLL8s+CE9nWZWZbuJLbNpievaIM6DGuayz3DYkJHcH5mXJYFPhTNoe9IQYbpyKofjE0YVag==",
+      "requires": {
+        "@babel/runtime": "^7.16.3",
+        "@emotion/hash": "^0.8.0",
+        "@mui/private-theming": "^5.2.3",
+        "@mui/types": "^7.1.0",
+        "@mui/utils": "^5.2.3",
+        "clsx": "^1.1.1",
+        "csstype": "^3.0.10",
+        "hoist-non-react-statics": "^3.3.2",
+        "jss": "^10.8.2",
+        "jss-plugin-camel-case": "^10.8.2",
+        "jss-plugin-default-unit": "^10.8.2",
+        "jss-plugin-global": "^10.8.2",
+        "jss-plugin-nested": "^10.8.2",
+        "jss-plugin-props-sort": "^10.8.2",
+        "jss-plugin-rule-value-function": "^10.8.2",
+        "jss-plugin-vendor-prefixer": "^10.8.2",
+        "prop-types": "^15.7.2"
+      },
+      "dependencies": {
+        "csstype": {
+          "version": "3.0.10",
+          "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz",
+          "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA=="
+        }
+      }
+    },
+    "@mui/system": {
+      "version": "5.2.8",
+      "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.2.8.tgz",
+      "integrity": "sha512-tje1HRubQUk+cDJBG5F83X1j0XzVe+qhellKxByrJVOEEDHoSpbc8UW+NCLSuBBHvOikxihuv3SS4VOWOo2/BQ==",
+      "requires": {
+        "@babel/runtime": "^7.16.3",
+        "@mui/private-theming": "^5.2.3",
+        "@mui/styled-engine": "^5.2.6",
+        "@mui/types": "^7.1.0",
+        "@mui/utils": "^5.2.3",
+        "clsx": "^1.1.1",
+        "csstype": "^3.0.10",
+        "prop-types": "^15.7.2"
+      },
+      "dependencies": {
+        "csstype": {
+          "version": "3.0.10",
+          "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz",
+          "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA=="
+        }
+      }
+    },
+    "@mui/types": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.1.0.tgz",
+      "integrity": "sha512-Hh7ALdq/GjfIwLvqH3XftuY3bcKhupktTm+S6qRIDGOtPtRuq2L21VWzOK4p7kblirK0XgGVH5BLwa6u8z/6QQ==",
+      "requires": {}
+    },
+    "@mui/utils": {
+      "version": "5.2.3",
+      "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.2.3.tgz",
+      "integrity": "sha512-sQujlajIS0zQKcGIS6tZR0L1R+ib26B6UtuEn+cZqwKHsPo3feuS+SkdscYBdcCdMbrZs4gj8WIJHl2z6tbSzQ==",
+      "requires": {
+        "@babel/runtime": "^7.16.3",
+        "@types/prop-types": "^15.7.4",
+        "@types/react-is": "^16.7.1 || ^17.0.0",
+        "prop-types": "^15.7.2",
+        "react-is": "^17.0.2"
+      }
+    },
     "@nicolo-ribaudo/chokidar-2": {
       "version": "2.1.8-no-fsevents.3",
       "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz",
@@ -17836,6 +18847,15 @@
         "@types/node": "*"
       }
     },
+    "@types/bonjour": {
+      "version": "3.5.10",
+      "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz",
+      "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
     "@types/connect": {
       "version": "3.4.35",
       "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
@@ -17844,6 +18864,16 @@
         "@types/node": "*"
       }
     },
+    "@types/connect-history-api-fallback": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz",
+      "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==",
+      "dev": true,
+      "requires": {
+        "@types/express-serve-static-core": "*",
+        "@types/node": "*"
+      }
+    },
     "@types/d3": {
       "version": "6.7.5",
       "resolved": "https://registry.npmjs.org/@types/d3/-/d3-6.7.5.tgz",
@@ -18228,6 +19258,11 @@
       "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz",
       "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw=="
     },
+    "@types/parse-json": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
+      "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
+    },
     "@types/polylabel": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/@types/polylabel/-/polylabel-1.0.5.tgz",
@@ -18265,6 +19300,14 @@
         }
       }
     },
+    "@types/react-is": {
+      "version": "17.0.3",
+      "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz",
+      "integrity": "sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==",
+      "requires": {
+        "@types/react": "*"
+      }
+    },
     "@types/react-redux": {
       "version": "7.1.20",
       "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.20.tgz",
@@ -18304,6 +19347,15 @@
       "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
       "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
     },
+    "@types/serve-index": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz",
+      "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==",
+      "dev": true,
+      "requires": {
+        "@types/express": "*"
+      }
+    },
     "@types/serve-static": {
       "version": "1.13.10",
       "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
@@ -18313,6 +19365,15 @@
         "@types/node": "*"
       }
     },
+    "@types/sockjs": {
+      "version": "0.3.33",
+      "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz",
+      "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
     "@types/source-list-map": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz",
@@ -18401,6 +19462,15 @@
         }
       }
     },
+    "@types/ws": {
+      "version": "8.2.2",
+      "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz",
+      "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
     "@webassemblyjs/ast": {
       "version": "1.11.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
@@ -19020,6 +20090,16 @@
         "object.assign": "^4.1.0"
       }
     },
+    "babel-plugin-macros": {
+      "version": "2.8.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz",
+      "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==",
+      "requires": {
+        "@babel/runtime": "^7.7.2",
+        "cosmiconfig": "^6.0.0",
+        "resolve": "^1.12.0"
+      }
+    },
     "babel-plugin-polyfill-corejs2": {
       "version": "0.2.3",
       "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz",
@@ -19238,7 +20318,6 @@
       "version": "4.17.6",
       "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.6.tgz",
       "integrity": "sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==",
-      "dev": true,
       "requires": {
         "caniuse-lite": "^1.0.30001274",
         "electron-to-chromium": "^1.3.886",
@@ -19309,8 +20388,7 @@
     "callsites": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
-      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
-      "dev": true
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
     },
     "camel-case": {
       "version": "4.1.2",
@@ -19325,8 +20403,7 @@
     "caniuse-lite": {
       "version": "1.0.30001279",
       "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001279.tgz",
-      "integrity": "sha512-VfEHpzHEXj6/CxggTwSFoZBBYGQfQv9Cf42KPlO79sWXCD1QNKWKsKzFeWL7QpZHJQYAvocqV6Rty1yJMkqWLQ==",
-      "dev": true
+      "integrity": "sha512-VfEHpzHEXj6/CxggTwSFoZBBYGQfQv9Cf42KPlO79sWXCD1QNKWKsKzFeWL7QpZHJQYAvocqV6Rty1yJMkqWLQ=="
     },
     "cartocolor": {
       "version": "4.0.2",
@@ -19877,6 +20954,31 @@
       "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
       "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
     },
+    "cosmiconfig": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
+      "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+      "requires": {
+        "@types/parse-json": "^4.0.0",
+        "import-fresh": "^3.1.0",
+        "parse-json": "^5.0.0",
+        "path-type": "^4.0.0",
+        "yaml": "^1.7.2"
+      },
+      "dependencies": {
+        "parse-json": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+          "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+          "requires": {
+            "@babel/code-frame": "^7.0.0",
+            "error-ex": "^1.3.1",
+            "json-parse-even-better-errors": "^2.3.0",
+            "lines-and-columns": "^1.1.6"
+          }
+        }
+      }
+    },
     "crc-32": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz",
@@ -20535,7 +21637,6 @@
       "version": "4.3.2",
       "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
       "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
-      "dev": true,
       "requires": {
         "ms": "2.1.2"
       }
@@ -20887,8 +21988,7 @@
     "electron-to-chromium": {
       "version": "1.3.893",
       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.893.tgz",
-      "integrity": "sha512-ChtwF7qB03INq1SyMpue08wc6cve+ktj2UC/Y7se9vB+JryfzziJeYwsgb8jLaCA5GMkHCdn5M62PfSMWhifZg==",
-      "dev": true
+      "integrity": "sha512-ChtwF7qB03INq1SyMpue08wc6cve+ktj2UC/Y7se9vB+JryfzziJeYwsgb8jLaCA5GMkHCdn5M62PfSMWhifZg=="
     },
     "emoji-regex": {
       "version": "8.0.0",
@@ -20941,7 +22041,6 @@
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
       "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
-      "dev": true,
       "requires": {
         "is-arrayish": "^0.2.1"
       }
@@ -21067,8 +22166,7 @@
     "escalade": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
-      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
-      "dev": true
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
     },
     "escape-html": {
       "version": "1.0.3",
@@ -21969,6 +23067,11 @@
         "array-back": "^3.0.1"
       }
     },
+    "find-root": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
+      "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
+    },
     "find-up": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
@@ -22016,9 +23119,9 @@
       "dev": true
     },
     "follow-redirects": {
-      "version": "1.14.5",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz",
-      "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA=="
+      "version": "1.14.7",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz",
+      "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ=="
     },
     "fontkit": {
       "version": "1.8.1",
@@ -22146,8 +23249,7 @@
     "gensync": {
       "version": "1.0.0-beta.2",
       "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
-      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
-      "dev": true
+      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="
     },
     "geojson-vt": {
       "version": "3.2.1",
@@ -22233,8 +23335,7 @@
     "globals": {
       "version": "11.12.0",
       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-      "dev": true
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
     },
     "globby": {
       "version": "11.0.4",
@@ -22276,12 +23377,12 @@
       }
     },
     "google-p12-pem": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.2.tgz",
-      "integrity": "sha512-tjf3IQIt7tWCDsa0ofDQ1qqSCNzahXDxdAGJDbruWqu3eCg5CKLYKN+hi0s6lfvzYZ1GDVr+oDF9OOWlDSdf0A==",
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.3.tgz",
+      "integrity": "sha512-MC0jISvzymxePDVembypNefkAQp+DRP7dBE+zNUPaIjEspIlYg0++OrsNr248V9tPbz6iqtZ7rX1hxWA5B8qBQ==",
       "dev": true,
       "requires": {
-        "node-forge": "^0.10.0"
+        "node-forge": "^1.0.0"
       }
     },
     "googleapis": {
@@ -22773,7 +23874,6 @@
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
       "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
-      "dev": true,
       "requires": {
         "parent-module": "^1.0.0",
         "resolve-from": "^4.0.0"
@@ -22963,8 +24063,7 @@
     "is-arrayish": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
-      "dev": true
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
     },
     "is-bigint": {
       "version": "1.0.4",
@@ -23241,8 +24340,7 @@
     "jsesc": {
       "version": "2.5.2",
       "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
-      "dev": true
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
     },
     "json-bigint": {
       "version": "1.0.0",
@@ -23264,6 +24362,11 @@
       "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
       "dev": true
     },
+    "json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+    },
     "json-schema-ref-parser": {
       "version": "9.0.9",
       "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz",
@@ -23287,7 +24390,6 @@
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
       "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
-      "dev": true,
       "requires": {
         "minimist": "^1.2.5"
       }
@@ -23508,6 +24610,11 @@
         }
       }
     },
+    "lines-and-columns": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
+    },
     "load-json-file": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
@@ -23746,9 +24853,9 @@
       "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="
     },
     "memfs": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.3.0.tgz",
-      "integrity": "sha512-BEE62uMfKOavX3iG7GYX43QJ+hAeeWnwIAuJ/R6q96jaMtiLzhsxHJC8B1L7fK7Pt/vXDRwb3SG/yBpNGDPqzg==",
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz",
+      "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==",
       "dev": true,
       "requires": {
         "fs-monkey": "1.0.3"
@@ -23880,8 +24987,7 @@
     "ms": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
     },
     "multer": {
       "version": "1.4.3",
@@ -24007,9 +25113,9 @@
       }
     },
     "node-forge": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
-      "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz",
+      "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==",
       "dev": true
     },
     "node-modules-regexp": {
@@ -24021,8 +25127,7 @@
     "node-releases": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
-      "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==",
-      "dev": true
+      "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA=="
     },
     "normalize-package-data": {
       "version": "2.5.0",
@@ -24307,7 +25412,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
       "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
-      "dev": true,
       "requires": {
         "callsites": "^3.0.0"
       }
@@ -24380,8 +25484,7 @@
     "path-type": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-      "dev": true
+      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
     },
     "pbf": {
       "version": "3.2.1",
@@ -24433,8 +25536,7 @@
     "picocolors": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
-      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
-      "dev": true
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
     },
     "picomatch": {
       "version": "2.3.0",
@@ -25485,9 +26587,9 @@
       "dev": true
     },
     "reselect": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.2.tgz",
-      "integrity": "sha512-wg60ebcPOtxcptIUfrr7Jt3h4BR86cCW3R7y4qt65lnNb4yz4QgrXcbSioVsIOYguyz42+XTHIyJ5TEruzkFgQ=="
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.5.tgz",
+      "integrity": "sha512-uVdlz8J7OO+ASpBYoz1Zypgx0KasCY20H+N8JD13oUMtPvSHQuscrHop4KbXrbsBcdB9Ds7lVK7eRkBIfO43vQ=="
     },
     "resize-observer-polyfill": {
       "version": "1.5.1",
@@ -25523,8 +26625,7 @@
     "resolve-from": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
-      "dev": true
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
     },
     "resolve-pathname": {
       "version": "3.0.0",
@@ -25760,19 +26861,18 @@
       "dev": true
     },
     "selfsigned": {
-      "version": "1.10.11",
-      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz",
-      "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz",
+      "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==",
       "dev": true,
       "requires": {
-        "node-forge": "^0.10.0"
+        "node-forge": "^1.2.0"
       }
     },
     "semver": {
       "version": "6.3.0",
       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "dev": true
+      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
     },
     "send": {
       "version": "0.17.1",
@@ -26582,9 +27682,9 @@
       }
     },
     "stylis": {
-      "version": "4.0.10",
-      "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.10.tgz",
-      "integrity": "sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg=="
+      "version": "4.0.13",
+      "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz",
+      "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag=="
     },
     "subscribe-event": {
       "version": "1.1.1",
@@ -26926,8 +28026,7 @@
     "to-fast-properties": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
-      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
-      "dev": true
+      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
     },
     "to-regex-range": {
       "version": "5.0.1",
@@ -27115,30 +28214,6 @@
         "punycode": "^2.1.0"
       }
     },
-    "url": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
-      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
-      "dev": true,
-      "requires": {
-        "punycode": "1.3.2",
-        "querystring": "0.2.0"
-      },
-      "dependencies": {
-        "punycode": {
-          "version": "1.3.2",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
-          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
-          "dev": true
-        },
-        "querystring": {
-          "version": "0.2.0",
-          "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
-          "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
-          "dev": true
-        }
-      }
-    },
     "url-template": {
       "version": "2.0.8",
       "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz",
@@ -27466,37 +28541,70 @@
       }
     },
     "webpack-dev-middleware": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.2.1.tgz",
-      "integrity": "sha512-Kx1X+36Rn9JaZcQMrJ7qN3PMAuKmEDD9ZISjUj3Cgq4A6PtwYsC4mpaKotSRYH3iOF6HsUa8viHKS59FlyVifQ==",
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz",
+      "integrity": "sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg==",
       "dev": true,
       "requires": {
         "colorette": "^2.0.10",
         "memfs": "^3.2.2",
         "mime-types": "^2.1.31",
         "range-parser": "^1.2.1",
-        "schema-utils": "^3.1.0"
+        "schema-utils": "^4.0.0"
       },
       "dependencies": {
+        "ajv": {
+          "version": "8.9.0",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz",
+          "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "json-schema-traverse": "^1.0.0",
+            "require-from-string": "^2.0.2",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "ajv-keywords": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+          "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^3.1.3"
+          }
+        },
+        "json-schema-traverse": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+          "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+          "dev": true
+        },
         "schema-utils": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
-          "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
+          "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
           "dev": true,
           "requires": {
-            "@types/json-schema": "^7.0.8",
-            "ajv": "^6.12.5",
-            "ajv-keywords": "^3.5.2"
+            "@types/json-schema": "^7.0.9",
+            "ajv": "^8.8.0",
+            "ajv-formats": "^2.1.1",
+            "ajv-keywords": "^5.0.0"
           }
         }
       }
     },
     "webpack-dev-server": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.6.0.tgz",
-      "integrity": "sha512-oojcBIKvx3Ya7qs1/AVWHDgmP1Xml8rGsEBnSobxU/UJSX1xP1GPM3MwsAnDzvqcVmVki8tV7lbcsjEjk0PtYg==",
+      "version": "4.7.3",
+      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz",
+      "integrity": "sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q==",
       "dev": true,
       "requires": {
+        "@types/bonjour": "^3.5.9",
+        "@types/connect-history-api-fallback": "^1.3.5",
+        "@types/serve-index": "^1.9.1",
+        "@types/sockjs": "^0.3.33",
+        "@types/ws": "^8.2.2",
         "ansi-html-community": "^0.0.8",
         "bonjour": "^3.5.0",
         "chokidar": "^3.5.2",
@@ -27514,13 +28622,12 @@
         "p-retry": "^4.5.0",
         "portfinder": "^1.0.28",
         "schema-utils": "^4.0.0",
-        "selfsigned": "^1.10.11",
+        "selfsigned": "^2.0.0",
         "serve-index": "^1.9.1",
         "sockjs": "^0.3.21",
         "spdy": "^4.0.2",
         "strip-ansi": "^7.0.0",
-        "url": "^0.11.0",
-        "webpack-dev-middleware": "^5.2.1",
+        "webpack-dev-middleware": "^5.3.0",
         "ws": "^8.1.0"
       },
       "dependencies": {
@@ -27839,6 +28946,11 @@
       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
       "dev": true
     },
+    "yaml": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
+    },
     "yargs": {
       "version": "16.2.0",
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
diff --git a/package.json b/package.json
index 1b13decd5b4664601bc7adf1a919cc970a4c1e38..fb9c1cc19a1d297a7a3e51e27c27cd35858dcfde 100644
--- a/package.json
+++ b/package.json
@@ -25,9 +25,15 @@
     "@amcharts/amcharts5": "^5.0.3",
     "@babel/runtime": "^7.15.4",
     "@date-io/moment": "^1.3.11",
+    "@emotion/react": "^11.7.1",
+    "@emotion/styled": "^11.6.0",
     "@material-ui/core": "^4.12.3",
     "@material-ui/icons": "^4.11.2",
     "@material-ui/pickers": "^3.3.10",
+    "@mui/icons-material": "^5.2.5",
+    "@mui/lab": "^5.0.0-alpha.64",
+    "@mui/material": "^5.2.8",
+    "@mui/styles": "^5.2.3",
     "@nosferatu500/react-sortable-tree": "^3.0.5",
     "@shakacode/recompose": "^0.30.3",
     "@turf/buffer": "^6.3.0",
@@ -72,7 +78,7 @@
     "react-sortable-tree-theme-file-explorer": "git+https://github.com/SemanticComputing/react-sortable-tree-theme-file-explorer.git#e60a5a73b4c5892b1dcd598a27a72bd3ebbd5e96",
     "react-virtualized": "^9.22.3",
     "react-wordcloud": "^1.2.7",
-    "redux": "^4.1.0",
+    "redux": "^4.1.2",
     "redux-observable": "^2.0.0",
     "reselect": "^4.0.0",
     "rxjs": "^7.2.0",
diff --git a/src/client/components/App.js b/src/client/components/App.js
index 15d5caeae448e4859362c3564910734ef59a897e..cf785afd49b166a8efb41cc0d5b1a396af96f8a2 100644
--- a/src/client/components/App.js
+++ b/src/client/components/App.js
@@ -1,7 +1,11 @@
 import React from 'react'
-import { MuiThemeProvider, createTheme } from '@material-ui/core/styles'
+import { ThemeProvider, StyledEngineProvider, createTheme } from '@mui/material/styles'
+import AdapterMoment from '@mui/lab/AdapterDateFns'
+import LocalizationProvider from '@mui/lab/LocalizationProvider'
+// import 'moment/locale/fi'
 import SemanticPortal from '../containers/SemanticPortal'
 import portalConfig from '../../configs/portalConfig.json'
+
 const { colorPalette } = portalConfig.layoutConfig
 
 const theme = createTheme({
@@ -13,7 +17,7 @@ const theme = createTheme({
       main: colorPalette.secondary.main
     }
   },
-  overrides: {
+  components: {
     MuiTooltip: {
       tooltip: {
         fontSize: '1 rem'
@@ -59,9 +63,13 @@ const theme = createTheme({
 })
 
 const App = () => (
-  <MuiThemeProvider theme={theme}>
-    <SemanticPortal />
-  </MuiThemeProvider>
+  <LocalizationProvider dateAdapter={AdapterMoment}>
+    <StyledEngineProvider injectFirst>
+      <ThemeProvider theme={theme}>
+        <SemanticPortal />
+      </ThemeProvider>
+    </StyledEngineProvider>
+  </LocalizationProvider>
 )
 
 export default App
diff --git a/src/client/components/facet_bar/ChartDialog.js b/src/client/components/facet_bar/ChartDialog.js
index 899e6a4bfcac0d2743d91b6d95adb4467fc9b2eb..7a83ee0f23ed36c19ad544e1c0fadb651474c3d5 100644
--- a/src/client/components/facet_bar/ChartDialog.js
+++ b/src/client/components/facet_bar/ChartDialog.js
@@ -1,10 +1,10 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import IconButton from '@material-ui/core/IconButton'
-import Tooltip from '@material-ui/core/Tooltip'
+import IconButton from '@mui/material/IconButton'
+import Tooltip from '@mui/material/Tooltip'
 import GeneralDialog from '../main_layout/GeneralDialog'
 import ApexCharts from '../facet_results/ApexCharts'
-import { makeStyles } from '@material-ui/core/styles'
+import makeStyles from '@mui/styles/makeStyles';
 
 const useStyles = makeStyles(theme => ({
   chartContainer: {
@@ -33,41 +33,39 @@ const ChartDialog = props => {
     setOpen(false)
   }
 
-  return (
-    <>
-      <Tooltip disableFocusListener title={tooltip}>
-        <IconButton
-          aria-label={tooltip}
-          aria-owns={open ? 'facet-option-menu' : undefined}
-          aria-haspopup='true'
-          onClick={handleClickOpen}
-        >
-          {props.icon}
-        </IconButton>
-      </Tooltip>
-      <GeneralDialog
-        open={open}
-        onClose={handleClose}
-        dialogTitle={props.dialogTitle}
-      >
-        <div className={classes.chartContainer}>
-          <ApexCharts
-            portalConfig={props.portalConfig}
-            perspectiveConfig={props.perspectiveConfig}
-            apexChartsConfig={props.apexChartsConfig}
-            results={results}
-            resultUpdateID={resultUpdateID}
-            fetching={fetching}
-            fetchData={fetchData}
-            resultClass={resultClass}
-            facetClass={facetClass}
-            facetID={facetID}
-            resultClassConfig={resultClassConfig}
-          />
-        </div>
-      </GeneralDialog>
-    </>
-  )
+  return <>
+    <Tooltip disableFocusListener title={tooltip}>
+      <IconButton
+        aria-label={tooltip}
+        aria-owns={open ? 'facet-option-menu' : undefined}
+        aria-haspopup='true'
+        onClick={handleClickOpen}
+        size="large">
+        {props.icon}
+      </IconButton>
+    </Tooltip>
+    <GeneralDialog
+      open={open}
+      onClose={handleClose}
+      dialogTitle={props.dialogTitle}
+    >
+      <div className={classes.chartContainer}>
+        <ApexCharts
+          portalConfig={props.portalConfig}
+          perspectiveConfig={props.perspectiveConfig}
+          apexChartsConfig={props.apexChartsConfig}
+          results={results}
+          resultUpdateID={resultUpdateID}
+          fetching={fetching}
+          fetchData={fetchData}
+          resultClass={resultClass}
+          facetClass={facetClass}
+          facetID={facetID}
+          resultClassConfig={resultClassConfig}
+        />
+      </div>
+    </GeneralDialog>
+  </>;
 }
 
 ChartDialog.propTypes = {
diff --git a/src/client/components/facet_bar/ChipsArray.js b/src/client/components/facet_bar/ChipsArray.js
index ea2898f890596eccbf2e744ecde978b2aff7babc..2e28f5260c2cd1444894605d2e8f805f81ca8333 100644
--- a/src/client/components/facet_bar/ChipsArray.js
+++ b/src/client/components/facet_bar/ChipsArray.js
@@ -1,8 +1,8 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import { withStyles } from '@material-ui/core/styles'
-import Chip from '@material-ui/core/Chip'
-import Tooltip from '@material-ui/core/Tooltip'
+import withStyles from '@mui/styles/withStyles';
+import Chip from '@mui/material/Chip'
+import Tooltip from '@mui/material/Tooltip'
 import { ISOStringToYear } from './FacetHelpers'
 
 const styles = theme => ({
diff --git a/src/client/components/facet_bar/DatasetSelector.js b/src/client/components/facet_bar/DatasetSelector.js
index 1bd28339aaa086b6efb9d4e7cb893c27e6b6e527..b8844501bb03373e85cf0b4b0a80516d2500bc84 100644
--- a/src/client/components/facet_bar/DatasetSelector.js
+++ b/src/client/components/facet_bar/DatasetSelector.js
@@ -1,13 +1,13 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import { withStyles } from '@material-ui/core/styles'
+import withStyles from '@mui/styles/withStyles';
 import intl from 'react-intl-universal'
-import FormControlLabel from '@material-ui/core/FormControlLabel'
-import FormControl from '@material-ui/core/FormControl'
-// import FormLabel from '@material-ui/core/FormLabel';
-import FormGroup from '@material-ui/core/FormGroup'
-import Checkbox from '@material-ui/core/Checkbox'
-import InfoIcon from '@material-ui/icons/Info'
+import FormControlLabel from '@mui/material/FormControlLabel'
+import FormControl from '@mui/material/FormControl'
+// import FormLabel from '@mui/material/FormLabel';
+import FormGroup from '@mui/material/FormGroup'
+import Checkbox from '@mui/material/Checkbox'
+import InfoIcon from '@mui/icons-material/Info'
 
 const styles = theme => ({
   root: {
@@ -20,7 +20,7 @@ const styles = theme => ({
   },
   formControlLabelRoot: {
     width: '100%',
-    [theme.breakpoints.down('md')]: {
+    [theme.breakpoints.down('lg')]: {
       marginBottom: theme.spacing(1)
     }
   },
diff --git a/src/client/components/facet_bar/DateFacet.js b/src/client/components/facet_bar/DateFacet.js
index 270e3a5faee11ab2d5c2f3c25b2f91a09dbb484d..7036902dae986af4172bf77f5f4fadcf27deb3b7 100644
--- a/src/client/components/facet_bar/DateFacet.js
+++ b/src/client/components/facet_bar/DateFacet.js
@@ -1,10 +1,10 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import { withStyles } from '@material-ui/core/styles'
+import withStyles from '@mui/styles/withStyles';
 import { KeyboardDatePicker } from '@material-ui/pickers'
 import moment from 'moment'
 import intl from 'react-intl-universal'
-import FormHelperText from '@material-ui/core/FormHelperText'
+import FormHelperText from '@mui/material/FormHelperText'
 import classNames from 'classnames'
 
 const styles = theme => ({
diff --git a/src/client/components/facet_bar/FacetBar.js b/src/client/components/facet_bar/FacetBar.js
index db93363918d9f5988e747e11eff53eee8f9f047c..1399e23e52de03fdbecb225972f871342dd415f9 100644
--- a/src/client/components/facet_bar/FacetBar.js
+++ b/src/client/components/facet_bar/FacetBar.js
@@ -1,23 +1,23 @@
 import React from 'react'
 import PropTypes from 'prop-types'
 import intl from 'react-intl-universal'
-import { withStyles } from '@material-ui/core/styles'
+import withStyles from '@mui/styles/withStyles';
 import HierarchicalFacet from './HierarchicalFacet'
 import TextFacet from './TextFacet'
 import SliderFacet from './SliderFacet'
 import RangeFacet from './RangeFacet'
 import DateFacet from './DateFacet'
-import Paper from '@material-ui/core/Paper'
+import Paper from '@mui/material/Paper'
 import FacetHeader from './FacetHeader'
 import FacetInfo from './FacetInfo'
 import DatasetSelector from './DatasetSelector'
 import SearchField from './SearchField'
 import LeafletMapDialog from './LeafletMapDialog'
-import Accordion from '@material-ui/core/Accordion'
-import AccordionSummary from '@material-ui/core/AccordionSummary'
-import AccordionDetails from '@material-ui/core/AccordionDetails'
-import ExpandMoreIcon from '@material-ui/icons/ExpandMore'
-import Typography from '@material-ui/core/Typography'
+import Accordion from '@mui/material/Accordion'
+import AccordionSummary from '@mui/material/AccordionSummary'
+import AccordionDetails from '@mui/material/AccordionDetails'
+import ExpandMoreIcon from '@mui/icons-material/ExpandMore'
+import Typography from '@mui/material/Typography'
 import clsx from 'clsx'
 import { has } from 'lodash'
 
diff --git a/src/client/components/facet_bar/FacetHeader.js b/src/client/components/facet_bar/FacetHeader.js
index b0cdf467ed5f3a6d1a41586a37c9ddf4567f222a..be2577cc7d7f7c49fd441001a80af5b5c38d85aa 100644
--- a/src/client/components/facet_bar/FacetHeader.js
+++ b/src/client/components/facet_bar/FacetHeader.js
@@ -1,20 +1,20 @@
 import React from 'react'
 import PropTypes from 'prop-types'
 import intl from 'react-intl-universal'
-import { withStyles } from '@material-ui/core/styles'
-import IconButton from '@material-ui/core/IconButton'
-import Tooltip from '@material-ui/core/Tooltip'
-import Menu from '@material-ui/core/Menu'
-import MenuItem from '@material-ui/core/MenuItem'
-import MoreVertIcon from '@material-ui/icons/MoreVert'
-import Typography from '@material-ui/core/Typography'
-import InfoIcon from '@material-ui/icons/InfoOutlined'
-import ListSubheader from '@material-ui/core/ListSubheader'
+import withStyles from '@mui/styles/withStyles';
+import IconButton from '@mui/material/IconButton'
+import Tooltip from '@mui/material/Tooltip'
+import Menu from '@mui/material/Menu'
+import MenuItem from '@mui/material/MenuItem'
+import MoreVertIcon from '@mui/icons-material/MoreVert'
+import Typography from '@mui/material/Typography'
+import InfoIcon from '@mui/icons-material/InfoOutlined'
+import ListSubheader from '@mui/material/ListSubheader'
 import history from '../../History'
 import ChartDialog from './ChartDialog'
-import PieChartIcon from '@material-ui/icons/PieChart'
-import LineChartIcon from '@material-ui/icons/ShowChart'
-import BarChartIcon from '@material-ui/icons/BarChart'
+import PieChartIcon from '@mui/icons-material/PieChart'
+import LineChartIcon from '@mui/icons-material/ShowChart'
+import BarChartIcon from '@mui/icons-material/BarChart'
 
 const styles = theme => ({
   root: {
@@ -283,89 +283,87 @@ class FacetHeader extends React.Component {
         )
       }
     }
-    return (
-      <>
-        {pieChartButton &&
-          <ChartDialog
-            portalConfig={this.props.portalConfig}
-            perspectiveConfig={this.props.perspectiveConfig}
-            apexChartsConfig={this.props.apexChartsConfig}
-            results={this.props.facetConstrainSelf.values}
-            resultUpdateID={this.props.facetConstrainSelfUpdateID}
-            fetching={this.props.facetConstrainSelf.isFetching}
-            fetchData={this.props.fetchFacetConstrainSelf}
-            facetClass={this.props.facetClass}
-            facetID={this.props.facetID}
-            icon={<PieChartIcon />}
-            tooltip={intl.get('facetBar.pieChart.tooltip')}
-            dialogTitle={this.props.facetLabel}
-            resultClassConfig={{
-              createChartData: 'createApexPieChartData',
-              property: this.props.facetID
-            }}
-          />}
-        {barChartButton &&
-          <ChartDialog
-            portalConfig={this.props.portalConfig}
-            perspectiveConfig={this.props.perspectiveConfig}
-            apexChartsConfig={this.props.apexChartsConfig}
-            results={this.props.facetConstrainSelf.values}
-            resultUpdateID={this.props.facetConstrainSelfUpdateID}
-            fetching={this.props.facetConstrainSelf.isFetching}
-            fetchData={this.props.fetchFacetConstrainSelf}
-            facetClass={this.props.facetClass}
-            facetID={this.props.facetID}
-            icon={<BarChartIcon />}
-            tooltip={intl.get('facetBar.barChart.tooltip')}
-            resultClassConfig={{
-              createChartData: 'createApexBarChartData',
-              property: this.props.facetID,
-              title: intl.get(`facetBar.barChart.${this.props.facetID}.title`),
-              xaxisTitle: intl.get(`facetBar.barChart.${this.props.facetID}.xaxisTitle`),
-              yaxisTitle: intl.get(`facetBar.barChart.${this.props.facetID}.yaxisTitle`),
-              seriesTitle: intl.get(`facetBar.barChart.${this.props.facetID}.seriesTitle`)
-            }}
-          />}
-        {lineChartButton &&
-          <ChartDialog
-            portalConfig={this.props.portalConfig}
-            perspectiveConfig={this.props.perspectiveConfig}
-            apexChartsConfig={this.props.apexChartsConfig}
-            results={this.props.perspectiveState.results}
-            resultUpdateID={this.props.perspectiveState.resultUpdateID}
-            fetching={this.props.perspectiveState.fetching}
-            fetchData={this.props.fetchResults}
-            resultClass={`${this.props.facetID}LineChart`}
-            facetClass={this.props.facetClass}
-            facetID={this.props.facetID}
-            icon={<LineChartIcon />}
-            tooltip={intl.get('facetBar.lineChart.tooltip')}
-            resultClassConfig={this.props.perspectiveConfig.resultClasses[`${this.props.facetID}LineChart`]}
-          />}
-        {menuButtons.length > 0 &&
-          <>
-            <Tooltip disableFocusListener title={intl.get('facetBar.filterOptions')}>
-              <IconButton
-                className='facetMenuButton'
-                aria-label={intl.get('facetBar.filterOptions')}
-                aria-owns={open ? 'facet-option-menu' : undefined}
-                aria-haspopup='true'
-                onClick={this.handleMenuButtonClick}
-              >
-                <MoreVertIcon />
-              </IconButton>
-            </Tooltip>
-            <Menu
-              id='facet-option-menu'
-              anchorEl={anchorEl}
-              open={open}
-              onClose={this.handleMenuClose}
-            >
-              {menuButtons}
-            </Menu>
-          </>}
-      </>
-    )
+    return <>
+      {pieChartButton &&
+        <ChartDialog
+          portalConfig={this.props.portalConfig}
+          perspectiveConfig={this.props.perspectiveConfig}
+          apexChartsConfig={this.props.apexChartsConfig}
+          results={this.props.facetConstrainSelf.values}
+          resultUpdateID={this.props.facetConstrainSelfUpdateID}
+          fetching={this.props.facetConstrainSelf.isFetching}
+          fetchData={this.props.fetchFacetConstrainSelf}
+          facetClass={this.props.facetClass}
+          facetID={this.props.facetID}
+          icon={<PieChartIcon />}
+          tooltip={intl.get('facetBar.pieChart.tooltip')}
+          dialogTitle={this.props.facetLabel}
+          resultClassConfig={{
+            createChartData: 'createApexPieChartData',
+            property: this.props.facetID
+          }}
+        />}
+      {barChartButton &&
+        <ChartDialog
+          portalConfig={this.props.portalConfig}
+          perspectiveConfig={this.props.perspectiveConfig}
+          apexChartsConfig={this.props.apexChartsConfig}
+          results={this.props.facetConstrainSelf.values}
+          resultUpdateID={this.props.facetConstrainSelfUpdateID}
+          fetching={this.props.facetConstrainSelf.isFetching}
+          fetchData={this.props.fetchFacetConstrainSelf}
+          facetClass={this.props.facetClass}
+          facetID={this.props.facetID}
+          icon={<BarChartIcon />}
+          tooltip={intl.get('facetBar.barChart.tooltip')}
+          resultClassConfig={{
+            createChartData: 'createApexBarChartData',
+            property: this.props.facetID,
+            title: intl.get(`facetBar.barChart.${this.props.facetID}.title`),
+            xaxisTitle: intl.get(`facetBar.barChart.${this.props.facetID}.xaxisTitle`),
+            yaxisTitle: intl.get(`facetBar.barChart.${this.props.facetID}.yaxisTitle`),
+            seriesTitle: intl.get(`facetBar.barChart.${this.props.facetID}.seriesTitle`)
+          }}
+        />}
+      {lineChartButton &&
+        <ChartDialog
+          portalConfig={this.props.portalConfig}
+          perspectiveConfig={this.props.perspectiveConfig}
+          apexChartsConfig={this.props.apexChartsConfig}
+          results={this.props.perspectiveState.results}
+          resultUpdateID={this.props.perspectiveState.resultUpdateID}
+          fetching={this.props.perspectiveState.fetching}
+          fetchData={this.props.fetchResults}
+          resultClass={`${this.props.facetID}LineChart`}
+          facetClass={this.props.facetClass}
+          facetID={this.props.facetID}
+          icon={<LineChartIcon />}
+          tooltip={intl.get('facetBar.lineChart.tooltip')}
+          resultClassConfig={this.props.perspectiveConfig.resultClasses[`${this.props.facetID}LineChart`]}
+        />}
+      {menuButtons.length > 0 &&
+        <>
+          <Tooltip disableFocusListener title={intl.get('facetBar.filterOptions')}>
+            <IconButton
+              className='facetMenuButton'
+              aria-label={intl.get('facetBar.filterOptions')}
+              aria-owns={open ? 'facet-option-menu' : undefined}
+              aria-haspopup='true'
+              onClick={this.handleMenuButtonClick}
+              size="large">
+              <MoreVertIcon />
+            </IconButton>
+          </Tooltip>
+          <Menu
+            id='facet-option-menu'
+            anchorEl={anchorEl}
+            open={open}
+            onClose={this.handleMenuClose}
+          >
+            {menuButtons}
+          </Menu>
+        </>}
+    </>;
   }
 
   render () {
@@ -381,7 +379,7 @@ class FacetHeader extends React.Component {
           title={facetDescription}
           enterDelay={300}
         >
-          <IconButton aria-label='description'>
+          <IconButton aria-label='description' size="large">
             <InfoIcon />
           </IconButton>
         </Tooltip>
@@ -390,7 +388,7 @@ class FacetHeader extends React.Component {
             {this.renderFacetMenu()}
           </div>}
       </div>
-    )
+    );
   }
 }
 
diff --git a/src/client/components/facet_bar/FacetHeader.stories.js b/src/client/components/facet_bar/FacetHeader.stories.js
index 3f55be4a6bd61a8697c9beb7a9992fb17a56d91d..9eb82d277fcf7a2a40cbe5d219a4a50d734a591a 100644
--- a/src/client/components/facet_bar/FacetHeader.stories.js
+++ b/src/client/components/facet_bar/FacetHeader.stories.js
@@ -1,6 +1,6 @@
 import React from 'react'
 import FacetHeader, { FacetHeaderComponent } from './FacetHeader'
-import Paper from '@material-ui/core/Paper'
+import Paper from '@mui/material/Paper'
 import { useSelector } from 'react-redux'
 import intl from 'react-intl-universal'
 import Center from '../../../../.storybook/Center'
diff --git a/src/client/components/facet_bar/FacetInfo.js b/src/client/components/facet_bar/FacetInfo.js
index 032f8a3b54d870fc8057fa9f8aa3b8dbcc22ac7e..9c33bf7bc29f93013055989a2b91de114967a930 100644
--- a/src/client/components/facet_bar/FacetInfo.js
+++ b/src/client/components/facet_bar/FacetInfo.js
@@ -2,14 +2,14 @@ import React from 'react'
 import PropTypes from 'prop-types'
 import intl from 'react-intl-universal'
 import { has } from 'lodash'
-import { withStyles } from '@material-ui/core/styles'
+import withStyles from '@mui/styles/withStyles';
 import ActiveFilters from './ActiveFilters'
-import Button from '@material-ui/core/Button'
-import DeleteIcon from '@material-ui/icons/Delete'
-import Divider from '@material-ui/core/Divider'
-import Typography from '@material-ui/core/Typography'
-import CircularProgress from '@material-ui/core/CircularProgress'
-import purple from '@material-ui/core/colors/purple'
+import Button from '@mui/material/Button'
+import DeleteIcon from '@mui/icons-material/Delete'
+import Divider from '@mui/material/Divider'
+import Typography from '@mui/material/Typography'
+import CircularProgress from '@mui/material/CircularProgress'
+import { purple } from '@mui/material/colors';
 
 const styles = theme => ({
   facetInfoDivider: {
diff --git a/src/client/components/facet_bar/HierarchicalFacet.js b/src/client/components/facet_bar/HierarchicalFacet.js
index 700fe66a907c4117d59ba9e42c84810b2c8f8ac6..159806b184a9fbfa233b4d5e9b59fd9fa6279164 100644
--- a/src/client/components/facet_bar/HierarchicalFacet.js
+++ b/src/client/components/facet_bar/HierarchicalFacet.js
@@ -1,20 +1,20 @@
 import React, { Component } from 'react'
 import PropTypes from 'prop-types'
 import intl from 'react-intl-universal'
-import { withStyles } from '@material-ui/core/styles'
+import withStyles from '@mui/styles/withStyles';
 import { has } from 'lodash'
 import SortableTree, { changeNodeAtPath } from '@nosferatu500/react-sortable-tree'
 import FileExplorerTheme from 'react-sortable-tree-theme-file-explorer'
-import Checkbox from '@material-ui/core/Checkbox'
-import FormControlLabel from '@material-ui/core/FormControlLabel'
-import CircularProgress from '@material-ui/core/CircularProgress'
-import purple from '@material-ui/core/colors/purple'
-import Input from '@material-ui/core/Input'
-import IconButton from '@material-ui/core/IconButton'
-import NavigateNextIcon from '@material-ui/icons/NavigateNext'
-import NavigateBeforeIcon from '@material-ui/icons/NavigateBefore'
-import Typography from '@material-ui/core/Typography'
+import Checkbox from '@mui/material/Checkbox'
+import FormControlLabel from '@mui/material/FormControlLabel'
+import CircularProgress from '@mui/material/CircularProgress'
+import Input from '@mui/material/Input'
+import IconButton from '@mui/material/IconButton'
+import NavigateNextIcon from '@mui/icons-material/NavigateNext'
+import NavigateBeforeIcon from '@mui/icons-material/NavigateBefore'
+import Typography from '@mui/material/Typography'
 import { generateLabelForMissingValue } from '../../helpers/helpers'
+import { purple } from '@mui/material/colors';
 
 const styles = () => ({
   facetSearchContainer: {
@@ -304,78 +304,76 @@ class HierarchicalFacet extends Component {
             : 0
       })
 
-    return (
-      <>
-        {isFetching
-          ? (
-            <div className={classes.spinnerContainer}>
-              <CircularProgress style={{ color: purple[500] }} thickness={5} />
-            </div>
-            )
-          : (
-            <>
-              {searchField && facet.filterType !== 'spatialFilter' &&
-                <div className={classes.facetSearchContainer}>
-                  <Input
-                    placeholder={intl.get('facetBar.facetSearchFieldPlaceholder')}
-                    onChange={this.handleSearchFieldOnChange}
-                    value={this.state.searchString}
-                  />
-                  {searchFoundCount > 0 &&
-                    <>
-                      <IconButton
-                        className={classes.facetSearchIconButton}
-                        aria-label='Previous'
-                        onClick={selectPrevMatch}
-                      >
-                        <NavigateBeforeIcon />
-                      </IconButton>
-                      <IconButton
-                        className={classes.facetSearchIconButton}
-                        aria-label='Next'
-                        onClick={selectNextMatch}
-                      >
-                        <NavigateNextIcon />
-                      </IconButton>
-                      <Typography>
-                        {searchFoundCount > 0 ? searchFocusIndex + 1 : 0} / {searchFoundCount || 0}
-                      </Typography>
-                    </>}
-                </div>}
-              {facet.filterType !== 'spatialFilter' &&
-                <div className={searchField ? classes.treeContainerWithSearchField : classes.treeContainer}>
-                  <SortableTree
-                    treeData={this.state.treeData}
-                    onChange={treeData => this.setState({ treeData })}
-                    canDrag={false}
-                    rowHeight={30}
-                    searchMethod={customSearchMethod}
-                    searchQuery={searchString}
-                    searchFocusOffset={searchFocusIndex}
-                    searchFinishCallback={matches => {
-                      this.setState({
-                        searchFoundCount: matches.length,
-                        searchFocusIndex:
-                          matches.length > 0 ? searchFocusIndex % matches.length : 0,
-                        matches
-                      })
-                    }}
-                    onlyExpandSearchedNodes
-                    theme={FileExplorerTheme}
-                    generateNodeProps={this.generateNodeProps}
-                    isVirtualized={this.props.facetedSearchMode !== 'storybook'}
-                  />
-                </div>}
-              {facet.filterType === 'spatialFilter' &&
-                <div className={classes.spinnerContainer}>
-                  <Typography>
-                    Draw a bounding box on the map to filter by {intl.get(`perspectives.${facetClass}.properties.${facetID}.label`)}.
-                  </Typography>
-                </div>}
-            </>
-            )}
-      </>
-    )
+    return <>
+      {isFetching
+        ? (
+          <div className={classes.spinnerContainer}>
+            <CircularProgress style={{ color: purple[500] }} thickness={5} />
+          </div>
+          )
+        : (
+          <>
+            {searchField && facet.filterType !== 'spatialFilter' &&
+              <div className={classes.facetSearchContainer}>
+                <Input
+                  placeholder={intl.get('facetBar.facetSearchFieldPlaceholder')}
+                  onChange={this.handleSearchFieldOnChange}
+                  value={this.state.searchString}
+                />
+                {searchFoundCount > 0 &&
+                  <>
+                    <IconButton
+                      className={classes.facetSearchIconButton}
+                      aria-label='Previous'
+                      onClick={selectPrevMatch}
+                      size="large">
+                      <NavigateBeforeIcon />
+                    </IconButton>
+                    <IconButton
+                      className={classes.facetSearchIconButton}
+                      aria-label='Next'
+                      onClick={selectNextMatch}
+                      size="large">
+                      <NavigateNextIcon />
+                    </IconButton>
+                    <Typography>
+                      {searchFoundCount > 0 ? searchFocusIndex + 1 : 0} / {searchFoundCount || 0}
+                    </Typography>
+                  </>}
+              </div>}
+            {facet.filterType !== 'spatialFilter' &&
+              <div className={searchField ? classes.treeContainerWithSearchField : classes.treeContainer}>
+                <SortableTree
+                  treeData={this.state.treeData}
+                  onChange={treeData => this.setState({ treeData })}
+                  canDrag={false}
+                  rowHeight={30}
+                  searchMethod={customSearchMethod}
+                  searchQuery={searchString}
+                  searchFocusOffset={searchFocusIndex}
+                  searchFinishCallback={matches => {
+                    this.setState({
+                      searchFoundCount: matches.length,
+                      searchFocusIndex:
+                        matches.length > 0 ? searchFocusIndex % matches.length : 0,
+                      matches
+                    })
+                  }}
+                  onlyExpandSearchedNodes
+                  theme={FileExplorerTheme}
+                  generateNodeProps={this.generateNodeProps}
+                  isVirtualized={this.props.facetedSearchMode !== 'storybook'}
+                />
+              </div>}
+            {facet.filterType === 'spatialFilter' &&
+              <div className={classes.spinnerContainer}>
+                <Typography>
+                  Draw a bounding box on the map to filter by {intl.get(`perspectives.${facetClass}.properties.${facetID}.label`)}.
+                </Typography>
+              </div>}
+          </>
+          )}
+    </>;
   }
 }
 
diff --git a/src/client/components/facet_bar/LeafletMapDialog.js b/src/client/components/facet_bar/LeafletMapDialog.js
index 353adb886eafcd234d294e0d251c15b2ee0c7376..51deda91314150fe72c69bf3e866af6eb37f13aa 100644
--- a/src/client/components/facet_bar/LeafletMapDialog.js
+++ b/src/client/components/facet_bar/LeafletMapDialog.js
@@ -1,15 +1,15 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import { withStyles } from '@material-ui/core/styles'
+import withStyles from '@mui/styles/withStyles';
 import intl from 'react-intl-universal'
-import Button from '@material-ui/core/Button'
-import Dialog from '@material-ui/core/Dialog'
-import DialogActions from '@material-ui/core/DialogActions'
-import DialogTitle from '@material-ui/core/DialogTitle'
-import CropFreeIcon from '@material-ui/icons/CropFree'
+import Button from '@mui/material/Button'
+import Dialog from '@mui/material/Dialog'
+import DialogActions from '@mui/material/DialogActions'
+import DialogTitle from '@mui/material/DialogTitle'
+import CropFreeIcon from '@mui/icons-material/CropFree'
 import LeafletMap from '../facet_results/LeafletMap'
-import CircularProgress from '@material-ui/core/CircularProgress'
-import Paper from '@material-ui/core/Paper'
+import CircularProgress from '@mui/material/CircularProgress'
+import Paper from '@mui/material/Paper'
 
 const styles = theme => ({
   root: {
diff --git a/src/client/components/facet_bar/RangeFacet.js b/src/client/components/facet_bar/RangeFacet.js
index caccd2a4fea3e141c0eb0fbed632ba2a239b3044..fb423b82a30af467577829253c40b3383a843684 100644
--- a/src/client/components/facet_bar/RangeFacet.js
+++ b/src/client/components/facet_bar/RangeFacet.js
@@ -1,12 +1,12 @@
 import React, { Component } from 'react'
 import PropTypes from 'prop-types'
-import CircularProgress from '@material-ui/core/CircularProgress'
-import purple from '@material-ui/core/colors/purple'
-import { withStyles } from '@material-ui/core/styles'
-import TextField from '@material-ui/core/TextField'
-import Button from '@material-ui/core/Button'
-import InputAdornment from '@material-ui/core/InputAdornment'
+import CircularProgress from '@mui/material/CircularProgress'
+import withStyles from '@mui/styles/withStyles';
+import TextField from '@mui/material/TextField'
+import Button from '@mui/material/Button'
+import InputAdornment from '@mui/material/InputAdornment'
 import { has } from 'lodash'
+import { purple } from '@mui/material/colors';
 
 const styles = theme => ({
   root: {
diff --git a/src/client/components/facet_bar/SearchField.js b/src/client/components/facet_bar/SearchField.js
index 75aabb7310cd8ca86aca1f7425e527ec825d617b..7e15e289d3be94cd22fe17f2b2c81d234dc618f9 100644
--- a/src/client/components/facet_bar/SearchField.js
+++ b/src/client/components/facet_bar/SearchField.js
@@ -1,15 +1,15 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import { withStyles } from '@material-ui/core/styles'
+import withStyles from '@mui/styles/withStyles';
 import intl from 'react-intl-universal'
-import IconButton from '@material-ui/core/IconButton'
-import SearchIcon from '@material-ui/icons/Search'
-import Input from '@material-ui/core/Input'
-import InputLabel from '@material-ui/core/InputLabel'
-import InputAdornment from '@material-ui/core/InputAdornment'
-import FormControl from '@material-ui/core/FormControl'
-import CircularProgress from '@material-ui/core/CircularProgress'
-import Paper from '@material-ui/core/Paper'
+import IconButton from '@mui/material/IconButton'
+import SearchIcon from '@mui/icons-material/Search'
+import Input from '@mui/material/Input'
+import InputLabel from '@mui/material/InputLabel'
+import InputAdornment from '@mui/material/InputAdornment'
+import FormControl from '@mui/material/FormControl'
+import CircularProgress from '@mui/material/CircularProgress'
+import Paper from '@mui/material/Paper'
 
 const styles = theme => ({
   root: {
@@ -89,9 +89,7 @@ class SearchField extends React.Component {
     let searchButton = null
     if (this.props.search.textResultsFetching) {
       searchButton = (
-        <IconButton
-          aria-label='Search places'
-        >
+        <IconButton aria-label='Search places' size="large">
           <CircularProgress size={24} />
         </IconButton>
       )
@@ -101,7 +99,7 @@ class SearchField extends React.Component {
           aria-label='Search'
           onClick={this.handleClick}
           onMouseDown={this.handleMouseDown}
-        >
+          size="large">
           <SearchIcon />
         </IconButton>
       )
diff --git a/src/client/components/facet_bar/SliderFacet.js b/src/client/components/facet_bar/SliderFacet.js
index 14a1912ba5a9bd0a41b7b65f0f30fd939cb06cdd..eab4bc8253a961f2d647783183901e0b11fe8c27 100644
--- a/src/client/components/facet_bar/SliderFacet.js
+++ b/src/client/components/facet_bar/SliderFacet.js
@@ -1,13 +1,13 @@
 import React, { Component } from 'react'
 import PropTypes from 'prop-types'
 import intl from 'react-intl-universal'
-import CircularProgress from '@material-ui/core/CircularProgress'
-import purple from '@material-ui/core/colors/purple'
-import { withStyles } from '@material-ui/core/styles'
-import Slider from '@material-ui/core/Slider'
-import TextField from '@material-ui/core/TextField'
-import Button from '@material-ui/core/Button'
+import CircularProgress from '@mui/material/CircularProgress'
+import withStyles from '@mui/styles/withStyles';
+import Slider from '@mui/material/Slider'
+import TextField from '@mui/material/TextField'
+import Button from '@mui/material/Button'
 import { yearToISOString, ISOStringToYear } from './FacetHelpers'
+import { purple } from '@mui/material/colors';
 
 const styles = theme => ({
   root: {
diff --git a/src/client/components/facet_bar/TextFacet.js b/src/client/components/facet_bar/TextFacet.js
index 1b898104b5f2afa0758f31ef3e171ac11806b5bf..6fcd04af059b4540890eb9c20905ec783c8040e1 100644
--- a/src/client/components/facet_bar/TextFacet.js
+++ b/src/client/components/facet_bar/TextFacet.js
@@ -1,14 +1,14 @@
 import React from 'react'
 import PropTypes from 'prop-types'
 import intl from 'react-intl-universal'
-import { withStyles } from '@material-ui/core/styles'
-import IconButton from '@material-ui/core/IconButton'
-import SearchIcon from '@material-ui/icons/Search'
-import Input from '@material-ui/core/Input'
-import InputLabel from '@material-ui/core/InputLabel'
-import InputAdornment from '@material-ui/core/InputAdornment'
-import FormControl from '@material-ui/core/FormControl'
-import CircularProgress from '@material-ui/core/CircularProgress'
+import withStyles from '@mui/styles/withStyles';
+import IconButton from '@mui/material/IconButton'
+import SearchIcon from '@mui/icons-material/Search'
+import Input from '@mui/material/Input'
+import InputLabel from '@mui/material/InputLabel'
+import InputAdornment from '@mui/material/InputAdornment'
+import FormControl from '@mui/material/FormControl'
+import CircularProgress from '@mui/material/CircularProgress'
 
 const styles = theme => ({
   textSearch: {
@@ -70,9 +70,7 @@ class TextFacet extends React.Component {
     const textResultsFetching = false
     if (textResultsFetching) {
       searchButton = (
-        <IconButton
-          aria-label={placeholder}
-        >
+        <IconButton aria-label={placeholder} size="large">
           <CircularProgress size={24} />
         </IconButton>
       )
@@ -82,7 +80,7 @@ class TextFacet extends React.Component {
           aria-label='search'
           onClick={this.handleClick}
           onMouseDown={this.handleMouseDown}
-        >
+          size="large">
           <SearchIcon />
         </IconButton>
       )
diff --git a/src/client/components/facet_results/ApexCharts.js b/src/client/components/facet_results/ApexCharts.js
index 70a2648cceac0a6cb64974a08dcdba11610f6cf4..59858ac6e52aea617eae6218cdac8a57f1acae7f 100644
--- a/src/client/components/facet_results/ApexCharts.js
+++ b/src/client/components/facet_results/ApexCharts.js
@@ -1,16 +1,16 @@
 import React from 'react'
 import PropTypes from 'prop-types'
 import intl from 'react-intl-universal'
-import { withStyles } from '@material-ui/core/styles'
+import withStyles from '@mui/styles/withStyles';
 import ApexCharts from 'apexcharts'
-import purple from '@material-ui/core/colors/purple'
-import CircularProgress from '@material-ui/core/CircularProgress'
-import MenuItem from '@material-ui/core/MenuItem'
-import FormControl from '@material-ui/core/FormControl'
-import Select from '@material-ui/core/Select'
-import Typography from '@material-ui/core/Typography'
+import CircularProgress from '@mui/material/CircularProgress'
+import MenuItem from '@mui/material/MenuItem'
+import FormControl from '@mui/material/FormControl'
+import Select from '@mui/material/Select'
+import Typography from '@mui/material/Typography'
 import GeneralDialog from '../main_layout/GeneralDialog'
 import InstaceList from '../main_layout/InstanceList'
+import { purple } from '@mui/material/colors';
 
 const defaultPadding = 32
 const smallScreenPadding = 8
diff --git a/src/client/components/facet_results/BarChartRace.js b/src/client/components/facet_results/BarChartRace.js
index b9b0900df21087a08dbf259653dc2d00f0b3a170..1fc22a2148392311dba28944dee501d07c5fca93 100644
--- a/src/client/components/facet_results/BarChartRace.js
+++ b/src/client/components/facet_results/BarChartRace.js
@@ -3,7 +3,7 @@ import React from 'react'
 import * as am5 from '@amcharts/amcharts5'
 import * as am5xy from '@amcharts/amcharts5/xy'
 import am5themesAnimated from '@amcharts/amcharts5/themes/Animated'
-import Paper from '@material-ui/core/Paper'
+import Paper from '@mui/material/Paper'
 
 // https://www.amcharts.com/docs/v5/
 
diff --git a/src/client/components/facet_results/CSVButton.js b/src/client/components/facet_results/CSVButton.js
index 61154ad68c1f0ed29abf4c21515b4b37c6203ae2..9de216622d0f3a8e733bfc7f42a5253f9ddb58a1 100644
--- a/src/client/components/facet_results/CSVButton.js
+++ b/src/client/components/facet_results/CSVButton.js
@@ -1,9 +1,9 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import { withStyles } from '@material-ui/core/styles'
+import withStyles from '@mui/styles/withStyles';
 import { CSVLink } from 'react-csv'
-import CloudDownloadIcon from '@material-ui/icons/CloudDownload'
-import Button from '@material-ui/core/Button'
+import CloudDownloadIcon from '@mui/icons-material/CloudDownload'
+import Button from '@mui/material/Button'
 import intl from 'react-intl-universal'
 
 const styles = theme => ({
diff --git a/src/client/components/facet_results/Deck.js b/src/client/components/facet_results/Deck.js
index 36707a2e03d42434a9780078f0e196fa5c6e9435..4bd78515a7331258091035491e6005ab1ce70477 100644
--- a/src/client/components/facet_results/Deck.js
+++ b/src/client/components/facet_results/Deck.js
@@ -1,6 +1,6 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import { withStyles } from '@material-ui/core/styles'
+import withStyles from '@mui/styles/withStyles';
 import DeckGL from '@deck.gl/react'
 import { ArcLayer, PolygonLayer } from '@deck.gl/layers'
 import { HeatmapLayer, HexagonLayer } from '@deck.gl/aggregation-layers'
@@ -8,8 +8,8 @@ import ReactMapGL, { NavigationControl, FullscreenControl, HTMLOverlay } from 'r
 import DeckArcLayerLegend from './DeckArcLayerLegend'
 import DeckArcLayerDialog from './DeckArcLayerDialog'
 import DeckArcLayerTooltip from './DeckArcLayerTooltip'
-import CircularProgress from '@material-ui/core/CircularProgress'
-import { purple } from '@material-ui/core/colors'
+import CircularProgress from '@mui/material/CircularProgress'
+import { purple } from '@mui/material/colors'
 
 /* Documentation links:
   https://deck.gl/#/documentation/getting-started/using-with-react?section=adding-a-base-map
diff --git a/src/client/components/facet_results/DeckArcLayerDialog.js b/src/client/components/facet_results/DeckArcLayerDialog.js
index df60fabe380ec719aca9afa4a94c8e0549984a81..54535ceed0b3bedd86c5b8a9b7b6b59feb989bae 100644
--- a/src/client/components/facet_results/DeckArcLayerDialog.js
+++ b/src/client/components/facet_results/DeckArcLayerDialog.js
@@ -1,9 +1,9 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import Dialog from '@material-ui/core/Dialog'
-import DialogContent from '@material-ui/core/DialogContent'
-import { withStyles } from '@material-ui/core/styles'
-import Typography from '@material-ui/core/Typography'
+import Dialog from '@mui/material/Dialog'
+import DialogContent from '@mui/material/DialogContent'
+import withStyles from '@mui/styles/withStyles';
+import Typography from '@mui/material/Typography'
 import InstanceList from '../main_layout/InstanceList'
 import { Link } from 'react-router-dom'
 
diff --git a/src/client/components/facet_results/DeckArcLayerLegend.js b/src/client/components/facet_results/DeckArcLayerLegend.js
index feac7e2439bdcb5c4b770dd1ace130cd783cd8e8..3a173a1e02070bec0f56374ab473723feec1e06e 100644
--- a/src/client/components/facet_results/DeckArcLayerLegend.js
+++ b/src/client/components/facet_results/DeckArcLayerLegend.js
@@ -1,9 +1,9 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import { withStyles } from '@material-ui/core/styles'
-import Card from '@material-ui/core/Card'
-import CardContent from '@material-ui/core/CardContent'
-import Typography from '@material-ui/core/Typography'
+import withStyles from '@mui/styles/withStyles';
+import Card from '@mui/material/Card'
+import CardContent from '@mui/material/CardContent'
+import Typography from '@mui/material/Typography'
 
 const styles = theme => ({
   legend: {
diff --git a/src/client/components/facet_results/DeckArcLayerTooltip.js b/src/client/components/facet_results/DeckArcLayerTooltip.js
index 1fc781df931be8e86e9a3c54d02de559bac434fd..a16e1643145bdb8295bf384242375e38a985a1ea 100644
--- a/src/client/components/facet_results/DeckArcLayerTooltip.js
+++ b/src/client/components/facet_results/DeckArcLayerTooltip.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import Paper from '@material-ui/core/Paper'
-import Typography from '@material-ui/core/Typography'
+import Paper from '@mui/material/Paper'
+import Typography from '@mui/material/Typography'
 
 const MigrationsMapTooltip = props => {
   const { data, fromText, toText, countText, showMoreText } = props
diff --git a/src/client/components/facet_results/Export.js b/src/client/components/facet_results/Export.js
index 9f32c3f08e8fbe73e545924c7513c487b5a332e9..4d9cbe49fc10ec0a295cabee6fb8a845d110dcb5 100644
--- a/src/client/components/facet_results/Export.js
+++ b/src/client/components/facet_results/Export.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import { withStyles } from '@material-ui/core/styles'
-import Button from '@material-ui/core/Button'
+import withStyles from '@mui/styles/withStyles';
+import Button from '@mui/material/Button'
 import querystring from 'querystring'
 import intl from 'react-intl-universal'
 
diff --git a/src/client/components/facet_results/ExportCSV.js b/src/client/components/facet_results/ExportCSV.js
index d2b1ae042d0ff196d5b1182c658b45719c5d8832..561eced12467193cfbbdeec911e6b222a41983b0 100644
--- a/src/client/components/facet_results/ExportCSV.js
+++ b/src/client/components/facet_results/ExportCSV.js
@@ -1,8 +1,8 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import { withStyles } from '@material-ui/core/styles'
-import Button from '@material-ui/core/Button'
-import Paper from '@material-ui/core/Paper'
+import withStyles from '@mui/styles/withStyles';
+import Button from '@mui/material/Button'
+import Paper from '@mui/material/Paper'
 import { stateToUrl } from '../../helpers/helpers'
 
 const apiUrl = process.env.API_URL
diff --git a/src/client/components/facet_results/LeafletMap.js b/src/client/components/facet_results/LeafletMap.js
index bcbe34019f60dce76be1966af8fd9355c59dd27d..700d4616e0d6c818cc342cfd59375aee063fc285 100644
--- a/src/client/components/facet_results/LeafletMap.js
+++ b/src/client/components/facet_results/LeafletMap.js
@@ -1,11 +1,11 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import { withStyles } from '@material-ui/core/styles'
+import withStyles from '@mui/styles/withStyles';
 import intl from 'react-intl-universal'
 import L from 'leaflet'
 import { has } from 'lodash'
-import CircularProgress from '@material-ui/core/CircularProgress'
-import { purple } from '@material-ui/core/colors'
+import CircularProgress from '@mui/material/CircularProgress'
+import { purple } from '@mui/material/colors'
 import history from '../../History'
 // import { apiUrl } from '../../epics'
 import 'leaflet/dist/leaflet.css' // Official Leaflet styles
diff --git a/src/client/components/facet_results/Network.js b/src/client/components/facet_results/Network.js
index 7f9d4e3c9cccb790bc2b802f930b68453bafcbfa..f4260e347e77fce49e799a70dfe6596f0c2e8533 100644
--- a/src/client/components/facet_results/Network.js
+++ b/src/client/components/facet_results/Network.js
@@ -4,10 +4,10 @@ import history from '../../History'
 import cytoscape from 'cytoscape'
 import panzoom from 'cytoscape-panzoom'
 import 'cytoscape-panzoom/cytoscape.js-panzoom.css'
-import purple from '@material-ui/core/colors/purple'
-import CircularProgress from '@material-ui/core/CircularProgress'
+import CircularProgress from '@mui/material/CircularProgress'
 import { library, dom } from '@fortawesome/fontawesome-svg-core'
 import { faMinus, faPlus, faExpand } from '@fortawesome/free-solid-svg-icons'
+import { purple } from '@mui/material/colors';
 
 const zoomControlOptions = {
   zoomFactor: 0.05, // zoom factor per zoom tick
diff --git a/src/client/components/facet_results/ObjectListCollapsible.js b/src/client/components/facet_results/ObjectListCollapsible.js
index e6e08f250f6547021acfac5aa9baa27906a77a8b..48e8f971b270f2bcf38bc9c598503ced423f68af 100644
--- a/src/client/components/facet_results/ObjectListCollapsible.js
+++ b/src/client/components/facet_results/ObjectListCollapsible.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import { withStyles } from '@material-ui/core/styles'
-import Collapse from '@material-ui/core/Collapse'
+import withStyles from '@mui/styles/withStyles';
+import Collapse from '@mui/material/Collapse'
 import { ISOStringToDate } from './Dates'
 import { orderBy, has } from 'lodash'
 import ObjectListItem from './ObjectListItem'
diff --git a/src/client/components/facet_results/ObjectListItemEvent.js b/src/client/components/facet_results/ObjectListItemEvent.js
index b44aed2067fd7d69aa369f72ac13fa60c9fd27c5..14ad2b9f754fc2c451c3a2c2870bd632f5a644bb 100644
--- a/src/client/components/facet_results/ObjectListItemEvent.js
+++ b/src/client/components/facet_results/ObjectListItemEvent.js
@@ -1,6 +1,6 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import { withStyles } from '@material-ui/core/styles'
+import withStyles from '@mui/styles/withStyles';
 import ObjectListItemLink from './ObjectListItemLink'
 
 const styles = () => ({
diff --git a/src/client/components/facet_results/ObjectListItemLink.js b/src/client/components/facet_results/ObjectListItemLink.js
index e129856ce9fd386a2c9fee3416772903ec1562a1..24002aba1a82a50d19ac3921ef17e52f8002050f 100644
--- a/src/client/components/facet_results/ObjectListItemLink.js
+++ b/src/client/components/facet_results/ObjectListItemLink.js
@@ -1,6 +1,6 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import Button from '@material-ui/core/Button'
+import Button from '@mui/material/Button'
 import { Link } from 'react-router-dom'
 
 const ObjectListLink = props => {
diff --git a/src/client/components/facet_results/Pie.js b/src/client/components/facet_results/Pie.js
index 0228d3c0ae77fd18654439660c3775fa640a18cd..f3fa0738463394e1eb02b18f4ef53b20cbe4c979 100644
--- a/src/client/components/facet_results/Pie.js
+++ b/src/client/components/facet_results/Pie.js
@@ -8,9 +8,9 @@ import {
 } from 'victory'
 import PieTooltip from './PieTooltip'
 import _ from 'lodash'
-import { withStyles } from '@material-ui/core/styles'
-import Grid from '@material-ui/core/Grid'
-import Paper from '@material-ui/core/Paper'
+import withStyles from '@mui/styles/withStyles';
+import Grid from '@mui/material/Grid'
+import Paper from '@mui/material/Paper'
 import ResultInfo from './ResultInfo'
 
 const styles = theme => ({
diff --git a/src/client/components/facet_results/ReactVirtualizedList.js b/src/client/components/facet_results/ReactVirtualizedList.js
index 8dd0cf597c18c712d29be51bc7f63a78c246ef90..f7bb92733350e19b2a9a39137e3d8924b594ff3c 100644
--- a/src/client/components/facet_results/ReactVirtualizedList.js
+++ b/src/client/components/facet_results/ReactVirtualizedList.js
@@ -1,15 +1,15 @@
 import React, { useEffect } from 'react'
 import { List, AutoSizer } from 'react-virtualized'
-import { makeStyles } from '@material-ui/core/styles'
-import Card from '@material-ui/core/Card'
-import CardActionArea from '@material-ui/core/CardActionArea'
-import CardContent from '@material-ui/core/CardContent'
-import CardMedia from '@material-ui/core/CardMedia'
-import Typography from '@material-ui/core/Typography'
+import makeStyles from '@mui/styles/makeStyles';
+import Card from '@mui/material/Card'
+import CardActionArea from '@mui/material/CardActionArea'
+import CardContent from '@mui/material/CardContent'
+import CardMedia from '@mui/material/CardMedia'
+import Typography from '@mui/material/Typography'
 import intl from 'react-intl-universal'
 import { Link } from 'react-router-dom'
-import CircularProgress from '@material-ui/core/CircularProgress'
-import purple from '@material-ui/core/colors/purple'
+import CircularProgress from '@mui/material/CircularProgress'
+import { purple } from '@mui/material/colors';
 
 const useStyles = makeStyles(theme => ({
   root: props => {
diff --git a/src/client/components/facet_results/ReactVirtualizedTable.js b/src/client/components/facet_results/ReactVirtualizedTable.js
index 5a0e2fbef964499580b4d2f2021ac689fc5632d0..6c73fd5666ac7b990a46bcc12a7f18ea7d08447e 100644
--- a/src/client/components/facet_results/ReactVirtualizedTable.js
+++ b/src/client/components/facet_results/ReactVirtualizedTable.js
@@ -1,16 +1,16 @@
 import React from 'react'
 import PropTypes from 'prop-types'
 import clsx from 'clsx'
-import { withStyles } from '@material-ui/core/styles'
-import TableCell from '@material-ui/core/TableCell'
-import TableSortLabel from '@material-ui/core/TableSortLabel'
-import Tooltip from '@material-ui/core/Tooltip'
+import withStyles from '@mui/styles/withStyles';
+import TableCell from '@mui/material/TableCell'
+import TableSortLabel from '@mui/material/TableSortLabel'
+import Tooltip from '@mui/material/Tooltip'
 import ResultTableCell from './ResultTableCell'
-import Paper from '@material-ui/core/Paper'
+import Paper from '@mui/material/Paper'
 import { AutoSizer, Column, Table } from 'react-virtualized'
 import intl from 'react-intl-universal'
-import CircularProgress from '@material-ui/core/CircularProgress'
-import purple from '@material-ui/core/colors/purple'
+import CircularProgress from '@mui/material/CircularProgress'
+import { purple } from '@mui/material/colors';
 
 const styles = theme => ({
   flexContainer: {
diff --git a/src/client/components/facet_results/ResultInfo.js b/src/client/components/facet_results/ResultInfo.js
index d709b59e0e63b4b4324251342acc884c418b2dca..26f09f7ee83a2b12e31ed77e874a29ce4e56aa73 100644
--- a/src/client/components/facet_results/ResultInfo.js
+++ b/src/client/components/facet_results/ResultInfo.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import { withStyles } from '@material-ui/core/styles'
-import Typography from '@material-ui/core/Typography'
+import withStyles from '@mui/styles/withStyles';
+import Typography from '@mui/material/Typography'
 
 const styles = () => ({
   root: {
diff --git a/src/client/components/facet_results/ResultTable.js b/src/client/components/facet_results/ResultTable.js
index bf45132a2988322d1383e46cb39642d6509b9aee..1d6ea20ac45198e91c5f56a4a5691516d2e3fe1a 100644
--- a/src/client/components/facet_results/ResultTable.js
+++ b/src/client/components/facet_results/ResultTable.js
@@ -1,22 +1,22 @@
 import React from 'react'
 import PropTypes from 'prop-types'
 import intl from 'react-intl-universal'
-import { withStyles } from '@material-ui/core/styles'
+import withStyles from '@mui/styles/withStyles';
 import clsx from 'clsx'
-import Table from '@material-ui/core/Table'
-import TableBody from '@material-ui/core/TableBody'
+import Table from '@mui/material/Table'
+import TableBody from '@mui/material/TableBody'
 import ResultTableCell from './ResultTableCell'
-import TableRow from '@material-ui/core/TableRow'
-import TableCell from '@material-ui/core/TableCell'
-import IconButton from '@material-ui/core/IconButton'
-import CircularProgress from '@material-ui/core/CircularProgress'
-import ExpandMoreIcon from '@material-ui/icons/ExpandMore'
-import purple from '@material-ui/core/colors/purple'
+import TableRow from '@mui/material/TableRow'
+import TableCell from '@mui/material/TableCell'
+import IconButton from '@mui/material/IconButton'
+import CircularProgress from '@mui/material/CircularProgress'
+import ExpandMoreIcon from '@mui/icons-material/ExpandMore'
 import querystring from 'querystring'
 import ResultTableHead from './ResultTableHead'
-import TablePagination from '@material-ui/core/TablePagination'
+import TablePagination from '@mui/material/TablePagination'
 import ResultTablePaginationActions from './ResultTablePaginationActions'
 import history from '../../History'
+import { purple } from '@mui/material/colors';
 
 const styles = theme => ({
   tableContainer: props => ({
@@ -42,7 +42,7 @@ const styles = theme => ({
   paginationToolbar: props => ({
     '& p': { fontSize: '0.75rem' },
     minHeight: props.layoutConfig.paginationToolbarHeight,
-    [theme.breakpoints.down(480)]: {
+    [theme.breakpoints.down(undefined)]: {
       display: 'flex',
       flexWrap: 'wrap',
       marginTop: theme.spacing(0.5)
@@ -266,13 +266,13 @@ class ResultTable extends React.Component {
               onClick={this.handleExpandRow(row.id)}
               aria-expanded={expanded}
               aria-label='Show more'
-            >
+              size="large">
               <ExpandMoreIcon />
             </IconButton>}
         </TableCell>
         {dataCells}
       </TableRow>
-    )
+    );
   }
 
   render () {
diff --git a/src/client/components/facet_results/ResultTableCell.js b/src/client/components/facet_results/ResultTableCell.js
index db757bfa0c29733593f7b35423c7f916c73ab153..d1380c8a6e5816b0e9e583159c935090afd4e384 100644
--- a/src/client/components/facet_results/ResultTableCell.js
+++ b/src/client/components/facet_results/ResultTableCell.js
@@ -1,6 +1,6 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import TableCell from '@material-ui/core/TableCell'
+import TableCell from '@mui/material/TableCell'
 import ObjectListCollapsible from './ObjectListCollapsible'
 import StringList from './StringList'
 import SimpleReactLightbox from 'simple-react-lightbox'
diff --git a/src/client/components/facet_results/ResultTableHead.js b/src/client/components/facet_results/ResultTableHead.js
index 5c021a6db07b32bd18e0fc9e1bd984e1abe94638..4f3200fe968451be5369bf140ec46c80b1a4d0f9 100644
--- a/src/client/components/facet_results/ResultTableHead.js
+++ b/src/client/components/facet_results/ResultTableHead.js
@@ -2,14 +2,14 @@ import React from 'react'
 import PropTypes from 'prop-types'
 import intl from 'react-intl-universal'
 import classNames from 'classnames'
-import { withStyles } from '@material-ui/core/styles'
-import TableHead from '@material-ui/core/TableHead'
-import TableRow from '@material-ui/core/TableRow'
-import TableCell from '@material-ui/core/TableCell'
-import Tooltip from '@material-ui/core/Tooltip'
-import TableSortLabel from '@material-ui/core/TableSortLabel'
-import IconButton from '@material-ui/core/IconButton'
-import InfoIcon from '@material-ui/icons/InfoOutlined'
+import withStyles from '@mui/styles/withStyles';
+import TableHead from '@mui/material/TableHead'
+import TableRow from '@mui/material/TableRow'
+import TableCell from '@mui/material/TableCell'
+import Tooltip from '@mui/material/Tooltip'
+import TableSortLabel from '@mui/material/TableSortLabel'
+import IconButton from '@mui/material/IconButton'
+import InfoIcon from '@mui/icons-material/InfoOutlined'
 
 const styles = theme => ({
   headerCol: {
@@ -50,7 +50,7 @@ const ResultTableHead = props => {
                       title={description}
                       enterDelay={300}
                     >
-                      <IconButton>
+                      <IconButton size="large">
                         <InfoIcon />
                       </IconButton>
                     </Tooltip>
@@ -78,18 +78,18 @@ const ResultTableHead = props => {
                       title={description}
                       enterDelay={300}
                     >
-                      <IconButton>
+                      <IconButton size="large">
                         <InfoIcon />
                       </IconButton>
                     </Tooltip>
                   </TableCell>
                   )}
             </React.Fragment>
-          )
+          );
         })}
       </TableRow>
     </TableHead>
-  )
+  );
 }
 
 ResultTableHead.propTypes = {
diff --git a/src/client/components/facet_results/ResultTablePaginationActions.js b/src/client/components/facet_results/ResultTablePaginationActions.js
index 33cd1adaa453aef30ce2caca1fe86e42aa8a93ae..64082c88827eef513a607a8ec333ca7d688eccf1 100644
--- a/src/client/components/facet_results/ResultTablePaginationActions.js
+++ b/src/client/components/facet_results/ResultTablePaginationActions.js
@@ -1,11 +1,11 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import { withStyles } from '@material-ui/core/styles'
-import IconButton from '@material-ui/core/IconButton'
-import FirstPageIcon from '@material-ui/icons/FirstPage'
-import KeyboardArrowLeft from '@material-ui/icons/KeyboardArrowLeft'
-import KeyboardArrowRight from '@material-ui/icons/KeyboardArrowRight'
-import LastPageIcon from '@material-ui/icons/LastPage'
+import withStyles from '@mui/styles/withStyles';
+import IconButton from '@mui/material/IconButton'
+import FirstPageIcon from '@mui/icons-material/FirstPage'
+import KeyboardArrowLeft from '@mui/icons-material/KeyboardArrowLeft'
+import KeyboardArrowRight from '@mui/icons-material/KeyboardArrowRight'
+import LastPageIcon from '@mui/icons-material/LastPage'
 
 const styles = theme => ({
   root: {
@@ -34,28 +34,32 @@ const ResultTablePaginationActions = props => {
         onClick={handleFirstPageButtonClick}
         disabled={page === 0}
         aria-label='First Page'
-      >
+        size="large">
         {theme.direction === 'rtl' ? <LastPageIcon /> : <FirstPageIcon />}
       </IconButton>
-      <IconButton onClick={handleBackButtonClick} disabled={page === 0} aria-label='Previous Page'>
+      <IconButton
+        onClick={handleBackButtonClick}
+        disabled={page === 0}
+        aria-label='Previous Page'
+        size="large">
         {theme.direction === 'rtl' ? <KeyboardArrowRight /> : <KeyboardArrowLeft />}
       </IconButton>
       <IconButton
         onClick={handleNextButtonClick}
         disabled={page >= Math.ceil(count / rowsPerPage) - 1}
         aria-label='Next Page'
-      >
+        size="large">
         {theme.direction === 'rtl' ? <KeyboardArrowLeft /> : <KeyboardArrowRight />}
       </IconButton>
       <IconButton
         onClick={handleLastPageButtonClick}
         disabled={page >= Math.ceil(count / rowsPerPage) - 1}
         aria-label='Last Page'
-      >
+        size="large">
         {theme.direction === 'rtl' ? <FirstPageIcon /> : <LastPageIcon />}
       </IconButton>
     </div>
-  )
+  );
 }
 
 ResultTablePaginationActions.propTypes = {
diff --git a/src/client/components/facet_results/StringList.js b/src/client/components/facet_results/StringList.js
index 20c5adb7c46b7bd063f4b6830e34d16473cb1b04..082aec11244730a65e525cc7cfb5c7e32952e4cd 100644
--- a/src/client/components/facet_results/StringList.js
+++ b/src/client/components/facet_results/StringList.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import { withStyles } from '@material-ui/core/styles'
-import Collapse from '@material-ui/core/Collapse'
+import withStyles from '@mui/styles/withStyles';
+import Collapse from '@mui/material/Collapse'
 import HTMLParser from '../../helpers/HTMLParser'
 import classNames from 'classnames'
 
diff --git a/src/client/components/facet_results/TemporalMap.js b/src/client/components/facet_results/TemporalMap.js
index 4b04d1085459d4105c519a7170170087fcc10bd4..e6bb1481973c5f784bd4ab9d498c1aca1353ec5c 100644
--- a/src/client/components/facet_results/TemporalMap.js
+++ b/src/client/components/facet_results/TemporalMap.js
@@ -1,13 +1,13 @@
 import React, { Component } from 'react'
 import PropTypes from 'prop-types'
-import { withStyles } from '@material-ui/core/styles'
+import withStyles from '@mui/styles/withStyles';
 import intl from 'react-intl-universal'
 import ReactMapGL, { NavigationControl, FullscreenControl } from 'react-map-gl'
 import DeckGL, { ScatterplotLayer } from 'deck.gl'
-import Paper from '@material-ui/core/Paper'
+import Paper from '@mui/material/Paper'
 import TemporalMapTimeSlider from './TemporalMapTimeSlider'
 import './TemporalMapCommon.scss'
-import Typography from '@material-ui/core/Typography'
+import Typography from '@mui/material/Typography'
 import { has } from 'lodash'
 import Moment from 'moment'
 import { extendMoment } from 'moment-range'
diff --git a/src/client/components/facet_results/TemporalMapTimeSlider.js b/src/client/components/facet_results/TemporalMapTimeSlider.js
index 0385ad806dba78ace9aec942bf2825b2868b6cd3..4aade73420bc293207ba3f3439fa87afe8fb75c6 100644
--- a/src/client/components/facet_results/TemporalMapTimeSlider.js
+++ b/src/client/components/facet_results/TemporalMapTimeSlider.js
@@ -1,7 +1,7 @@
 import React from 'react'
-import { withStyles } from '@material-ui/core/styles'
+import withStyles from '@mui/styles/withStyles';
 import PropTypes from 'prop-types'
-import Slider from '@material-ui/core/Slider'
+import Slider from '@mui/material/Slider'
 import { BaseControl } from 'react-map-gl'
 import moment from 'moment'
 
diff --git a/src/client/components/facet_results/VirtualizedTable.js b/src/client/components/facet_results/VirtualizedTable.js
index 770e8822e284bae2d59b64f5351748f363e79900..f13d311d6101b82a1839e94eb43396384699182e 100644
--- a/src/client/components/facet_results/VirtualizedTable.js
+++ b/src/client/components/facet_results/VirtualizedTable.js
@@ -2,9 +2,9 @@ import React from 'react'
 import Immutable from 'immutable'
 import PropTypes from 'prop-types'
 import intl from 'react-intl-universal'
-import { withStyles } from '@material-ui/core/styles'
-import IconButton from '@material-ui/core/IconButton'
-import PlaceIcon from '@material-ui/icons/Place'
+import withStyles from '@mui/styles/withStyles';
+import IconButton from '@mui/material/IconButton'
+import PlaceIcon from '@mui/icons-material/Place'
 import { has } from 'lodash'
 import {
   AutoSizer,
@@ -119,10 +119,7 @@ class VirtualizedTable extends React.PureComponent {
       let marker = ''
       if (typeof rowData.lat !== 'undefined' || typeof rowData.long !== 'undefined') {
         marker = (
-          <IconButton
-            disabled
-            aria-label='Marker'
-          >
+          <IconButton disabled aria-label='Marker' size="large">
             <PlaceIcon />
           </IconButton>
         )
diff --git a/src/client/components/main_layout/FullTextSearch.js b/src/client/components/main_layout/FullTextSearch.js
index f7582bf04c8405054f94b9f5fe6118d2fe63907f..f3f129eeb9f5f38ead85d299382dbd48ca323be8 100644
--- a/src/client/components/main_layout/FullTextSearch.js
+++ b/src/client/components/main_layout/FullTextSearch.js
@@ -1,10 +1,10 @@
 import React from 'react'
 import PropTypes from 'prop-types'
 import { Route, Redirect } from 'react-router-dom'
-import { makeStyles } from '@material-ui/core/styles'
+import makeStyles from '@mui/styles/makeStyles';
 import PerspectiveTabs from './PerspectiveTabs'
 import ReactVirtualizedTable from '../facet_results/ReactVirtualizedTable'
-import CalendarViewDayIcon from '@material-ui/icons/CalendarViewDay'
+import CalendarViewDayIcon from '@mui/icons-material/CalendarViewDay'
 
 const useStyles = makeStyles(theme => ({
   root: props => ({
diff --git a/src/client/components/main_layout/GeneralDialog.js b/src/client/components/main_layout/GeneralDialog.js
index 4b5af19a020e8a3140011627428f0b79e90a14d3..e7ed9211af7c651471d37206a49ccedffeccc65f 100644
--- a/src/client/components/main_layout/GeneralDialog.js
+++ b/src/client/components/main_layout/GeneralDialog.js
@@ -1,11 +1,11 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import Dialog from '@material-ui/core/Dialog'
-import MuiDialogTitle from '@material-ui/core/DialogTitle'
-import IconButton from '@material-ui/core/IconButton'
-import CloseIcon from '@material-ui/icons/Close'
-import Typography from '@material-ui/core/Typography'
-import { withStyles } from '@material-ui/core/styles'
+import Dialog from '@mui/material/Dialog'
+import MuiDialogTitle from '@mui/material/DialogTitle'
+import IconButton from '@mui/material/IconButton'
+import CloseIcon from '@mui/icons-material/Close'
+import Typography from '@mui/material/Typography'
+import withStyles from '@mui/styles/withStyles';
 
 const styles = theme => ({
   dialogPaper: {
@@ -26,13 +26,17 @@ const DialogTitle = withStyles(styles)((props) => {
       <Typography variant='h6'>{children}</Typography>
       {onClose
         ? (
-          <IconButton aria-label='close' className={classes.closeButton} onClick={onClose}>
+          <IconButton
+            aria-label='close'
+            className={classes.closeButton}
+            onClick={onClose}
+            size="large">
             <CloseIcon />
           </IconButton>
           )
         : null}
     </MuiDialogTitle>
-  )
+  );
 })
 
 const GeneralDialog = props => {
diff --git a/src/client/components/main_layout/ImageGallerySRL.js b/src/client/components/main_layout/ImageGallerySRL.js
index 006f47fa86b54bf636dafaaa864043949ee57642..d4e5fdfd55c203a559a3724ca41a82a59c860493 100644
--- a/src/client/components/main_layout/ImageGallerySRL.js
+++ b/src/client/components/main_layout/ImageGallerySRL.js
@@ -1,7 +1,7 @@
 import React from 'react'
-import { makeStyles } from '@material-ui/core/styles'
+import makeStyles from '@mui/styles/makeStyles';
 import { SRLWrapper, useLightbox } from 'simple-react-lightbox'
-import Button from '@material-ui/core/Button'
+import Button from '@mui/material/Button'
 
 const useStyles = makeStyles({
   previewImage: {
diff --git a/src/client/components/main_layout/InfoHeader.js b/src/client/components/main_layout/InfoHeader.js
index 3cf5bdc8561ca7ba35d5e0bd9b0414e598cba28d..40254da639ab02d945f870b82b77c10f9497a479 100644
--- a/src/client/components/main_layout/InfoHeader.js
+++ b/src/client/components/main_layout/InfoHeader.js
@@ -1,15 +1,15 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import { makeStyles } from '@material-ui/core/styles'
-import Accordion from '@material-ui/core/Accordion'
-import AccordionSummary from '@material-ui/core/AccordionSummary'
-import AccordionDetails from '@material-ui/core/AccordionDetails'
-import ExpandMoreIcon from '@material-ui/icons/ExpandMore'
-import Typography from '@material-ui/core/Typography'
-// import Divider from '@material-ui/core/Divider';
-import IconButton from '@material-ui/core/IconButton'
-import InfoIcon from '@material-ui/icons/InfoOutlined'
-import Tooltip from '@material-ui/core/Tooltip'
+import makeStyles from '@mui/styles/makeStyles';
+import Accordion from '@mui/material/Accordion'
+import AccordionSummary from '@mui/material/AccordionSummary'
+import AccordionDetails from '@mui/material/AccordionDetails'
+import ExpandMoreIcon from '@mui/icons-material/ExpandMore'
+import Typography from '@mui/material/Typography'
+// import Divider from '@mui/material/Divider';
+import IconButton from '@mui/material/IconButton'
+import InfoIcon from '@mui/icons-material/InfoOutlined'
+import Tooltip from '@mui/material/Tooltip'
 import intl from 'react-intl-universal'
 
 const useStyles = makeStyles(theme => ({
@@ -31,7 +31,7 @@ const useStyles = makeStyles(theme => ({
   summaryContent: {
     display: 'block',
     marginTop: theme.spacing(0.5),
-    marginBottom: `${theme.spacing(0.5)}px !important`
+    marginBottom: `${theme.spacing(0.5)} !important`
   },
   headingContainer: {
     display: 'flex'
@@ -133,7 +133,11 @@ const InfoHeader = props => {
               {props.pageType === 'instancePage' && intl.get(`perspectives.${props.resultClass}.instancePage.label`)}
             </Typography>
             <Tooltip title={intl.get('infoHeader.toggleInstructions')}>
-              <IconButton aria-label='toggle instructions' className={classes.infoIconButton} onClick={handleExpandButtonOnClick}>
+              <IconButton
+                aria-label='toggle instructions'
+                className={classes.infoIconButton}
+                onClick={handleExpandButtonOnClick}
+                size="large">
                 <InfoIcon className={classes.infoIcon} />
               </IconButton>
             </Tooltip>
@@ -153,7 +157,7 @@ const InfoHeader = props => {
         </AccordionDetails>
       </Accordion>
     </div>
-  )
+  );
 }
 
 InfoHeader.propTypes = {
diff --git a/src/client/components/main_layout/InstanceList.js b/src/client/components/main_layout/InstanceList.js
index bd7f35ffb946b3ffed33ee04b0686800b497fea3..d6727735239e4482d1d0d707bd154e284d88040b 100644
--- a/src/client/components/main_layout/InstanceList.js
+++ b/src/client/components/main_layout/InstanceList.js
@@ -1,8 +1,8 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import { withStyles } from '@material-ui/core/styles'
+import withStyles from '@mui/styles/withStyles';
 import { Link } from 'react-router-dom'
-import Typography from '@material-ui/core/Typography'
+import Typography from '@mui/material/Typography'
 
 const styles = theme => ({
   root: {
diff --git a/src/client/components/main_layout/InstancePage.js b/src/client/components/main_layout/InstancePage.js
index 0dc9b2a0e4b87ac30e9d87141871527cb8a1f89a..db882a43bff4f0b2fe39ac29d447c66b4be14140 100644
--- a/src/client/components/main_layout/InstancePage.js
+++ b/src/client/components/main_layout/InstancePage.js
@@ -1,15 +1,15 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import { withStyles } from '@material-ui/core/styles'
-import Paper from '@material-ui/core/Paper'
-import Typography from '@material-ui/core/Typography'
-import CircularProgress from '@material-ui/core/CircularProgress'
-import purple from '@material-ui/core/colors/purple'
+import withStyles from '@mui/styles/withStyles';
+import Paper from '@mui/material/Paper'
+import Typography from '@mui/material/Typography'
+import CircularProgress from '@mui/material/CircularProgress'
 import PerspectiveTabs from './PerspectiveTabs'
 import ResultClassRoute from '../facet_results/ResultClassRoute'
 import { getLocalIDFromAppLocation, createURIfromLocalID } from '../../helpers/helpers'
 import { Route, Redirect } from 'react-router-dom'
 import { has } from 'lodash'
+import { purple } from '@mui/material/colors';
 
 const styles = () => ({
   root: {
diff --git a/src/client/components/main_layout/InstancePageTable.js b/src/client/components/main_layout/InstancePageTable.js
index dd7c73ee59d43ce5b31a7a6008160f84dac5c3bf..b882c1d681cc4500d0507f5d509bb554d840c2a9 100644
--- a/src/client/components/main_layout/InstancePageTable.js
+++ b/src/client/components/main_layout/InstancePageTable.js
@@ -1,23 +1,23 @@
 import React from 'react'
 import PropTypes from 'prop-types'
 import intl from 'react-intl-universal'
-import { withStyles } from '@material-ui/core/styles'
+import withStyles from '@mui/styles/withStyles';
 import clsx from 'clsx'
-import ExpandMoreIcon from '@material-ui/icons/ExpandMore'
-import Table from '@material-ui/core/Table'
-import TableBody from '@material-ui/core/TableBody'
-import TableRow from '@material-ui/core/TableRow'
-import TableCell from '@material-ui/core/TableCell'
+import ExpandMoreIcon from '@mui/icons-material/ExpandMore'
+import Table from '@mui/material/Table'
+import TableBody from '@mui/material/TableBody'
+import TableRow from '@mui/material/TableRow'
+import TableCell from '@mui/material/TableCell'
 import ResultTableCell from '../facet_results/ResultTableCell'
-import Tooltip from '@material-ui/core/Tooltip'
-import IconButton from '@material-ui/core/IconButton'
-import InfoIcon from '@material-ui/icons/InfoOutlined'
+import Tooltip from '@mui/material/Tooltip'
+import IconButton from '@mui/material/IconButton'
+import InfoIcon from '@mui/icons-material/InfoOutlined'
 
 const styles = theme => ({
   instanceTable: {
     maxWidth: 1200,
     width: '100%',
-    [theme.breakpoints.down('md')]: {
+    [theme.breakpoints.down('lg')]: {
       tableLayout: 'fixed',
       overflowWrap: 'break-word'
     },
@@ -38,7 +38,7 @@ const styles = theme => ({
     justifyContent: 'center'
   },
   labelCell: {
-    [theme.breakpoints.down('md')]: {
+    [theme.breakpoints.down('lg')]: {
       paddingRight: 0
     },
     [theme.breakpoints.up('md')]: {
@@ -53,7 +53,7 @@ const styles = theme => ({
     paddingTop: 0,
     paddingBottom: 0,
     width: 32,
-    [theme.breakpoints.down('md')]: {
+    [theme.breakpoints.down('lg')]: {
       paddingLeft: 0
     }
   },
@@ -126,81 +126,79 @@ class InstancePageTable extends React.Component {
   render = () => {
     const { classes, data, properties, screenSize, perspectiveConfig } = this.props
     const perspectiveID = perspectiveConfig.id
-    return (
-      <>
-        {data &&
-          <Table className={classes.instanceTable} size='small'>
-            <TableBody>
-              {properties.map(row => {
-                const label = intl.get(`perspectives.${perspectiveID}.properties.${row.id}.label`)
-                const description = intl.get(`perspectives.${perspectiveID}.properties.${row.id}.description`)
-                const {
-                  id, valueType, makeLink, externalLink, sortValues, sortBy, numberedList, minWidth,
-                  linkAsButton, collapsedMaxWords, showSource, sourceExternalLink, renderAsHTML, HTMLParserTask
-                } = row
-                let { previewImageHeight } = row
-                if (screenSize === 'xs' || screenSize === 'sm') {
-                  previewImageHeight = 50
-                }
-                const expanded = this.state.expandedRows.has(row.id)
-                return (
-                  <TableRow key={row.id}>
-                    <TableCell className={classes.labelCell}>
-                      {label}
-                      <Tooltip
-                        className={classes.tooltip}
-                        title={description}
-                        enterDelay={300}
-                      >
-                        <IconButton>
-                          <InfoIcon />
-                        </IconButton>
-                      </Tooltip>
-                    </TableCell>
-                    <TableCell className={classes.expandCell}>
-                      {this.hasExpandableContent({ data: data[id], config: row }) &&
-                        <IconButton
-                          className={clsx(classes.expand, {
-                            [classes.expandOpen]: expanded
-                          })}
-                          onClick={this.handleExpandRow(row.id)}
-                          aria-expanded={expanded}
-                          aria-label='Show more'
-                        >
-                          <ExpandMoreIcon />
-                        </IconButton>}
-                    </TableCell>
-                    <ResultTableCell
-                      key={id}
-                      columnId={id}
-                      data={data[id]}
-                      valueType={valueType}
-                      makeLink={makeLink}
-                      externalLink={externalLink}
-                      sortValues={sortValues}
-                      sortBy={sortBy}
-                      numberedList={numberedList}
-                      minWidth={minWidth}
-                      previewImageHeight={previewImageHeight}
-                      container='cell'
-                      expanded={expanded}
-                      shortenLabel={false}
-                      linkAsButton={linkAsButton}
-                      collapsedMaxWords={collapsedMaxWords}
-                      showSource={showSource}
-                      sourceExternalLink={sourceExternalLink}
-                      renderAsHTML={renderAsHTML}
-                      HTMLParserTask={HTMLParserTask}
-                      referencedTerm={data.referencedTerm}
-                    />
-                  </TableRow>
-                )
+    return <>
+      {data &&
+        <Table className={classes.instanceTable} size='small'>
+          <TableBody>
+            {properties.map(row => {
+              const label = intl.get(`perspectives.${perspectiveID}.properties.${row.id}.label`)
+              const description = intl.get(`perspectives.${perspectiveID}.properties.${row.id}.description`)
+              const {
+                id, valueType, makeLink, externalLink, sortValues, sortBy, numberedList, minWidth,
+                linkAsButton, collapsedMaxWords, showSource, sourceExternalLink, renderAsHTML, HTMLParserTask
+              } = row
+              let { previewImageHeight } = row
+              if (screenSize === 'xs' || screenSize === 'sm') {
+                previewImageHeight = 50
               }
-              )}
-            </TableBody>
-          </Table>}
-      </>
-    )
+              const expanded = this.state.expandedRows.has(row.id)
+              return (
+                <TableRow key={row.id}>
+                  <TableCell className={classes.labelCell}>
+                    {label}
+                    <Tooltip
+                      className={classes.tooltip}
+                      title={description}
+                      enterDelay={300}
+                    >
+                      <IconButton size="large">
+                        <InfoIcon />
+                      </IconButton>
+                    </Tooltip>
+                  </TableCell>
+                  <TableCell className={classes.expandCell}>
+                    {this.hasExpandableContent({ data: data[id], config: row }) &&
+                      <IconButton
+                        className={clsx(classes.expand, {
+                          [classes.expandOpen]: expanded
+                        })}
+                        onClick={this.handleExpandRow(row.id)}
+                        aria-expanded={expanded}
+                        aria-label='Show more'
+                        size="large">
+                        <ExpandMoreIcon />
+                      </IconButton>}
+                  </TableCell>
+                  <ResultTableCell
+                    key={id}
+                    columnId={id}
+                    data={data[id]}
+                    valueType={valueType}
+                    makeLink={makeLink}
+                    externalLink={externalLink}
+                    sortValues={sortValues}
+                    sortBy={sortBy}
+                    numberedList={numberedList}
+                    minWidth={minWidth}
+                    previewImageHeight={previewImageHeight}
+                    container='cell'
+                    expanded={expanded}
+                    shortenLabel={false}
+                    linkAsButton={linkAsButton}
+                    collapsedMaxWords={collapsedMaxWords}
+                    showSource={showSource}
+                    sourceExternalLink={sourceExternalLink}
+                    renderAsHTML={renderAsHTML}
+                    HTMLParserTask={HTMLParserTask}
+                    referencedTerm={data.referencedTerm}
+                  />
+                </TableRow>
+              );
+            }
+            )}
+          </TableBody>
+        </Table>}
+    </>;
   }
 }
 
diff --git a/src/client/components/main_layout/KnowledgeGraphMetadataTable.js b/src/client/components/main_layout/KnowledgeGraphMetadataTable.js
index 58822256e0b362db83119c1a6924a2cdb496c6e6..6c116a3fe686a5e54e6525521768c43c6cafb98d 100644
--- a/src/client/components/main_layout/KnowledgeGraphMetadataTable.js
+++ b/src/client/components/main_layout/KnowledgeGraphMetadataTable.js
@@ -1,13 +1,13 @@
 import React, { useEffect } from 'react'
 import PropTypes from 'prop-types'
-import { makeStyles } from '@material-ui/core/styles'
-import Table from '@material-ui/core/Table'
-import TableBody from '@material-ui/core/TableBody'
-import TableCell from '@material-ui/core/TableCell'
-import TableContainer from '@material-ui/core/TableContainer'
-import TableHead from '@material-ui/core/TableHead'
-import TableRow from '@material-ui/core/TableRow'
-import Paper from '@material-ui/core/Paper'
+import makeStyles from '@mui/styles/makeStyles';
+import Table from '@mui/material/Table'
+import TableBody from '@mui/material/TableBody'
+import TableCell from '@mui/material/TableCell'
+import TableContainer from '@mui/material/TableContainer'
+import TableHead from '@mui/material/TableHead'
+import TableRow from '@mui/material/TableRow'
+import Paper from '@mui/material/Paper'
 
 const useStyles = makeStyles(theme => ({
   root: {
diff --git a/src/client/components/main_layout/MuiIcon.js b/src/client/components/main_layout/MuiIcon.js
index 5c107aef0a6c29f45b914b38fc11ff184fd3fa12..d60bf295f4f555bbb072df90f2789a1ae0d4f910 100644
--- a/src/client/components/main_layout/MuiIcon.js
+++ b/src/client/components/main_layout/MuiIcon.js
@@ -20,7 +20,7 @@ import {
   PlayArrow,
   MailOutline,
   TrendingDown
-} from '@material-ui/icons'
+} from '@mui/icons-material'
 import has from 'lodash'
 
 const MuiIcon = props => {
diff --git a/src/client/components/main_layout/PerspectiveTabs.js b/src/client/components/main_layout/PerspectiveTabs.js
index 0773cd6409e7efe959ff721ca70c5880b269acee..96b32667f356cb454ec046e47dc76775b40f09c0 100644
--- a/src/client/components/main_layout/PerspectiveTabs.js
+++ b/src/client/components/main_layout/PerspectiveTabs.js
@@ -1,11 +1,11 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import { withStyles } from '@material-ui/core/styles'
-import Grow from '@material-ui/core/Grow'
-import Tabs from '@material-ui/core/Tabs'
-import Tab from '@material-ui/core/Tab'
+import withStyles from '@mui/styles/withStyles';
+import Grow from '@mui/material/Grow'
+import Tabs from '@mui/material/Tabs'
+import Tab from '@mui/material/Tab'
 import { Link } from 'react-router-dom'
-import Paper from '@material-ui/core/Paper'
+import Paper from '@mui/material/Paper'
 import intl from 'react-intl-universal'
 
 const styles = theme => ({
diff --git a/src/client/components/main_layout/Player.js b/src/client/components/main_layout/Player.js
index f2cc5c7d25e9e6a54f9ab098572b700949d824fe..d01ec655fd5774d857247f043691d7738ba80560 100644
--- a/src/client/components/main_layout/Player.js
+++ b/src/client/components/main_layout/Player.js
@@ -1,5 +1,5 @@
 import React from 'react'
-import { withStyles } from '@material-ui/core/styles'
+import withStyles from '@mui/styles/withStyles';
 
 const styles = theme => ({
   // https://www.w3schools.com/howto/howto_css_responsive_iframes.asp
diff --git a/src/client/components/main_layout/TextPage.js b/src/client/components/main_layout/TextPage.js
index b3a7c3b269c73387d977f1c0eb01e6311a649963..5f7f70cddebd67007a1a7fa803863219d29dd531 100644
--- a/src/client/components/main_layout/TextPage.js
+++ b/src/client/components/main_layout/TextPage.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import { makeStyles } from '@material-ui/core/styles'
-import Paper from '@material-ui/core/Paper'
+import makeStyles from '@mui/styles/makeStyles';
+import Paper from '@mui/material/Paper'
 
 const useStyles = makeStyles(theme => ({
   root: {
@@ -15,7 +15,7 @@ const useStyles = makeStyles(theme => ({
     padding: theme.spacing(3),
     marginLeft: theme.spacing(3),
     marginRight: theme.spacing(3),
-    [theme.breakpoints.down('sm')]: {
+    [theme.breakpoints.down('md')]: {
       padding: theme.spacing(1.5),
       marginLeft: 0,
       marginRight: 0
diff --git a/src/client/components/main_layout/TopBar.js b/src/client/components/main_layout/TopBar.js
index 37b128ee61beb33d1dabd8f51f7df197817ebd85..312f6d578a339eeaabfdd16231761acd8ebe7c11 100644
--- a/src/client/components/main_layout/TopBar.js
+++ b/src/client/components/main_layout/TopBar.js
@@ -1,20 +1,20 @@
 import React from 'react'
 import PropTypes from 'prop-types'
 import intl from 'react-intl-universal'
-import AppBar from '@material-ui/core/AppBar'
-import Toolbar from '@material-ui/core/Toolbar'
-import IconButton from '@material-ui/core/IconButton'
-import Typography from '@material-ui/core/Typography'
-import MenuItem from '@material-ui/core/MenuItem'
-import Menu from '@material-ui/core/Menu'
-import { makeStyles } from '@material-ui/core/styles'
-import MoreIcon from '@material-ui/icons/MoreVert'
-import Button from '@material-ui/core/Button'
+import AppBar from '@mui/material/AppBar'
+import Toolbar from '@mui/material/Toolbar'
+import IconButton from '@mui/material/IconButton'
+import Typography from '@mui/material/Typography'
+import MenuItem from '@mui/material/MenuItem'
+import Menu from '@mui/material/Menu'
+import makeStyles from '@mui/styles/makeStyles'
+import MoreIcon from '@mui/icons-material/MoreVert'
+import Button from '@mui/material/Button'
 import { Link, NavLink } from 'react-router-dom'
 import TopBarSearchField from './TopBarSearchField'
 import TopBarInfoButton from './TopBarInfoButton'
 import TopBarLanguageButton from './TopBarLanguageButton'
-import Divider from '@material-ui/core/Divider'
+import Divider from '@mui/material/Divider'
 import { has } from 'lodash'
 import secoLogo from '../../img/logos/seco-logo-48x50.png'
 
@@ -79,7 +79,7 @@ const useStyles = makeStyles(theme => ({
   }),
   mainLogoButtonRoot: {
     paddingLeft: 0,
-    [theme.breakpoints.down('xs')]: {
+    [theme.breakpoints.down('sm')]: {
       minWidth: 48
     }
   },
@@ -92,11 +92,11 @@ const useStyles = makeStyles(theme => ({
     background: theme.palette.primary.main,
     whiteSpace: 'nowrap',
     textTransform: props.layoutConfig.topBar.logoTextTransform,
-    [theme.breakpoints.down('sm')]: {
+    [theme.breakpoints.down('md')]: {
       fontSize: '1.5rem'
     },
     ...(props.layoutConfig.topBar.hideLogoTextOnMobile && {
-      [theme.breakpoints.down('xs')]: {
+      [theme.breakpoints.down('sm')]: {
         display: 'none'
       }
     })
@@ -382,9 +382,11 @@ const TopBar = props => {
                 location={props.location}
               />}
             <IconButton
-              aria-label='display more actions' color='inherit'
+              aria-label='display more actions'
+              color='inherit'
               className={classes.mobileMenuButton}
               onClick={handleMobileMenuOpen}
+              size='large'
             >
               <MoreIcon />
             </IconButton>
diff --git a/src/client/components/main_layout/TopBarInfoButton.js b/src/client/components/main_layout/TopBarInfoButton.js
index dd34179ccdef26664fdd58b0db76dda03965446d..48d6d5a2b6084f0cc5ba8e9be88ad6fddda0281c 100644
--- a/src/client/components/main_layout/TopBarInfoButton.js
+++ b/src/client/components/main_layout/TopBarInfoButton.js
@@ -1,11 +1,11 @@
 import React from 'react'
 import PropTypes from 'prop-types'
 import intl from 'react-intl-universal'
-import Button from '@material-ui/core/Button'
-import MenuItem from '@material-ui/core/MenuItem'
-import Menu from '@material-ui/core/Menu'
-import ExpandMoreIcon from '@material-ui/icons/ExpandMore'
-import { withStyles } from '@material-ui/core/styles'
+import Button from '@mui/material/Button'
+import MenuItem from '@mui/material/MenuItem'
+import Menu from '@mui/material/Menu'
+import ExpandMoreIcon from '@mui/icons-material/ExpandMore'
+import withStyles from '@mui/styles/withStyles'
 import { Link } from 'react-router-dom'
 
 const styles = theme => ({
@@ -80,7 +80,6 @@ class TopBarInfoButton extends React.Component {
         </Button>
         <Menu
           anchorEl={this.state.anchorEl}
-          getContentAnchorEl={null}
           anchorOrigin={{
             vertical: 'bottom',
             horizontal: 'center'
diff --git a/src/client/components/main_layout/TopBarLanguageButton.js b/src/client/components/main_layout/TopBarLanguageButton.js
index 5725a5419884b1be31ae762914a80da170bbc797..9229e68e06e8c60aeeb3a3aac9c903f4dc7ed32f 100644
--- a/src/client/components/main_layout/TopBarLanguageButton.js
+++ b/src/client/components/main_layout/TopBarLanguageButton.js
@@ -1,10 +1,10 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import Button from '@material-ui/core/Button'
-import MenuItem from '@material-ui/core/MenuItem'
-import Menu from '@material-ui/core/Menu'
-import ExpandMoreIcon from '@material-ui/icons/ExpandMore'
-import { withStyles } from '@material-ui/core/styles'
+import Button from '@mui/material/Button'
+import MenuItem from '@mui/material/MenuItem'
+import Menu from '@mui/material/Menu'
+import ExpandMoreIcon from '@mui/icons-material/ExpandMore'
+import withStyles from '@mui/styles/withStyles'
 import { Link } from 'react-router-dom'
 import history from '../../History'
 import { updateLocaleToPathname } from '../../helpers/helpers'
@@ -57,7 +57,6 @@ class TopBarLanguageButton extends React.Component {
         </Button>
         <Menu
           anchorEl={this.state.anchorEl}
-          getContentAnchorEl={null}
           anchorOrigin={{
             vertical: 'bottom',
             horizontal: 'center'
diff --git a/src/client/components/main_layout/TopBarSearchField.js b/src/client/components/main_layout/TopBarSearchField.js
index 8e848cbff8d40ab8ae00d1e26c06f6356524eaac..0c89fb4708e67a8354a7c68dccf749c4ec7f0699 100644
--- a/src/client/components/main_layout/TopBarSearchField.js
+++ b/src/client/components/main_layout/TopBarSearchField.js
@@ -1,11 +1,11 @@
 import React from 'react'
 import PropTypes from 'prop-types'
 import intl from 'react-intl-universal'
-import { withStyles } from '@material-ui/core/styles'
-import { alpha } from '@material-ui/core/styles/colorManipulator'
-import SearchIcon from '@material-ui/icons/Search'
-import InputBase from '@material-ui/core/InputBase'
-// import CircularProgress from '@material-ui/core/CircularProgress';
+import { alpha } from '@mui/material/styles';
+import withStyles from '@mui/styles/withStyles';
+import SearchIcon from '@mui/icons-material/Search'
+import InputBase from '@mui/material/InputBase'
+// import CircularProgress from '@mui/material/CircularProgress';
 import history from '../../History'
 
 const styles = theme => ({
diff --git a/src/client/components/main_layout/VideoPage.js b/src/client/components/main_layout/VideoPage.js
index 1c357cb2985e54a2ffc38dd768cca0c19195b461..19ae3796d8015bce32d115737d3c94105fcda757 100644
--- a/src/client/components/main_layout/VideoPage.js
+++ b/src/client/components/main_layout/VideoPage.js
@@ -1,8 +1,8 @@
 import React from 'react'
-import { makeStyles } from '@material-ui/core/styles'
-import Paper from '@material-ui/core/Paper'
-import Grid from '@material-ui/core/Grid'
-import { Typography } from '@material-ui/core'
+import makeStyles from '@mui/styles/makeStyles';
+import Paper from '@mui/material/Paper'
+import Grid from '@mui/material/Grid'
+import { Typography } from '@mui/material'
 import InstancePageTable from './InstancePageTable'
 import Player from './Player'
 import VideoTableOfContents from './VideoTableOfContents'
@@ -24,7 +24,7 @@ const useStyles = makeStyles(theme => ({
     marginTop: theme.spacing(1),
     // flexWrap: 'wrap-reverse',
     [theme.breakpoints.up(props.layoutConfig.hundredPercentHeightBreakPoint)]: {
-      height: `calc(100% - ${theme.spacing(2.5)}px)`
+      height: `calc(100% - ${theme.spacing(2.5)})`
     }
   }),
   gridItem: props => ({
@@ -46,7 +46,7 @@ const useStyles = makeStyles(theme => ({
     [theme.breakpoints.up(props.layoutConfig.hundredPercentHeightBreakPoint)]: {
       height: '60%'
     },
-    [theme.breakpoints.down('sm')]: {
+    [theme.breakpoints.down('md')]: {
       maxWidth: 500
     },
     overflow: 'auto',
@@ -57,7 +57,7 @@ const useStyles = makeStyles(theme => ({
   tableContainer: props => ({
     marginBottom: theme.spacing(1),
     [theme.breakpoints.up(props.layoutConfig.hundredPercentHeightBreakPoint)]: {
-      height: `calc(40% - ${theme.spacing(1)}px)`,
+      height: `calc(40% - ${theme.spacing(1)})`,
       overflow: 'auto'
     }
   }),
diff --git a/src/client/components/main_layout/VideoTableOfContents.js b/src/client/components/main_layout/VideoTableOfContents.js
index 6e7d2dc7935970dced6ce29c2cb74fe06a083d74..7480500c371ca9db41e133c592cc34eb5ddffcca 100644
--- a/src/client/components/main_layout/VideoTableOfContents.js
+++ b/src/client/components/main_layout/VideoTableOfContents.js
@@ -1,12 +1,12 @@
 import React from 'react'
-import { withStyles } from '@material-ui/core/styles'
-import Accordion from '@material-ui/core/Accordion'
-import AccordionDetails from '@material-ui/core/AccordionDetails'
-import AccordionSummary from '@material-ui/core/AccordionSummary'
-import Typography from '@material-ui/core/Typography'
-import ExpandMoreIcon from '@material-ui/icons/ExpandMore'
-import Divider from '@material-ui/core/Divider'
-import Tooltip from '@material-ui/core/Tooltip'
+import withStyles from '@mui/styles/withStyles';
+import Accordion from '@mui/material/Accordion'
+import AccordionDetails from '@mui/material/AccordionDetails'
+import AccordionSummary from '@mui/material/AccordionSummary'
+import Typography from '@mui/material/Typography'
+import ExpandMoreIcon from '@mui/icons-material/ExpandMore'
+import Divider from '@mui/material/Divider'
+import Tooltip from '@mui/material/Tooltip'
 import { Link } from 'react-router-dom'
 import { has } from 'lodash'
 import parse from 'html-react-parser'
diff --git a/src/client/components/main_layout/WordCloud.js b/src/client/components/main_layout/WordCloud.js
index 284335c82a8146060b2861f440d3ca89b893c36c..c261ae19ad5b3d1e210d0bd58cd8d6720cf28b72 100644
--- a/src/client/components/main_layout/WordCloud.js
+++ b/src/client/components/main_layout/WordCloud.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import ReactWordcloud from 'react-wordcloud'
-import { makeStyles } from '@material-ui/core/styles'
-import Paper from '@material-ui/core/Paper'
+import makeStyles from '@mui/styles/makeStyles';
+import Paper from '@mui/material/Paper'
 import 'tippy.js/dist/tippy.css'
 import 'tippy.js/animations/scale.css'
 
@@ -22,7 +22,7 @@ const useStyles = makeStyles(theme => ({
   wordCloudInnerContainer: props => ({
     width: '100%',
     height: '100%',
-    [theme.breakpoints.down('md')]: {
+    [theme.breakpoints.down('lg')]: {
       minHeight: 400,
       overflow: 'auto'
     },
diff --git a/src/client/components/perspectives/sampo/Footer.js b/src/client/components/perspectives/sampo/Footer.js
index 6be5b73c7803641bf1129081321c4290adc4961e..6a3018660c0ec4ad740133ac690a8f97ee2a4c48 100644
--- a/src/client/components/perspectives/sampo/Footer.js
+++ b/src/client/components/perspectives/sampo/Footer.js
@@ -1,8 +1,8 @@
 import React from 'react'
-import Paper from '@material-ui/core/Paper'
+import Paper from '@mui/material/Paper'
 import PropTypes from 'prop-types'
-import Grid from '@material-ui/core/Grid'
-import { makeStyles } from '@material-ui/core/styles'
+import Grid from '@mui/material/Grid'
+import makeStyles from '@mui/styles/makeStyles';
 import aaltoLogo from '../../../img/logos/Aalto_SCI_EN_13_BLACK_2_cropped.png'
 import hyLogo from '../../../img/logos/university-of-helsinki-logo-transparent-black.png'
 import heldigLogo from '../../../img/logos/heldig-logo-transparent-black.png'
@@ -44,7 +44,7 @@ const useStyles = makeStyles(theme => ({
       paddingTop: '0px !important',
       paddingBottom: '0px !important'
     },
-    [theme.breakpoints.down('sm')]: {
+    [theme.breakpoints.down('md')]: {
       paddingTop: '12px !important',
       paddingBottom: '12px !important'
     }
diff --git a/src/client/components/perspectives/sampo/Main.js b/src/client/components/perspectives/sampo/Main.js
index 172a59cde39314cc9350dfdcc6dfa2d79f1c385e..62df9eea49e5716cf4320c5b04bf26c04e0913a3 100644
--- a/src/client/components/perspectives/sampo/Main.js
+++ b/src/client/components/perspectives/sampo/Main.js
@@ -1,92 +1,18 @@
 import React from 'react'
 import PropTypes from 'prop-types'
 import intl from 'react-intl-universal'
-import Grid from '@material-ui/core/Grid'
-import Typography from '@material-ui/core/Typography'
-import { makeStyles } from '@material-ui/core/styles'
-import MainCard from './MainCard'
+import Box from '@mui/material/Box'
+import Grid from '@mui/material/Grid'
+import Typography from '@mui/material/Typography'
 import has from 'lodash'
-
-const useStyles = makeStyles(theme => ({
-  root: props => ({
-    [theme.breakpoints.up(props.layoutConfig.hundredPercentHeightBreakPoint)]: {
-      overflow: 'auto',
-      height: `calc(100% - ${props.layoutConfig.topBar.reducedHeight + props.layoutConfig.footer.reducedHeight + theme.spacing(1)}px)`
-    },
-    [theme.breakpoints.up(props.layoutConfig.reducedHeightBreakpoint)]: {
-      overflow: 'auto',
-      height: `calc(100% - ${props.layoutConfig.topBar.defaultHeight + props.layoutConfig.footer.defaultHeight + theme.spacing(1)}px)`
-    },
-    marginBottom: theme.spacing(1)
-  }),
-  banner: props => ({
-    background: props.layoutConfig.mainPage.bannerBackround,
-    backgroundRepeat: 'no-repeat',
-    backgroundSize: 'cover',
-    backgroundPosition: 'center',
-    height: props.layoutConfig.mainPage.bannerMobileHeight,
-    [theme.breakpoints.up('md')]: {
-      height: props.layoutConfig.mainPage.bannerReducedHeight
-    },
-    [theme.breakpoints.up('xl')]: {
-      height: props.layoutConfig.mainPage.bannerDefaultHeight
-    },
-    boxShadow: '0 -15px 15px 0px #bdbdbd inset',
-    display: 'flex',
-    alignItems: 'center',
-    justifyContent: 'center'
-  }),
-  bannerContent: {
-    display: 'inline-block',
-    color: '#fff'
-  },
-  bannerHeading: {
-    display: 'flex',
-    justifyContent: 'center'
-  },
-  bannerSubheading: {
-    marginTop: theme.spacing(1.5),
-    [theme.breakpoints.up('md')]: {
-      display: 'flex',
-      '& div': {
-        flexGrow: 1,
-        width: 0
-      }
-    }
-  },
-  layout: {
-    marginLeft: theme.spacing(1),
-    marginRight: theme.spacing(1),
-    [theme.breakpoints.up(800 + theme.spacing(6))]: {
-      width: 800,
-      marginLeft: 'auto',
-      marginRight: 'auto'
-    }
-  },
-  heroContent: {
-    // paddingTop: theme.spacing(3),
-    paddingBottom: theme.spacing(1)
-  },
-  licenceText: {
-    marginTop: theme.spacing(0.5),
-    fontSize: '0.7em'
-  },
-  lowerRow: {
-    marginTop: theme.spacing(1)
-  },
-  licenceTextContainer: {
-    marginTop: theme.spacing(1),
-    display: 'flex',
-    justifyContent: 'center'
-  }
-}))
+import MainCard from './MainCard'
+import { getSpacing } from '../../../helpers/helpers'
 
 /**
- * A component for generating a landing page for a semantic portal.
+ * A component for generating a front page for a semantic portal.
  */
 const Main = props => {
   const { perspectives, screenSize } = props
-  const classes = useStyles(props)
   let headingVariant = 'h5'
   let subheadingVariant = 'body1'
   let descriptionVariant = 'body1'
@@ -119,37 +45,106 @@ const Main = props => {
   }
 
   return (
-    <div className={classes.root}>
-      <div className={classes.banner}>
-        <div className={classes.bannerContent}>
-          <div className={classes.bannerHeading}>
+    <Box
+      sx={theme => {
+        const { layoutConfig } = props
+        const defaultHeightReduction = layoutConfig.topBar.defaultHeight +
+          layoutConfig.footer.defaultHeight + getSpacing(theme, 1)
+        const reducedHeightReduction = layoutConfig.topBar.reducedHeight +
+          layoutConfig.footer.reducedHeight + getSpacing(theme, 1)
+        return {
+          [theme.breakpoints.up(props.layoutConfig.hundredPercentHeightBreakPoint)]: {
+            overflow: 'auto',
+            height: `calc(100% - ${reducedHeightReduction}px)`
+          },
+          [theme.breakpoints.up(props.layoutConfig.reducedHeightBreakpoint)]: {
+            overflow: 'auto',
+            height: `calc(100% - ${defaultHeightReduction}px)`
+          },
+          marginBottom: theme.spacing(1)
+        }
+      }}
+    >
+      <Box
+        sx={theme => ({
+          background: props.layoutConfig.mainPage.bannerBackround,
+          backgroundRepeat: 'no-repeat',
+          backgroundSize: 'cover',
+          backgroundPosition: 'center',
+          height: props.layoutConfig.mainPage.bannerMobileHeight,
+          [theme.breakpoints.up('md')]: {
+            height: props.layoutConfig.mainPage.bannerReducedHeight
+          },
+          [theme.breakpoints.up('xl')]: {
+            height: props.layoutConfig.mainPage.bannerDefaultHeight
+          },
+          boxShadow: '0 -15px 15px 0px #bdbdbd inset',
+          display: 'flex',
+          alignItems: 'center',
+          justifyContent: 'center'
+        })}
+      >
+        <Box
+          sx={{
+            color: '#fff'
+          }}
+        >
+          <Box
+            sx={{
+              display: 'flex',
+              justifyContent: 'center'
+            }}
+          >
             <Typography component='h1' variant={headingVariant} align='center'>
               {intl.getHTML('appTitle.long')}
             </Typography>
-          </div>
-          <div className={classes.bannerSubheading}>
-            <div>
+          </Box>
+          <Box
+            sx={theme => ({
+              marginTop: theme.spacing(1.5),
+              [theme.breakpoints.up('md')]: {
+                display: 'flex',
+                '& div': {
+                  flexGrow: 1,
+                  width: 0
+                }
+              }
+            })}
+          >
+            <Box>
               <Typography component='p' variant={subheadingVariant} align='center'>
                 {intl.getHTML('appTitle.subheading')}
               </Typography>
-            </div>
-          </div>
-
-        </div>
-
-      </div>
-      <div className={classes.layout}>
-        <div className={classes.heroContent}>
+            </Box>
+          </Box>
+        </Box>
+      </Box>
+      <Box
+        sx={theme => ({
+          marginLeft: theme.spacing(1),
+          marginRight: theme.spacing(1),
+          [theme.breakpoints.up(800 + getSpacing(theme, 6))]: {
+            width: 800,
+            marginLeft: 'auto',
+            marginRight: 'auto'
+          }
+        })}
+      >
+        <Box
+          sx={theme => ({
+            paddingBottom: theme.spacing(1)
+          })}
+        >
           <Typography variant={descriptionVariant} color='textPrimary' paragraph>
             {intl.getHTML('appDescription')}
           </Typography>
           <Typography variant={descriptionVariant} align='center' color='textPrimary' paragraph>
             {intl.get('selectPerspective')}
           </Typography>
-        </div>
+        </Box>
         <Grid
           container spacing={screenSize === 'sm' ? 2 : 1}
-          justify={screenSize === 'xs' || screenSize === 'sm' ? 'center' : 'flex-start'}
+          justifyContent={screenSize === 'xs' || screenSize === 'sm' ? 'center' : 'flex-start'}
         >
           {perspectives.map(perspective => {
             const hideCard = (has(perspective.hideCardOnFrontPage) && perspective.hideCardOnFrontPage)
@@ -166,11 +161,24 @@ const Main = props => {
             return null
           })}
         </Grid>
-        <div className={classes.licenceTextContainer}>
-          <Typography className={classes.licenceText}>{intl.getHTML('mainPageImageLicence')}</Typography>
-        </div>
-      </div>
-    </div>
+        <Box
+          sx={theme => ({
+            marginTop: theme.spacing(1),
+            display: 'flex',
+            justifyContent: 'center'
+          })}
+        >
+          <Typography
+            sx={theme => ({
+              marginTop: theme.spacing(0.5),
+              fontSize: '0.7em'
+            })}
+          >
+            {intl.getHTML('mainPageImageLicence')}
+          </Typography>
+        </Box>
+      </Box>
+    </Box>
   )
 }
 
diff --git a/src/client/components/perspectives/sampo/MainCard.js b/src/client/components/perspectives/sampo/MainCard.js
index c536120ea1ee5b77167a0a37ad84c754f048b6a6..e0efd4847b6584775f01bcefdae4df70ba2d4d30 100644
--- a/src/client/components/perspectives/sampo/MainCard.js
+++ b/src/client/components/perspectives/sampo/MainCard.js
@@ -1,15 +1,15 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import Typography from '@material-ui/core/Typography'
-import Paper from '@material-ui/core/Paper'
-import Grid from '@material-ui/core/Grid'
+import Typography from '@mui/material/Typography'
+import Paper from '@mui/material/Paper'
+import Grid from '@mui/material/Grid'
 import intl from 'react-intl-universal'
-import Card from '@material-ui/core/Card'
-import CardActionArea from '@material-ui/core/CardActionArea'
-import CardContent from '@material-ui/core/CardContent'
-import CardMedia from '@material-ui/core/CardMedia'
-import { makeStyles } from '@material-ui/core/styles'
-import useMediaQuery from '@material-ui/core/useMediaQuery'
+import Card from '@mui/material/Card'
+import CardActionArea from '@mui/material/CardActionArea'
+import CardContent from '@mui/material/CardContent'
+import CardMedia from '@mui/material/CardMedia'
+import makeStyles from '@mui/styles/makeStyles';
+import useMediaQuery from '@mui/material/useMediaQuery'
 import { Link } from 'react-router-dom'
 import { has } from 'lodash'
 import defaultImage from '../../../img/main_page/thumb.png'
@@ -17,11 +17,11 @@ import defaultImage from '../../../img/main_page/thumb.png'
 const useStyles = makeStyles(theme => ({
   gridItem: props => ({
     textDecoration: 'none',
-    [theme.breakpoints.down('xs')]: {
+    [theme.breakpoints.down('sm')]: {
       justifyContent: 'center'
     },
     height: 228,
-    [theme.breakpoints.down('sm')]: {
+    [theme.breakpoints.down('md')]: {
       height: 170,
       maxWidth: 300
     },
@@ -65,7 +65,7 @@ const useStyles = makeStyles(theme => ({
 const MainCard = props => {
   const classes = useStyles(props)
   const { perspective, cardHeadingVariant } = props
-  const xsScreen = useMediaQuery(theme => theme.breakpoints.down('xs'))
+  const xsScreen = useMediaQuery(theme => theme.breakpoints.down('sm'))
   // const smScreen = useMediaQuery(theme => theme.breakpoints.between('sm', 'md'))
   const externalPerspective = has(perspective, 'externalUrl')
   const card = has(perspective, 'frontPageElement') && perspective.frontPageElement === 'card'
diff --git a/src/client/components/perspectives/sampo/MainClientFS.js b/src/client/components/perspectives/sampo/MainClientFS.js
index 0aa7a59cfa2556d55c2f5d1cd4de9bbb421f32f1..a341435abc10761fbcf9de0e78fb0a85dec53569 100644
--- a/src/client/components/perspectives/sampo/MainClientFS.js
+++ b/src/client/components/perspectives/sampo/MainClientFS.js
@@ -1,8 +1,8 @@
 import React from 'react'
 import PropTypes from 'prop-types'
-import { withStyles } from '@material-ui/core/styles'
-import Typography from '@material-ui/core/Typography'
-import Paper from '@material-ui/core/Paper'
+import withStyles from '@mui/styles/withStyles';
+import Typography from '@mui/material/Typography'
+import Paper from '@mui/material/Paper'
 import intl from 'react-intl-universal'
 import bgImage from '../../../img/main_page/bg2.jpg'
 
@@ -20,17 +20,17 @@ const styles = theme => ({
     backgroundColor: 'rgba(255, 255, 255, 0.8)',
     margin: theme.spacing(3),
     padding: theme.spacing(3),
-    [theme.breakpoints.down('md')]: {
+    [theme.breakpoints.down('lg')]: {
       padding: theme.spacing(1)
     }
   },
   frontPageHeading: {
-    [theme.breakpoints.down('md')]: {
+    [theme.breakpoints.down('lg')]: {
       fontSize: '1.2rem'
     }
   },
   frontPageText: {
-    [theme.breakpoints.down('md')]: {
+    [theme.breakpoints.down('lg')]: {
       fontSize: '1.0rem'
     }
   }
diff --git a/src/client/containers/SemanticPortal.js b/src/client/containers/SemanticPortal.js
index db9921307b7405b3ed6e2c91855d1086820af1e3..7b24a5d1c1de884e76d8da0b98494703dfe773f1 100644
--- a/src/client/containers/SemanticPortal.js
+++ b/src/client/containers/SemanticPortal.js
@@ -7,11 +7,8 @@ import { makeStyles } from '@material-ui/core/styles'
 import { withRouter, Route, Redirect, Switch } from 'react-router-dom'
 import classNames from 'classnames'
 import { compose } from '@shakacode/recompose'
-import useMediaQuery from '@material-ui/core/useMediaQuery'
-import { MuiPickersUtilsProvider } from '@material-ui/pickers'
-import moment from 'moment'
-import MomentUtils from '@date-io/moment'
-import 'moment/locale/fi'
+import { useTheme } from '@mui/material/styles'
+import useMediaQuery from '@mui/material/useMediaQuery'
 import Grid from '@material-ui/core/Grid'
 import {
   fetchResultCount,
@@ -245,12 +242,13 @@ const useStyles = makeStyles(theme => ({
  */
 const SemanticPortal = props => {
   const { error } = props
+  const theme = useTheme()
   const classes = useStyles(props)
-  const xsScreen = useMediaQuery(theme => theme.breakpoints.down('xs'))
-  const smScreen = useMediaQuery(theme => theme.breakpoints.between('sm', 'md'))
-  const mdScreen = useMediaQuery(theme => theme.breakpoints.between('md', 'lg'))
-  const lgScreen = useMediaQuery(theme => theme.breakpoints.between('lg', 'xl'))
-  const xlScreen = useMediaQuery(theme => theme.breakpoints.up('xl'))
+  const xsScreen = useMediaQuery(theme.breakpoints.down('xs'))
+  const smScreen = useMediaQuery(theme.breakpoints.between('sm', 'md'))
+  const mdScreen = useMediaQuery(theme.breakpoints.between('md', 'lg'))
+  const lgScreen = useMediaQuery(theme.breakpoints.between('lg', 'xl'))
+  const xlScreen = useMediaQuery(theme.breakpoints.up('xl'))
   let screenSize = ''
   if (xsScreen) { screenSize = 'xs' }
   if (smScreen) { screenSize = 'sm' }
@@ -267,73 +265,167 @@ const SemanticPortal = props => {
   }, [props.options.currentLocale])
 
   return (
-    <MuiPickersUtilsProvider libInstance={moment} utils={MomentUtils} locale={props.options.currentLocale}>
-      <div className={classes.root}>
-        <Message error={error} />
-        <>
-          <TopBar
-            rootUrl={rootUrlWithLang}
-            search={props.fullTextSearch}
-            fetchFullTextResults={props.fetchFullTextResults}
-            clearResults={props.clearResults}
-            clientFSClearResults={props.clientFSClearResults}
-            perspectives={perspectiveConfig}
-            currentLocale={props.options.currentLocale}
-            availableLocales={props.options.availableLocales}
-            loadLocales={props.loadLocales}
-            xsScreen={xsScreen}
-            location={props.location}
-            layoutConfig={layoutConfig}
-          />
-          <Route exact path={`${rootUrl}/`}>
-            <Redirect to={rootUrlWithLang} />
-          </Route>
-          <Route
-            exact path={`${rootUrlWithLang}/`}
-            render={() =>
-              <>
-                <Main
-                  perspectives={perspectiveConfig}
-                  screenSize={screenSize}
-                  rootUrl={rootUrlWithLang}
-                  layoutConfig={layoutConfig}
-                />
-                <Footer
-                  portalConfig={portalConfig}
-                  layoutConfig={layoutConfig}
-                />
-              </>}
-          />
-          {/* https://stackoverflow.com/a/41024944 */}
-          <Route
-            path={`${rootUrlWithLang}/`} render={({ location }) => {
-              if (typeof window.ga === 'function') {
-                window.ga('set', 'page', location.pathname + location.search)
-                window.ga('send', 'pageview')
-              }
-              return null
-            }}
-          />
-          {/* route for full text search results */}
-          <Route
-            path={`${rootUrlWithLang}/full-text-search`}
-            render={routeProps =>
-              <FullTextSearch
-                fullTextSearch={props.fullTextSearch}
-                sortFullTextResults={props.sortFullTextResults}
-                routeProps={routeProps}
+    <div className={classes.root}>
+      <Message error={error} />
+      <>
+        <TopBar
+          rootUrl={rootUrlWithLang}
+          search={props.fullTextSearch}
+          fetchFullTextResults={props.fetchFullTextResults}
+          clearResults={props.clearResults}
+          clientFSClearResults={props.clientFSClearResults}
+          perspectives={perspectiveConfig}
+          currentLocale={props.options.currentLocale}
+          availableLocales={props.options.availableLocales}
+          loadLocales={props.loadLocales}
+          xsScreen={xsScreen}
+          location={props.location}
+          layoutConfig={layoutConfig}
+        />
+        <Route exact path={`${rootUrl}/`}>
+          <Redirect to={rootUrlWithLang} />
+        </Route>
+        <Route
+          exact path={`${rootUrlWithLang}/`}
+          render={() =>
+            <>
+              <Main
+                perspectives={perspectiveConfig}
                 screenSize={screenSize}
                 rootUrl={rootUrlWithLang}
                 layoutConfig={layoutConfig}
-              />}
-          />
-          {/* routes for faceted search perspectives */}
-          {perspectiveConfig.map(perspective => {
-            if (!has(perspective, 'externalUrl') && perspective.searchMode === 'faceted-search') {
-              return (
-                <React.Fragment key={perspective.id}>
+              />
+              <Footer
+                portalConfig={portalConfig}
+                layoutConfig={layoutConfig}
+              />
+            </>}
+        />
+        {/* https://stackoverflow.com/a/41024944 */}
+        <Route
+          path={`${rootUrlWithLang}/`} render={({ location }) => {
+            if (typeof window.ga === 'function') {
+              window.ga('set', 'page', location.pathname + location.search)
+              window.ga('send', 'pageview')
+            }
+            return null
+          }}
+        />
+        {/* route for full text search results */}
+        <Route
+          path={`${rootUrlWithLang}/full-text-search`}
+          render={routeProps =>
+            <FullTextSearch
+              fullTextSearch={props.fullTextSearch}
+              sortFullTextResults={props.sortFullTextResults}
+              routeProps={routeProps}
+              screenSize={screenSize}
+              rootUrl={rootUrlWithLang}
+              layoutConfig={layoutConfig}
+            />}
+        />
+        {/* routes for faceted search perspectives */}
+        {perspectiveConfig.map(perspective => {
+          if (!has(perspective, 'externalUrl') && perspective.searchMode === 'faceted-search') {
+            return (
+              <React.Fragment key={perspective.id}>
+                <Route
+                  path={`${rootUrlWithLang}/${perspective.id}/faceted-search`}
+                  render={routeProps => {
+                    return (
+                      <>
+                        <InfoHeader
+                          portalConfig={portalConfig}
+                          layoutConfig={layoutConfig}
+                          resultClass={perspective.id}
+                          pageType='facetResults'
+                          expanded={props[perspective.id].facetedSearchHeaderExpanded}
+                          updateExpanded={props.updatePerspectiveHeaderExpanded}
+                          screenSize={screenSize}
+                        />
+                        <Grid
+                          container spacing={1} className={props[perspective.id].facetedSearchHeaderExpanded
+                            ? classes.perspectiveContainerHeaderExpanded
+                            : classes.perspectiveContainer}
+                        >
+                          <Grid item xs={12} md={3} className={classes.facetBarContainer}>
+                            <FacetBar
+                              portalConfig={portalConfig}
+                              perspectiveConfig={perspective}
+                              layoutConfig={layoutConfig}
+                              facetedSearchMode='serverFS'
+                              facetData={props[`${perspective.id}Facets`]}
+                              facetDataConstrainSelf={props[`${perspective.id}FacetsConstrainSelf`]}
+                              perspectiveState={props[perspective.id]}
+                              facetClass={perspective.id}
+                              resultClass={perspective.id}
+                              fetchingResultCount={props[perspective.id].fetchingResultCount}
+                              resultCount={props[perspective.id].resultCount}
+                              fetchFacet={props.fetchFacet}
+                              fetchFacetConstrainSelf={props.fetchFacetConstrainSelf}
+                              fetchResults={props.fetchResults}
+                              clearFacet={props.clearFacet}
+                              clearAllFacets={props.clearAllFacets}
+                              fetchResultCount={props.fetchResultCount}
+                              updateFacetOption={props.updateFacetOption}
+                              showError={props.showError}
+                              defaultActiveFacets={perspective.defaultActiveFacets}
+                              rootUrl={rootUrlWithLang}
+                              screenSize={screenSize}
+                              apexChartsConfig={apexChartsConfig}
+                              leafletConfig={leafletConfig}
+                              networkConfig={networkConfig}
+                            />
+                          </Grid>
+                          <Grid item xs={12} md={9} className={classes.resultsContainer}>
+                            <FacetResults
+                              portalConfig={portalConfig}
+                              layoutConfig={layoutConfig}
+                              perspectiveConfig={perspective}
+                              perspectiveState={props[`${perspective.id}`]}
+                              facetState={props[`${perspective.id}Facets`]}
+                              facetConstrainSelfState={props[`${perspective.id}FacetsConstrainSelf`]}
+                              leafletMapState={props.leafletMap}
+                              fetchPaginatedResults={props.fetchPaginatedResults}
+                              fetchResults={props.fetchResults}
+                              fetchInstanceAnalysis={props.fetchInstanceAnalysis}
+                              fetchFacetConstrainSelf={props.fetchFacetConstrainSelf}
+                              fetchGeoJSONLayers={props.fetchGeoJSONLayers}
+                              fetchGeoJSONLayersBackend={props.fetchGeoJSONLayersBackend}
+                              clearGeoJSONLayers={props.clearGeoJSONLayers}
+                              fetchByURI={props.fetchByURI}
+                              updatePage={props.updatePage}
+                              updateRowsPerPage={props.updateRowsPerPage}
+                              updateFacetOption={props.updateFacetOption}
+                              updateMapBounds={props.updateMapBounds}
+                              sortResults={props.sortResults}
+                              showError={props.showError}
+                              routeProps={routeProps}
+                              perspective={perspective}
+                              animationValue={props.animationValue}
+                              animateMap={props.animateMap}
+                              screenSize={screenSize}
+                              rootUrl={rootUrlWithLang}
+                              apexChartsConfig={apexChartsConfig}
+                              leafletConfig={leafletConfig}
+                              networkConfig={networkConfig}
+                            />
+                          </Grid>
+                        </Grid>
+                      </>
+                    )
+                  }}
+                />
+                <Switch>
+                  <Redirect
+                    from={`/${perspective.id}/page/:id`}
+                    to={{
+                      pathname: `${rootUrlWithLang}/${perspective.id}/page/:id`,
+                      hash: props.location.hash
+                    }}
+                  />
                   <Route
-                    path={`${rootUrlWithLang}/${perspective.id}/faceted-search`}
+                    path={`${rootUrlWithLang}/${perspective.id}/page/:id`}
                     render={routeProps => {
                       return (
                         <>
@@ -341,53 +433,23 @@ const SemanticPortal = props => {
                             portalConfig={portalConfig}
                             layoutConfig={layoutConfig}
                             resultClass={perspective.id}
-                            pageType='facetResults'
-                            expanded={props[perspective.id].facetedSearchHeaderExpanded}
+                            pageType='instancePage'
+                            instanceData={props[perspective.id].instanceTableData}
+                            expanded={props[perspective.id].instancePageHeaderExpanded}
                             updateExpanded={props.updatePerspectiveHeaderExpanded}
                             screenSize={screenSize}
                           />
                           <Grid
-                            container spacing={1} className={props[perspective.id].facetedSearchHeaderExpanded
-                              ? classes.perspectiveContainerHeaderExpanded
-                              : classes.perspectiveContainer}
+                            container spacing={1} className={props[perspective.id].instancePageHeaderExpanded
+                              ? classes.instancePageContainerHeaderExpanded
+                              : classes.instancePageContainer}
                           >
-                            <Grid item xs={12} md={3} className={classes.facetBarContainer}>
-                              <FacetBar
-                                portalConfig={portalConfig}
-                                perspectiveConfig={perspective}
-                                layoutConfig={layoutConfig}
-                                facetedSearchMode='serverFS'
-                                facetData={props[`${perspective.id}Facets`]}
-                                facetDataConstrainSelf={props[`${perspective.id}FacetsConstrainSelf`]}
-                                perspectiveState={props[perspective.id]}
-                                facetClass={perspective.id}
-                                resultClass={perspective.id}
-                                fetchingResultCount={props[perspective.id].fetchingResultCount}
-                                resultCount={props[perspective.id].resultCount}
-                                fetchFacet={props.fetchFacet}
-                                fetchFacetConstrainSelf={props.fetchFacetConstrainSelf}
-                                fetchResults={props.fetchResults}
-                                clearFacet={props.clearFacet}
-                                clearAllFacets={props.clearAllFacets}
-                                fetchResultCount={props.fetchResultCount}
-                                updateFacetOption={props.updateFacetOption}
-                                showError={props.showError}
-                                defaultActiveFacets={perspective.defaultActiveFacets}
-                                rootUrl={rootUrlWithLang}
-                                screenSize={screenSize}
-                                apexChartsConfig={apexChartsConfig}
-                                leafletConfig={leafletConfig}
-                                networkConfig={networkConfig}
-                              />
-                            </Grid>
-                            <Grid item xs={12} md={9} className={classes.resultsContainer}>
-                              <FacetResults
+                            <Grid item xs={12} className={classes.instancePageContent}>
+                              <InstancePage
                                 portalConfig={portalConfig}
                                 layoutConfig={layoutConfig}
                                 perspectiveConfig={perspective}
                                 perspectiveState={props[`${perspective.id}`]}
-                                facetState={props[`${perspective.id}Facets`]}
-                                facetConstrainSelfState={props[`${perspective.id}FacetsConstrainSelf`]}
                                 leafletMapState={props.leafletMap}
                                 fetchPaginatedResults={props.fetchPaginatedResults}
                                 fetchResults={props.fetchResults}
@@ -407,6 +469,8 @@ const SemanticPortal = props => {
                                 perspective={perspective}
                                 animationValue={props.animationValue}
                                 animateMap={props.animateMap}
+                                videoPlayerState={props.videoPlayer}
+                                updateVideoPlayerTime={props.updateVideoPlayerTime}
                                 screenSize={screenSize}
                                 rootUrl={rootUrlWithLang}
                                 apexChartsConfig={apexChartsConfig}
@@ -419,246 +483,177 @@ const SemanticPortal = props => {
                       )
                     }}
                   />
-                  <Switch>
-                    <Redirect
-                      from={`/${perspective.id}/page/:id`}
-                      to={{
-                        pathname: `${rootUrlWithLang}/${perspective.id}/page/:id`,
-                        hash: props.location.hash
-                      }}
-                    />
-                    <Route
-                      path={`${rootUrlWithLang}/${perspective.id}/page/:id`}
-                      render={routeProps => {
-                        return (
-                          <>
-                            <InfoHeader
-                              portalConfig={portalConfig}
-                              layoutConfig={layoutConfig}
-                              resultClass={perspective.id}
-                              pageType='instancePage'
-                              instanceData={props[perspective.id].instanceTableData}
-                              expanded={props[perspective.id].instancePageHeaderExpanded}
-                              updateExpanded={props.updatePerspectiveHeaderExpanded}
-                              screenSize={screenSize}
-                            />
-                            <Grid
-                              container spacing={1} className={props[perspective.id].instancePageHeaderExpanded
-                                ? classes.instancePageContainerHeaderExpanded
-                                : classes.instancePageContainer}
-                            >
-                              <Grid item xs={12} className={classes.instancePageContent}>
-                                <InstancePage
-                                  portalConfig={portalConfig}
-                                  layoutConfig={layoutConfig}
-                                  perspectiveConfig={perspective}
-                                  perspectiveState={props[`${perspective.id}`]}
-                                  leafletMapState={props.leafletMap}
-                                  fetchPaginatedResults={props.fetchPaginatedResults}
-                                  fetchResults={props.fetchResults}
-                                  fetchInstanceAnalysis={props.fetchInstanceAnalysis}
-                                  fetchFacetConstrainSelf={props.fetchFacetConstrainSelf}
-                                  fetchGeoJSONLayers={props.fetchGeoJSONLayers}
-                                  fetchGeoJSONLayersBackend={props.fetchGeoJSONLayersBackend}
-                                  clearGeoJSONLayers={props.clearGeoJSONLayers}
-                                  fetchByURI={props.fetchByURI}
-                                  updatePage={props.updatePage}
-                                  updateRowsPerPage={props.updateRowsPerPage}
-                                  updateFacetOption={props.updateFacetOption}
-                                  updateMapBounds={props.updateMapBounds}
-                                  sortResults={props.sortResults}
-                                  showError={props.showError}
-                                  routeProps={routeProps}
-                                  perspective={perspective}
-                                  animationValue={props.animationValue}
-                                  animateMap={props.animateMap}
-                                  videoPlayerState={props.videoPlayer}
-                                  updateVideoPlayerTime={props.updateVideoPlayerTime}
-                                  screenSize={screenSize}
-                                  rootUrl={rootUrlWithLang}
-                                  apexChartsConfig={apexChartsConfig}
-                                  leafletConfig={leafletConfig}
-                                  networkConfig={networkConfig}
-                                />
-                              </Grid>
-                            </Grid>
-                          </>
-                        )
-                      }}
+                </Switch>
+              </React.Fragment>
+            )
+          }
+          return null
+        })}
+        {/* create routes for classes that have only info pages and no faceted search perspective */}
+        {perspectiveConfigOnlyInfoPages.map(perspective =>
+          <Switch key={perspective.id}>
+            <Redirect
+              from={`${rootUrl}/${perspective.id}/page/:id`}
+              to={`${rootUrlWithLang}/${perspective.id}/page/:id`}
+            />
+            <Route
+              path={`${rootUrlWithLang}/${perspective.id}/page/:id`}
+              render={routeProps => {
+                return (
+                  <>
+                    <InfoHeader
+                      portalConfig={portalConfig}
+                      layoutConfig={layoutConfig}
+                      resultClass={perspective.id}
+                      pageType='instancePage'
+                      instanceData={props[perspective.id].instanceTableData}
+                      expanded={props[perspective.id].instancePageHeaderExpanded}
+                      updateExpanded={props.updatePerspectiveHeaderExpanded}
+                      screenSize={screenSize}
                     />
-                  </Switch>
-                </React.Fragment>
-              )
-            }
-            return null
-          })}
-          {/* create routes for classes that have only info pages and no faceted search perspective */}
-          {perspectiveConfigOnlyInfoPages.map(perspective =>
-            <Switch key={perspective.id}>
-              <Redirect
-                from={`${rootUrl}/${perspective.id}/page/:id`}
-                to={`${rootUrlWithLang}/${perspective.id}/page/:id`}
-              />
-              <Route
-                path={`${rootUrlWithLang}/${perspective.id}/page/:id`}
-                render={routeProps => {
-                  return (
-                    <>
-                      <InfoHeader
-                        portalConfig={portalConfig}
-                        layoutConfig={layoutConfig}
-                        resultClass={perspective.id}
-                        pageType='instancePage'
-                        instanceData={props[perspective.id].instanceTableData}
-                        expanded={props[perspective.id].instancePageHeaderExpanded}
-                        updateExpanded={props.updatePerspectiveHeaderExpanded}
-                        screenSize={screenSize}
-                      />
-                      <Grid
-                        container spacing={1} className={props[perspective.id].instancePageHeaderExpanded
-                          ? classes.instancePageContainerHeaderExpanded
-                          : classes.instancePageContainer}
-                      >
-                        <Grid item xs={12} className={classes.instancePageContent}>
-                          <InstancePage
-                            portalConfig={portalConfig}
-                            layoutConfig={layoutConfig}
-                            perspectiveConfig={perspective}
-                            perspectiveState={props[`${perspective.id}`]}
-                            leafletMapState={props.leafletMap}
-                            fetchPaginatedResults={props.fetchPaginatedResults}
-                            fetchResults={props.fetchResults}
-                            fetchInstanceAnalysis={props.fetchInstanceAnalysis}
-                            fetchFacetConstrainSelf={props.fetchFacetConstrainSelf}
-                            fetchGeoJSONLayers={props.fetchGeoJSONLayers}
-                            fetchGeoJSONLayersBackend={props.fetchGeoJSONLayersBackend}
-                            clearGeoJSONLayers={props.clearGeoJSONLayers}
-                            fetchByURI={props.fetchByURI}
-                            updatePage={props.updatePage}
-                            updateRowsPerPage={props.updateRowsPerPage}
-                            updateFacetOption={props.updateFacetOption}
-                            updateMapBounds={props.updateMapBounds}
-                            sortResults={props.sortResults}
-                            showError={props.showError}
-                            routeProps={routeProps}
-                            perspective={perspective}
-                            animationValue={props.animationValue}
-                            animateMap={props.animateMap}
-                            videoPlayerState={props.videoPlayer}
-                            updateVideoPlayerTime={props.updateVideoPlayerTime}
-                            screenSize={screenSize}
-                            rootUrl={rootUrlWithLang}
-                            apexChartsConfig={apexChartsConfig}
-                            leafletConfig={leafletConfig}
-                            networkConfig={networkConfig}
-                          />
-                        </Grid>
+                    <Grid
+                      container spacing={1} className={props[perspective.id].instancePageHeaderExpanded
+                        ? classes.instancePageContainerHeaderExpanded
+                        : classes.instancePageContainer}
+                    >
+                      <Grid item xs={12} className={classes.instancePageContent}>
+                        <InstancePage
+                          portalConfig={portalConfig}
+                          layoutConfig={layoutConfig}
+                          perspectiveConfig={perspective}
+                          perspectiveState={props[`${perspective.id}`]}
+                          leafletMapState={props.leafletMap}
+                          fetchPaginatedResults={props.fetchPaginatedResults}
+                          fetchResults={props.fetchResults}
+                          fetchInstanceAnalysis={props.fetchInstanceAnalysis}
+                          fetchFacetConstrainSelf={props.fetchFacetConstrainSelf}
+                          fetchGeoJSONLayers={props.fetchGeoJSONLayers}
+                          fetchGeoJSONLayersBackend={props.fetchGeoJSONLayersBackend}
+                          clearGeoJSONLayers={props.clearGeoJSONLayers}
+                          fetchByURI={props.fetchByURI}
+                          updatePage={props.updatePage}
+                          updateRowsPerPage={props.updateRowsPerPage}
+                          updateFacetOption={props.updateFacetOption}
+                          updateMapBounds={props.updateMapBounds}
+                          sortResults={props.sortResults}
+                          showError={props.showError}
+                          routeProps={routeProps}
+                          perspective={perspective}
+                          animationValue={props.animationValue}
+                          animateMap={props.animateMap}
+                          videoPlayerState={props.videoPlayer}
+                          updateVideoPlayerTime={props.updateVideoPlayerTime}
+                          screenSize={screenSize}
+                          rootUrl={rootUrlWithLang}
+                          apexChartsConfig={apexChartsConfig}
+                          leafletConfig={leafletConfig}
+                          networkConfig={networkConfig}
+                        />
                       </Grid>
-                    </>
-                  )
-                }}
-              />
-            </Switch>
-          )}
-          <Route
-            path={`${rootUrlWithLang}/perspective4/federated-search`}
-            render={routeProps =>
-              <>
-                <Grid container className={classes.mainContainerClientFS}>
-                  <Grid item sm={12} md={4} lg={3} className={classes.facetBarContainerClientFS}>
-                    <FacetBar
+                    </Grid>
+                  </>
+                )
+              }}
+            />
+          </Switch>
+        )}
+        <Route
+          path={`${rootUrlWithLang}/perspective4/federated-search`}
+          render={routeProps =>
+            <>
+              <Grid container className={classes.mainContainerClientFS}>
+                <Grid item sm={12} md={4} lg={3} className={classes.facetBarContainerClientFS}>
+                  <FacetBar
+                    portalConfig={portalConfig}
+                    layoutConfig={layoutConfig}
+                    facetedSearchMode='clientFS'
+                    facetClass='perspective4'
+                    resultClass='perspective4'
+                    facetData={props.clientFSState}
+                    clientFSFacetValues={props.clientFSFacetValues}
+                    fetchingResultCount={props.clientFSState.textResultsFetching}
+                    resultCount={noClientFSResults ? 0 : props.clientFSState.results.length}
+                    clientFSState={props.clientFSState}
+                    clientFSToggleDataset={props.clientFSToggleDataset}
+                    clientFSFetchResults={props.clientFSFetchResults}
+                    clientFSClearResults={props.clientFSClearResults}
+                    clientFSUpdateQuery={props.clientFSUpdateQuery}
+                    clientFSUpdateFacet={props.clientFSUpdateFacet}
+                    defaultActiveFacets={perspectiveConfig.find(p => p.id === 'perspective4').defaultActiveFacets}
+                    leafletMap={props.leafletMap}
+                    updateMapBounds={props.updateMapBounds}
+                    screenSize={screenSize}
+                    showError={props.showError}
+                    rootUrl={rootUrlWithLang}
+                    apexChartsConfig={apexChartsConfig}
+                    leafletConfig={leafletConfig}
+                    networkConfig={networkConfig}
+                  />
+                </Grid>
+                <Grid item sm={12} md={8} lg={9} className={classes.resultsContainerClientFS}>
+                  {noClientFSResults && <MainClientFS />}
+                  {!noClientFSResults &&
+                    <FederatedResults
                       portalConfig={portalConfig}
                       layoutConfig={layoutConfig}
-                      facetedSearchMode='clientFS'
-                      facetClass='perspective4'
-                      resultClass='perspective4'
-                      facetData={props.clientFSState}
-                      clientFSFacetValues={props.clientFSFacetValues}
-                      fetchingResultCount={props.clientFSState.textResultsFetching}
-                      resultCount={noClientFSResults ? 0 : props.clientFSState.results.length}
+                      perspective={perspectiveConfig.find(p => p.id === 'perspective4')}
+                      routeProps={routeProps}
+                      screenSize={screenSize}
                       clientFSState={props.clientFSState}
-                      clientFSToggleDataset={props.clientFSToggleDataset}
-                      clientFSFetchResults={props.clientFSFetchResults}
-                      clientFSClearResults={props.clientFSClearResults}
-                      clientFSUpdateQuery={props.clientFSUpdateQuery}
-                      clientFSUpdateFacet={props.clientFSUpdateFacet}
-                      defaultActiveFacets={perspectiveConfig.find(p => p.id === 'perspective4').defaultActiveFacets}
+                      clientFSResults={props.clientFSResults}
+                      clientFSSortResults={props.clientFSSortResults}
                       leafletMap={props.leafletMap}
                       updateMapBounds={props.updateMapBounds}
-                      screenSize={screenSize}
+                      fetchGeoJSONLayersBackend={props.fetchGeoJSONLayersBackend}
+                      fetchGeoJSONLayers={props.fetchGeoJSONLayers}
+                      clearGeoJSONLayers={props.clearGeoJSONLayers}
                       showError={props.showError}
                       rootUrl={rootUrlWithLang}
                       apexChartsConfig={apexChartsConfig}
                       leafletConfig={leafletConfig}
                       networkConfig={networkConfig}
-                    />
-                  </Grid>
-                  <Grid item sm={12} md={8} lg={9} className={classes.resultsContainerClientFS}>
-                    {noClientFSResults && <MainClientFS />}
-                    {!noClientFSResults &&
-                      <FederatedResults
-                        portalConfig={portalConfig}
-                        layoutConfig={layoutConfig}
-                        perspective={perspectiveConfig.find(p => p.id === 'perspective4')}
-                        routeProps={routeProps}
-                        screenSize={screenSize}
-                        clientFSState={props.clientFSState}
-                        clientFSResults={props.clientFSResults}
-                        clientFSSortResults={props.clientFSSortResults}
-                        leafletMap={props.leafletMap}
-                        updateMapBounds={props.updateMapBounds}
-                        fetchGeoJSONLayersBackend={props.fetchGeoJSONLayersBackend}
-                        fetchGeoJSONLayers={props.fetchGeoJSONLayers}
-                        clearGeoJSONLayers={props.clearGeoJSONLayers}
-                        showError={props.showError}
-                        rootUrl={rootUrlWithLang}
-                        apexChartsConfig={apexChartsConfig}
-                        leafletConfig={leafletConfig}
-                        networkConfig={networkConfig}
-                      />}
-                  </Grid>
+                    />}
                 </Grid>
-                <Footer
-                  portalConfig={portalConfig}
-                  layoutConfig={layoutConfig}
-                />
-              </>}
-
-          />
-          {/* create routes for info buttons */}
-          {!layoutConfig.topBar.externalAboutPage &&
-            <Route
-              path={`${rootUrlWithLang}/about`}
-              render={() =>
-                <div className={classNames(classes.mainContainer, classes.textPageContainer)}>
-                  <TextPage>
-                    {intl.getHTML('aboutThePortalPartOne')}
-                    {knowledgeGraphMetadataConfig.showTable &&
-                      <KnowledgeGraphMetadataTable
-                        portalConfig={portalConfig}
-                        layoutConfig={layoutConfig}
-                        perspectiveID={knowledgeGraphMetadataConfig.perspective}
-                        resultClass='knowledgeGraphMetadata'
-                        fetchKnowledgeGraphMetadata={props.fetchKnowledgeGraphMetadata}
-                        knowledgeGraphMetadata={props[knowledgeGraphMetadataConfig.perspective]
-                          ? props[knowledgeGraphMetadataConfig.perspective].knowledgeGraphMetadata
-                          : null}
-                      />}
-                    {intl.getHTML('aboutThePortalPartTwo')}
-                  </TextPage>
-                </div>}
-            />}
-          {!layoutConfig.topBar.externalInstructions &&
-            <Route
-              path={`${rootUrlWithLang}/instructions`}
-              render={() =>
-                <div className={classNames(classes.mainContainer, classes.textPageContainer)}>
-                  <TextPage>{intl.getHTML('instructions')}</TextPage>
-                </div>}
-            />}
-        </>
-      </div>
-    </MuiPickersUtilsProvider>
+              </Grid>
+              <Footer
+                portalConfig={portalConfig}
+                layoutConfig={layoutConfig}
+              />
+            </>}
+        />
+        {/* create routes for info buttons */}
+        {!layoutConfig.topBar.externalAboutPage &&
+          <Route
+            path={`${rootUrlWithLang}/about`}
+            render={() =>
+              <div className={classNames(classes.mainContainer, classes.textPageContainer)}>
+                <TextPage>
+                  {intl.getHTML('aboutThePortalPartOne')}
+                  {knowledgeGraphMetadataConfig.showTable &&
+                    <KnowledgeGraphMetadataTable
+                      portalConfig={portalConfig}
+                      layoutConfig={layoutConfig}
+                      perspectiveID={knowledgeGraphMetadataConfig.perspective}
+                      resultClass='knowledgeGraphMetadata'
+                      fetchKnowledgeGraphMetadata={props.fetchKnowledgeGraphMetadata}
+                      knowledgeGraphMetadata={props[knowledgeGraphMetadataConfig.perspective]
+                        ? props[knowledgeGraphMetadataConfig.perspective].knowledgeGraphMetadata
+                        : null}
+                    />}
+                  {intl.getHTML('aboutThePortalPartTwo')}
+                </TextPage>
+              </div>}
+          />}
+        {!layoutConfig.topBar.externalInstructions &&
+          <Route
+            path={`${rootUrlWithLang}/instructions`}
+            render={() =>
+              <div className={classNames(classes.mainContainer, classes.textPageContainer)}>
+                <TextPage>{intl.getHTML('instructions')}</TextPage>
+              </div>}
+          />}
+      </>
+    </div>
   )
 }
 
diff --git a/src/client/helpers/helpers.js b/src/client/helpers/helpers.js
index e3f127d9ee5e6719b029b5b02eb552d8ccf54e49..745eeae658cacd1ccf229221f146b6d4403fe4da 100644
--- a/src/client/helpers/helpers.js
+++ b/src/client/helpers/helpers.js
@@ -287,3 +287,5 @@ export const createPerspectiveConfigOnlyInfoPages = async ({ portalID, onlyInsta
   }
   return perspectiveConfigOnlyInfoPages
 }
+
+export const getSpacing = (theme, value) => Number(theme.spacing(value).slice(0, -2))