Projects STRLCPY Sirius Commits 0e3d32d1
🤬
Revision indexing in progress... (symbol navigation in revisions will be accurate after indexed)
  • ■ ■ ■ ■ ■ ■
    UI/.gitignore
     1 +# Logs
     2 +logs
     3 +*.log
     4 +npm-debug.log*
     5 +yarn-debug.log*
     6 +yarn-error.log*
     7 +pnpm-debug.log*
     8 +lerna-debug.log*
     9 + 
     10 +node_modules
     11 +dist
     12 +dist-ssr
     13 +*.local
     14 + 
     15 +# Editor directories and files
     16 +.vscode/*
     17 +!.vscode/extensions.json
     18 +.idea
     19 +.DS_Store
     20 +*.suo
     21 +*.ntvs*
     22 +*.njsproj
     23 +*.sln
     24 +*.sw?
     25 + 
  • ■ ■ ■ ■ ■ ■
    UI/index.html
     1 +<!DOCTYPE html>
     2 +<html lang="en">
     3 + <head>
     4 + <meta charset="UTF-8" />
     5 + <link rel="icon" type="image/png" href="/sirius.png" />
     6 + <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     7 + <title>Vite + React + TS</title>
     8 + </head>
     9 + <body>
     10 + <div id="root"></div>
     11 + <script type="module" src="/src/main.tsx"></script>
     12 + </body>
     13 +</html>
     14 + 
  • UI/package-lock.json
    Diff is too large to be displayed.
  • ■ ■ ■ ■ ■ ■
    UI/package.json
     1 +{
     2 + "name": "test-admin",
     3 + "private": true,
     4 + "version": "0.0.0",
     5 + "type": "module",
     6 + "scripts": {
     7 + "dev": "vite",
     8 + "build": "tsc && vite build",
     9 + "preview": "vite preview"
     10 + },
     11 + "dependencies": {
     12 + "@fortawesome/fontawesome-svg-core": "^6.2.1",
     13 + "@fortawesome/free-brands-svg-icons": "^6.2.1",
     14 + "@fortawesome/free-solid-svg-icons": "^6.2.1",
     15 + "@fortawesome/react-fontawesome": "^0.2.0",
     16 + "ra-data-json-server": "^4.6.2",
     17 + "react": "^18.2.0",
     18 + "react-admin": "^4.6.2",
     19 + "react-dom": "^18.2.0"
     20 + },
     21 + "devDependencies": {
     22 + "@types/react": "^18.0.26",
     23 + "@types/react-dom": "^18.0.9",
     24 + "@vitejs/plugin-react": "^3.0.0",
     25 + "typescript": "^4.9.3",
     26 + "vite": "^4.0.0"
     27 + }
     28 +}
     29 + 
  • UI/public/vite.svg
  • ■ ■ ■ ■ ■ ■
    UI/src/App.css
     1 +#root {
     2 + max-width: 1280px;
     3 + margin: 0 auto;
     4 + padding: 2rem;
     5 + text-align: center;
     6 +}
     7 + 
     8 +.logo {
     9 + height: 6em;
     10 + padding: 1.5em;
     11 + will-change: filter;
     12 +}
     13 +.logo:hover {
     14 + filter: drop-shadow(0 0 2em #646cffaa);
     15 +}
     16 +.logo.react:hover {
     17 + filter: drop-shadow(0 0 2em #61dafbaa);
     18 +}
     19 + 
     20 +@keyframes logo-spin {
     21 + from {
     22 + transform: rotate(0deg);
     23 + }
     24 + to {
     25 + transform: rotate(360deg);
     26 + }
     27 +}
     28 + 
     29 +@media (prefers-reduced-motion: no-preference) {
     30 + a:nth-of-type(2) .logo {
     31 + animation: logo-spin infinite 20s linear;
     32 + }
     33 +}
     34 + 
     35 +.card {
     36 + padding: 2em;
     37 +}
     38 + 
     39 +.read-the-docs {
     40 + color: #888;
     41 +}
     42 + 
  • ■ ■ ■ ■ ■ ■
    UI/src/App.tsx
     1 +import { Route } from "react-router-dom";
     2 +import { Admin, Resource, defaultTheme, CustomRoutes } from "react-admin";
     3 +import jsonServerProvider from "ra-data-json-server";
     4 + 
     5 +import PostIcon from "@mui/icons-material/Book";
     6 +import UserIcon from "@mui/icons-material/Group";
     7 + 
     8 +import Layout from './core/components/Layout';
     9 + 
     10 +import { PostList, PostEdit, PostCreate } from "./admin/posts";
     11 +import { UserList } from "./admin/users";
     12 +import { Dashboard } from './admin/dashboard';
     13 +import { authProvider } from './core/authProvider';
     14 + 
     15 +import IssuesNavigator from "./sirius/IssuesNavigator";
     16 +import InventoryNavigator from "./sirius/InventoryNavigator";
     17 +import ScanControl from "./sirius/ScanControl";
     18 +import SingleReport from "./sirius/SingleReport";
     19 + 
     20 +//import { dataProvider } from './dataProvider';
     21 + 
     22 + 
     23 +const dataProvider = jsonServerProvider('https://jsonplaceholder.typicode.com');
     24 + 
     25 +import indigo from '@mui/material/colors/indigo';
     26 +import purple from '@mui/material/colors/purple';
     27 +import green from '@mui/material/colors/green';
     28 + 
     29 +const theme = {
     30 + ...defaultTheme,
     31 + palette: {
     32 + primary: {
     33 + main: '#428dd1',
     34 + },
     35 + secondary: {
     36 + main: green[500],
     37 + },
     38 + background: {
     39 + default: '#fafafb',
     40 + },
     41 + },
     42 +};
     43 + 
     44 +const App = () => (
     45 + <Admin
     46 + authProvider={authProvider}
     47 + dataProvider={dataProvider}
     48 + layout={Layout}
     49 + dashboard={IssuesNavigator}
     50 + theme={{
     51 + ...theme,
     52 + }}
     53 + >
     54 + <CustomRoutes>
     55 + <Route path="/inventory" element={<InventoryNavigator />} />
     56 + <Route path="/scan" element={<ScanControl />} />
     57 + <Route path="/report/host/" element={<SingleReport />} />
     58 + <Route path="/report/vulnerability/" element={<SingleReport />} />
     59 + </CustomRoutes>
     60 + 
     61 + {/* Administration */}
     62 + <Resource name="users" list={UserList} edit={PostEdit} create={PostCreate} icon={UserIcon} />
     63 + <Resource name="users" list={UserList} recordRepresentation="name" />
     64 + <Resource name="posts" list={PostList} edit={PostEdit} create={PostCreate} icon={PostIcon} />
     65 + </Admin>
     66 +);
     67 + 
     68 +export default App;
  • ■ ■ ■ ■ ■ ■
    UI/src/admin/custom/UrlField.tsx
     1 +import { useRecordContext } from "react-admin";
     2 +import { Link } from "@mui/material";
     3 +import LaunchIcon from "@mui/icons-material/Launch";
     4 + 
     5 +const MyUrlField = ({ source }) => {
     6 + const record = useRecordContext();
     7 + return record ? (
     8 + <Link href={record[source]} sx={{ textDecoration: "none" }}>
     9 + {record[source]}
     10 + <LaunchIcon sx={{ fontSize: 15, ml: 1 }} />
     11 + </Link>
     12 + ) : null;
     13 +};
     14 + 
     15 +export default MyUrlField;
  • ■ ■ ■ ■ ■ ■
    UI/src/admin/dashboard.tsx
     1 +import { Card, CardContent, CardHeader } from "@mui/material";
     2 + 
     3 +export const Dashboard = () => (
     4 + <Card>
     5 + <CardHeader title="Welcome to the administration" />
     6 + <CardContent>Lorem ipsum sic dolor amet...</CardContent>
     7 + </Card>
     8 +);
  • ■ ■ ■ ■ ■ ■
    UI/src/admin/posts.tsx
     1 +import {
     2 + List,
     3 + Datagrid,
     4 + TextField,
     5 + ReferenceField,
     6 + EditButton,
     7 + Edit,
     8 + Create,
     9 + SimpleForm,
     10 + ReferenceInput,
     11 + TextInput,
     12 + } from "react-admin";
     13 + 
     14 +import { useRecordContext} from "react-admin";
     15 + 
     16 +export const PostList = () => (
     17 + <List filters={postFilters}>
     18 + <Datagrid>
     19 + <TextField source="id" />
     20 + <ReferenceField source="userId" reference="users" />
     21 + <TextField source="title" />
     22 + <EditButton />
     23 + </Datagrid>
     24 + </List>
     25 +);
     26 + 
     27 +export const PostEdit = () => (
     28 + <Edit title={<PostTitle />}>
     29 + <SimpleForm>
     30 + <ReferenceInput source="userId" reference="users" />
     31 + <TextInput source="id" />
     32 + <TextInput source="title" />
     33 + <TextInput source="body" />
     34 + </SimpleForm>
     35 + </Edit>
     36 +);
     37 + 
     38 +export const PostCreate = () => (
     39 + <Create title="asdf">
     40 + <SimpleForm>
     41 + <ReferenceInput source="userId" reference="users" />
     42 + <TextInput source="title" />
     43 + <TextInput source="body" multiline rows={5} />
     44 + </SimpleForm>
     45 + </Create>
     46 +);
     47 + 
     48 +const PostTitle = () => {
     49 + const record = useRecordContext();
     50 + return <span>Post {record ? `"${record.title}"` : ''}</span>;
     51 +};
     52 + 
     53 +const postFilters = [
     54 + <TextInput source="q" label="Search" alwaysOn />,
     55 + <ReferenceInput source="userId" label="User" reference="users" />,
     56 +];
     57 + 
  • ■ ■ ■ ■ ■ ■
    UI/src/admin/users.tsx
     1 +import { useMediaQuery } from "@mui/material";
     2 +import { List, SimpleList, Datagrid, TextField, EmailField } from "react-admin";
     3 + 
     4 +import UrlField from './custom/UrlField';
     5 + 
     6 +export const UserList = () => {
     7 + const isSmall = useMediaQuery((theme) => theme.breakpoints.down("sm"));
     8 + return (
     9 + <List>
     10 + {isSmall ? (
     11 + <SimpleList
     12 + primaryText={(record) => record.name}
     13 + secondaryText={(record) => record.username}
     14 + tertiaryText={(record) => record.email}
     15 + />
     16 + ) : (
     17 + <Datagrid rowClick="edit">
     18 + <TextField source="id" />
     19 + <TextField source="name" />
     20 + <TextField source="username" />
     21 + <EmailField source="email" />
     22 + <TextField source="phone" />
     23 + <UrlField source="website" />
     24 + <TextField source="company.name" />
     25 + </Datagrid>
     26 + )}
     27 + </List>
     28 + );
     29 +};
  • UI/src/assets/react.svg
  • UI/src/assets/sirius.png
  • ■ ■ ■ ■ ■ ■
    UI/src/core/authProvider.ts
     1 +export const authProvider = {
     2 + // called when the user attempts to log in
     3 + login: ({ username }) => {
     4 + localStorage.setItem("username", username);
     5 + // accept all username/password combinations
     6 + return Promise.resolve();
     7 + },
     8 + // called when the user clicks on the logout button
     9 + logout: () => {
     10 + localStorage.removeItem("username");
     11 + return Promise.resolve();
     12 + },
     13 + // called when the API returns an error
     14 + checkError: ({ status }) => {
     15 + if (status === 401 || status === 403) {
     16 + localStorage.removeItem("username");
     17 + return Promise.reject();
     18 + }
     19 + return Promise.resolve();
     20 + },
     21 + // called when the user navigates to a new location, to check for authentication
     22 + checkAuth: () => {
     23 + return localStorage.getItem("username")
     24 + ? Promise.resolve()
     25 + : Promise.reject();
     26 + },
     27 + // called when the user navigates to a new location, to check for permissions / roles
     28 + getPermissions: () => Promise.resolve(),
     29 + };
  • ■ ■ ■ ■ ■ ■
    UI/src/core/components/Drawer.tsx
     1 +import React from 'react';
     2 +import { Link, matchPath, useLocation } from 'react-router-dom';
     3 +import { UserMenu, Logout, LoadingIndicator } from 'react-admin';
     4 + 
     5 +import { styled, useTheme, Theme, CSSObject } from '@mui/material/styles';
     6 +import { Tabs, Tab, Toolbar, Box, Typography } from '@mui/material';
     7 +import MuiDrawer from '@mui/material/Drawer';
     8 +import MuiAppBar, { AppBarProps as MuiAppBarProps } from '@mui/material/AppBar';
     9 +import List from '@mui/material/List';
     10 +import CssBaseline from '@mui/material/CssBaseline';
     11 +import Divider from '@mui/material/Divider';
     12 +import IconButton from '@mui/material/IconButton';
     13 +import MenuIcon from '@mui/icons-material/Menu';
     14 +import ChevronLeftIcon from '@mui/icons-material/ChevronLeft';
     15 +import ChevronRightIcon from '@mui/icons-material/ChevronRight';
     16 +import ListItem from '@mui/material/ListItem';
     17 +import ListItemButton from '@mui/material/ListItemButton';
     18 +import ListItemIcon from '@mui/material/ListItemIcon';
     19 +import ListItemText from '@mui/material/ListItemText';
     20 +import InboxIcon from '@mui/icons-material/MoveToInbox';
     21 +import MailIcon from '@mui/icons-material/Mail';
     22 + 
     23 +import Header from './Header';
     24 + 
     25 +const drawerWidth = 240;
     26 + 
     27 +const openedMixin = (theme: Theme): CSSObject => ({
     28 + width: drawerWidth,
     29 + transition: theme.transitions.create('width', {
     30 + easing: theme.transitions.easing.sharp,
     31 + duration: theme.transitions.duration.enteringScreen,
     32 + }),
     33 + overflowX: 'hidden',
     34 +});
     35 + 
     36 +const closedMixin = (theme: Theme): CSSObject => ({
     37 + transition: theme.transitions.create('width', {
     38 + easing: theme.transitions.easing.sharp,
     39 + duration: theme.transitions.duration.leavingScreen,
     40 + }),
     41 + overflowX: 'hidden',
     42 + width: `calc(${theme.spacing(7)} + 1px)`,
     43 + [theme.breakpoints.up('sm')]: {
     44 + width: `calc(${theme.spacing(8)} + 1px)`,
     45 + },
     46 +});
     47 + 
     48 +const DrawerHeader = styled('div')(({ theme }) => ({
     49 + display: 'flex',
     50 + alignItems: 'center',
     51 + justifyContent: 'flex-end',
     52 + padding: theme.spacing(0, 1),
     53 + // necessary for content to be below app bar
     54 + ...theme.mixins.toolbar,
     55 +}));
     56 + 
     57 +interface AppBarProps extends MuiAppBarProps {
     58 + open?: boolean;
     59 +}
     60 + 
     61 +const AppBar = styled(MuiAppBar, {
     62 + shouldForwardProp: (prop) => prop !== 'open',
     63 +})<AppBarProps>(({ theme, open }) => ({
     64 + zIndex: theme.zIndex.drawer + 1,
     65 + transition: theme.transitions.create(['width', 'margin'], {
     66 + easing: theme.transitions.easing.sharp,
     67 + duration: theme.transitions.duration.leavingScreen,
     68 + }),
     69 + ...(open && {
     70 + marginLeft: drawerWidth,
     71 + width: `calc(100% - ${drawerWidth}px)`,
     72 + transition: theme.transitions.create(['width', 'margin'], {
     73 + easing: theme.transitions.easing.sharp,
     74 + duration: theme.transitions.duration.enteringScreen,
     75 + }),
     76 + }),
     77 +}));
     78 + 
     79 +const Drawer = styled(MuiDrawer, { shouldForwardProp: (prop) => prop !== 'open' })(
     80 + ({ theme, open }) => ({
     81 + width: drawerWidth,
     82 + flexShrink: 0,
     83 + whiteSpace: 'nowrap',
     84 + boxSizing: 'border-box',
     85 + ...(open && {
     86 + ...openedMixin(theme),
     87 + '& .MuiDrawer-paper': openedMixin(theme),
     88 + }),
     89 + ...(!open && {
     90 + ...closedMixin(theme),
     91 + '& .MuiDrawer-paper': closedMixin(theme),
     92 + }),
     93 + }),
     94 +);
     95 + 
     96 +export default function MiniDrawer() {
     97 + const theme = useTheme();
     98 + const [open, setOpen] = React.useState(false);
     99 + 
     100 + const handleDrawer = () => {
     101 + if (open === true) {
     102 + setOpen(false);
     103 + } else {
     104 + setOpen(true);
     105 + }
     106 + };
     107 + 
     108 + const handleDrawerClose = () => {
     109 + setOpen(false);
     110 + };
     111 + const location = useLocation();
     112 + 
     113 + let currentPath = '/';
     114 + if (!!matchPath('/contacts/*', location.pathname)) {
     115 + currentPath = '/contacts';
     116 + } else if (!!matchPath('/companies/*', location.pathname)) {
     117 + currentPath = '/companies';
     118 + } else if (!!matchPath('/deals/*', location.pathname)) {
     119 + currentPath = '/deals';
     120 + }
     121 + 
     122 + return (
     123 + <Box sx={{ display: 'flex' }}>
     124 + <CssBaseline />
     125 + <AppBar position="fixed" color="primary" >
     126 + <Toolbar variant="dense">
     127 + <Box flex={1} display="flex" justifyContent="space-between">
     128 + <Box display="flex" alignItems="center">
     129 + <Box
     130 + component="img"
     131 + sx={{ marginRight: '1em', height: 30 }}
     132 + src={
     133 + 'https://upload.wikimedia.org/wikipedia/commons/a/a7/React-icon.svg'
     134 + }
     135 + alt="Bosch Logo"
     136 + />
     137 + <Typography component="span" variant="h5">
     138 + Sirius Scan
     139 + </Typography>
     140 + </Box>
     141 + <Box>
     142 + <Tabs
     143 + value={currentPath}
     144 + aria-label="Navigation Tabs"
     145 + indicatorColor="secondary"
     146 + textColor="inherit"
     147 + >
     148 + <Tab
     149 + label={'Dashboard'}
     150 + component={Link}
     151 + to="/"
     152 + value="/"
     153 + />
     154 + <Tab
     155 + label={'Users'}
     156 + component={Link}
     157 + to="/users"
     158 + value="/users"
     159 + />
     160 + <Tab
     161 + label={'Companies'}
     162 + component={Link}
     163 + to="/companies"
     164 + value="/companies"
     165 + />
     166 + <Tab
     167 + label={'Deals'}
     168 + component={Link}
     169 + to="/deals"
     170 + value="/deals"
     171 + />
     172 + </Tabs>
     173 + </Box>
     174 + <Box display="flex">
     175 + <LoadingIndicator
     176 + sx={{
     177 + '& .RaLoadingIndicator-loader': {
     178 + marginTop: 2,
     179 + },
     180 + }}
     181 + />
     182 + <UserMenu>
     183 + <Logout />
     184 + </UserMenu>
     185 + </Box>
     186 + </Box>
     187 + </Toolbar>
     188 + </AppBar>
     189 + <Drawer variant="permanent" open={open}>
     190 + <Divider />
     191 + <List>
     192 + {['Inbox', 'Starred', 'Send email', 'Drafts'].map((text, index) => (
     193 + <ListItem key={text} disablePadding sx={{ display: 'block' }}>
     194 + <ListItemButton
     195 + sx={{
     196 + minHeight: 48,
     197 + justifyContent: open ? 'initial' : 'center',
     198 + px: 2.5,
     199 + }}
     200 + >
     201 + <ListItemIcon
     202 + sx={{
     203 + minWidth: 0,
     204 + mr: open ? 3 : 'auto',
     205 + justifyContent: 'center',
     206 + }}
     207 + >
     208 + {index % 2 === 0 ? <InboxIcon /> : <MailIcon />}
     209 + </ListItemIcon>
     210 + <ListItemText primary={text} sx={{ opacity: open ? 1 : 0 }} />
     211 + </ListItemButton>
     212 + </ListItem>
     213 + ))}
     214 + </List>
     215 + <Divider />
     216 + <List>
     217 + {['All mail', 'Trash', 'Spam'].map((text, index) => (
     218 + <ListItem key={text} disablePadding sx={{ display: 'block' }}>
     219 + <ListItemButton
     220 + sx={{
     221 + minHeight: 48,
     222 + justifyContent: open ? 'initial' : 'center',
     223 + px: 2.5,
     224 + }}
     225 + >
     226 + <ListItemIcon
     227 + sx={{
     228 + minWidth: 0,
     229 + mr: open ? 3 : 'auto',
     230 + justifyContent: 'center',
     231 + }}
     232 + >
     233 + {index % 2 === 0 ? <InboxIcon /> : <MailIcon />}
     234 + </ListItemIcon>
     235 + <ListItemText primary={text} sx={{ opacity: open ? 1 : 0 }} />
     236 + </ListItemButton>
     237 + </ListItem>
     238 + ))}
     239 + </List>
     240 + <List>
     241 + <ListItem disablePadding sx={{ display: 'block' }}>
     242 + <ListItemButton
     243 + onClick={handleDrawer}
     244 + sx={{
     245 + minHeight: 48,
     246 + px: 2.5,
     247 + }}
     248 + >
     249 + <MenuIcon />
     250 + </ListItemButton>
     251 + </ListItem>
     252 + <ListItem disablePadding sx={{ display: 'block' }}>
     253 + <ListItemButton
     254 + onClick={handleDrawer}
     255 + sx={{
     256 + minHeight: 48,
     257 + px: 2.5,
     258 + }}
     259 + >
     260 + </ListItemButton>
     261 + </ListItem>
     262 + </List>
     263 + </Drawer>
     264 + </Box>
     265 + );
     266 +}
  • ■ ■ ■ ■ ■ ■
    UI/src/core/components/Header.tsx
     1 +import React from 'react';
     2 +import { Tabs, Tab, Toolbar, AppBar, Box, Typography } from '@mui/material';
     3 +import MuiAppBar, { AppBarProps as MuiAppBarProps } from '@mui/material/AppBar';
     4 +import { styled, useTheme, Theme, CSSObject } from '@mui/material/styles';
     5 +import CssBaseline from '@mui/material/CssBaseline';
     6 +import { Link, matchPath, useLocation } from 'react-router-dom';
     7 +import { UserMenu, Logout, LoadingIndicator } from 'react-admin';
     8 + 
     9 +const Header = () => {
     10 +
     11 + const location = useLocation();
     12 + 
     13 + let currentPath = '/';
     14 + if (!!matchPath('/contacts/*', location.pathname)) {
     15 + currentPath = '/contacts';
     16 + } else if (!!matchPath('/companies/*', location.pathname)) {
     17 + currentPath = '/companies';
     18 + } else if (!!matchPath('/deals/*', location.pathname)) {
     19 + currentPath = '/deals';
     20 + }
     21 + 
     22 + interface AppBarProps extends MuiAppBarProps {
     23 + open?: boolean;
     24 + }
     25 + 
     26 + const AppBar = styled(MuiAppBar, {
     27 + shouldForwardProp: (prop) => prop !== 'open',
     28 + })<AppBarProps>(({ theme, open }) => ({
     29 + zIndex: theme.zIndex.drawer + 1000,
     30 + transition: theme.transitions.create(['width', 'margin'], {
     31 + easing: theme.transitions.easing.sharp,
     32 + duration: theme.transitions.duration.leavingScreen,
     33 + }),
     34 + ...(open && {
     35 + marginLeft: drawerWidth,
     36 + width: `calc(100% - ${drawerWidth}px)`,
     37 + transition: theme.transitions.create(['width', 'margin'], {
     38 + easing: theme.transitions.easing.sharp,
     39 + duration: theme.transitions.duration.enteringScreen,
     40 + }),
     41 + }),
     42 + }));
     43 + 
     44 + return (
     45 + <Box component="nav" sx={{ flexGrow: 1 }}>
     46 + <AppBar position="static" color="primary" sx={{ zIndex: 1000000 }}>
     47 + <Toolbar variant="dense">
     48 + <Box flex={1} display="flex" justifyContent="space-between">
     49 + <Box display="flex" alignItems="center">
     50 + <Box
     51 + component="img"
     52 + sx={{ marginRight: '1em', height: 30 }}
     53 + src={
     54 + 'https://upload.wikimedia.org/wikipedia/commons/a/a7/React-icon.svg'
     55 + }
     56 + alt="Bosch Logo"
     57 + />
     58 + <Typography component="span" variant="h5">
     59 + Sirius Scan
     60 + </Typography>
     61 + </Box>
     62 + {/*
     63 + <Box>
     64 + <Tabs
     65 + value={currentPath}
     66 + aria-label="Navigation Tabs"
     67 + indicatorColor="secondary"
     68 + textColor="inherit"
     69 + >
     70 + <Tab
     71 + label={'Dashboard'}
     72 + component={Link}
     73 + to="/"
     74 + value="/"
     75 + />
     76 + </Tabs>
     77 + </Box>
     78 + */}
     79 + <Box display="flex">
     80 + <LoadingIndicator
     81 + sx={{
     82 + '& .RaLoadingIndicator-loader': {
     83 + marginTop: 2,
     84 + },
     85 + }}
     86 + />
     87 + <UserMenu>
     88 + <Logout />
     89 + </UserMenu>
     90 + </Box>
     91 + </Box>
     92 + </Toolbar>
     93 + </AppBar>
     94 + </Box>
     95 + );
     96 +};
     97 + 
     98 +export default Header;
  • ■ ■ ■ ■ ■ ■
    UI/src/core/components/Layout.tsx
     1 +import React, { HtmlHTMLAttributes } from 'react';
     2 +import { CssBaseline, Container } from '@mui/material';
     3 +import { CoreLayoutProps } from 'react-admin';
     4 +import { ErrorBoundary } from 'react-error-boundary';
     5 + 
     6 +import { Error } from 'react-admin';
     7 +import Nav from './Nav';
     8 + 
     9 +const Layout = (props: LayoutProps) => {
     10 + const { children } = props;
     11 + return (
     12 + <>
     13 + <CssBaseline />
     14 + <Nav />
     15 + <Container sx={{ maxWidth: { xl: 1280 } }}>
     16 + <main id="main-content">
     17 + {/* @ts-ignore */}
     18 + <ErrorBoundary FallbackComponent={Error}>
     19 + {children}
     20 + </ErrorBoundary>
     21 + </main>
     22 + </Container>
     23 + </>
     24 + );
     25 +};
     26 + 
     27 +export interface LayoutProps
     28 + extends CoreLayoutProps,
     29 + Omit<HtmlHTMLAttributes<HTMLDivElement>, 'title'> {}
     30 + 
     31 +export default Layout;
  • ■ ■ ■ ■ ■ ■
    UI/src/core/components/Nav.tsx
     1 +import React from 'react';
     2 +import { Link, matchPath, useLocation } from 'react-router-dom';
     3 +import { UserMenu, Logout, LoadingIndicator } from 'react-admin';
     4 + 
     5 +import { styled, useTheme, Theme, CSSObject } from '@mui/material/styles';
     6 +import { Tabs, Tab, Toolbar, Box, Typography, MenuItem } from '@mui/material';
     7 +import MuiDrawer from '@mui/material/Drawer';
     8 +import MuiAppBar, { AppBarProps as MuiAppBarProps } from '@mui/material/AppBar';
     9 +import List from '@mui/material/List';
     10 +import CssBaseline from '@mui/material/CssBaseline';
     11 +import Divider from '@mui/material/Divider';
     12 +import IconButton from '@mui/material/IconButton';
     13 +import MenuIcon from '@mui/icons-material/Menu';
     14 +import RadarIcon from '@mui/icons-material/Radar';
     15 +import BugReportIcon from '@mui/icons-material/BugReport';
     16 +import TerminalIcon from '@mui/icons-material/Terminal';
     17 +import LanIcon from '@mui/icons-material/Lan';
     18 +import ListItem from '@mui/material/ListItem';
     19 +import ListItemButton from '@mui/material/ListItemButton';
     20 +import ListItemText from '@mui/material/ListItemText';
     21 +import SettingsIcon from '@mui/icons-material/Settings';
     22 + 
     23 +import Header from './Header';
     24 + 
     25 +import logo from '../../assets/sirius.png';
     26 + 
     27 +const drawerWidth = 240;
     28 + 
     29 +const openedMixin = (theme: Theme): CSSObject => ({
     30 + width: drawerWidth,
     31 + transition: theme.transitions.create('width', {
     32 + easing: theme.transitions.easing.sharp,
     33 + duration: theme.transitions.duration.enteringScreen,
     34 + }),
     35 + overflowX: 'hidden',
     36 +});
     37 + 
     38 +const closedMixin = (theme: Theme): CSSObject => ({
     39 + transition: theme.transitions.create('width', {
     40 + easing: theme.transitions.easing.sharp,
     41 + duration: theme.transitions.duration.leavingScreen,
     42 + }),
     43 + overflowX: 'hidden',
     44 + width: `calc(${theme.spacing(7)} + 1px)`,
     45 + [theme.breakpoints.up('sm')]: {
     46 + width: `calc(${theme.spacing(8)} + 1px)`,
     47 + },
     48 +});
     49 + 
     50 +const DrawerHeader = styled('div')(({ theme }) => ({
     51 + display: 'flex',
     52 + alignItems: 'center',
     53 + justifyContent: 'flex-end',
     54 + padding: theme.spacing(0, 1),
     55 + // necessary for content to be below app bar
     56 + ...theme.mixins.toolbar,
     57 +}));
     58 + 
     59 +interface AppBarProps extends MuiAppBarProps {
     60 + open?: boolean;
     61 +}
     62 + 
     63 +const AppBar = styled(MuiAppBar, {
     64 + shouldForwardProp: (prop) => prop !== 'open',
     65 +})<AppBarProps>(({ theme, open }) => ({
     66 + zIndex: theme.zIndex.drawer + 1,
     67 + transition: theme.transitions.create(['width', 'margin'], {
     68 + easing: theme.transitions.easing.sharp,
     69 + duration: theme.transitions.duration.leavingScreen,
     70 + }),
     71 + ...(open && {
     72 + marginLeft: drawerWidth,
     73 + width: `calc(100% - ${drawerWidth}px)`,
     74 + transition: theme.transitions.create(['width', 'margin'], {
     75 + easing: theme.transitions.easing.sharp,
     76 + duration: theme.transitions.duration.enteringScreen,
     77 + }),
     78 + }),
     79 +}));
     80 + 
     81 +const Drawer = styled(MuiDrawer, { shouldForwardProp: (prop) => prop !== 'open' })(
     82 + ({ theme, open }) => ({
     83 + width: drawerWidth,
     84 + flexShrink: 0,
     85 + whiteSpace: 'nowrap',
     86 + boxSizing: 'border-box',
     87 + ...(open && {
     88 + ...openedMixin(theme),
     89 + '& .MuiDrawer-paper': openedMixin(theme),
     90 + }),
     91 + ...(!open && {
     92 + ...closedMixin(theme),
     93 + '& .MuiDrawer-paper': closedMixin(theme),
     94 + }),
     95 + }),
     96 +);
     97 + 
     98 +export default function MiniDrawer() {
     99 + const theme = useTheme();
     100 + const [open, setOpen] = React.useState(false);
     101 + 
     102 + const handleDrawer = () => {
     103 + if (open === true) {
     104 + setOpen(false);
     105 + } else {
     106 + setOpen(true);
     107 + }
     108 + };
     109 + 
     110 + const handleDrawerClose = () => {
     111 + setOpen(false);
     112 + };
     113 + const location = useLocation();
     114 + 
     115 + let currentPath = '/';
     116 + if (!!matchPath('/contacts/*', location.pathname)) {
     117 + currentPath = '/contacts';
     118 + } else if (!!matchPath('/companies/*', location.pathname)) {
     119 + currentPath = '/companies';
     120 + } else if (!!matchPath('/deals/*', location.pathname)) {
     121 + currentPath = '/deals';
     122 + }
     123 + 
     124 + return (
     125 + <Box sx={{ display: 'flex' }}>
     126 + <CssBaseline />
     127 + <AppBar position="fixed" color="primary" >
     128 + <Toolbar variant="dense">
     129 + <Box flex={1} display="flex" justifyContent="space-between">
     130 + <Box display="flex" alignItems="center">
     131 + <Box
     132 + component="img"
     133 + sx={{ marginRight: '1em', height: 30 }}
     134 + src={logo}
     135 + />
     136 + <Typography component="span" variant="h5">
     137 +
     138 + </Typography>
     139 + </Box>
     140 + {/*
     141 + <Box>
     142 + <Tabs
     143 + value={currentPath}
     144 + aria-label="Navigation Tabs"
     145 + indicatorColor="secondary"
     146 + textColor="inherit"
     147 + >
     148 + <Tab
     149 + label={'Dashboard'}
     150 + component={Link}
     151 + to="/"
     152 + value="/"
     153 + />
     154 + </Tabs>
     155 + </Box>
     156 + */}
     157 + <Box display="flex">
     158 + <LoadingIndicator
     159 + sx={{
     160 + '& .RaLoadingIndicator-loader': {
     161 + marginTop: 2,
     162 + },
     163 + }}
     164 + />
     165 + <UserMenu>
     166 + <Logout />
     167 + <MenuItem
     168 + label={'Users'}
     169 + component={Link}
     170 + to="/users"
     171 + value="/users"
     172 + >
     173 + Administration
     174 + </MenuItem>
     175 + </UserMenu>
     176 + </Box>
     177 + </Box>
     178 + </Toolbar>
     179 + </AppBar>
     180 + <Drawer variant="permanent" open={open}>
     181 + <Divider />
     182 + <List>
     183 + <ListItem disablePadding sx={{ display: 'block' }}>
     184 + <ListItemButton
     185 + sx={{
     186 + minHeight: 45,
     187 + }}
     188 + >
     189 + </ListItemButton>
     190 + </ListItem>
     191 + {/* Drawer Icon Buttons */}
     192 + <ListItem disablePadding sx={{ display: 'block' }}>
     193 + <ListItemButton
     194 + component={Link}
     195 + to="/"
     196 + value="/"
     197 + sx={{
     198 + minHeight: 48,
     199 + px: 2.5,
     200 + }}
     201 + >
     202 + <BugReportIcon
     203 + sx={{
     204 + minWidth: 0,
     205 + mr: open ? 3 : 'auto',
     206 + justifyContent: 'center',
     207 + }}
     208 + />
     209 + <ListItemText sx={{ opacity: open ? 1 : 0 }}>Issues</ListItemText>
     210 + </ListItemButton>
     211 + <ListItemButton
     212 + component={Link}
     213 + to="/inventory"
     214 + value="/"
     215 + sx={{
     216 + minHeight: 48,
     217 + px: 2.5,
     218 + }}
     219 + >
     220 + <LanIcon
     221 + sx={{
     222 + minWidth: 0,
     223 + mr: open ? 3 : 'auto',
     224 + justifyContent: 'center',
     225 + }}
     226 + />
     227 + <ListItemText sx={{ opacity: open ? 1 : 0 }}>Inventory</ListItemText>
     228 + </ListItemButton>
     229 + <ListItemButton
     230 + component={Link}
     231 + to="/scan"
     232 + sx={{
     233 + minHeight: 48,
     234 + px: 2.5,
     235 + }}
     236 + >
     237 + <RadarIcon
     238 + sx={{
     239 + minWidth: 0,
     240 + mr: open ? 3 : 'auto',
     241 + justifyContent: 'center',
     242 + }}
     243 + />
     244 + <ListItemText sx={{ opacity: open ? 1 : 0 }}>Scanner</ListItemText>
     245 + </ListItemButton>
     246 + <ListItemButton
     247 + sx={{
     248 + minHeight: 48,
     249 + px: 2.5,
     250 + }}
     251 + >
     252 + <TerminalIcon
     253 + sx={{
     254 + minWidth: 0,
     255 + mr: open ? 3 : 'auto',
     256 + justifyContent: 'center',
     257 + }}
     258 + />
     259 + <ListItemText sx={{ opacity: open ? 1 : 0 }}>Agents</ListItemText>
     260 + </ListItemButton>
     261 + </ListItem>
     262 + </List>
     263 + <Divider />
     264 + <List>
     265 + <ListItem disablePadding sx={{ display: 'block' }}>
     266 + <ListItemButton
     267 + onClick={handleDrawer}
     268 + sx={{
     269 + minHeight: 48,
     270 + px: 2.5,
     271 + }}
     272 + >
     273 + <MenuIcon
     274 + sx={{
     275 + minWidth: 0,
     276 + mr: open ? 3 : 'auto',
     277 + justifyContent: 'center',
     278 + }}
     279 + />
     280 + </ListItemButton>
     281 + </ListItem>
     282 + <ListItem disablePadding sx={{ display: 'block' }}>
     283 + <ListItemButton
     284 + label={'Users'}
     285 + component={Link}
     286 + to="/users"
     287 + value="/users"
     288 + sx={{
     289 + minHeight: 48,
     290 + px: 2.5,
     291 + }}
     292 + >
     293 + <SettingsIcon
     294 + sx={{
     295 + minWidth: 0,
     296 + mr: open ? 3 : 'auto',
     297 + justifyContent: 'center',
     298 + }}
     299 + />
     300 + <ListItemText sx={{ opacity: open ? 1 : 0 }}>Administration</ListItemText>
     301 + </ListItemButton>
     302 + </ListItem>
     303 + </List>
     304 + </Drawer>
     305 + </Box>
     306 + );
     307 +}
  • ■ ■ ■ ■ ■ ■
    UI/src/core/dataProvider.ts
     1 +import { fetchUtils } from "react-admin";
     2 +import { stringify } from "query-string";
     3 + 
     4 +const apiUrl = 'https://my.api.com/';
     5 +const httpClient = fetchUtils.fetchJson;
     6 + 
     7 +export const dataProvider= {
     8 + getList: (resource, params) => {
     9 + const { page, perPage } = params.pagination;
     10 + const { field, order } = params.sort;
     11 + const query = {
     12 + sort: JSON.stringify([field, order]),
     13 + range: JSON.stringify([(page - 1) * perPage, page * perPage - 1]),
     14 + filter: JSON.stringify(params.filter),
     15 + };
     16 + const url = `${apiUrl}/${resource}?${stringify(query)}`;
     17 + 
     18 + return httpClient(url).then(({ headers, json }) => ({
     19 + data: json,
     20 + total: parseInt(headers.get('content-range').split('/').pop(), 10),
     21 + }));
     22 + },
     23 + 
     24 + getOne: (resource, params) =>
     25 + httpClient(`${apiUrl}/${resource}/${params.id}`).then(({ json }) => ({
     26 + data: json,
     27 + })),
     28 + 
     29 + getMany: (resource, params) => {
     30 + const query = {
     31 + filter: JSON.stringify({ id: params.ids }),
     32 + };
     33 + const url = `${apiUrl}/${resource}?${stringify(query)}`;
     34 + return httpClient(url).then(({ json }) => ({ data: json }));
     35 + },
     36 + 
     37 + getManyReference: (resource, params) => {
     38 + const { page, perPage } = params.pagination;
     39 + const { field, order } = params.sort;
     40 + const query = {
     41 + sort: JSON.stringify([field, order]),
     42 + range: JSON.stringify([(page - 1) * perPage, page * perPage - 1]),
     43 + filter: JSON.stringify({
     44 + ...params.filter,
     45 + [params.target]: params.id,
     46 + }),
     47 + };
     48 + const url = `${apiUrl}/${resource}?${stringify(query)}`;
     49 + 
     50 + return httpClient(url).then(({ headers, json }) => ({
     51 + data: json,
     52 + total: parseInt(headers.get('content-range').split('/').pop(), 10),
     53 + }));
     54 + },
     55 + 
     56 + update: (resource, params) =>
     57 + httpClient(`${apiUrl}/${resource}/${params.id}`, {
     58 + method: 'PUT',
     59 + body: JSON.stringify(params.data),
     60 + }).then(({ json }) => ({ data: json })),
     61 + 
     62 + updateMany: (resource, params) => {
     63 + const query = {
     64 + filter: JSON.stringify({ id: params.ids}),
     65 + };
     66 + return httpClient(`${apiUrl}/${resource}?${stringify(query)}`, {
     67 + method: 'PUT',
     68 + body: JSON.stringify(params.data),
     69 + }).then(({ json }) => ({ data: json }));
     70 + },
     71 + 
     72 + create: (resource, params) =>
     73 + httpClient(`${apiUrl}/${resource}`, {
     74 + method: 'POST',
     75 + body: JSON.stringify(params.data),
     76 + }).then(({ json }) => ({
     77 + data: { ...params.data, id: json.id },
     78 + })),
     79 + 
     80 + delete: (resource, params) =>
     81 + httpClient(`${apiUrl}/${resource}/${params.id}`, {
     82 + method: 'DELETE',
     83 + }).then(({ json }) => ({ data: json })),
     84 + 
     85 + deleteMany: (resource, params) => {
     86 + const query = {
     87 + filter: JSON.stringify({ id: params.ids}),
     88 + };
     89 + return httpClient(`${apiUrl}/${resource}?${stringify(query)}`, {
     90 + method: 'DELETE',
     91 + }).then(({ json }) => ({ data: json }));
     92 + }
     93 +};
  • ■ ■ ■ ■ ■ ■
    UI/src/index.css
     1 +body {
     2 + margin: 0;
     3 +}
  • ■ ■ ■ ■ ■ ■
    UI/src/main.tsx
     1 +import React from 'react'
     2 +import ReactDOM from 'react-dom/client'
     3 +import App from './App'
     4 +import './index.css'
     5 + 
     6 +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
     7 + <React.StrictMode>
     8 + <App />
     9 + </React.StrictMode>,
     10 +)
     11 + 
  • ■ ■ ■ ■ ■ ■
    UI/src/sirius/InventoryNavigator.tsx
     1 +import * as React from 'react';
     2 +import { Card, CardContent, CardHeader, Paper } from "@mui/material";
     3 +import { Container } from "@mui/material";
     4 +import Tabs from '@mui/material/Tabs';
     5 +import Tab from '@mui/material/Tab';
     6 +import Typography from '@mui/material/Typography';
     7 +import Box from '@mui/material/Box';
     8 +import LanIcon from '@mui/icons-material/Lan';
     9 +import HealingIcon from '@mui/icons-material/Healing';
     10 +import AnalyticsIcon from '@mui/icons-material/Analytics';
     11 + 
     12 +import InventoryHost from "./containers/InventoryHost";
     13 + 
     14 +interface TabPanelProps {
     15 + children?: React.ReactNode;
     16 + index: number;
     17 + value: number;
     18 + }
     19 + 
     20 +export default function IssuesNavigator() {
     21 + const [value, setValue] = React.useState(0);
     22 + const [hostList, setHostList] = React.useState([]);
     23 + 
     24 + React.useEffect(() => {
     25 + //Get the list of hosts
     26 + fetch('http://localhost:8080/api/get/hosts')
     27 + .then((response) => response.json())
     28 + .then((data) => {
     29 + setHostList(data);
     30 + });
     31 + }, [])
     32 + 
     33 + const handleChange = (event: React.SyntheticEvent, newValue: number) => {
     34 + setValue(newValue);
     35 + };
     36 + 
     37 + return (
     38 + <Container sx={{marginTop: 8, marginLeft: 3}}>
     39 + <Card>
     40 + {/* Navigator Tab Headers */}
     41 + {value == 0 ?
     42 + <CardHeader sx={{ fontSize: 54 }} title="Inventory Navigator" subheader="Hosts" avatar={<LanIcon />} />
     43 + : null}
     44 + {value == 1 ?
     45 + <CardHeader title="Inventory Navigator" subheader="Software Inventory" avatar={<HealingIcon />} />
     46 + : null}
     47 + {value == 2 ?
     48 + <CardHeader title="Inventory Navigator" subheader="Statistics" avatar={<AnalyticsIcon />} />
     49 + : null}
     50 + <CardContent>
     51 + <InventoryTabs value={value} handleChange={handleChange} />
     52 + </CardContent>
     53 + 
     54 + {/* Navigator Tab Contents */}
     55 + {value == 0 ?
     56 + <InventoryHost hostList={hostList} />
     57 + : null}
     58 + </Card>
     59 + </Container>
     60 + );
     61 +}
     62 + 
     63 +function InventoryTabs({value, handleChange}) {
     64 + return (
     65 + <Box>
     66 + <Box sx={{ borderBottom: 1, borderColor: 'divider' }}>
     67 + <Tabs value={value} onChange={handleChange} aria-label="basic tabs example">
     68 + <Tab label="Hosts" {...a11yProps(0)} />
     69 + <Tab label="Software Inventory" {...a11yProps(1)} />
     70 + <Tab label="Statistics" {...a11yProps(2)} />
     71 + </Tabs>
     72 + </Box>
     73 + <TabPanel value={value} index={0}>
     74 +
     75 + </TabPanel>
     76 + <TabPanel value={value} index={1}>
     77 + Item Two
     78 + </TabPanel>
     79 + <TabPanel value={value} index={2}>
     80 + Item Three
     81 + </TabPanel>
     82 + </Box>
     83 + );
     84 +}
     85 +
     86 +function TabPanel(props: TabPanelProps) {
     87 + const { children, value, index, ...other } = props;
     88 + 
     89 + return (
     90 + <div>
     91 + {value === index && (
     92 + <Box>
     93 + {children}
     94 + </Box>
     95 + )}
     96 + </div>
     97 + );
     98 +}
     99 +
     100 +function a11yProps(index: number) {
     101 + return {
     102 + id: `simple-tab-${index}`,
     103 + 'aria-controls': `simple-tabpanel-${index}`,
     104 + };
     105 +}
     106 +
     107 + 
     108 + 
     109 + 
  • ■ ■ ■ ■ ■ ■
    UI/src/sirius/IssuesNavigator.tsx
     1 +import * as React from 'react';
     2 +import { Card, CardContent, CardHeader, Paper } from "@mui/material";
     3 +import { Container } from "@mui/material";
     4 +import Tabs from '@mui/material/Tabs';
     5 +import Tab from '@mui/material/Tab';
     6 +import Typography from '@mui/material/Typography';
     7 +import Box from '@mui/material/Box';
     8 +import BugReportIcon from '@mui/icons-material/BugReport';
     9 +import HealingIcon from '@mui/icons-material/Healing';
     10 +import AnalyticsIcon from '@mui/icons-material/Analytics';
     11 + 
     12 +import SiriusIssues from "./containers/SiriusIssues";
     13 +import { HostFindingsDashboard } from "./components/Reporting";
     14 + 
     15 +interface TabPanelProps {
     16 + children?: React.ReactNode;
     17 + index: number;
     18 + value: number;
     19 + }
     20 +
     21 +function TabPanel(props: TabPanelProps) {
     22 + const { children, value, index, ...other } = props;
     23 +
     24 + return (
     25 + <div>
     26 + {value === index && (
     27 + <Box>
     28 + {children}
     29 + </Box>
     30 + )}
     31 + </div>
     32 + );
     33 +}
     34 + 
     35 +function updateTab(value) {
     36 + const [newValue, setValue] = React.useState(0);
     37 + console.log("Updating tab");
     38 + setValue(value);
     39 +}
     40 +
     41 +function a11yProps(index: number) {
     42 + return {
     43 + id: `simple-tab-${index}`,
     44 + 'aria-controls': `simple-tabpanel-${index}`,
     45 + };
     46 +}
     47 +
     48 +function IssueTabs({value, handleChange}) {
     49 + return (
     50 + <Box>
     51 + <Box sx={{ borderBottom: 1, borderColor: 'divider' }}>
     52 + <Tabs value={value} onChange={handleChange} aria-label="">
     53 + <Tab label="Vulnerabilities" {...a11yProps(0)} />
     54 + <Tab label="Missing Patches" {...a11yProps(1)} />
     55 + <Tab label="Statistics" {...a11yProps(2)} />
     56 + </Tabs>
     57 + </Box>
     58 + <TabPanel value={value} index={0}>
     59 + 
     60 + <Box sx={{maxWidth: '650px', marginLeft: -5, marginTop: 2}}>
     61 + <HostFindingsDashboard />
     62 + </Box>
     63 + 
     64 + </TabPanel>
     65 + <TabPanel value={value} index={1}>
     66 + Item Two
     67 + </TabPanel>
     68 + <TabPanel value={value} index={2}>
     69 + Item Three
     70 + </TabPanel>
     71 + </Box>
     72 + );
     73 +}
     74 + 
     75 +export default function IssuesNavigator() {
     76 + const [value, setValue] = React.useState(0);
     77 +
     78 + const handleChange = (event: React.SyntheticEvent, newValue: number) => {
     79 + setValue(newValue);
     80 + console.log("New value: " + newValue)
     81 + };
     82 + 
     83 + return (
     84 + <Container sx={{marginTop: 8, marginLeft: 3}}>
     85 + <Card>
     86 + {value == 0 ?
     87 + <CardHeader sx={{ fontSize: 54 }} title="Security Issues Navigator" subheader="Vulnerabilities" avatar={<BugReportIcon />} />
     88 + : null}
     89 + {value == 1 ?
     90 + <CardHeader title="Security Issues Navigator" subheader="Missing Patches" avatar={<HealingIcon />} />
     91 + : null}
     92 + {value == 2 ?
     93 + <CardHeader title="Security Issues Navigator" subheader="Statistics" avatar={<AnalyticsIcon />} />
     94 + : null}
     95 + <CardContent>
     96 + <IssueTabs value={value} handleChange={handleChange} />
     97 + </CardContent>
     98 + {value == 0 ?
     99 + <SiriusIssues />
     100 + : null}
     101 + </Card>
     102 + </Container>
     103 + );
     104 +}
  • ■ ■ ■ ■ ■ ■
    UI/src/sirius/ScanControl.tsx
     1 +import * as React from 'react';
     2 +import { Card, CardContent, CardHeader, Paper } from "@mui/material";
     3 +import { Container } from "@mui/material";
     4 +import Tabs from '@mui/material/Tabs';
     5 +import Tab from '@mui/material/Tab';
     6 +import Typography from '@mui/material/Typography';
     7 +import Box from '@mui/material/Box';
     8 +import RadarIcon from '@mui/icons-material/Radar';
     9 +import HealingIcon from '@mui/icons-material/Healing';
     10 +import AnalyticsIcon from '@mui/icons-material/Analytics';
     11 + 
     12 +import Scanner from "./containers/Scanner";
     13 + 
     14 +interface TabPanelProps {
     15 + children?: React.ReactNode;
     16 + index: number;
     17 + value: number;
     18 + }
     19 + 
     20 +export default function ScanControl() {
     21 + const [value, setValue] = React.useState(0);
     22 + const [hostList, setHostList] = React.useState([]);
     23 + 
     24 + React.useEffect(() => {
     25 + //Get the list of hosts
     26 + fetch('http://localhost:8080/api/get/hosts')
     27 + .then((response) => response.json())
     28 + .then((data) => {
     29 + setHostList(data);
     30 + });
     31 + }, [])
     32 + 
     33 + const handleChange = (event: React.SyntheticEvent, newValue: number) => {
     34 + setValue(newValue);
     35 + };
     36 + 
     37 + return (
     38 + <Container sx={{marginTop: 8, marginLeft: 3}}>
     39 + <Card>
     40 + {/* Navigator Tab Headers */}
     41 + {value == 0 ?
     42 + <CardHeader sx={{ fontSize: 54 }} title="Scanner" subheader="Create a New Scan" avatar={<RadarIcon />} />
     43 + : null}
     44 + {value == 1 ?
     45 + <CardHeader sx={{ fontSize: 54 }} title="Modules" subheader="Sirius Scanning Module Library" avatar={<RadarIcon />} />
     46 + : null}
     47 + {value == 2 ?
     48 + <CardHeader sx={{ fontSize: 54 }} title="Repositories" subheader="Module Repositories" avatar={<RadarIcon />} />
     49 + : null}
     50 + <CardContent>
     51 + <ScanControlTabs value={value} handleChange={handleChange} />
     52 + </CardContent>
     53 + 
     54 + {/* Navigator Tab Contents */}
     55 + {value == 0 ?
     56 + <Scanner hostList={hostList} />
     57 + : null}
     58 + </Card>
     59 + </Container>
     60 + );
     61 +}
     62 + 
     63 +function ScanControlTabs({value, handleChange}) {
     64 + return (
     65 + <Box>
     66 + <Box sx={{ borderBottom: 1, borderColor: 'divider' }}>
     67 + <Tabs value={value} onChange={handleChange} aria-label="basic tabs example">
     68 + <Tab label="Scanner" {...a11yProps(0)} />
     69 + <Tab label="Modules" {...a11yProps(1)} />
     70 + <Tab label="Repositories" {...a11yProps(2)} />
     71 + </Tabs>
     72 + </Box>
     73 + <TabPanel value={value} index={0}>
     74 + </TabPanel>
     75 + <TabPanel value={value} index={1}>
     76 + Not yet implemented
     77 + </TabPanel>
     78 + <TabPanel value={value} index={2}>
     79 + Not yet implemented
     80 + </TabPanel>
     81 + </Box>
     82 + );
     83 +}
     84 +
     85 +function TabPanel(props: TabPanelProps) {
     86 + const { children, value, index, ...other } = props;
     87 + 
     88 + return (
     89 + <div>
     90 + {value === index && (
     91 + <Box>
     92 + {children}
     93 + </Box>
     94 + )}
     95 + </div>
     96 + );
     97 +}
     98 +
     99 +function a11yProps(index: number) {
     100 + return {
     101 + id: `simple-tab-${index}`,
     102 + 'aria-controls': `simple-tabpanel-${index}`,
     103 + };
     104 +}
     105 +
     106 + 
     107 + 
     108 + 
  • ■ ■ ■ ■ ■ ■
    UI/src/sirius/SingleReport.tsx
     1 +import * as React from 'react';
     2 +import { useSearchParams } from 'react-router-dom';
     3 + 
     4 +import { Card, CardContent, CardHeader, Paper } from "@mui/material";
     5 +import { Container } from "@mui/material";
     6 +import Box from '@mui/material/Box';
     7 +import Grid from '@mui/material/Grid';
     8 + 
     9 +import { HostReportOverview, VulnReportOverview, ReportTitle, ReturnButton } from "./components/Reporting";
     10 +import HostReportTabs from "./components/HostReport";
     11 +import VulnReportTabs from "./components/VulnReport";
     12 + 
     13 + 
     14 +export default function SingleReport() {
     15 + const [value, setValue] = React.useState(0);
     16 +
     17 + const handleChange = (event: React.SyntheticEvent, newValue: number) => {
     18 + setValue(newValue);
     19 + };
     20 + 
     21 + //Get the report type from the URL
     22 + const [queryParameters] = useSearchParams()
     23 + const r = window.location.href.split("?")[0].split("/").pop()
     24 + const reportType = r.charAt(0).toUpperCase() + r.slice(1)
     25 + 
     26 + const reportTitle = reportType + " Report";
     27 + 
     28 + return (
     29 + <Container sx={{marginTop: 12, marginLeft: 3}}>
     30 + <Paper>
     31 + <Box sx={{
     32 + backgroundColor: "primary.main",
     33 + }}>
     34 + <Grid container>
     35 + <Grid xs={1.3}>
     36 + <ReturnButton />
     37 + </Grid>
     38 + <Grid xs={4}>
     39 + <ReportTitle title={reportTitle} />
     40 + </Grid>
     41 + </Grid>
     42 + </Box>
     43 + <Box sx={{
     44 + }}>
     45 + {reportType == "Host"
     46 + ?
     47 + <div>
     48 + <HostReportOverview title={reportTitle} />
     49 + <HostReportTabs value={value} handleChange={handleChange} />
     50 + </div>
     51 + : null
     52 + }
     53 + {reportType == "Vulnerability"
     54 + ?
     55 + <div>
     56 + <VulnReportOverview title={reportTitle} />
     57 + <VulnReportTabs value={value} handleChange={handleChange} />
     58 + </div>
     59 + : null
     60 + }
     61 + 
     62 + </Box>
     63 + </Paper>
     64 + </Container>
     65 + );
     66 +}
  • ■ ■ ■ ■ ■ ■
    UI/src/sirius/components/HostReport.tsx
     1 +import * as React from 'react';
     2 +import { useSearchParams } from 'react-router-dom';
     3 + 
     4 +import { Card, CardContent, CardHeader, Paper } from "@mui/material";
     5 +import { Container } from "@mui/material";
     6 +import Tabs from '@mui/material/Tabs';
     7 +import Tab from '@mui/material/Tab';
     8 +import Typography from '@mui/material/Typography';
     9 +import Box from '@mui/material/Box';
     10 +import LanIcon from '@mui/icons-material/Lan';
     11 +import HealingIcon from '@mui/icons-material/Healing';
     12 +import AnalyticsIcon from '@mui/icons-material/Analytics';
     13 + 
     14 + 
     15 +import VulnTable from "./VulnTable";
     16 + 
     17 +interface TabPanelProps {
     18 + children?: React.ReactNode;
     19 + index: number;
     20 + value: number;
     21 + }
     22 + 
     23 +export default function HostReportTabs() {
     24 + const [value, setValue] = React.useState(0);
     25 + const [vulnList, setVulnList] = React.useState([]);
     26 + const [queryParameters] = useSearchParams()
     27 + 
     28 + React.useEffect(() => {
     29 + //Get the list of vulnerabilities
     30 + //Make API post request to get the list of vulnerabilities for the ip parameter
     31 + const requestOptions = {
     32 + method: 'POST',
     33 + headers: { 'Content-Type': 'application/json' },
     34 + body: JSON.stringify({ ip: queryParameters.get("ip") })
     35 + };
     36 + fetch('http://localhost:8080/api/svdb/report/host', requestOptions)
     37 + .then((response) => response.json())
     38 + .then((data) => {
     39 + setVulnList(data);
     40 + });
     41 + }, [])
     42 + 
     43 + 
     44 + const handleChange = (event: React.SyntheticEvent, newValue: number) => {
     45 + setValue(newValue);
     46 + };
     47 + 
     48 + return (
     49 + <div sx={{marginTop: 0, width: '100%'}}>
     50 + <Card>
     51 + {/* Navigator Tab Headers */}
     52 + 
     53 + <CardContent>
     54 + <HostTabs value={value} handleChange={handleChange} />
     55 + </CardContent>
     56 + 
     57 + {/* Navigator Tab Contents */}
     58 + {value == 0 ?
     59 + <VulnTable vulnList={vulnList}/>
     60 + : null}
     61 + </Card>
     62 + </div>
     63 + );
     64 +}
     65 + 
     66 + 
     67 +function HostTabs({value, handleChange}) {
     68 + return (
     69 + <Box>
     70 + <Box sx={{ borderBottom: 1, borderColor: 'divider' }}>
     71 + <Tabs value={value} onChange={handleChange} aria-label="">
     72 + <Tab label="Vulnerabilities" {...a11yProps(0)} />
     73 + <Tab label="Missing Patches" {...a11yProps(1)} />
     74 + <Tab label="Statistics" {...a11yProps(2)} />
     75 + </Tabs>
     76 + </Box>
     77 + <TabPanel value={value} index={0}>
     78 +
     79 + </TabPanel>
     80 + <TabPanel value={value} index={1}>
     81 + Item Two
     82 + </TabPanel>
     83 + <TabPanel value={value} index={2}>
     84 + Item Three
     85 + </TabPanel>
     86 + </Box>
     87 + );
     88 + }
     89 +
     90 + function TabPanel(props: TabPanelProps) {
     91 + const { children, value, index, ...other } = props;
     92 +
     93 + return (
     94 + <div>
     95 + {value === index && (
     96 + <Box>
     97 + {children}
     98 + </Box>
     99 + )}
     100 + </div>
     101 + );
     102 + }
     103 +
     104 + function a11yProps(index: number) {
     105 + return {
     106 + id: `simple-tab-${index}`,
     107 + 'aria-controls': `simple-tabpanel-${index}`,
     108 + };
     109 + }
  • ■ ■ ■ ■ ■ ■
    UI/src/sirius/components/HostTable.tsx
     1 +import React, { Component } from 'react';
     2 +import { Link } from 'react-router-dom';
     3 + 
     4 +import Paper from '@mui/material/Paper';
     5 +import Card from '@mui/material/Card';
     6 +import Badge from '@mui/material/Badge';
     7 +import CardActions from '@mui/material/CardActions';
     8 +import CardContent from '@mui/material/CardContent';
     9 +import Typography from '@mui/material/Typography';
     10 +import Table from '@mui/material/Table';
     11 +import TableBody from '@mui/material/TableBody';
     12 +import TableCell from '@mui/material/TableCell';
     13 +import TableContainer from '@mui/material/TableContainer';
     14 +import TableHead from '@mui/material/TableHead';
     15 +import TableRow from '@mui/material/TableRow';
     16 +import Collapse from '@mui/material/Collapse';
     17 +import IconButton from '@mui/material/IconButton';
     18 +import Box from '@mui/material/Box';
     19 + 
     20 +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
     21 +import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';
     22 +import AddBox from '@mui/icons-material/AddBox';
     23 +import IndeterminateCheckBoxIcon from '@mui/icons-material/IndeterminateCheckBox';
     24 +import UploadFileRoundedIcon from '@mui/icons-material/UploadFileRounded';
     25 + 
     26 +import { createMuiTheme } from 'material-ui/styles';
     27 + 
     28 +export function HostTable(props: { row: ReturnType<typeof createData> }) {
     29 + const { row } = props;
     30 + const [open, setOpen] = React.useState(false);
     31 + 
     32 + console.log(row);
     33 +
     34 + return (
     35 + <>
     36 + {row}
     37 + </>
     38 + );
     39 + }
     40 + 
  • ■ ■ ■ ■ ■ ■
    UI/src/sirius/components/Reporting.tsx
     1 +import { useSearchParams } from 'react-router-dom';
     2 + 
     3 +import Box from '@mui/material/Box';
     4 +import ArrowBackIcon from '@mui/icons-material/ArrowBack';
     5 +import Divider from '@mui/material/Divider';
     6 +import Typography from '@mui/material/Typography';
     7 +import Grid from '@mui/material/Grid';
     8 +import Item from '@mui/material/Grid';
     9 + 
     10 +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
     11 +import { faWindows } from '@fortawesome/free-brands-svg-icons';
     12 +import { faUser } from '@fortawesome/free-solid-svg-icons';
     13 +import { solid, regular, brands, icon } from '@fortawesome/fontawesome-svg-core/import.macro'
     14 + 
     15 +import { Progress } from "rsuite";
     16 +import "rsuite/dist/rsuite.min.css";
     17 + 
     18 +export const ReturnButton = () => {
     19 + 
     20 + return (
     21 + <Box sx={{
     22 + width: 90,
     23 + height: 90,
     24 + minWidth: 40,
     25 + minHeight: 40,
     26 + display: 'flex',
     27 + backgroundColor: 'black',
     28 + '&:hover': {
     29 + backgroundColor: 'black',
     30 + opacity: [0.9, 0.8, 0.7],
     31 + },
     32 + cursor: 'pointer'
     33 + }}>
     34 + <ArrowBackIcon sx={{
     35 + color: 'white',
     36 + margin: 'auto',
     37 + fontSize: 60,
     38 + }} />
     39 + </Box>
     40 + );
     41 +};
     42 + 
     43 +export const HostFindingsDashboard = () => {
     44 + 
     45 + return (
     46 + <Grid sx={{marginLeft: 5}} spacing={1} container item xs={12}>
     47 + <Grid item xs={3}>
     48 + <Box sx={{
     49 + width: 150,
     50 + borderBottom: '.2rem solid #bcd5ff',
     51 + display: 'flex',
     52 + flexDirection: 'column',
     53 + justifyContent: 'center',
     54 + alignItems: "center",
     55 + color: '#fff',
     56 + height: 90,
     57 + minWidth: 40,
     58 + minHeight: 40,
     59 + display: 'flex',
     60 + backgroundColor: 'black',
     61 + '&:hover': {
     62 + backgroundColor: 'black',
     63 + opacity: [0.9, 0.8, 0.7],
     64 + },
     65 + cursor: 'pointer'
     66 + }}>
     67 + <Typography sx={{fontSize: 10, paddingTop: '15px'}} variant="button" display="block">
     68 + Critical
     69 + </Typography>
     70 + <Typography sx={{fontSize: 42, marginTop: '-15px'}} variant="button" display="block" gutterBottom>
     71 + 5
     72 + </Typography>
     73 + </Box>
     74 + </Grid>
     75 + <Grid item xs={3}>
     76 + <Box sx={{
     77 + width: 150,
     78 + borderBottom: '.2rem solid #bcd5ff',
     79 + display: 'flex',
     80 + flexDirection: 'column',
     81 + justifyContent: 'center',
     82 + alignItems: "center",
     83 + color: '#fff',
     84 + height: 90,
     85 + minWidth: 40,
     86 + minHeight: 40,
     87 + display: 'flex',
     88 + backgroundColor: '#e91010',
     89 + '&:hover': {
     90 + backgroundColor: '#e91010',
     91 + opacity: [0.9, 0.8, 0.7],
     92 + },
     93 + cursor: 'pointer'
     94 + }}>
     95 + <Typography sx={{fontSize: 10, paddingTop: '15px'}} variant="button" display="block">
     96 + High
     97 + </Typography>
     98 + <Typography sx={{fontSize: 42, marginTop: '-15px'}} variant="button" display="block" gutterBottom>
     99 + 13
     100 + </Typography>
     101 + </Box>
     102 + </Grid>
     103 + <Grid item xs={3}>
     104 + <Box sx={{
     105 + width: 150,
     106 + borderBottom: '.2rem solid #bcd5ff',
     107 + display: 'flex',
     108 + flexDirection: 'column',
     109 + justifyContent: 'center',
     110 + alignItems: "center",
     111 + color: '#fff',
     112 + height: 90,
     113 + minWidth: 40,
     114 + minHeight: 40,
     115 + display: 'flex',
     116 + backgroundColor: '#4aae19',
     117 + '&:hover': {
     118 + backgroundColor: '#4aae19',
     119 + opacity: [0.9, 0.8, 0.7],
     120 + },
     121 + cursor: 'pointer'
     122 + }}>
     123 + <Typography sx={{fontSize: 10, paddingTop: '15px'}} variant="button" display="block">
     124 + Medium
     125 + </Typography>
     126 + <Typography sx={{fontSize: 42, marginTop: '-15px'}} variant="button" display="block" gutterBottom>
     127 + 86
     128 + </Typography>
     129 + </Box>
     130 + </Grid>
     131 + <Grid item xs={3}>
     132 + <Box sx={{
     133 + width: 150,
     134 + borderBottom: '.2rem solid #bcd5ff',
     135 + display: 'flex',
     136 + flexDirection: 'column',
     137 + justifyContent: 'center',
     138 + alignItems: "center",
     139 + color: '#fff',
     140 + height: 90,
     141 + minWidth: 40,
     142 + minHeight: 40,
     143 + display: 'flex',
     144 + backgroundColor: '#ff8000',
     145 + '&:hover': {
     146 + backgroundColor: '#ff8000',
     147 + opacity: [0.9, 0.8, 0.7],
     148 + },
     149 + cursor: 'pointer'
     150 + }}>
     151 + <Typography sx={{fontSize: 10, paddingTop: '15px'}} variant="button" display="block">
     152 + Low
     153 + </Typography>
     154 + <Typography sx={{fontSize: 42, marginTop: '-15px'}} variant="button" display="block" gutterBottom>
     155 + 129
     156 + </Typography>
     157 + </Box>
     158 + </Grid>
     159 + </Grid>
     160 + );
     161 +};
     162 + 
     163 +export function ReportTitle({title}) {
     164 + const [queryParameters] = useSearchParams()
     165 + 
     166 + return (
     167 + <div>
     168 + <Grid>
     169 + <Box sx={{
     170 + fontSize: 30,
     171 + color: "white",
     172 + paddingTop: 1,
     173 + display: 'flex',
     174 + }}>
     175 + {queryParameters.get("ip")}
     176 + {queryParameters.get("id")}
     177 + </Box>
     178 + </Grid>
     179 + <Grid>
     180 + <Typography sx={{ fontSize: 14, color: 'white' }} component="div">
     181 + {title}
     182 + </Typography>
     183 + <Divider />
     184 + </Grid>
     185 + </div>
     186 + );
     187 +};
     188 + 
     189 +export function HostReportOverview({title}) {
     190 + const [queryParameters] = useSearchParams()
     191 + 
     192 + return (
     193 + <div>
     194 + <Grid>
     195 + <Box sx={{
     196 + minWidth: 40,
     197 + height: 0,
     198 + fontSize: 30,
     199 + paddingTop: 2,
     200 + paddingLeft: 3,
     201 + paddingRight: 1,
     202 + display: 'flex',
     203 + }}>
     204 + <FontAwesomeIcon size="3x" icon={faWindows} />
     205 + <Box sx={{
     206 + paddingLeft: 30,
     207 + }} />
     208 + <HostFindingsDashboard />
     209 + </Box>
     210 + <Box sx={{
     211 + minWidth: 500,
     212 + minHeight: 40,
     213 + fontSize: 30,
     214 + paddingTop: 2,
     215 + paddingLeft: 15,
     216 + paddingRight: 1,
     217 + display: 'flex',
     218 + }}>
     219 + WIN2k8svrDC1
     220 + </Box>
     221 + <Box sx={{
     222 + height: 50,
     223 + minWidth: 40,
     224 + minHeight: 40,
     225 + paddingLeft: 15
     226 + }}>
     227 + Windows Server 2008 R2 Standard
     228 + </Box>
     229 + </Grid>
     230 + <Divider />
     231 + </div>
     232 + );
     233 +};
     234 + 
     235 +export function VulnReportOverview({title}) {
     236 + const [queryParameters] = useSearchParams()
     237 + 
     238 + const style = {
     239 + width: 150,
     240 + display: "inline-block",
     241 + marginRight: 20,
     242 + marginLeft: 20,
     243 + };
     244 + 
     245 + 
     246 + return (
     247 + <div>
     248 + <Grid>
     249 + <Box sx={{
     250 + minWidth: 40,
     251 + height: 0,
     252 + fontSize: 30,
     253 + paddingTop: 2,
     254 + paddingLeft: 3,
     255 + paddingRight: 1,
     256 + display: 'flex',
     257 + }}>
     258 + <Box style={style}>
     259 + <Progress.Circle
     260 + gapDegree={60}
     261 + strokeLinecap="square"
     262 + percent={80}
     263 + status="active"
     264 + strokeColor="red"
     265 + trailColor="green"
     266 + gapPosition="bottom"
     267 + strokeLinecap="butt"
     268 + strokeWidth={8}
     269 + showInfo={false}
     270 + />
     271 + </Box>
     272 + <Box sx={{
     273 + position: 'absolute',
     274 + minWidth: 0,
     275 + fontSize: 30,
     276 + paddingTop: 6,
     277 + paddingLeft: 8,
     278 + paddingRight: 1,
     279 + }}>
     280 + HIGH
     281 + </Box>
     282 + </Box>
     283 +
     284 + <Box sx={{
     285 + height: 50,
     286 + minWidth: 40,
     287 + minHeight: 150,
     288 + paddingLeft: 30
     289 + }}>
     290 + <h4>Sirius Threat Level 3</h4>
     291 + This vulnerability is rated as high severity. It is recommended that you take immediate action to remediate this vulnerability. An attacker with access to this vulnerability could exploit it to gain access to the system or network.
     292 + </Box>
     293 + </Grid>
     294 + <Divider />
     295 + </div>
     296 + );
     297 +};
  • ■ ■ ■ ■ ■ ■
    UI/src/sirius/components/VulnDetails.tsx
     1 +import React, { Component, useCallback } from 'react';
     2 +import {useHistory} from 'react-router-dom';
     3 +import {useNavigate} from 'react-router-dom';
     4 +import { Link } from 'react-router-dom';
     5 + 
     6 +import { Container } from "@mui/material";
     7 +import Paper from '@mui/material/Paper';
     8 +import Divider from '@mui/material/Divider';
     9 +import Card from '@mui/material/Card';
     10 +import Badge from '@mui/material/Badge';
     11 +import CardActions from '@mui/material/CardActions';
     12 +import CardContent from '@mui/material/CardContent';
     13 +import Typography from '@mui/material/Typography';
     14 +import Table from '@mui/material/Table';
     15 +import TableBody from '@mui/material/TableBody';
     16 +import TableCell from '@mui/material/TableCell';
     17 +import TableContainer from '@mui/material/TableContainer';
     18 +import TableHead from '@mui/material/TableHead';
     19 +import TableRow from '@mui/material/TableRow';
     20 +import Collapse from '@mui/material/Collapse';
     21 +import IconButton from '@mui/material/IconButton';
     22 +import Box from '@mui/material/Box';
     23 + 
     24 +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
     25 +import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';
     26 +import AddBox from '@mui/icons-material/AddBox';
     27 +import IndeterminateCheckBoxIcon from '@mui/icons-material/IndeterminateCheckBox';
     28 +import UploadFileRoundedIcon from '@mui/icons-material/UploadFileRounded';
     29 + 
     30 +import { createMuiTheme } from 'material-ui/styles';
     31 + 
     32 +class VulnDetails extends React.Component {
     33 + constructor(props) {
     34 + super(props);
     35 +
     36 + this.state = {
     37 + open: false,
     38 + setOpen: false,
     39 + };
     40 + this.props.vulnList.map((row) => console.log(row));
     41 + }
     42 + 
     43 + render() {
     44 + return (
     45 + <div>
     46 + {this.props.vulnList.map((row) => (
     47 + <Card sx={{marginTop: -2, paddingLeft: 3}} key={row.CVEDataMeta.ID}>
     48 + 
     49 + <Table sx={{maxWidth: '80%'}} aria-label="collapsible table">
     50 + <TableRow>
     51 + <TableCell>
     52 + Summary
     53 + </TableCell>
     54 + <TableCell align="left">
     55 + {row.Description.description_data[0].value}
     56 + </TableCell>
     57 + </TableRow>
     58 + <TableRow>
     59 + <TableCell>
     60 + CVE ID
     61 + </TableCell>
     62 + <TableCell align="left">
     63 + <a href={"https://nvd.nist.gov/vuln/detail/" + row.CVEDataMeta.ID}>{row.CVEDataMeta.ID}</a>
     64 + </TableCell>
     65 + </TableRow>
     66 + <TableRow>
     67 + <TableCell>
     68 + CVSSv3
     69 + </TableCell>
     70 + <TableCell align="left">
     71 + {row.CVSSV3.baseScore}
     72 + </TableCell>
     73 + </TableRow>
     74 + <TableRow>
     75 + <TableCell>
     76 + Severity
     77 + </TableCell>
     78 + <TableCell align="left">
     79 + {row.CVSSV3.baseSeverity}
     80 + </TableCell>
     81 + </TableRow>
     82 + </Table>
     83 + 
     84 + <br />
     85 + <h6>References</h6>
     86 + {row.References.map((ref, i) => (
     87 + <div key={i}>
     88 + <li>
     89 + {ref}
     90 + </li>
     91 + </div>
     92 + ))}
     93 + <Divider sx={{marginTop: 2, marginBottom: 2}} />
     94 + 
     95 + </Card>
     96 + ))}
     97 + </div>
     98 + );
     99 + }
     100 +}
     101 +export default VulnDetails;
  • ■ ■ ■ ■ ■ ■
    UI/src/sirius/components/VulnReport.tsx
     1 +import * as React from 'react';
     2 +import { Card, CardContent, CardHeader, Paper } from "@mui/material";
     3 +import { Container } from "@mui/material";
     4 +import Tabs from '@mui/material/Tabs';
     5 +import Tab from '@mui/material/Tab';
     6 +import Typography from '@mui/material/Typography';
     7 +import Box from '@mui/material/Box';
     8 +import LanIcon from '@mui/icons-material/Lan';
     9 +import HealingIcon from '@mui/icons-material/Healing';
     10 +import AnalyticsIcon from '@mui/icons-material/Analytics';
     11 + 
     12 +import VulnDetails from "./VulnDetails";
     13 + 
     14 +interface TabPanelProps {
     15 + children?: React.ReactNode;
     16 + index: number;
     17 + value: number;
     18 + }
     19 + 
     20 +export default function VulnReportTabs() {
     21 + const [value, setValue] = React.useState(0);
     22 + const [vulnList, setVulnList] = React.useState([]);
     23 + 
     24 + React.useEffect(() => {
     25 + //Get the list of vulnerabilities
     26 + //Make API post request to get the list of vulnerabilities for the ip parameter
     27 + const requestOptions = {
     28 + method: 'POST',
     29 + headers: { 'Content-Type': 'application/json' },
     30 + body: JSON.stringify({ CVE: ['CVE-2022-32168'] })
     31 + };
     32 + fetch('http://localhost:8080/api/svdb/get/finding', requestOptions)
     33 + .then((response) => response.json())
     34 + .then((data) => {
     35 + setVulnList(data);
     36 + });
     37 + }, [])
     38 + 
     39 + 
     40 + const handleChange = (event: React.SyntheticEvent, newValue: number) => {
     41 + setValue(newValue);
     42 + };
     43 + 
     44 + return (
     45 + <div sx={{marginTop: 0, width: '100%'}}>
     46 + <Card>
     47 + {/* Navigator Tab Headers */}
     48 + 
     49 + <CardContent>
     50 + <HostTabs value={value} handleChange={handleChange} />
     51 + </CardContent>
     52 + 
     53 + {/* Navigator Tab Contents */}
     54 + {value == 0 ?
     55 + <VulnDetails vulnList={vulnList}/>
     56 + : null}
     57 + </Card>
     58 + </div>
     59 + );
     60 +}
     61 + 
     62 + 
     63 +function HostTabs({value, handleChange}) {
     64 + return (
     65 + <Box>
     66 + <Box sx={{ borderBottom: 1, borderColor: 'divider' }}>
     67 + <Tabs value={value} onChange={handleChange} aria-label="">
     68 + <Tab label="Vulnerability Details" {...a11yProps(0)} />
     69 + <Tab label="Affected Systems" {...a11yProps(1)} />
     70 + <Tab label="Statistics" {...a11yProps(2)} />
     71 + </Tabs>
     72 + </Box>
     73 + <TabPanel value={value} index={0}>
     74 +
     75 + </TabPanel>
     76 + <TabPanel value={value} index={1}>
     77 + Item Two
     78 + </TabPanel>
     79 + <TabPanel value={value} index={2}>
     80 + Item Three
     81 + </TabPanel>
     82 + </Box>
     83 + );
     84 + }
     85 +
     86 + function TabPanel(props: TabPanelProps) {
     87 + const { children, value, index, ...other } = props;
     88 +
     89 + return (
     90 + <div>
     91 + {value === index && (
     92 + <Box>
     93 + {children}
     94 + </Box>
     95 + )}
     96 + </div>
     97 + );
     98 + }
     99 +
     100 + function a11yProps(index: number) {
     101 + return {
     102 + id: `simple-tab-${index}`,
     103 + 'aria-controls': `simple-tabpanel-${index}`,
     104 + };
     105 + }
  • ■ ■ ■ ■ ■ ■
    UI/src/sirius/components/VulnTable.tsx
     1 +import React, { Component, useCallback } from 'react';
     2 +import {useHistory} from 'react-router-dom';
     3 +import {useNavigate} from 'react-router-dom';
     4 +import { Link } from 'react-router-dom';
     5 + 
     6 +import Paper from '@mui/material/Paper';
     7 +import Card from '@mui/material/Card';
     8 +import Badge from '@mui/material/Badge';
     9 +import CardActions from '@mui/material/CardActions';
     10 +import CardContent from '@mui/material/CardContent';
     11 +import Typography from '@mui/material/Typography';
     12 +import Table from '@mui/material/Table';
     13 +import TableBody from '@mui/material/TableBody';
     14 +import TableCell from '@mui/material/TableCell';
     15 +import TableContainer from '@mui/material/TableContainer';
     16 +import TableHead from '@mui/material/TableHead';
     17 +import TableRow from '@mui/material/TableRow';
     18 +import Collapse from '@mui/material/Collapse';
     19 +import IconButton from '@mui/material/IconButton';
     20 +import Box from '@mui/material/Box';
     21 + 
     22 +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
     23 +import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';
     24 +import AddBox from '@mui/icons-material/AddBox';
     25 +import IndeterminateCheckBoxIcon from '@mui/icons-material/IndeterminateCheckBox';
     26 +import UploadFileRoundedIcon from '@mui/icons-material/UploadFileRounded';
     27 + 
     28 +import { createMuiTheme } from 'material-ui/styles';
     29 + 
     30 +class VulnTable extends React.Component {
     31 + constructor(props) {
     32 + super(props);
     33 +
     34 + this.state = {
     35 + open: false,
     36 + setOpen: false,
     37 + };
     38 + this.props.vulnList.map((row) => console.log(row));
     39 + }
     40 + 
     41 + render() {
     42 + return (
     43 + <div className="rightcard">
     44 + <TableContainer component={Paper}>
     45 + <Table aria-label="collapsible table">
     46 + <TableHead>
     47 + <TableRow>
     48 + <TableCell>Vulnerability</TableCell>
     49 + <TableCell align="left">Description</TableCell>
     50 + {this.props.allHosts ? <TableCell align="left">Affected Systems</TableCell> : null }
     51 + <TableCell align="center">Severity</TableCell>
     52 + <TableCell align="center">CVSSv3</TableCell>
     53 + </TableRow>
     54 + </TableHead>
     55 + <TableBody>
     56 + {this.props.vulnList.map((row) => (
     57 + <Row key={row.CVEDataMeta.ID} row={row} />
     58 + ))}
     59 + </TableBody>
     60 + </Table>
     61 + </TableContainer>
     62 + </div>
     63 + );
     64 + }
     65 +}
     66 +export default VulnTable;
     67 + 
     68 +function hostClick(row) {
     69 + console.log(row.ip);
     70 +}
     71 + 
     72 +{/* HostTable */}
     73 +function Row(props) {
     74 + const { row } = props;
     75 + const [open, setOpen] = React.useState(false);
     76 + const navigate = useNavigate();
     77 + const handleOnClick = useCallback((row) => navigate('/report/vulnerability?id=' + row.CVEDataMeta.ID, {replace: true}), [navigate]);
     78 + 
     79 + 
     80 + return (
     81 + <>
     82 + <TableRow sx={{ '&:last-child td, &:last-child th': { border: 0 } }} onClick={() => handleOnClick(row)} sx={{ '& > *': { borderBottom: 'unset' } }}>
     83 + <TableCell width="20%" component="th" scope="row">
     84 + {row.CVEDataMeta.ID}
     85 + </TableCell>
     86 + <TableCell width="65%" align="left">
     87 + <Box sx={{ textOverflow: 'ellipsis' }}>
     88 + {row.Description.description_data[0].value.slice(0,75)}...
     89 + </Box>
     90 + </TableCell>
     91 + {row.AffectedHosts ? <TableCell width="5%" align="left">{row.AffectedHosts.length}</TableCell> : null}
     92 +
     93 + <TableCell width="5%" align="center">{row.CVSSV3.baseSeverity}</TableCell>
     94 + <TableCell width="5%" align="center">{row.CVSSV3.baseScore}</TableCell>
     95 + </TableRow>
     96 + </>
     97 + );
     98 +}
  • ■ ■ ■ ■ ■ ■
    UI/src/sirius/containers/InventoryHost.tsx
     1 +import React, { Component, useCallback } from 'react';
     2 +import {useHistory} from 'react-router-dom';
     3 +import {useNavigate} from 'react-router-dom';
     4 +import { Link } from 'react-router-dom';
     5 + 
     6 +import Paper from '@mui/material/Paper';
     7 +import Card from '@mui/material/Card';
     8 +import Badge from '@mui/material/Badge';
     9 +import CardActions from '@mui/material/CardActions';
     10 +import CardContent from '@mui/material/CardContent';
     11 +import Typography from '@mui/material/Typography';
     12 +import Table from '@mui/material/Table';
     13 +import TableBody from '@mui/material/TableBody';
     14 +import TableCell from '@mui/material/TableCell';
     15 +import TableContainer from '@mui/material/TableContainer';
     16 +import TableHead from '@mui/material/TableHead';
     17 +import TableRow from '@mui/material/TableRow';
     18 +import Collapse from '@mui/material/Collapse';
     19 +import IconButton from '@mui/material/IconButton';
     20 +import Box from '@mui/material/Box';
     21 + 
     22 +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
     23 +import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';
     24 +import AddBox from '@mui/icons-material/AddBox';
     25 +import IndeterminateCheckBoxIcon from '@mui/icons-material/IndeterminateCheckBox';
     26 +import UploadFileRoundedIcon from '@mui/icons-material/UploadFileRounded';
     27 + 
     28 +import { createMuiTheme } from 'material-ui/styles';
     29 + 
     30 +class InventoryHost extends React.Component {
     31 + constructor(props) {
     32 + super(props);
     33 +
     34 + this.state = {
     35 + open: false,
     36 + setOpen: false,
     37 + };
     38 + this.props.hostList.map((row) => console.log(row.os));
     39 + }
     40 + 
     41 + render() {
     42 + return (
     43 + <div className="rightcard">
     44 + <TableContainer component={Paper}>
     45 + <Table aria-label="collapsible table">
     46 + <TableHead>
     47 + <TableRow>
     48 + <TableCell>Host</TableCell>
     49 + <TableCell align="right">Name</TableCell>
     50 + <TableCell align="right">Operating System</TableCell>
     51 + <TableCell align="right">Version</TableCell>
     52 + <TableCell align="right">Issues</TableCell>
     53 + <TableCell align="right">Risk</TableCell>
     54 + </TableRow>
     55 + </TableHead>
     56 + <TableBody>
     57 + {this.props.hostList.map((row) => (
     58 + <Row key={row.ip} row={row} />
     59 + ))}
     60 + </TableBody>
     61 + </Table>
     62 + </TableContainer>
     63 + </div>
     64 + );
     65 + }
     66 +}
     67 +export default InventoryHost;
     68 + 
     69 +function hostClick(row) {
     70 + console.log(row.ip);
     71 +}
     72 + 
     73 +{/* HostTable */}
     74 +function Row(props) {
     75 + const { row } = props;
     76 + const [open, setOpen] = React.useState(false);
     77 + const navigate = useNavigate();
     78 + const handleOnClick = useCallback((row) => navigate('/report/host?ip=' + row.ip, {replace: true}), [navigate]);
     79 + 
     80 + 
     81 + return (
     82 + <>
     83 + {/* <HostTable /> */}
     84 +
     85 + <TableRow onClick={() => handleOnClick(row)} sx={{ '& > *': { borderBottom: 'unset' } }}>
     86 + <TableCell component="th" scope="row">
     87 + {row.ip}
     88 + </TableCell>
     89 + <TableCell align="right">{row.hostname}</TableCell>
     90 + <TableCell align="right">{row.os}</TableCell>
     91 + <TableCell align="right">{row.osversion}</TableCell>
     92 + <TableCell align="right">10</TableCell>
     93 + <TableCell align="right">3</TableCell>
     94 + </TableRow>
     95 +
     96 + </>
     97 + );
     98 +}
     99 + 
     100 + 
     101 + 
  • ■ ■ ■ ■ ■ ■
    UI/src/sirius/containers/Scanner.tsx
     1 +import React, { Component, useCallback } from 'react';
     2 +import {useHistory} from 'react-router-dom';
     3 +import {useNavigate} from 'react-router-dom';
     4 +import { Link } from 'react-router-dom';
     5 + 
     6 +import Card from '@mui/material/Card';
     7 +import Button from '@mui/material/Button';
     8 +import TextField from '@mui/material/TextField';
     9 +import Box from '@mui/material/Box';
     10 + 
     11 +import { createMuiTheme } from 'material-ui/styles';
     12 + 
     13 +export default function Scanner() {
     14 + const [scanResults, setScanResults] = React.useState({Targets: []});
     15 + const [target, setTarget] = React.useState("");
     16 + 
     17 + function executeScan() {
     18 + StartScan(target, setScanResults);
     19 + }
     20 + 
     21 + return (
     22 + <>
     23 + <Card sx={{paddingLeft: 3, paddingBottom: 5}}>
     24 + <TextField
     25 + id="outlined-basic"
     26 + label="Target IP Address"
     27 + variant="outlined"
     28 + sx={{marginTop: 2, marginLeft: 2, width: 300}}
     29 + onChange={(e) => setTarget(e.target.value)}
     30 + />
     31 + <Button onClick={() => executeScan()} variant="contained" sx={{marginTop: 2, marginLeft: 2}}>Start Scan</Button>
     32 + 
     33 + {scanResults.Targets.length ? <ScanResults scanResults={scanResults} /> : null}
     34 + </Card>
     35 + </>
     36 + );
     37 +}
     38 + 
     39 +function StartScan(target: string, setScanResults: any) {
     40 + console.log("Starting Scan: " + target)
     41 + 
     42 + //Create list of targets based on input
     43 + if (target.split(",").length > 1) {
     44 + var targets = target.split(",");
     45 + } else {
     46 + var targets = [target];
     47 + }
     48 + 
     49 + const requestOptions = {
     50 + method: 'POST',
     51 + headers: { 'Content-Type': 'application/json' },
     52 + body: JSON.stringify({ targets: targets })
     53 + };
     54 + fetch('http://localhost:8080/api/scan/new', requestOptions)
     55 + .then((response) => response.json())
     56 + .then((data) => {
     57 + setScanResults(data);
     58 + });
     59 +}
     60 + 
     61 +export const ScanResults = (scanResults: {}) => {
     62 + return (
     63 + <Box>
     64 + <h1>Scan Results</h1>
     65 + {scanResults.scanResults.Targets.map((target: any) => (
     66 + <Box key={target}>
     67 + <h5>Target IP Address: {target}</h5>
     68 + </Box>
     69 + ))}
     70 + </Box>
     71 + );
     72 +};
  • ■ ■ ■ ■ ■ ■
    UI/src/sirius/containers/SiriusIssues.tsx
     1 +// @flow
     2 +import React, { Component } from 'react';
     3 +import { Link } from 'react-router-dom';
     4 + 
     5 +import Paper from '@mui/material/Paper';
     6 +import Card from '@mui/material/Card';
     7 +import Badge from '@mui/material/Badge';
     8 +import CardActions from '@mui/material/CardActions';
     9 +import CardContent from '@mui/material/CardContent';
     10 +import Typography from '@mui/material/Typography';
     11 +import Table from '@mui/material/Table';
     12 +import TableBody from '@mui/material/TableBody';
     13 +import TableCell from '@mui/material/TableCell';
     14 +import TableContainer from '@mui/material/TableContainer';
     15 +import TableHead from '@mui/material/TableHead';
     16 +import TableRow from '@mui/material/TableRow';
     17 +import Collapse from '@mui/material/Collapse';
     18 +import IconButton from '@mui/material/IconButton';
     19 +import Box from '@mui/material/Box';
     20 + 
     21 +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
     22 +import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';
     23 +import AddBox from '@mui/icons-material/AddBox';
     24 +import IndeterminateCheckBoxIcon from '@mui/icons-material/IndeterminateCheckBox';
     25 +import UploadFileRoundedIcon from '@mui/icons-material/UploadFileRounded';
     26 + 
     27 +import { createMuiTheme } from 'material-ui/styles';
     28 + 
     29 +import VulnTable from "../components/VulnTable";
     30 + 
     31 +export default function HostReportTabs() {
     32 + const [value, setValue] = React.useState(0);
     33 + const [vulnList, setVulnList] = React.useState([]);
     34 + 
     35 + React.useEffect(() => {
     36 + //Get the list of vulnerabilities
     37 + //Make API post request to get the list of vulnerabilities for the ip parameter
     38 + const requestOptions = {
     39 + method: 'POST',
     40 + headers: { 'Content-Type': 'application/json' },
     41 + body: JSON.stringify({ ip: '192.168.1.69' })
     42 + };
     43 + fetch('http://localhost:8080/api/svdb/report/vulnerability', requestOptions)
     44 + .then((response) => response.json())
     45 + .then((data) => {
     46 + setVulnList(data);
     47 + });
     48 + }, [])
     49 + 
     50 + 
     51 + const handleChange = (event: React.SyntheticEvent, newValue: number) => {
     52 + setValue(newValue);
     53 + };
     54 + 
     55 + return (
     56 + <div sx={{marginTop: 0, width: '100%'}}>
     57 + <Card>
     58 + <VulnTable allHosts="true" vulnList={vulnList}/>
     59 + </Card>
     60 + </div>
     61 + );
     62 +}
     63 + 
     64 +function createData(
     65 + cve: string,
     66 + catagory: string,
     67 + tags: string,
     68 + cvss: int,
     69 + srs: int,
     70 + description: string
     71 +) {
     72 + return {
     73 + cve,
     74 + catagory,
     75 + tags,
     76 + cvss,
     77 + srs,
     78 + description,
     79 + };
     80 +}
     81 + 
     82 +function Row(props: { row: ReturnType<typeof createData> }) {
     83 + const { row } = props;
     84 + const [open, setOpen] = React.useState(false);
     85 + 
     86 + return (
     87 + <>
     88 + <TableRow sx={{ '& > *': { borderBottom: 'unset' } }}>
     89 + <TableCell>
     90 + <IconButton
     91 + aria-label="expand row"
     92 + size="small"
     93 + onClick={() => setOpen(!open)}
     94 + >
     95 + {open ? <KeyboardArrowUpIcon /> : <KeyboardArrowDownIcon />}
     96 + </IconButton>
     97 + </TableCell>
     98 + <TableCell component="th" scope="row">
     99 + {row.CVEDataMeta.ID}
     100 + </TableCell>
     101 + <TableCell align="right">{row.CVSSV3.baseSeverity}</TableCell>
     102 + <TableCell align="right">{row.Tags}</TableCell>
     103 + <TableCell align="right">{row.CVSSV3.baseScore}</TableCell>
     104 + </TableRow>
     105 + <TableRow>
     106 + <TableCell style={{ paddingBottom: 0, paddingTop: 0 }} colSpan={6}>
     107 + <Collapse in={open} timeout="auto" unmountOnExit>
     108 + <Box sx={{ margin: 1 }}>
     109 + <Typography variant="h6" gutterBottom component="div">
     110 + Vulnerability Summary
     111 + </Typography>
     112 + <Typography variant="subtitle1" gutterBottom component="div">
     113 + {row.Description.description_data[0].value}
     114 + </Typography>
     115 + <Typography variant="h6" gutterBottom component="div">
     116 + Impact
     117 + </Typography>
     118 + <Typography variant="subtitle1" gutterBottom component="div">
     119 + <Table size="small" aria-label="purchases">
     120 + <TableHead>
     121 + <TableRow>
     122 + <TableCell>Confidentiality Impact</TableCell>
     123 + <TableCell>Integrity Impact</TableCell>
     124 + <TableCell>Availability Impact</TableCell>
     125 + </TableRow>
     126 + </TableHead>
     127 + <TableBody>
     128 + <TableRow>
     129 + <TableCell>High</TableCell>
     130 + <TableCell>High</TableCell>
     131 + <TableCell>High</TableCell>
     132 + </TableRow>
     133 + </TableBody>
     134 + </Table>
     135 + </Typography>
     136 + <Typography variant="h6" gutterBottom component="div">
     137 + References
     138 + </Typography>
     139 + <Typography variant="subtitle1" gutterBottom component="div">
     140 + {row.References[0]}
     141 + </Typography>
     142 + </Box>
     143 + </Collapse>
     144 + </TableCell>
     145 + </TableRow>
     146 + </>
     147 + );
     148 +}
  • ■ ■ ■ ■ ■ ■
    UI/src/sirius/test-data/vuln-list.json
     1 +{
     2 + "CVEDataMeta": {
     3 + "ID": "Loading Vulnerability List...",
     4 + "ASSIGNER": "[email protected]",
     5 + },
     6 + "CVSSV3": {
     7 + "baseScore": 0,
     8 + "baseSeverity": "",
     9 + },
     10 + "Description": {
     11 + "description_data": [
     12 + {
     13 + "value": "Loading...",
     14 + },
     15 + ]
     16 + },
     17 + "References": [
     18 + "Loading..."
     19 + ],
     20 + "cve": "CVE-2017-0145 - Remote Code Execution",
     21 + "catagory": "",
     22 + "tags": "CISA Worm RCE Wild",
     23 + "cvss": 9.8,
     24 + "srs": 10,
     25 + "description": "The SMBv1 server in Microsoft Windows Vista SP2; Windows Server 2008 SP2 and R2 SP1; Windows 7 SP1; Windows 8.1; Windows Server 2012 Gold and R2; Windows RT 8.1; and Windows 10 Gold, 1511, and 1607; and Windows Server 2016 allows remote attackers to execute arbitrary code via crafted packets, aka "Windows SMB Remote Code Execution Vulnerability." This vulnerability is different from those described in CVE-2017-0143, CVE-2017-0144, CVE-2017-0146, and CVE-2017-0148.",
     26 + "cia": "3,3,3",
     27 +}
  • ■ ■ ■ ■ ■ ■
    UI/src/vite-env.d.ts
     1 +/// <reference types="vite/client" />
     2 + 
  • ■ ■ ■ ■ ■ ■
    UI/tsconfig.json
     1 +{
     2 + "compilerOptions": {
     3 + "target": "ESNext",
     4 + "useDefineForClassFields": true,
     5 + "lib": ["DOM", "DOM.Iterable", "ESNext"],
     6 + "allowJs": false,
     7 + "skipLibCheck": true,
     8 + "esModuleInterop": false,
     9 + "allowSyntheticDefaultImports": true,
     10 + "strict": true,
     11 + "forceConsistentCasingInFileNames": true,
     12 + "module": "ESNext",
     13 + "moduleResolution": "Node",
     14 + "resolveJsonModule": true,
     15 + "isolatedModules": true,
     16 + "noEmit": true,
     17 + "jsx": "react-jsx"
     18 + },
     19 + "include": ["src"],
     20 + "references": [{ "path": "./tsconfig.node.json" }]
     21 +}
     22 + 
  • ■ ■ ■ ■ ■ ■
    UI/tsconfig.node.json
     1 +{
     2 + "compilerOptions": {
     3 + "composite": true,
     4 + "module": "ESNext",
     5 + "moduleResolution": "Node",
     6 + "allowSyntheticDefaultImports": true
     7 + },
     8 + "include": ["vite.config.ts"]
     9 +}
     10 + 
  • ■ ■ ■ ■ ■ ■
    UI/vite.config.ts
     1 +import { defineConfig } from 'vite'
     2 +import react from '@vitejs/plugin-react'
     3 + 
     4 +// https://vitejs.dev/config/
     5 +export default defineConfig({
     6 + plugins: [react()],
     7 +})
     8 + 
  • ■ ■ ■ ■ ■ ■
    UI/yarn.lock
     1 +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
     2 +# yarn lockfile v1
     3 + 
     4 + 
     5 +"@ampproject/remapping@^2.1.0":
     6 + "integrity" "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w=="
     7 + "resolved" "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz"
     8 + "version" "2.2.0"
     9 + dependencies:
     10 + "@jridgewell/gen-mapping" "^0.1.0"
     11 + "@jridgewell/trace-mapping" "^0.3.9"
     12 + 
     13 +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6":
     14 + "integrity" "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q=="
     15 + "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz"
     16 + "version" "7.18.6"
     17 + dependencies:
     18 + "@babel/highlight" "^7.18.6"
     19 + 
     20 +"@babel/compat-data@^7.20.5":
     21 + "integrity" "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg=="
     22 + "resolved" "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz"
     23 + "version" "7.20.10"
     24 + 
     25 +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.20.5":
     26 + "integrity" "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw=="
     27 + "resolved" "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz"
     28 + "version" "7.20.7"
     29 + dependencies:
     30 + "@ampproject/remapping" "^2.1.0"
     31 + "@babel/code-frame" "^7.18.6"
     32 + "@babel/generator" "^7.20.7"
     33 + "@babel/helper-compilation-targets" "^7.20.7"
     34 + "@babel/helper-module-transforms" "^7.20.7"
     35 + "@babel/helpers" "^7.20.7"
     36 + "@babel/parser" "^7.20.7"
     37 + "@babel/template" "^7.20.7"
     38 + "@babel/traverse" "^7.20.7"
     39 + "@babel/types" "^7.20.7"
     40 + "convert-source-map" "^1.7.0"
     41 + "debug" "^4.1.0"
     42 + "gensync" "^1.0.0-beta.2"
     43 + "json5" "^2.2.1"
     44 + "semver" "^6.3.0"
     45 + 
     46 +"@babel/generator@^7.20.7":
     47 + "integrity" "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw=="
     48 + "resolved" "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz"
     49 + "version" "7.20.7"
     50 + dependencies:
     51 + "@babel/types" "^7.20.7"
     52 + "@jridgewell/gen-mapping" "^0.3.2"
     53 + "jsesc" "^2.5.1"
     54 + 
     55 +"@babel/helper-compilation-targets@^7.20.7":
     56 + "integrity" "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ=="
     57 + "resolved" "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz"
     58 + "version" "7.20.7"
     59 + dependencies:
     60 + "@babel/compat-data" "^7.20.5"
     61 + "@babel/helper-validator-option" "^7.18.6"
     62 + "browserslist" "^4.21.3"
     63 + "lru-cache" "^5.1.1"
     64 + "semver" "^6.3.0"
     65 + 
     66 +"@babel/helper-environment-visitor@^7.18.9":
     67 + "integrity" "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg=="
     68 + "resolved" "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz"
     69 + "version" "7.18.9"
     70 + 
     71 +"@babel/helper-function-name@^7.19.0":
     72 + "integrity" "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w=="
     73 + "resolved" "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz"
     74 + "version" "7.19.0"
     75 + dependencies:
     76 + "@babel/template" "^7.18.10"
     77 + "@babel/types" "^7.19.0"
     78 + 
     79 +"@babel/helper-hoist-variables@^7.18.6":
     80 + "integrity" "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q=="
     81 + "resolved" "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz"
     82 + "version" "7.18.6"
     83 + dependencies:
     84 + "@babel/types" "^7.18.6"
     85 + 
     86 +"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6":
     87 + "integrity" "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA=="
     88 + "resolved" "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz"
     89 + "version" "7.18.6"
     90 + dependencies:
     91 + "@babel/types" "^7.18.6"
     92 + 
     93 +"@babel/helper-module-transforms@^7.20.7":
     94 + "integrity" "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg=="
     95 + "resolved" "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz"
     96 + "version" "7.20.11"
     97 + dependencies:
     98 + "@babel/helper-environment-visitor" "^7.18.9"
     99 + "@babel/helper-module-imports" "^7.18.6"
     100 + "@babel/helper-simple-access" "^7.20.2"
     101 + "@babel/helper-split-export-declaration" "^7.18.6"
     102 + "@babel/helper-validator-identifier" "^7.19.1"
     103 + "@babel/template" "^7.20.7"
     104 + "@babel/traverse" "^7.20.10"
     105 + "@babel/types" "^7.20.7"
     106 + 
     107 +"@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0":
     108 + "integrity" "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ=="
     109 + "resolved" "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz"
     110 + "version" "7.20.2"
     111 + 
     112 +"@babel/helper-simple-access@^7.20.2":
     113 + "integrity" "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA=="
     114 + "resolved" "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz"
     115 + "version" "7.20.2"
     116 + dependencies:
     117 + "@babel/types" "^7.20.2"
     118 + 
     119 +"@babel/helper-split-export-declaration@^7.18.6":
     120 + "integrity" "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA=="
     121 + "resolved" "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz"
     122 + "version" "7.18.6"
     123 + dependencies:
     124 + "@babel/types" "^7.18.6"
     125 + 
     126 +"@babel/helper-string-parser@^7.19.4":
     127 + "integrity" "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw=="
     128 + "resolved" "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz"
     129 + "version" "7.19.4"
     130 + 
     131 +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1":
     132 + "integrity" "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w=="
     133 + "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz"
     134 + "version" "7.19.1"
     135 + 
     136 +"@babel/helper-validator-option@^7.18.6":
     137 + "integrity" "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw=="
     138 + "resolved" "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz"
     139 + "version" "7.18.6"
     140 + 
     141 +"@babel/helpers@^7.20.7":
     142 + "integrity" "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA=="
     143 + "resolved" "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz"
     144 + "version" "7.20.7"
     145 + dependencies:
     146 + "@babel/template" "^7.20.7"
     147 + "@babel/traverse" "^7.20.7"
     148 + "@babel/types" "^7.20.7"
     149 + 
     150 +"@babel/highlight@^7.18.6":
     151 + "integrity" "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g=="
     152 + "resolved" "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz"
     153 + "version" "7.18.6"
     154 + dependencies:
     155 + "@babel/helper-validator-identifier" "^7.18.6"
     156 + "chalk" "^2.0.0"
     157 + "js-tokens" "^4.0.0"
     158 + 
     159 +"@babel/parser@^7.20.7":
     160 + "integrity" "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg=="
     161 + "resolved" "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz"
     162 + "version" "7.20.7"
     163 + 
     164 +"@babel/plugin-syntax-jsx@^7.17.12":
     165 + "integrity" "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q=="
     166 + "resolved" "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz"
     167 + "version" "7.18.6"
     168 + dependencies:
     169 + "@babel/helper-plugin-utils" "^7.18.6"
     170 + 
     171 +"@babel/plugin-transform-react-jsx-self@^7.18.6":
     172 + "integrity" "sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig=="
     173 + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz"
     174 + "version" "7.18.6"
     175 + dependencies:
     176 + "@babel/helper-plugin-utils" "^7.18.6"
     177 + 
     178 +"@babel/plugin-transform-react-jsx-source@^7.19.6":
     179 + "integrity" "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ=="
     180 + "resolved" "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz"
     181 + "version" "7.19.6"
     182 + dependencies:
     183 + "@babel/helper-plugin-utils" "^7.19.0"
     184 + 
     185 +"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.6", "@babel/runtime@^7.20.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.7":
     186 + "integrity" "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ=="
     187 + "resolved" "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz"
     188 + "version" "7.20.7"
     189 + dependencies:
     190 + "regenerator-runtime" "^0.13.11"
     191 + 
     192 +"@babel/template@^7.18.10", "@babel/template@^7.20.7":
     193 + "integrity" "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw=="
     194 + "resolved" "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz"
     195 + "version" "7.20.7"
     196 + dependencies:
     197 + "@babel/code-frame" "^7.18.6"
     198 + "@babel/parser" "^7.20.7"
     199 + "@babel/types" "^7.20.7"
     200 + 
     201 +"@babel/traverse@^7.20.10", "@babel/traverse@^7.20.7":
     202 + "integrity" "sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg=="
     203 + "resolved" "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.10.tgz"
     204 + "version" "7.20.10"
     205 + dependencies:
     206 + "@babel/code-frame" "^7.18.6"
     207 + "@babel/generator" "^7.20.7"
     208 + "@babel/helper-environment-visitor" "^7.18.9"
     209 + "@babel/helper-function-name" "^7.19.0"
     210 + "@babel/helper-hoist-variables" "^7.18.6"
     211 + "@babel/helper-split-export-declaration" "^7.18.6"
     212 + "@babel/parser" "^7.20.7"
     213 + "@babel/types" "^7.20.7"
     214 + "debug" "^4.1.0"
     215 + "globals" "^11.1.0"
     216 + 
     217 +"@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7":
     218 + "integrity" "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg=="
     219 + "resolved" "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz"
     220 + "version" "7.20.7"
     221 + dependencies:
     222 + "@babel/helper-string-parser" "^7.19.4"
     223 + "@babel/helper-validator-identifier" "^7.19.1"
     224 + "to-fast-properties" "^2.0.0"
     225 + 
     226 +"@emotion/babel-plugin@^11.10.5":
     227 + "integrity" "sha512-xE7/hyLHJac7D2Ve9dKroBBZqBT7WuPQmWcq7HSGb84sUuP4mlOWoB8dvVfD9yk5DHkU1m6RW7xSoDtnQHNQeA=="
     228 + "resolved" "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.5.tgz"
     229 + "version" "11.10.5"
     230 + dependencies:
     231 + "@babel/helper-module-imports" "^7.16.7"
     232 + "@babel/plugin-syntax-jsx" "^7.17.12"
     233 + "@babel/runtime" "^7.18.3"
     234 + "@emotion/hash" "^0.9.0"
     235 + "@emotion/memoize" "^0.8.0"
     236 + "@emotion/serialize" "^1.1.1"
     237 + "babel-plugin-macros" "^3.1.0"
     238 + "convert-source-map" "^1.5.0"
     239 + "escape-string-regexp" "^4.0.0"
     240 + "find-root" "^1.1.0"
     241 + "source-map" "^0.5.7"
     242 + "stylis" "4.1.3"
     243 + 
     244 +"@emotion/cache@^11.10.5":
     245 + "integrity" "sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA=="
     246 + "resolved" "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz"
     247 + "version" "11.10.5"
     248 + dependencies:
     249 + "@emotion/memoize" "^0.8.0"
     250 + "@emotion/sheet" "^1.2.1"
     251 + "@emotion/utils" "^1.2.0"
     252 + "@emotion/weak-memoize" "^0.3.0"
     253 + "stylis" "4.1.3"
     254 + 
     255 +"@emotion/hash@^0.9.0":
     256 + "integrity" "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ=="
     257 + "resolved" "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz"
     258 + "version" "0.9.0"
     259 + 
     260 +"@emotion/is-prop-valid@^1.2.0":
     261 + "integrity" "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg=="
     262 + "resolved" "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz"
     263 + "version" "1.2.0"
     264 + dependencies:
     265 + "@emotion/memoize" "^0.8.0"
     266 + 
     267 +"@emotion/memoize@^0.8.0":
     268 + "integrity" "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA=="
     269 + "resolved" "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz"
     270 + "version" "0.8.0"
     271 + 
     272 +"@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0":
     273 + "integrity" "sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A=="
     274 + "resolved" "https://registry.npmjs.org/@emotion/react/-/react-11.10.5.tgz"
     275 + "version" "11.10.5"
     276 + dependencies:
     277 + "@babel/runtime" "^7.18.3"
     278 + "@emotion/babel-plugin" "^11.10.5"
     279 + "@emotion/cache" "^11.10.5"
     280 + "@emotion/serialize" "^1.1.1"
     281 + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0"
     282 + "@emotion/utils" "^1.2.0"
     283 + "@emotion/weak-memoize" "^0.3.0"
     284 + "hoist-non-react-statics" "^3.3.1"
     285 + 
     286 +"@emotion/serialize@^1.1.1":
     287 + "integrity" "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA=="
     288 + "resolved" "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz"
     289 + "version" "1.1.1"
     290 + dependencies:
     291 + "@emotion/hash" "^0.9.0"
     292 + "@emotion/memoize" "^0.8.0"
     293 + "@emotion/unitless" "^0.8.0"
     294 + "@emotion/utils" "^1.2.0"
     295 + "csstype" "^3.0.2"
     296 + 
     297 +"@emotion/sheet@^1.2.1":
     298 + "integrity" "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA=="
     299 + "resolved" "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz"
     300 + "version" "1.2.1"
     301 + 
     302 +"@emotion/styled@^11.3.0":
     303 + "integrity" "sha512-8EP6dD7dMkdku2foLoruPCNkRevzdcBaY6q0l0OsbyJK+x8D9HWjX27ARiSIKNF634hY9Zdoedh8bJCiva8yZw=="
     304 + "resolved" "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.5.tgz"
     305 + "version" "11.10.5"
     306 + dependencies:
     307 + "@babel/runtime" "^7.18.3"
     308 + "@emotion/babel-plugin" "^11.10.5"
     309 + "@emotion/is-prop-valid" "^1.2.0"
     310 + "@emotion/serialize" "^1.1.1"
     311 + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0"
     312 + "@emotion/utils" "^1.2.0"
     313 + 
     314 +"@emotion/unitless@^0.8.0":
     315 + "integrity" "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw=="
     316 + "resolved" "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz"
     317 + "version" "0.8.0"
     318 + 
     319 +"@emotion/use-insertion-effect-with-fallbacks@^1.0.0":
     320 + "integrity" "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A=="
     321 + "resolved" "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz"
     322 + "version" "1.0.0"
     323 + 
     324 +"@emotion/utils@^1.2.0":
     325 + "integrity" "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw=="
     326 + "resolved" "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz"
     327 + "version" "1.2.0"
     328 + 
     329 +"@emotion/weak-memoize@^0.3.0":
     330 + "integrity" "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg=="
     331 + "resolved" "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz"
     332 + "version" "0.3.0"
     333 + 
     334 +"@esbuild/[email protected]":
     335 + "integrity" "sha512-ogrVuNi2URocrr3Ps20f075EMm9V7IeenOi9FRj4qdbT6mQlwLuP4l90PW2iBrKERx0oRkcZprEUNsz/3xd7ww=="
     336 + "resolved" "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.13.tgz"
     337 + "version" "0.16.13"
     338 + 
     339 +"@fortawesome/[email protected]":
     340 + "integrity" "sha512-Sz07mnQrTekFWLz5BMjOzHl/+NooTdW8F8kDQxjWwbpOJcnoSg4vUDng8d/WR1wOxM0O+CY9Zw0nR054riNYtQ=="
     341 + "resolved" "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.1.tgz"
     342 + "version" "6.2.1"
     343 + 
     344 +"@fortawesome/fontawesome-svg-core@^6.2.1", "@fortawesome/fontawesome-svg-core@~1 || ~6":
     345 + "integrity" "sha512-HELwwbCz6C1XEcjzyT1Jugmz2NNklMrSPjZOWMlc+ZsHIVk+XOvOXLGGQtFBwSyqfJDNgRq4xBCwWOaZ/d9DEA=="
     346 + "resolved" "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.1.tgz"
     347 + "version" "6.2.1"
     348 + dependencies:
     349 + "@fortawesome/fontawesome-common-types" "6.2.1"
     350 + 
     351 +"@fortawesome/free-brands-svg-icons@^6.2.1":
     352 + "integrity" "sha512-L8l4MfdHPmZlJ72PvzdfwOwbwcCAL0vx48tJRnI6u1PJXh+j2f3yDoKyQgO3qjEsgD5Fr2tQV/cPP8F/k6aUig=="
     353 + "resolved" "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.2.1.tgz"
     354 + "version" "6.2.1"
     355 + dependencies:
     356 + "@fortawesome/fontawesome-common-types" "6.2.1"
     357 + 
     358 +"@fortawesome/free-solid-svg-icons@^6.2.1":
     359 + "integrity" "sha512-oKuqrP5jbfEPJWTij4sM+/RvgX+RMFwx3QZCZcK9PrBDgxC35zuc7AOFsyMjMd/PIFPeB2JxyqDr5zs/DZFPPw=="
     360 + "resolved" "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.1.tgz"
     361 + "version" "6.2.1"
     362 + dependencies:
     363 + "@fortawesome/fontawesome-common-types" "6.2.1"
     364 + 
     365 +"@fortawesome/react-fontawesome@^0.2.0":
     366 + "integrity" "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw=="
     367 + "resolved" "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz"
     368 + "version" "0.2.0"
     369 + dependencies:
     370 + "prop-types" "^15.8.1"
     371 + 
     372 +"@jridgewell/gen-mapping@^0.1.0":
     373 + "integrity" "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w=="
     374 + "resolved" "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz"
     375 + "version" "0.1.1"
     376 + dependencies:
     377 + "@jridgewell/set-array" "^1.0.0"
     378 + "@jridgewell/sourcemap-codec" "^1.4.10"
     379 + 
     380 +"@jridgewell/gen-mapping@^0.3.2":
     381 + "integrity" "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A=="
     382 + "resolved" "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz"
     383 + "version" "0.3.2"
     384 + dependencies:
     385 + "@jridgewell/set-array" "^1.0.1"
     386 + "@jridgewell/sourcemap-codec" "^1.4.10"
     387 + "@jridgewell/trace-mapping" "^0.3.9"
     388 + 
     389 +"@jridgewell/[email protected]":
     390 + "integrity" "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="
     391 + "resolved" "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz"
     392 + "version" "3.1.0"
     393 + 
     394 +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1":
     395 + "integrity" "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw=="
     396 + "resolved" "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz"
     397 + "version" "1.1.2"
     398 + 
     399 +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/[email protected]":
     400 + "integrity" "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
     401 + "resolved" "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz"
     402 + "version" "1.4.14"
     403 + 
     404 +"@jridgewell/trace-mapping@^0.3.9":
     405 + "integrity" "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g=="
     406 + "resolved" "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz"
     407 + "version" "0.3.17"
     408 + dependencies:
     409 + "@jridgewell/resolve-uri" "3.1.0"
     410 + "@jridgewell/sourcemap-codec" "1.4.14"
     411 + 
     412 +"@mui/[email protected]":
     413 + "integrity" "sha512-KPwb1iYPXsV/P8uu0SNQrj7v7YU6wdN4Eccc2lZQyRDW+f6PJYjHBuFUTYKc408B98Jvs1XbC/z5MN45a2DWrQ=="
     414 + "resolved" "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.112.tgz"
     415 + "version" "5.0.0-alpha.112"
     416 + dependencies:
     417 + "@babel/runtime" "^7.20.7"
     418 + "@emotion/is-prop-valid" "^1.2.0"
     419 + "@mui/types" "^7.2.3"
     420 + "@mui/utils" "^5.11.2"
     421 + "@popperjs/core" "^2.11.6"
     422 + "clsx" "^1.2.1"
     423 + "prop-types" "^15.8.1"
     424 + "react-is" "^18.2.0"
     425 + 
     426 +"@mui/core-downloads-tracker@^5.11.3":
     427 + "integrity" "sha512-Bgb6//KtxY7IC7M5Pa5RKFX1wttc213mqpKqydnz3wn4BGDXfA5c0vf5nTu5zqsJeB4T3ysAJTRJhQ/E1GsZDQ=="
     428 + "resolved" "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.11.3.tgz"
     429 + "version" "5.11.3"
     430 + 
     431 +"@mui/icons-material@^5.0.1":
     432 + "integrity" "sha512-I2LaOKqO8a0xcLGtIozC9xoXjZAto5G5gh0FYUMAlbsIHNHIjn4Xrw9rvjY20vZonyiGrZNMAlAXYkY6JvhF6A=="
     433 + "resolved" "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.11.0.tgz"
     434 + "version" "5.11.0"
     435 + dependencies:
     436 + "@babel/runtime" "^7.20.6"
     437 + 
     438 +"@mui/material@^5.0.0", "@mui/material@^5.0.2":
     439 + "integrity" "sha512-Oz+rMFiMtxzzDLUxKyyj4mSxF9ShmsBoJ9qvglXCYqklgSrEl1R/Z4hfPZ+2pWd5CriO8U/0CFHr4DksrlTiCw=="
     440 + "resolved" "https://registry.npmjs.org/@mui/material/-/material-5.11.3.tgz"
     441 + "version" "5.11.3"
     442 + dependencies:
     443 + "@babel/runtime" "^7.20.7"
     444 + "@mui/base" "5.0.0-alpha.112"
     445 + "@mui/core-downloads-tracker" "^5.11.3"
     446 + "@mui/system" "^5.11.2"
     447 + "@mui/types" "^7.2.3"
     448 + "@mui/utils" "^5.11.2"
     449 + "@types/react-transition-group" "^4.4.5"
     450 + "clsx" "^1.2.1"
     451 + "csstype" "^3.1.1"
     452 + "prop-types" "^15.8.1"
     453 + "react-is" "^18.2.0"
     454 + "react-transition-group" "^4.4.5"
     455 + 
     456 +"@mui/private-theming@^5.11.2":
     457 + "integrity" "sha512-qZwMaqRFPwlYmqwVKblKBGKtIjJRAj3nsvX93pOmatsXyorW7N/0IPE/swPgz1VwChXhHO75DwBEx8tB+aRMNg=="
     458 + "resolved" "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.11.2.tgz"
     459 + "version" "5.11.2"
     460 + dependencies:
     461 + "@babel/runtime" "^7.20.7"
     462 + "@mui/utils" "^5.11.2"
     463 + "prop-types" "^15.8.1"
     464 + 
     465 +"@mui/styled-engine@^5.11.0":
     466 + "integrity" "sha512-AF06K60Zc58qf0f7X+Y/QjaHaZq16znliLnGc9iVrV/+s8Ln/FCoeNuFvhlCbZZQ5WQcJvcy59zp0nXrklGGPQ=="
     467 + "resolved" "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.11.0.tgz"
     468 + "version" "5.11.0"
     469 + dependencies:
     470 + "@babel/runtime" "^7.20.6"
     471 + "@emotion/cache" "^11.10.5"
     472 + "csstype" "^3.1.1"
     473 + "prop-types" "^15.8.1"
     474 + 
     475 +"@mui/system@^5.11.2":
     476 + "integrity" "sha512-PPkYhrcP2MkhscX6SauIl0wPgra0w1LGPtll+hIKc2Z2JbGRSrUCFif93kxejB7I1cAoCay9jWW4mnNhsOqF/g=="
     477 + "resolved" "https://registry.npmjs.org/@mui/system/-/system-5.11.2.tgz"
     478 + "version" "5.11.2"
     479 + dependencies:
     480 + "@babel/runtime" "^7.20.7"
     481 + "@mui/private-theming" "^5.11.2"
     482 + "@mui/styled-engine" "^5.11.0"
     483 + "@mui/types" "^7.2.3"
     484 + "@mui/utils" "^5.11.2"
     485 + "clsx" "^1.2.1"
     486 + "csstype" "^3.1.1"
     487 + "prop-types" "^15.8.1"
     488 + 
     489 +"@mui/types@^7.2.3":
     490 + "integrity" "sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw=="
     491 + "resolved" "https://registry.npmjs.org/@mui/types/-/types-7.2.3.tgz"
     492 + "version" "7.2.3"
     493 + 
     494 +"@mui/utils@^5.11.2":
     495 + "integrity" "sha512-AyizuHHlGdAtH5hOOXBW3kriuIwUIKUIgg0P7LzMvzf6jPhoQbENYqY6zJqfoZ7fAWMNNYT8mgN5EftNGzwE2w=="
     496 + "resolved" "https://registry.npmjs.org/@mui/utils/-/utils-5.11.2.tgz"
     497 + "version" "5.11.2"
     498 + dependencies:
     499 + "@babel/runtime" "^7.20.7"
     500 + "@types/prop-types" "^15.7.5"
     501 + "@types/react-is" "^16.7.1 || ^17.0.0"
     502 + "prop-types" "^15.8.1"
     503 + "react-is" "^18.2.0"
     504 + 
     505 +"@popperjs/core@^2.11.6":
     506 + "integrity" "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw=="
     507 + "resolved" "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz"
     508 + "version" "2.11.6"
     509 + 
     510 +"@remix-run/[email protected]":
     511 + "integrity" "sha512-XiY0IsyHR+DXYS5vBxpoBe/8veTeoRpMHP+vDosLZxL5bnpetzI0igkxkLZS235ldLzyfkxF+2divEwWHP3vMQ=="
     512 + "resolved" "https://registry.npmjs.org/@remix-run/router/-/router-1.2.1.tgz"
     513 + "version" "1.2.1"
     514 + 
     515 +"@types/parse-json@^4.0.0":
     516 + "integrity" "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
     517 + "resolved" "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz"
     518 + "version" "4.0.0"
     519 + 
     520 +"@types/prop-types@*", "@types/prop-types@^15.7.5":
     521 + "integrity" "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w=="
     522 + "resolved" "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz"
     523 + "version" "15.7.5"
     524 + 
     525 +"@types/react-dom@^18.0.9":
     526 + "integrity" "sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg=="
     527 + "resolved" "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.10.tgz"
     528 + "version" "18.0.10"
     529 + dependencies:
     530 + "@types/react" "*"
     531 + 
     532 +"@types/react-is@^16.7.1 || ^17.0.0":
     533 + "integrity" "sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw=="
     534 + "resolved" "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz"
     535 + "version" "17.0.3"
     536 + dependencies:
     537 + "@types/react" "*"
     538 + 
     539 +"@types/react-transition-group@^4.4.5":
     540 + "integrity" "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA=="
     541 + "resolved" "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz"
     542 + "version" "4.4.5"
     543 + dependencies:
     544 + "@types/react" "*"
     545 + 
     546 +"@types/react@*", "@types/react@^17.0.0 || ^18.0.0", "@types/react@^18.0.26":
     547 + "integrity" "sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug=="
     548 + "resolved" "https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz"
     549 + "version" "18.0.26"
     550 + dependencies:
     551 + "@types/prop-types" "*"
     552 + "@types/scheduler" "*"
     553 + "csstype" "^3.0.2"
     554 + 
     555 +"@types/scheduler@*":
     556 + "integrity" "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
     557 + "resolved" "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz"
     558 + "version" "0.16.2"
     559 + 
     560 +"@vitejs/plugin-react@^3.0.0":
     561 + "integrity" "sha512-1mvyPc0xYW5G8CHQvJIJXLoMjl5Ct3q2g5Y2s6Ccfgwm45y48LBvsla7az+GkkAtYikWQ4Lxqcsq5RHLcZgtNQ=="
     562 + "resolved" "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.0.0.tgz"
     563 + "version" "3.0.0"
     564 + dependencies:
     565 + "@babel/core" "^7.20.5"
     566 + "@babel/plugin-transform-react-jsx-self" "^7.18.6"
     567 + "@babel/plugin-transform-react-jsx-source" "^7.19.6"
     568 + "magic-string" "^0.27.0"
     569 + "react-refresh" "^0.14.0"
     570 + 
     571 +"ansi-styles@^3.2.1":
     572 + "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="
     573 + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
     574 + "version" "3.2.1"
     575 + dependencies:
     576 + "color-convert" "^1.9.0"
     577 + 
     578 +"array.prototype.foreach@^1.0.0":
     579 + "integrity" "sha512-OYqqGR/56CopyheXNwdlJvFtbSvf2Z9RGvL20X6GvAuKePJ76L/D46BqZn3bITd36QA2Ti7Iy0UwVJaD/YwXZA=="
     580 + "resolved" "https://registry.npmjs.org/array.prototype.foreach/-/array.prototype.foreach-1.0.4.tgz"
     581 + "version" "1.0.4"
     582 + dependencies:
     583 + "call-bind" "^1.0.2"
     584 + "define-properties" "^1.1.4"
     585 + "es-abstract" "^1.20.4"
     586 + "es-array-method-boxes-properly" "^1.0.0"
     587 + "get-intrinsic" "^1.1.3"
     588 + "is-string" "^1.0.7"
     589 + 
     590 +"attr-accept@^2.2.2":
     591 + "integrity" "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg=="
     592 + "resolved" "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz"
     593 + "version" "2.2.2"
     594 + 
     595 +"autosuggest-highlight@^3.1.1":
     596 + "integrity" "sha512-j6RETBD2xYnrVcoV1S5R4t3WxOlWZKyDQjkwnggDPSjF5L4jV98ZltBpvPvbkM1HtoSe5o+bNrTHyjPbieGeYA=="
     597 + "resolved" "https://registry.npmjs.org/autosuggest-highlight/-/autosuggest-highlight-3.3.4.tgz"
     598 + "version" "3.3.4"
     599 + dependencies:
     600 + "remove-accents" "^0.4.2"
     601 + 
     602 +"babel-plugin-macros@^3.1.0":
     603 + "integrity" "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg=="
     604 + "resolved" "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz"
     605 + "version" "3.1.0"
     606 + dependencies:
     607 + "@babel/runtime" "^7.12.5"
     608 + "cosmiconfig" "^7.0.0"
     609 + "resolve" "^1.19.0"
     610 + 
     611 +"balanced-match@^1.0.0":
     612 + "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
     613 + "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
     614 + "version" "1.0.2"
     615 + 
     616 +"big-integer@^1.6.16":
     617 + "integrity" "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg=="
     618 + "resolved" "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz"
     619 + "version" "1.6.51"
     620 + 
     621 +"brace-expansion@^1.1.7":
     622 + "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="
     623 + "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"
     624 + "version" "1.1.11"
     625 + dependencies:
     626 + "balanced-match" "^1.0.0"
     627 + "concat-map" "0.0.1"
     628 + 
     629 +"broadcast-channel@^3.4.1":
     630 + "integrity" "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg=="
     631 + "resolved" "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz"
     632 + "version" "3.7.0"
     633 + dependencies:
     634 + "@babel/runtime" "^7.7.2"
     635 + "detect-node" "^2.1.0"
     636 + "js-sha3" "0.8.0"
     637 + "microseconds" "0.2.0"
     638 + "nano-time" "1.0.0"
     639 + "oblivious-set" "1.0.0"
     640 + "rimraf" "3.0.2"
     641 + "unload" "2.2.0"
     642 + 
     643 +"browserslist@^4.21.3", "browserslist@>= 4.21.0":
     644 + "integrity" "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw=="
     645 + "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz"
     646 + "version" "4.21.4"
     647 + dependencies:
     648 + "caniuse-lite" "^1.0.30001400"
     649 + "electron-to-chromium" "^1.4.251"
     650 + "node-releases" "^2.0.6"
     651 + "update-browserslist-db" "^1.0.9"
     652 + 
     653 +"call-bind@^1.0.0", "call-bind@^1.0.2":
     654 + "integrity" "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA=="
     655 + "resolved" "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz"
     656 + "version" "1.0.2"
     657 + dependencies:
     658 + "function-bind" "^1.1.1"
     659 + "get-intrinsic" "^1.0.2"
     660 + 
     661 +"callsites@^3.0.0":
     662 + "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
     663 + "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
     664 + "version" "3.1.0"
     665 + 
     666 +"caniuse-lite@^1.0.30001400":
     667 + "integrity" "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg=="
     668 + "resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz"
     669 + "version" "1.0.30001441"
     670 + 
     671 +"chalk@^2.0.0":
     672 + "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="
     673 + "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
     674 + "version" "2.4.2"
     675 + dependencies:
     676 + "ansi-styles" "^3.2.1"
     677 + "escape-string-regexp" "^1.0.5"
     678 + "supports-color" "^5.3.0"
     679 + 
     680 +"clsx@^1.1.1", "clsx@^1.2.1":
     681 + "integrity" "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg=="
     682 + "resolved" "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz"
     683 + "version" "1.2.1"
     684 + 
     685 +"color-convert@^1.9.0":
     686 + "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="
     687 + "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"
     688 + "version" "1.9.3"
     689 + dependencies:
     690 + "color-name" "1.1.3"
     691 + 
     692 +"[email protected]":
     693 + "integrity" "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
     694 + "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
     695 + "version" "1.1.3"
     696 + 
     697 +"[email protected]":
     698 + "integrity" "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
     699 + "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
     700 + "version" "0.0.1"
     701 + 
     702 +"convert-source-map@^1.5.0", "convert-source-map@^1.7.0":
     703 + "integrity" "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
     704 + "resolved" "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz"
     705 + "version" "1.9.0"
     706 + 
     707 +"cosmiconfig@^7.0.0":
     708 + "integrity" "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA=="
     709 + "resolved" "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz"
     710 + "version" "7.1.0"
     711 + dependencies:
     712 + "@types/parse-json" "^4.0.0"
     713 + "import-fresh" "^3.2.1"
     714 + "parse-json" "^5.0.0"
     715 + "path-type" "^4.0.0"
     716 + "yaml" "^1.10.0"
     717 + 
     718 +"css-mediaquery@^0.1.2":
     719 + "integrity" "sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q=="
     720 + "resolved" "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz"
     721 + "version" "0.1.2"
     722 + 
     723 +"csstype@^3.0.2", "csstype@^3.1.1":
     724 + "integrity" "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw=="
     725 + "resolved" "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz"
     726 + "version" "3.1.1"
     727 + 
     728 +"date-fns@^2.19.0":
     729 + "integrity" "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA=="
     730 + "resolved" "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz"
     731 + "version" "2.29.3"
     732 + 
     733 +"debug@^4.1.0":
     734 + "integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="
     735 + "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"
     736 + "version" "4.3.4"
     737 + dependencies:
     738 + "ms" "2.1.2"
     739 + 
     740 +"decode-uri-component@^0.2.2":
     741 + "integrity" "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ=="
     742 + "resolved" "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz"
     743 + "version" "0.2.2"
     744 + 
     745 +"define-properties@^1.1.3", "define-properties@^1.1.4":
     746 + "integrity" "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA=="
     747 + "resolved" "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz"
     748 + "version" "1.1.4"
     749 + dependencies:
     750 + "has-property-descriptors" "^1.0.0"
     751 + "object-keys" "^1.1.1"
     752 + 
     753 +"detect-node@^2.0.4", "detect-node@^2.1.0":
     754 + "integrity" "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="
     755 + "resolved" "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz"
     756 + "version" "2.1.0"
     757 + 
     758 +"dom-helpers@^5.0.1":
     759 + "integrity" "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA=="
     760 + "resolved" "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz"
     761 + "version" "5.2.1"
     762 + dependencies:
     763 + "@babel/runtime" "^7.8.7"
     764 + "csstype" "^3.0.2"
     765 + 
     766 +"electron-to-chromium@^1.4.251":
     767 + "integrity" "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA=="
     768 + "resolved" "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz"
     769 + "version" "1.4.284"
     770 + 
     771 +"error-ex@^1.3.1":
     772 + "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="
     773 + "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz"
     774 + "version" "1.3.2"
     775 + dependencies:
     776 + "is-arrayish" "^0.2.1"
     777 + 
     778 +"es-abstract@^1.19.0", "es-abstract@^1.20.4":
     779 + "integrity" "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ=="
     780 + "resolved" "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz"
     781 + "version" "1.20.5"
     782 + dependencies:
     783 + "call-bind" "^1.0.2"
     784 + "es-to-primitive" "^1.2.1"
     785 + "function-bind" "^1.1.1"
     786 + "function.prototype.name" "^1.1.5"
     787 + "get-intrinsic" "^1.1.3"
     788 + "get-symbol-description" "^1.0.0"
     789 + "gopd" "^1.0.1"
     790 + "has" "^1.0.3"
     791 + "has-property-descriptors" "^1.0.0"
     792 + "has-symbols" "^1.0.3"
     793 + "internal-slot" "^1.0.3"
     794 + "is-callable" "^1.2.7"
     795 + "is-negative-zero" "^2.0.2"
     796 + "is-regex" "^1.1.4"
     797 + "is-shared-array-buffer" "^1.0.2"
     798 + "is-string" "^1.0.7"
     799 + "is-weakref" "^1.0.2"
     800 + "object-inspect" "^1.12.2"
     801 + "object-keys" "^1.1.1"
     802 + "object.assign" "^4.1.4"
     803 + "regexp.prototype.flags" "^1.4.3"
     804 + "safe-regex-test" "^1.0.0"
     805 + "string.prototype.trimend" "^1.0.6"
     806 + "string.prototype.trimstart" "^1.0.6"
     807 + "unbox-primitive" "^1.0.2"
     808 + 
     809 +"es-array-method-boxes-properly@^1.0.0":
     810 + "integrity" "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA=="
     811 + "resolved" "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz"
     812 + "version" "1.0.0"
     813 + 
     814 +"es-to-primitive@^1.2.1":
     815 + "integrity" "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA=="
     816 + "resolved" "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz"
     817 + "version" "1.2.1"
     818 + dependencies:
     819 + "is-callable" "^1.1.4"
     820 + "is-date-object" "^1.0.1"
     821 + "is-symbol" "^1.0.2"
     822 + 
     823 +"esbuild@^0.16.3":
     824 + "integrity" "sha512-oYwFdSEIoKM1oYzyem1osgKJAvg5447XF+05ava21fOtilyb2HeQQh26/74K4WeAk5dZmj/Mx10zUqUnI14jhA=="
     825 + "resolved" "https://registry.npmjs.org/esbuild/-/esbuild-0.16.13.tgz"
     826 + "version" "0.16.13"
     827 + optionalDependencies:
     828 + "@esbuild/android-arm" "0.16.13"
     829 + "@esbuild/android-arm64" "0.16.13"
     830 + "@esbuild/android-x64" "0.16.13"
     831 + "@esbuild/darwin-arm64" "0.16.13"
     832 + "@esbuild/darwin-x64" "0.16.13"
     833 + "@esbuild/freebsd-arm64" "0.16.13"
     834 + "@esbuild/freebsd-x64" "0.16.13"
     835 + "@esbuild/linux-arm" "0.16.13"
     836 + "@esbuild/linux-arm64" "0.16.13"
     837 + "@esbuild/linux-ia32" "0.16.13"
     838 + "@esbuild/linux-loong64" "0.16.13"
     839 + "@esbuild/linux-mips64el" "0.16.13"
     840 + "@esbuild/linux-ppc64" "0.16.13"
     841 + "@esbuild/linux-riscv64" "0.16.13"
     842 + "@esbuild/linux-s390x" "0.16.13"
     843 + "@esbuild/linux-x64" "0.16.13"
     844 + "@esbuild/netbsd-x64" "0.16.13"
     845 + "@esbuild/openbsd-x64" "0.16.13"
     846 + "@esbuild/sunos-x64" "0.16.13"
     847 + "@esbuild/win32-arm64" "0.16.13"
     848 + "@esbuild/win32-ia32" "0.16.13"
     849 + "@esbuild/win32-x64" "0.16.13"
     850 + 
     851 +"escalade@^3.1.1":
     852 + "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
     853 + "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz"
     854 + "version" "3.1.1"
     855 + 
     856 +"escape-string-regexp@^1.0.5":
     857 + "integrity" "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
     858 + "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
     859 + "version" "1.0.5"
     860 + 
     861 +"escape-string-regexp@^4.0.0":
     862 + "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
     863 + "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
     864 + "version" "4.0.0"
     865 + 
     866 +"eventemitter3@^4.0.7":
     867 + "integrity" "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
     868 + "resolved" "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz"
     869 + "version" "4.0.7"
     870 + 
     871 +"file-selector@^0.5.0":
     872 + "integrity" "sha512-s8KNnmIDTBoD0p9uJ9uD0XY38SCeBOtj0UMXyQSLg1Ypfrfj8+dAvwsLjYQkQ2GjhVtp2HrnF5cJzMhBjfD8HA=="
     873 + "resolved" "https://registry.npmjs.org/file-selector/-/file-selector-0.5.0.tgz"
     874 + "version" "0.5.0"
     875 + dependencies:
     876 + "tslib" "^2.0.3"
     877 + 
     878 +"filter-obj@^1.1.0":
     879 + "integrity" "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ=="
     880 + "resolved" "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz"
     881 + "version" "1.1.0"
     882 + 
     883 +"find-root@^1.1.0":
     884 + "integrity" "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
     885 + "resolved" "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz"
     886 + "version" "1.1.0"
     887 + 
     888 +"fs.realpath@^1.0.0":
     889 + "integrity" "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
     890 + "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
     891 + "version" "1.0.0"
     892 + 
     893 +"fsevents@~2.3.2":
     894 + "integrity" "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="
     895 + "resolved" "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz"
     896 + "version" "2.3.2"
     897 + 
     898 +"function-bind@^1.1.1":
     899 + "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
     900 + "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"
     901 + "version" "1.1.1"
     902 + 
     903 +"function.prototype.name@^1.1.5":
     904 + "integrity" "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA=="
     905 + "resolved" "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz"
     906 + "version" "1.1.5"
     907 + dependencies:
     908 + "call-bind" "^1.0.2"
     909 + "define-properties" "^1.1.3"
     910 + "es-abstract" "^1.19.0"
     911 + "functions-have-names" "^1.2.2"
     912 + 
     913 +"functions-have-names@^1.2.2":
     914 + "integrity" "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
     915 + "resolved" "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz"
     916 + "version" "1.2.3"
     917 + 
     918 +"gensync@^1.0.0-beta.2":
     919 + "integrity" "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="
     920 + "resolved" "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"
     921 + "version" "1.0.0-beta.2"
     922 + 
     923 +"get-intrinsic@^1.0.2", "get-intrinsic@^1.1.1", "get-intrinsic@^1.1.3":
     924 + "integrity" "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A=="
     925 + "resolved" "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz"
     926 + "version" "1.1.3"
     927 + dependencies:
     928 + "function-bind" "^1.1.1"
     929 + "has" "^1.0.3"
     930 + "has-symbols" "^1.0.3"
     931 + 
     932 +"get-symbol-description@^1.0.0":
     933 + "integrity" "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw=="
     934 + "resolved" "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz"
     935 + "version" "1.0.0"
     936 + dependencies:
     937 + "call-bind" "^1.0.2"
     938 + "get-intrinsic" "^1.1.1"
     939 + 
     940 +"glob@^7.1.3":
     941 + "integrity" "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="
     942 + "resolved" "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz"
     943 + "version" "7.2.3"
     944 + dependencies:
     945 + "fs.realpath" "^1.0.0"
     946 + "inflight" "^1.0.4"
     947 + "inherits" "2"
     948 + "minimatch" "^3.1.1"
     949 + "once" "^1.3.0"
     950 + "path-is-absolute" "^1.0.0"
     951 + 
     952 +"globals@^11.1.0":
     953 + "integrity" "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
     954 + "resolved" "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz"
     955 + "version" "11.12.0"
     956 + 
     957 +"gopd@^1.0.1":
     958 + "integrity" "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA=="
     959 + "resolved" "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz"
     960 + "version" "1.0.1"
     961 + dependencies:
     962 + "get-intrinsic" "^1.1.3"
     963 + 
     964 +"has-bigints@^1.0.1", "has-bigints@^1.0.2":
     965 + "integrity" "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ=="
     966 + "resolved" "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz"
     967 + "version" "1.0.2"
     968 + 
     969 +"has-flag@^3.0.0":
     970 + "integrity" "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
     971 + "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
     972 + "version" "3.0.0"
     973 + 
     974 +"has-property-descriptors@^1.0.0":
     975 + "integrity" "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ=="
     976 + "resolved" "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz"
     977 + "version" "1.0.0"
     978 + dependencies:
     979 + "get-intrinsic" "^1.1.1"
     980 + 
     981 +"has-symbols@^1.0.2", "has-symbols@^1.0.3":
     982 + "integrity" "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
     983 + "resolved" "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz"
     984 + "version" "1.0.3"
     985 + 
     986 +"has-tostringtag@^1.0.0":
     987 + "integrity" "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ=="
     988 + "resolved" "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz"
     989 + "version" "1.0.0"
     990 + dependencies:
     991 + "has-symbols" "^1.0.2"
     992 + 
     993 +"has@^1.0.3":
     994 + "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw=="
     995 + "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz"
     996 + "version" "1.0.3"
     997 + dependencies:
     998 + "function-bind" "^1.1.1"
     999 + 
     1000 +"history@^5.1.0":
     1001 + "integrity" "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ=="
     1002 + "resolved" "https://registry.npmjs.org/history/-/history-5.3.0.tgz"
     1003 + "version" "5.3.0"
     1004 + dependencies:
     1005 + "@babel/runtime" "^7.7.6"
     1006 + 
     1007 +"hoist-non-react-statics@^3.3.1":
     1008 + "integrity" "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="
     1009 + "resolved" "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz"
     1010 + "version" "3.3.2"
     1011 + dependencies:
     1012 + "react-is" "^16.7.0"
     1013 + 
     1014 +"import-fresh@^3.2.1":
     1015 + "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw=="
     1016 + "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz"
     1017 + "version" "3.3.0"
     1018 + dependencies:
     1019 + "parent-module" "^1.0.0"
     1020 + "resolve-from" "^4.0.0"
     1021 + 
     1022 +"inflection@~1.12.0":
     1023 + "integrity" "sha512-lRy4DxuIFWXlJU7ed8UiTJOSTqStqYdEb4CEbtXfNbkdj3nH1L+reUWiE10VWcJS2yR7tge8Z74pJjtBjNwj0w=="
     1024 + "resolved" "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz"
     1025 + "version" "1.12.0"
     1026 + 
     1027 +"inflight@^1.0.4":
     1028 + "integrity" "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="
     1029 + "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
     1030 + "version" "1.0.6"
     1031 + dependencies:
     1032 + "once" "^1.3.0"
     1033 + "wrappy" "1"
     1034 + 
     1035 +"inherits@2":
     1036 + "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
     1037 + "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
     1038 + "version" "2.0.4"
     1039 + 
     1040 +"internal-slot@^1.0.3":
     1041 + "integrity" "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ=="
     1042 + "resolved" "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz"
     1043 + "version" "1.0.4"
     1044 + dependencies:
     1045 + "get-intrinsic" "^1.1.3"
     1046 + "has" "^1.0.3"
     1047 + "side-channel" "^1.0.4"
     1048 + 
     1049 +"is-arrayish@^0.2.1":
     1050 + "integrity" "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
     1051 + "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"
     1052 + "version" "0.2.1"
     1053 + 
     1054 +"is-bigint@^1.0.1":
     1055 + "integrity" "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg=="
     1056 + "resolved" "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz"
     1057 + "version" "1.0.4"
     1058 + dependencies:
     1059 + "has-bigints" "^1.0.1"
     1060 + 
     1061 +"is-boolean-object@^1.1.0":
     1062 + "integrity" "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA=="
     1063 + "resolved" "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz"
     1064 + "version" "1.1.2"
     1065 + dependencies:
     1066 + "call-bind" "^1.0.2"
     1067 + "has-tostringtag" "^1.0.0"
     1068 + 
     1069 +"is-callable@^1.1.4", "is-callable@^1.2.7":
     1070 + "integrity" "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="
     1071 + "resolved" "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz"
     1072 + "version" "1.2.7"
     1073 + 
     1074 +"is-core-module@^2.9.0":
     1075 + "integrity" "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw=="
     1076 + "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz"
     1077 + "version" "2.11.0"
     1078 + dependencies:
     1079 + "has" "^1.0.3"
     1080 + 
     1081 +"is-date-object@^1.0.1":
     1082 + "integrity" "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ=="
     1083 + "resolved" "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz"
     1084 + "version" "1.0.5"
     1085 + dependencies:
     1086 + "has-tostringtag" "^1.0.0"
     1087 + 
     1088 +"is-negative-zero@^2.0.2":
     1089 + "integrity" "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA=="
     1090 + "resolved" "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz"
     1091 + "version" "2.0.2"
     1092 + 
     1093 +"is-number-object@^1.0.4":
     1094 + "integrity" "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ=="
     1095 + "resolved" "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz"
     1096 + "version" "1.0.7"
     1097 + dependencies:
     1098 + "has-tostringtag" "^1.0.0"
     1099 + 
     1100 +"is-regex@^1.1.4":
     1101 + "integrity" "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg=="
     1102 + "resolved" "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz"
     1103 + "version" "1.1.4"
     1104 + dependencies:
     1105 + "call-bind" "^1.0.2"
     1106 + "has-tostringtag" "^1.0.0"
     1107 + 
     1108 +"is-shared-array-buffer@^1.0.2":
     1109 + "integrity" "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA=="
     1110 + "resolved" "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz"
     1111 + "version" "1.0.2"
     1112 + dependencies:
     1113 + "call-bind" "^1.0.2"
     1114 + 
     1115 +"is-string@^1.0.5", "is-string@^1.0.7":
     1116 + "integrity" "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg=="
     1117 + "resolved" "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz"
     1118 + "version" "1.0.7"
     1119 + dependencies:
     1120 + "has-tostringtag" "^1.0.0"
     1121 + 
     1122 +"is-symbol@^1.0.2", "is-symbol@^1.0.3":
     1123 + "integrity" "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg=="
     1124 + "resolved" "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz"
     1125 + "version" "1.0.4"
     1126 + dependencies:
     1127 + "has-symbols" "^1.0.2"
     1128 + 
     1129 +"is-weakref@^1.0.2":
     1130 + "integrity" "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ=="
     1131 + "resolved" "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz"
     1132 + "version" "1.0.2"
     1133 + dependencies:
     1134 + "call-bind" "^1.0.2"
     1135 + 
     1136 +"[email protected]":
     1137 + "integrity" "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q=="
     1138 + "resolved" "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz"
     1139 + "version" "0.8.0"
     1140 + 
     1141 +"js-tokens@^3.0.0 || ^4.0.0", "js-tokens@^4.0.0":
     1142 + "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
     1143 + "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
     1144 + "version" "4.0.0"
     1145 + 
     1146 +"jsesc@^2.5.1":
     1147 + "integrity" "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
     1148 + "resolved" "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz"
     1149 + "version" "2.5.2"
     1150 + 
     1151 +"json-parse-even-better-errors@^2.3.0":
     1152 + "integrity" "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
     1153 + "resolved" "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz"
     1154 + "version" "2.3.1"
     1155 + 
     1156 +"json5@^2.2.1":
     1157 + "integrity" "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
     1158 + "resolved" "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"
     1159 + "version" "2.2.3"
     1160 + 
     1161 +"jsonexport@^3.2.0":
     1162 + "integrity" "sha512-GbO9ugb0YTZatPd/hqCGR0FSwbr82H6OzG04yzdrG7XOe4QZ0jhQ+kOsB29zqkzoYJLmLxbbrFiuwbQu891XnQ=="
     1163 + "resolved" "https://registry.npmjs.org/jsonexport/-/jsonexport-3.2.0.tgz"
     1164 + "version" "3.2.0"
     1165 + 
     1166 +"lines-and-columns@^1.1.6":
     1167 + "integrity" "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
     1168 + "resolved" "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz"
     1169 + "version" "1.2.4"
     1170 + 
     1171 +"lodash@~4.17.5":
     1172 + "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
     1173 + "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
     1174 + "version" "4.17.21"
     1175 + 
     1176 +"loose-envify@^1.0.0", "loose-envify@^1.1.0", "loose-envify@^1.4.0":
     1177 + "integrity" "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="
     1178 + "resolved" "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz"
     1179 + "version" "1.4.0"
     1180 + dependencies:
     1181 + "js-tokens" "^3.0.0 || ^4.0.0"
     1182 + 
     1183 +"lru-cache@^5.1.1":
     1184 + "integrity" "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="
     1185 + "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz"
     1186 + "version" "5.1.1"
     1187 + dependencies:
     1188 + "yallist" "^3.0.2"
     1189 + 
     1190 +"magic-string@^0.27.0":
     1191 + "integrity" "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA=="
     1192 + "resolved" "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz"
     1193 + "version" "0.27.0"
     1194 + dependencies:
     1195 + "@jridgewell/sourcemap-codec" "^1.4.13"
     1196 + 
     1197 +"match-sorter@^6.0.2":
     1198 + "integrity" "sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw=="
     1199 + "resolved" "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz"
     1200 + "version" "6.3.1"
     1201 + dependencies:
     1202 + "@babel/runtime" "^7.12.5"
     1203 + "remove-accents" "0.4.2"
     1204 + 
     1205 +"[email protected]":
     1206 + "integrity" "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA=="
     1207 + "resolved" "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz"
     1208 + "version" "0.2.0"
     1209 + 
     1210 +"minimatch@^3.1.1":
     1211 + "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="
     1212 + "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
     1213 + "version" "3.1.2"
     1214 + dependencies:
     1215 + "brace-expansion" "^1.1.7"
     1216 + 
     1217 +"[email protected]":
     1218 + "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
     1219 + "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
     1220 + "version" "2.1.2"
     1221 + 
     1222 +"[email protected]":
     1223 + "integrity" "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA=="
     1224 + "resolved" "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz"
     1225 + "version" "1.0.0"
     1226 + dependencies:
     1227 + "big-integer" "^1.6.16"
     1228 + 
     1229 +"nanoid@^3.3.4":
     1230 + "integrity" "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
     1231 + "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz"
     1232 + "version" "3.3.4"
     1233 + 
     1234 +"node-polyglot@^2.2.2":
     1235 + "integrity" "sha512-AgTVpQ32BQ5XPI+tFHJ9bCYxWwSLvtmEodX8ooftFhEuyCgBG6ijWulIVb7pH3THigtgvc9uLiPn0IO51KHpkg=="
     1236 + "resolved" "https://registry.npmjs.org/node-polyglot/-/node-polyglot-2.4.2.tgz"
     1237 + "version" "2.4.2"
     1238 + dependencies:
     1239 + "array.prototype.foreach" "^1.0.0"
     1240 + "has" "^1.0.3"
     1241 + "object.entries" "^1.1.4"
     1242 + "string.prototype.trim" "^1.2.4"
     1243 + "warning" "^4.0.3"
     1244 + 
     1245 +"node-releases@^2.0.6":
     1246 + "integrity" "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A=="
     1247 + "resolved" "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz"
     1248 + "version" "2.0.8"
     1249 + 
     1250 +"object-assign@^4.1.1":
     1251 + "integrity" "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
     1252 + "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
     1253 + "version" "4.1.1"
     1254 + 
     1255 +"object-inspect@^1.12.2", "object-inspect@^1.9.0":
     1256 + "integrity" "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
     1257 + "resolved" "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz"
     1258 + "version" "1.12.2"
     1259 + 
     1260 +"object-keys@^1.1.1":
     1261 + "integrity" "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
     1262 + "resolved" "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz"
     1263 + "version" "1.1.1"
     1264 + 
     1265 +"object.assign@^4.1.4":
     1266 + "integrity" "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ=="
     1267 + "resolved" "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz"
     1268 + "version" "4.1.4"
     1269 + dependencies:
     1270 + "call-bind" "^1.0.2"
     1271 + "define-properties" "^1.1.4"
     1272 + "has-symbols" "^1.0.3"
     1273 + "object-keys" "^1.1.1"
     1274 + 
     1275 +"object.entries@^1.1.4":
     1276 + "integrity" "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w=="
     1277 + "resolved" "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz"
     1278 + "version" "1.1.6"
     1279 + dependencies:
     1280 + "call-bind" "^1.0.2"
     1281 + "define-properties" "^1.1.4"
     1282 + "es-abstract" "^1.20.4"
     1283 + 
     1284 +"[email protected]":
     1285 + "integrity" "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw=="
     1286 + "resolved" "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz"
     1287 + "version" "1.0.0"
     1288 + 
     1289 +"once@^1.3.0":
     1290 + "integrity" "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="
     1291 + "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
     1292 + "version" "1.4.0"
     1293 + dependencies:
     1294 + "wrappy" "1"
     1295 + 
     1296 +"parent-module@^1.0.0":
     1297 + "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="
     1298 + "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
     1299 + "version" "1.0.1"
     1300 + dependencies:
     1301 + "callsites" "^3.0.0"
     1302 + 
     1303 +"parse-json@^5.0.0":
     1304 + "integrity" "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="
     1305 + "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz"
     1306 + "version" "5.2.0"
     1307 + dependencies:
     1308 + "@babel/code-frame" "^7.0.0"
     1309 + "error-ex" "^1.3.1"
     1310 + "json-parse-even-better-errors" "^2.3.0"
     1311 + "lines-and-columns" "^1.1.6"
     1312 + 
     1313 +"path-is-absolute@^1.0.0":
     1314 + "integrity" "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
     1315 + "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
     1316 + "version" "1.0.1"
     1317 + 
     1318 +"path-parse@^1.0.7":
     1319 + "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
     1320 + "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"
     1321 + "version" "1.0.7"
     1322 + 
     1323 +"path-type@^4.0.0":
     1324 + "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
     1325 + "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
     1326 + "version" "4.0.0"
     1327 + 
     1328 +"picocolors@^1.0.0":
     1329 + "integrity" "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
     1330 + "resolved" "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz"
     1331 + "version" "1.0.0"
     1332 + 
     1333 +"postcss@^8.4.20":
     1334 + "integrity" "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g=="
     1335 + "resolved" "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz"
     1336 + "version" "8.4.20"
     1337 + dependencies:
     1338 + "nanoid" "^3.3.4"
     1339 + "picocolors" "^1.0.0"
     1340 + "source-map-js" "^1.0.2"
     1341 + 
     1342 +"prop-types@^15.6.1", "prop-types@^15.6.2", "prop-types@^15.7.0", "prop-types@^15.8.1":
     1343 + "integrity" "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="
     1344 + "resolved" "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"
     1345 + "version" "15.8.1"
     1346 + dependencies:
     1347 + "loose-envify" "^1.4.0"
     1348 + "object-assign" "^4.1.1"
     1349 + "react-is" "^16.13.1"
     1350 + 
     1351 +"query-string@^7.1.1":
     1352 + "integrity" "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg=="
     1353 + "resolved" "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz"
     1354 + "version" "7.1.3"
     1355 + dependencies:
     1356 + "decode-uri-component" "^0.2.2"
     1357 + "filter-obj" "^1.1.0"
     1358 + "split-on-first" "^1.0.0"
     1359 + "strict-uri-encode" "^2.0.0"
     1360 + 
     1361 +"ra-core@^4.0.0", "ra-core@^4.6.2":
     1362 + "integrity" "sha512-Thp9QOffve+meV9FLCmNqUwZH9za2ik/gYvwKAeMdmVJSlSYxhDtPNasAIn73WgW8pQsJhAJ5UNczWKaDQORNg=="
     1363 + "resolved" "https://registry.npmjs.org/ra-core/-/ra-core-4.6.2.tgz"
     1364 + "version" "4.6.2"
     1365 + dependencies:
     1366 + "clsx" "^1.1.1"
     1367 + "date-fns" "^2.19.0"
     1368 + "eventemitter3" "^4.0.7"
     1369 + "inflection" "~1.12.0"
     1370 + "jsonexport" "^3.2.0"
     1371 + "lodash" "~4.17.5"
     1372 + "prop-types" "^15.6.1"
     1373 + "query-string" "^7.1.1"
     1374 + "react-is" "^17.0.2"
     1375 + "react-query" "^3.32.1"
     1376 + 
     1377 +"ra-data-json-server@^4.6.2":
     1378 + "integrity" "sha512-ySKi7KLrn5bLyc6cdEgnxNHHeRtTqccmJ+r4dTZinTYlZ+S61UipEbcMwpN+h6qBT6579U9RRnz2O/QwFClYLQ=="
     1379 + "resolved" "https://registry.npmjs.org/ra-data-json-server/-/ra-data-json-server-4.6.2.tgz"
     1380 + "version" "4.6.2"
     1381 + dependencies:
     1382 + "query-string" "^7.1.1"
     1383 + "ra-core" "^4.6.2"
     1384 + 
     1385 +"ra-i18n-polyglot@^4.6.2":
     1386 + "integrity" "sha512-McI6Y5dVzS1EsFEodbfa9fCFbH8V/DMk8ZJQ/jbZ+xV9l1NjwjG+Y46KdiN+FxQuNGqDxs/14gZiY99yQc8e3Q=="
     1387 + "resolved" "https://registry.npmjs.org/ra-i18n-polyglot/-/ra-i18n-polyglot-4.6.2.tgz"
     1388 + "version" "4.6.2"
     1389 + dependencies:
     1390 + "node-polyglot" "^2.2.2"
     1391 + "ra-core" "^4.6.2"
     1392 + 
     1393 +"ra-language-english@^4.6.2":
     1394 + "integrity" "sha512-lPmWtv/Y58ohnS4h30BzkA3N3VKNuMaFB3fDkoIQGXpB3qeyQgja8FNgxqIinn5scU5ocMJho2SUhdJObo2eIQ=="
     1395 + "resolved" "https://registry.npmjs.org/ra-language-english/-/ra-language-english-4.6.2.tgz"
     1396 + "version" "4.6.2"
     1397 + dependencies:
     1398 + "ra-core" "^4.6.2"
     1399 + 
     1400 +"ra-ui-materialui@^4.6.2":
     1401 + "integrity" "sha512-AB5y8ZS23PATNDploArb7tD2Y4++UI2Wdl1CW5G+YiMAZfKmIsxhkAYkRaBW+Gej2M/vXeWKbLC7LppJXVQuoA=="
     1402 + "resolved" "https://registry.npmjs.org/ra-ui-materialui/-/ra-ui-materialui-4.6.2.tgz"
     1403 + "version" "4.6.2"
     1404 + dependencies:
     1405 + "autosuggest-highlight" "^3.1.1"
     1406 + "clsx" "^1.1.1"
     1407 + "css-mediaquery" "^0.1.2"
     1408 + "inflection" "~1.12.0"
     1409 + "jsonexport" "^3.2.0"
     1410 + "lodash" "~4.17.5"
     1411 + "prop-types" "^15.7.0"
     1412 + "query-string" "^7.1.1"
     1413 + "react-dropzone" "^12.0.4"
     1414 + "react-error-boundary" "^3.1.4"
     1415 + "react-query" "^3.32.1"
     1416 + "react-transition-group" "^4.4.1"
     1417 + 
     1418 +"react-admin@^4.6.2":
     1419 + "integrity" "sha512-lCvbTPHDDBnbRDFzk3yQ1OqdePN8Cc6v8WBnsX0GXhSHcv8DosufUd4a7kKlPaqozg4xsf+oI0HxwFhDoCRJ3A=="
     1420 + "resolved" "https://registry.npmjs.org/react-admin/-/react-admin-4.6.2.tgz"
     1421 + "version" "4.6.2"
     1422 + dependencies:
     1423 + "@emotion/react" "^11.4.1"
     1424 + "@emotion/styled" "^11.3.0"
     1425 + "@mui/icons-material" "^5.0.1"
     1426 + "@mui/material" "^5.0.2"
     1427 + "history" "^5.1.0"
     1428 + "ra-core" "^4.6.2"
     1429 + "ra-i18n-polyglot" "^4.6.2"
     1430 + "ra-language-english" "^4.6.2"
     1431 + "ra-ui-materialui" "^4.6.2"
     1432 + "react-hook-form" "^7.40.0"
     1433 + "react-router" "^6.1.0"
     1434 + "react-router-dom" "^6.1.0"
     1435 + 
     1436 +"react-dom@^16.9.0 || ^17.0.0 || ^18.0.0", "react-dom@^17.0.0 || ^18.0.0", "react-dom@^18.2.0", "react-dom@>=16.6.0", "react-dom@>=16.8":
     1437 + "integrity" "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="
     1438 + "resolved" "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz"
     1439 + "version" "18.2.0"
     1440 + dependencies:
     1441 + "loose-envify" "^1.1.0"
     1442 + "scheduler" "^0.23.0"
     1443 + 
     1444 +"react-dropzone@^12.0.4":
     1445 + "integrity" "sha512-iBYHA1rbopIvtzokEX4QubO6qk5IF/x3BtKGu74rF2JkQDXnwC4uO/lHKpaw4PJIV6iIAYOlwLv2FpiGyqHNog=="
     1446 + "resolved" "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.1.0.tgz"
     1447 + "version" "12.1.0"
     1448 + dependencies:
     1449 + "attr-accept" "^2.2.2"
     1450 + "file-selector" "^0.5.0"
     1451 + "prop-types" "^15.8.1"
     1452 + 
     1453 +"react-error-boundary@^3.1.4":
     1454 + "integrity" "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA=="
     1455 + "resolved" "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz"
     1456 + "version" "3.1.4"
     1457 + dependencies:
     1458 + "@babel/runtime" "^7.12.5"
     1459 + 
     1460 +"react-hook-form@*", "react-hook-form@^7.40.0":
     1461 + "integrity" "sha512-75TOP2OJNj+wmeDvzD4FxDNBitJzqqwobf5q0FegvkNpXDnoAsjFD9O1c7PQOvmIVenUDGcAat5QQARWboDnnQ=="
     1462 + "resolved" "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.41.4.tgz"
     1463 + "version" "7.41.4"
     1464 + 
     1465 +"react-is@^16.13.1":
     1466 + "integrity" "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
     1467 + "resolved" "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
     1468 + "version" "16.13.1"
     1469 + 
     1470 +"react-is@^16.7.0":
     1471 + "integrity" "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
     1472 + "resolved" "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
     1473 + "version" "16.13.1"
     1474 + 
     1475 +"react-is@^17.0.2":
     1476 + "integrity" "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
     1477 + "resolved" "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz"
     1478 + "version" "17.0.2"
     1479 + 
     1480 +"react-is@^18.2.0":
     1481 + "integrity" "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
     1482 + "resolved" "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz"
     1483 + "version" "18.2.0"
     1484 + 
     1485 +"react-query@^3.32.1":
     1486 + "integrity" "sha512-F6hYDKyNgDQfQOuR1Rsp3VRzJnWHx6aRnnIZHMNGGgbL3SBgpZTDg8MQwmxOgpCAoqZJA+JSNCydF1xGJqKOCA=="
     1487 + "resolved" "https://registry.npmjs.org/react-query/-/react-query-3.39.2.tgz"
     1488 + "version" "3.39.2"
     1489 + dependencies:
     1490 + "@babel/runtime" "^7.5.5"
     1491 + "broadcast-channel" "^3.4.1"
     1492 + "match-sorter" "^6.0.2"
     1493 + 
     1494 +"react-refresh@^0.14.0":
     1495 + "integrity" "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ=="
     1496 + "resolved" "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz"
     1497 + "version" "0.14.0"
     1498 + 
     1499 +"react-router-dom@^6.1.0":
     1500 + "integrity" "sha512-u+8BKUtelStKbZD5UcY0NY90WOzktrkJJhyhNg7L0APn9t1qJNLowzrM9CHdpB6+rcPt6qQrlkIXsTvhuXP68g=="
     1501 + "resolved" "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.6.1.tgz"
     1502 + "version" "6.6.1"
     1503 + dependencies:
     1504 + "@remix-run/router" "1.2.1"
     1505 + "react-router" "6.6.1"
     1506 + 
     1507 +"react-router@^6.1.0", "[email protected]":
     1508 + "integrity" "sha512-YkvlYRusnI/IN0kDtosUCgxqHeulN5je+ew8W+iA1VvFhf86kA+JEI/X/8NqYcr11hCDDp906S+SGMpBheNeYQ=="
     1509 + "resolved" "https://registry.npmjs.org/react-router/-/react-router-6.6.1.tgz"
     1510 + "version" "6.6.1"
     1511 + dependencies:
     1512 + "@remix-run/router" "1.2.1"
     1513 + 
     1514 +"react-transition-group@^4.4.1", "react-transition-group@^4.4.5":
     1515 + "integrity" "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g=="
     1516 + "resolved" "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz"
     1517 + "version" "4.4.5"
     1518 + dependencies:
     1519 + "@babel/runtime" "^7.5.5"
     1520 + "dom-helpers" "^5.0.1"
     1521 + "loose-envify" "^1.4.0"
     1522 + "prop-types" "^15.6.2"
     1523 + 
     1524 +"react@^16.8.0 || ^17 || ^18", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.9.0 || ^17.0.0 || ^18.0.0", "react@^17.0.0 || ^18.0.0", "react@^18.2.0", "react@>= 16.8", "react@>=16.13.1", "react@>=16.3", "react@>=16.6.0", "react@>=16.8", "react@>=16.8.0":
     1525 + "integrity" "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ=="
     1526 + "resolved" "https://registry.npmjs.org/react/-/react-18.2.0.tgz"
     1527 + "version" "18.2.0"
     1528 + dependencies:
     1529 + "loose-envify" "^1.1.0"
     1530 + 
     1531 +"regenerator-runtime@^0.13.11":
     1532 + "integrity" "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
     1533 + "resolved" "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz"
     1534 + "version" "0.13.11"
     1535 + 
     1536 +"regexp.prototype.flags@^1.4.3":
     1537 + "integrity" "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA=="
     1538 + "resolved" "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz"
     1539 + "version" "1.4.3"
     1540 + dependencies:
     1541 + "call-bind" "^1.0.2"
     1542 + "define-properties" "^1.1.3"
     1543 + "functions-have-names" "^1.2.2"
     1544 + 
     1545 +"remove-accents@^0.4.2":
     1546 + "integrity" "sha512-EpFcOa/ISetVHEXqu+VwI96KZBmq+a8LJnGkaeFw45epGlxIZz5dhEEnNZMsQXgORu3qaMoLX4qJCzOik6ytAg=="
     1547 + "resolved" "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.4.tgz"
     1548 + "version" "0.4.4"
     1549 + 
     1550 +"[email protected]":
     1551 + "integrity" "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA=="
     1552 + "resolved" "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz"
     1553 + "version" "0.4.2"
     1554 + 
     1555 +"resolve-from@^4.0.0":
     1556 + "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
     1557 + "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
     1558 + "version" "4.0.0"
     1559 + 
     1560 +"resolve@^1.19.0", "resolve@^1.22.1":
     1561 + "integrity" "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw=="
     1562 + "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz"
     1563 + "version" "1.22.1"
     1564 + dependencies:
     1565 + "is-core-module" "^2.9.0"
     1566 + "path-parse" "^1.0.7"
     1567 + "supports-preserve-symlinks-flag" "^1.0.0"
     1568 + 
     1569 +"[email protected]":
     1570 + "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="
     1571 + "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz"
     1572 + "version" "3.0.2"
     1573 + dependencies:
     1574 + "glob" "^7.1.3"
     1575 + 
     1576 +"rollup@^3.7.0":
     1577 + "integrity" "sha512-GswCYHXftN8ZKGVgQhTFUJB/NBXxrRGgO2NCy6E8s1rwEJ4Q9/VttNqcYfEvx4dTo4j58YqdC3OVztPzlKSX8w=="
     1578 + "resolved" "https://registry.npmjs.org/rollup/-/rollup-3.9.1.tgz"
     1579 + "version" "3.9.1"
     1580 + optionalDependencies:
     1581 + "fsevents" "~2.3.2"
     1582 + 
     1583 +"safe-regex-test@^1.0.0":
     1584 + "integrity" "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA=="
     1585 + "resolved" "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz"
     1586 + "version" "1.0.0"
     1587 + dependencies:
     1588 + "call-bind" "^1.0.2"
     1589 + "get-intrinsic" "^1.1.3"
     1590 + "is-regex" "^1.1.4"
     1591 + 
     1592 +"scheduler@^0.23.0":
     1593 + "integrity" "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw=="
     1594 + "resolved" "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz"
     1595 + "version" "0.23.0"
     1596 + dependencies:
     1597 + "loose-envify" "^1.1.0"
     1598 + 
     1599 +"semver@^6.3.0":
     1600 + "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
     1601 + "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
     1602 + "version" "6.3.0"
     1603 + 
     1604 +"side-channel@^1.0.4":
     1605 + "integrity" "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw=="
     1606 + "resolved" "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz"
     1607 + "version" "1.0.4"
     1608 + dependencies:
     1609 + "call-bind" "^1.0.0"
     1610 + "get-intrinsic" "^1.0.2"
     1611 + "object-inspect" "^1.9.0"
     1612 + 
     1613 +"source-map-js@^1.0.2":
     1614 + "integrity" "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
     1615 + "resolved" "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz"
     1616 + "version" "1.0.2"
     1617 + 
     1618 +"source-map@^0.5.7":
     1619 + "integrity" "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="
     1620 + "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz"
     1621 + "version" "0.5.7"
     1622 + 
     1623 +"split-on-first@^1.0.0":
     1624 + "integrity" "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw=="
     1625 + "resolved" "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz"
     1626 + "version" "1.1.0"
     1627 + 
     1628 +"strict-uri-encode@^2.0.0":
     1629 + "integrity" "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ=="
     1630 + "resolved" "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz"
     1631 + "version" "2.0.0"
     1632 + 
     1633 +"string.prototype.trim@^1.2.4":
     1634 + "integrity" "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg=="
     1635 + "resolved" "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz"
     1636 + "version" "1.2.7"
     1637 + dependencies:
     1638 + "call-bind" "^1.0.2"
     1639 + "define-properties" "^1.1.4"
     1640 + "es-abstract" "^1.20.4"
     1641 + 
     1642 +"string.prototype.trimend@^1.0.6":
     1643 + "integrity" "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ=="
     1644 + "resolved" "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz"
     1645 + "version" "1.0.6"
     1646 + dependencies:
     1647 + "call-bind" "^1.0.2"
     1648 + "define-properties" "^1.1.4"
     1649 + "es-abstract" "^1.20.4"
     1650 + 
     1651 +"string.prototype.trimstart@^1.0.6":
     1652 + "integrity" "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA=="
     1653 + "resolved" "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz"
     1654 + "version" "1.0.6"
     1655 + dependencies:
     1656 + "call-bind" "^1.0.2"
     1657 + "define-properties" "^1.1.4"
     1658 + "es-abstract" "^1.20.4"
     1659 + 
     1660 +"[email protected]":
     1661 + "integrity" "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA=="
     1662 + "resolved" "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz"
     1663 + "version" "4.1.3"
     1664 + 
     1665 +"supports-color@^5.3.0":
     1666 + "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="
     1667 + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
     1668 + "version" "5.5.0"
     1669 + dependencies:
     1670 + "has-flag" "^3.0.0"
     1671 + 
     1672 +"supports-preserve-symlinks-flag@^1.0.0":
     1673 + "integrity" "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
     1674 + "resolved" "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
     1675 + "version" "1.0.0"
     1676 + 
     1677 +"to-fast-properties@^2.0.0":
     1678 + "integrity" "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="
     1679 + "resolved" "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz"
     1680 + "version" "2.0.0"
     1681 + 
     1682 +"tslib@^2.0.3":
     1683 + "integrity" "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
     1684 + "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz"
     1685 + "version" "2.4.1"
     1686 + 
     1687 +"typescript@^4.9.3":
     1688 + "integrity" "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg=="
     1689 + "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz"
     1690 + "version" "4.9.4"
     1691 + 
     1692 +"unbox-primitive@^1.0.2":
     1693 + "integrity" "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw=="
     1694 + "resolved" "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz"
     1695 + "version" "1.0.2"
     1696 + dependencies:
     1697 + "call-bind" "^1.0.2"
     1698 + "has-bigints" "^1.0.2"
     1699 + "has-symbols" "^1.0.3"
     1700 + "which-boxed-primitive" "^1.0.2"
     1701 + 
     1702 +"[email protected]":
     1703 + "integrity" "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA=="
     1704 + "resolved" "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz"
     1705 + "version" "2.2.0"
     1706 + dependencies:
     1707 + "@babel/runtime" "^7.6.2"
     1708 + "detect-node" "^2.0.4"
     1709 + 
     1710 +"update-browserslist-db@^1.0.9":
     1711 + "integrity" "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ=="
     1712 + "resolved" "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz"
     1713 + "version" "1.0.10"
     1714 + dependencies:
     1715 + "escalade" "^3.1.1"
     1716 + "picocolors" "^1.0.0"
     1717 + 
     1718 +"vite@^4.0.0":
     1719 + "integrity" "sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw=="
     1720 + "resolved" "https://registry.npmjs.org/vite/-/vite-4.0.4.tgz"
     1721 + "version" "4.0.4"
     1722 + dependencies:
     1723 + "esbuild" "^0.16.3"
     1724 + "postcss" "^8.4.20"
     1725 + "resolve" "^1.22.1"
     1726 + "rollup" "^3.7.0"
     1727 + optionalDependencies:
     1728 + "fsevents" "~2.3.2"
     1729 + 
     1730 +"warning@^4.0.3":
     1731 + "integrity" "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w=="
     1732 + "resolved" "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz"
     1733 + "version" "4.0.3"
     1734 + dependencies:
     1735 + "loose-envify" "^1.0.0"
     1736 + 
     1737 +"which-boxed-primitive@^1.0.2":
     1738 + "integrity" "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg=="
     1739 + "resolved" "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz"
     1740 + "version" "1.0.2"
     1741 + dependencies:
     1742 + "is-bigint" "^1.0.1"
     1743 + "is-boolean-object" "^1.1.0"
     1744 + "is-number-object" "^1.0.4"
     1745 + "is-string" "^1.0.5"
     1746 + "is-symbol" "^1.0.3"
     1747 + 
     1748 +"wrappy@1":
     1749 + "integrity" "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
     1750 + "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
     1751 + "version" "1.0.2"
     1752 + 
     1753 +"yallist@^3.0.2":
     1754 + "integrity" "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
     1755 + "resolved" "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"
     1756 + "version" "3.1.1"
     1757 + 
     1758 +"yaml@^1.10.0":
     1759 + "integrity" "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
     1760 + "resolved" "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz"
     1761 + "version" "1.10.2"
     1762 + 
  • ■ ■ ■ ■ ■ ■
    package.json
     1 +{
     2 + "dependencies": {
     3 + "rsuite": "^5.27.0"
     4 + }
     5 +}
     6 + 
  • ■ ■ ■ ■ ■ ■
    yarn.lock
     1 +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
     2 +# yarn lockfile v1
     3 + 
     4 + 
     5 +"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.0", "@babel/runtime@^7.20.0", "@babel/runtime@^7.20.1":
     6 + version "7.20.13"
     7 + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b"
     8 + integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==
     9 + dependencies:
     10 + regenerator-runtime "^0.13.11"
     11 + 
     12 +"@juggle/resize-observer@^3.3.1", "@juggle/resize-observer@^3.4.0":
     13 + version "3.4.0"
     14 + resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60"
     15 + integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==
     16 + 
     17 +"@rsuite/icon-font@^4.0.0":
     18 + version "4.0.0"
     19 + resolved "https://registry.yarnpkg.com/@rsuite/icon-font/-/icon-font-4.0.0.tgz#c4a772af5020bb3bbf74761879f80da23e914123"
     20 + integrity sha512-rZTgpTH3H3HLczCA2rnkWfoMKm0ZXoRzsrkVujfP/FfslnKUMvO6w56pa8pCvhWGpNEPUsLS2ULnFGpTEcup/Q==
     21 + 
     22 +"@rsuite/icons@^1.0.0", "@rsuite/icons@^1.0.2":
     23 + version "1.0.2"
     24 + resolved "https://registry.yarnpkg.com/@rsuite/icons/-/icons-1.0.2.tgz#1b53f6e5dc1dabec7a40ac5773ecc2172f05d09e"
     25 + integrity sha512-Y7vJNDQpJnFlyYSUXQ2iQ9Meg7+ZKcrIenhpYDdM3c7vYDE/L7pml+hrK28jk6QfV/QkVv5B504D+l7aM6AAJQ==
     26 + dependencies:
     27 + "@rsuite/icon-font" "^4.0.0"
     28 + classnames "^2.2.5"
     29 + insert-css "^2.0.0"
     30 + lodash "^4.17.20"
     31 + 
     32 +"@types/chai@^4.3.3":
     33 + version "4.3.4"
     34 + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4"
     35 + integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==
     36 + 
     37 +"@types/lodash@^4.14.184":
     38 + version "4.14.191"
     39 + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa"
     40 + integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==
     41 + 
     42 +"@types/prop-types@*", "@types/prop-types@^15.7.5":
     43 + version "15.7.5"
     44 + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf"
     45 + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==
     46 + 
     47 +"@types/react-window@^1.8.5":
     48 + version "1.8.5"
     49 + resolved "https://registry.yarnpkg.com/@types/react-window/-/react-window-1.8.5.tgz#285fcc5cea703eef78d90f499e1457e9b5c02fc1"
     50 + integrity sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==
     51 + dependencies:
     52 + "@types/react" "*"
     53 + 
     54 +"@types/react@*":
     55 + version "18.0.28"
     56 + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.28.tgz#accaeb8b86f4908057ad629a26635fe641480065"
     57 + integrity sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==
     58 + dependencies:
     59 + "@types/prop-types" "*"
     60 + "@types/scheduler" "*"
     61 + csstype "^3.0.2"
     62 + 
     63 +"@types/scheduler@*":
     64 + version "0.16.2"
     65 + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39"
     66 + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==
     67 + 
     68 +classnames@^2.2.5, classnames@^2.3.1:
     69 + version "2.3.2"
     70 + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924"
     71 + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==
     72 + 
     73 +csstype@^3.0.2:
     74 + version "3.1.1"
     75 + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9"
     76 + integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==
     77 + 
     78 +date-fns@^2.29.3:
     79 + version "2.29.3"
     80 + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8"
     81 + integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==
     82 + 
     83 +dom-lib@^3.1.3:
     84 + version "3.1.6"
     85 + resolved "https://registry.yarnpkg.com/dom-lib/-/dom-lib-3.1.6.tgz#4e69d6d033dc75491ed0513d2c32d0742b1721e2"
     86 + integrity sha512-xXEhStHDoAyfhnz8mqDwZ9rnqdqz/9BcrKd1UEw6BlA/l17emFb2dK7q8IX8ArU31pScSU9otEnL6wzvpoT5aw==
     87 + dependencies:
     88 + "@babel/runtime" "^7.20.0"
     89 + 
     90 +insert-css@^2.0.0:
     91 + version "2.0.0"
     92 + resolved "https://registry.yarnpkg.com/insert-css/-/insert-css-2.0.0.tgz#eb5d1097b7542f4c79ea3060d3aee07d053880f4"
     93 + integrity sha512-xGq5ISgcUP5cvGkS2MMFLtPDBtrtQPSFfC6gA6U8wHKqfjTIMZLZNxOItQnoSjdOzlXOLU/yD32RKC4SvjNbtA==
     94 + 
     95 +"js-tokens@^3.0.0 || ^4.0.0":
     96 + version "4.0.0"
     97 + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
     98 + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
     99 + 
     100 +lodash@^4.17.11, lodash@^4.17.20, lodash@^4.17.21:
     101 + version "4.17.21"
     102 + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
     103 + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
     104 + 
     105 +loose-envify@^1.4.0:
     106 + version "1.4.0"
     107 + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
     108 + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
     109 + dependencies:
     110 + js-tokens "^3.0.0 || ^4.0.0"
     111 + 
     112 +"memoize-one@>=3.1.1 <6":
     113 + version "5.2.1"
     114 + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e"
     115 + integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==
     116 + 
     117 +object-assign@^4.1.1:
     118 + version "4.1.1"
     119 + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
     120 + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
     121 + 
     122 +prop-types@^15.8.1:
     123 + version "15.8.1"
     124 + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
     125 + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
     126 + dependencies:
     127 + loose-envify "^1.4.0"
     128 + object-assign "^4.1.1"
     129 + react-is "^16.13.1"
     130 + 
     131 +react-is@^16.13.1:
     132 + version "16.13.1"
     133 + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
     134 + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
     135 + 
     136 +react-is@^17.0.2:
     137 + version "17.0.2"
     138 + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
     139 + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
     140 + 
     141 +react-window@^1.8.8:
     142 + version "1.8.8"
     143 + resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.8.tgz#1b52919f009ddf91970cbdb2050a6c7be44df243"
     144 + integrity sha512-D4IiBeRtGXziZ1n0XklnFGu7h9gU684zepqyKzgPNzrsrk7xOCxni+TCckjg2Nr/DiaEEGVVmnhYSlT2rB47dQ==
     145 + dependencies:
     146 + "@babel/runtime" "^7.0.0"
     147 + memoize-one ">=3.1.1 <6"
     148 + 
     149 +regenerator-runtime@^0.13.11:
     150 + version "0.13.11"
     151 + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
     152 + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
     153 + 
     154 +rsuite-table@^5.8.2:
     155 + version "5.8.2"
     156 + resolved "https://registry.yarnpkg.com/rsuite-table/-/rsuite-table-5.8.2.tgz#3ddfbcd8fc99e0653a81484fe33b13fc7a1e843b"
     157 + integrity sha512-rHNMTwQaaesbH5t3ZvZ37mVRLLL+M7UGdTTALOp9HIAUaECM5W/DEcFVWeaEJQFe3U/C58lj0zB41R3VgsNRKA==
     158 + dependencies:
     159 + "@babel/runtime" "^7.12.5"
     160 + "@juggle/resize-observer" "^3.3.1"
     161 + "@rsuite/icons" "^1.0.0"
     162 + classnames "^2.3.1"
     163 + dom-lib "^3.1.3"
     164 + lodash "^4.17.21"
     165 + react-is "^17.0.2"
     166 + 
     167 +rsuite@^5.27.0:
     168 + version "5.27.0"
     169 + resolved "https://registry.yarnpkg.com/rsuite/-/rsuite-5.27.0.tgz#36099e4b055393d36d69fe1303b76c42a96530d0"
     170 + integrity sha512-JydAsqby30x6M7CfHHQ0GGnmrAcD4cYNNzKosdP3/jnBZzCrJprlyJ5U0ISVxL7rh4IiHMVQYfp0PW3v1idwLw==
     171 + dependencies:
     172 + "@babel/runtime" "^7.20.1"
     173 + "@juggle/resize-observer" "^3.4.0"
     174 + "@rsuite/icons" "^1.0.2"
     175 + "@types/chai" "^4.3.3"
     176 + "@types/lodash" "^4.14.184"
     177 + "@types/prop-types" "^15.7.5"
     178 + "@types/react-window" "^1.8.5"
     179 + classnames "^2.3.1"
     180 + date-fns "^2.29.3"
     181 + dom-lib "^3.1.3"
     182 + lodash "^4.17.11"
     183 + prop-types "^15.8.1"
     184 + react-window "^1.8.8"
     185 + rsuite-table "^5.8.2"
     186 + schema-typed "^2.0.3"
     187 + 
     188 +schema-typed@^2.0.3:
     189 + version "2.0.3"
     190 + resolved "https://registry.yarnpkg.com/schema-typed/-/schema-typed-2.0.3.tgz#bfd84b31fbb2d13e748736637281032d8bcb2be8"
     191 + integrity sha512-4KckVnJjTtVugYpSAoQrcH4quE4yIVTvI/nHEqtwdceBr/ZCuH2LfV8/gaZFrYU7cwwyufLKaswt28aqQ1T9ww==
     192 + dependencies:
     193 + "@babel/runtime" "^7.16.0"
     194 + 
Please wait...
Page is in error, reload to recover