From f3f09f6deb71d4769a3d5772defc8817be21148b Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Wed, 23 Aug 2023 16:04:32 +0200 Subject: [PATCH 01/57] create mobile size for start screen --- src/index.css | 1 + .../SmartContainer/SmartContainer.module.css | 5 ++ src/ui/StartScreen/StartScreen.module.css | 56 +++++++++---------- 3 files changed, 34 insertions(+), 28 deletions(-) diff --git a/src/index.css b/src/index.css index 5838fae1..00997e55 100644 --- a/src/index.css +++ b/src/index.css @@ -11,6 +11,7 @@ body { margin: 0; padding: 0; font-family: 'Inter', sans-serif; + font-size: 15px; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; height: 100vh; diff --git a/src/ui/StartScreen/SmartContainer/SmartContainer.module.css b/src/ui/StartScreen/SmartContainer/SmartContainer.module.css index 0dcb2277..509aa132 100644 --- a/src/ui/StartScreen/SmartContainer/SmartContainer.module.css +++ b/src/ui/StartScreen/SmartContainer/SmartContainer.module.css @@ -54,3 +54,8 @@ background-position: 100% 0, 0 100%, 0 0, 100% 100%; } } + +.buttons_toolbar { + display: flex; + flex-direction: column; +} diff --git a/src/ui/StartScreen/StartScreen.module.css b/src/ui/StartScreen/StartScreen.module.css index c2ca3472..3dad40ae 100644 --- a/src/ui/StartScreen/StartScreen.module.css +++ b/src/ui/StartScreen/StartScreen.module.css @@ -4,52 +4,52 @@ flex-direction: column; align-items: center; height: 100%; + padding: 0 2rem; } .header_text { - margin: 0; - margin-top: 40px; font-weight: 400; - font-size: 30px; + font-size: 2rem; line-height: 36.31px; color: var(--white); } -.subheader { - margin: 0; - display: flex; - flex-direction: column-reverse; - align-items: center; - justify-content: center; -} - .subheader_text { - margin: 0; - margin-bottom: 10px; - opacity: 0.6; - font-size: 14px; - line-height: 36.31px; - font-weight: 400; - text-align: center; - color: var(--white); + display: none; } - -.github_link { - margin-right: 10px; +.subheader svg { + display: none; } -.container { - margin-top: 30px; -} @media screen and (min-width: 768px) { .subheader { - flex-direction: row; + margin: 0; + display: flex; + flex-direction: column-reverse; + align-items: center; + justify-content: center; } .subheader_text { margin: 0; - margin-left: 10px; - text-align: left; + margin-bottom: 10px; + opacity: 0.6; + font-size: 14px; + line-height: 36.31px; + font-weight: 400; + text-align: center; + color: var(--white); } + + .github_link { + margin-right: 10px; + } + + .container { + margin-top: 30px; + } + + } + From 8ed06f47ba25f10a3d78c749d2ab035c5d803129 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Wed, 23 Aug 2023 16:58:35 +0200 Subject: [PATCH 02/57] create mobile size for start screen --- .../SmartContainer/SmartContainer.jsx | 6 +++++- .../SmartContainer/SmartContainer.module.css | 20 ++++++++++--------- src/ui/StartScreen/StartScreen.module.css | 4 ++++ 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/ui/StartScreen/SmartContainer/SmartContainer.jsx b/src/ui/StartScreen/SmartContainer/SmartContainer.jsx index 02775944..d1064013 100644 --- a/src/ui/StartScreen/SmartContainer/SmartContainer.jsx +++ b/src/ui/StartScreen/SmartContainer/SmartContainer.jsx @@ -25,8 +25,11 @@ class SmartContainer extends FileReader { } componentDidMount() { - const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent); + //const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent); + //console.log(navigator.userAgent); + const isMobile = window.innerWidth <= 768; this.setState({ isMobile }); + console.log(isMobile); } handleDrag(e) { @@ -47,6 +50,7 @@ class SmartContainer extends FileReader { render() { const { isMobile } = this.state; + console.log(isMobile); return (
Date: Wed, 23 Aug 2023 17:20:32 +0200 Subject: [PATCH 03/57] create mobile size for start screen --- src/ui/StartScreen/SmartContainer/SmartContainer.jsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ui/StartScreen/SmartContainer/SmartContainer.jsx b/src/ui/StartScreen/SmartContainer/SmartContainer.jsx index d1064013..f627108e 100644 --- a/src/ui/StartScreen/SmartContainer/SmartContainer.jsx +++ b/src/ui/StartScreen/SmartContainer/SmartContainer.jsx @@ -25,9 +25,8 @@ class SmartContainer extends FileReader { } componentDidMount() { - //const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent); + const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent); //console.log(navigator.userAgent); - const isMobile = window.innerWidth <= 768; this.setState({ isMobile }); console.log(isMobile); } From 41394df5f722ee7145862aa0456226f5b9f662b9 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Wed, 23 Aug 2023 18:31:18 +0200 Subject: [PATCH 04/57] add resize depends on screen --- .../StartScreen/SmartContainer/SmartContainer.jsx | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/ui/StartScreen/SmartContainer/SmartContainer.jsx b/src/ui/StartScreen/SmartContainer/SmartContainer.jsx index f627108e..423a0787 100644 --- a/src/ui/StartScreen/SmartContainer/SmartContainer.jsx +++ b/src/ui/StartScreen/SmartContainer/SmartContainer.jsx @@ -25,8 +25,10 @@ class SmartContainer extends FileReader { } componentDidMount() { - const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent); + const isMobile = window.innerWidth < 768; + //const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent); //console.log(navigator.userAgent); + window.addEventListener('resize', this.handleWindowResize); this.setState({ isMobile }); console.log(isMobile); } @@ -47,6 +49,15 @@ class SmartContainer extends FileReader { this.handleFileSelected(e); } + handleWindowResize = () => { + const isMobile = window.innerWidth < 768; + this.setState({ isMobile }); + }; + + componentWillUnmount() { + window.removeEventListener('resize', this.handleWindowResize); + } + render() { const { isMobile } = this.state; console.log(isMobile); From 829715630437ef8835ba2eeea5b3646b20072fd7 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Sun, 27 Aug 2023 18:59:19 +0200 Subject: [PATCH 05/57] add bottom menu --- src/engine/Graphics2d.js | 4 +- src/ui/BottomMenu/BottomMenu.jsx | 19 ++++ src/ui/BottomMenu/BottomMenu.module.css | 4 + src/ui/Button/Button.module.css | 125 ++++++++++++++++++++++++ src/ui/Layout/Container.module.css | 64 ++++++++---- src/ui/Main.jsx | 2 + src/ui/Main.module.css | 106 ++++++++++++++------ src/ui/Modals/Modals.module.css | 2 + src/ui/Tooltip/Tooltip.module.css | 2 +- 9 files changed, 280 insertions(+), 48 deletions(-) create mode 100644 src/ui/BottomMenu/BottomMenu.jsx create mode 100644 src/ui/BottomMenu/BottomMenu.module.css diff --git a/src/engine/Graphics2d.js b/src/engine/Graphics2d.js index 02807fd8..ede63679 100644 --- a/src/engine/Graphics2d.js +++ b/src/engine/Graphics2d.js @@ -696,7 +696,9 @@ class Graphics2d extends React.Component { justifyContent: 'flex-start', width: `calc(100% - 110px)`, height: `calc(100% - 110px)`, - margin: '100px 125px', + // TODO check that + //margin: '100px 125px', + margin: '5rem 0 4rem 5rem', }; const canvasStyles = { maxWidth: '100%', diff --git a/src/ui/BottomMenu/BottomMenu.jsx b/src/ui/BottomMenu/BottomMenu.jsx new file mode 100644 index 00000000..1a2cfb17 --- /dev/null +++ b/src/ui/BottomMenu/BottomMenu.jsx @@ -0,0 +1,19 @@ +import React from 'react'; +import { UIButton } from '../Button/Button'; +import { Tooltip } from '../Tooltip/Tooltip'; + +export const BottomMenu = () => { + return ( +
+ + + + + + + + + +
+ ); +}; diff --git a/src/ui/BottomMenu/BottomMenu.module.css b/src/ui/BottomMenu/BottomMenu.module.css new file mode 100644 index 00000000..b0370c43 --- /dev/null +++ b/src/ui/BottomMenu/BottomMenu.module.css @@ -0,0 +1,4 @@ +.bottomMenu { + display: block; + height: 30px; +} \ No newline at end of file diff --git a/src/ui/Button/Button.module.css b/src/ui/Button/Button.module.css index d9e75930..18022f15 100644 --- a/src/ui/Button/Button.module.css +++ b/src/ui/Button/Button.module.css @@ -2,7 +2,13 @@ * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) * SPDX-License-Identifier: Apache-2.0 */ +@media screen and (max-width: 767px) { + .reset { + display: flex; + justify-content: end; + } +} .reset { display: inline-block; border: none; @@ -108,3 +114,122 @@ .button.accent.active svg { fill: var(--black); } + +.button:not(.reset) { + display: block; +} +@media screen and (min-width: 748px) { + .button:not(.reset) { + display: block; + } + +} +@media screen and (min-width: 1024px) { + .reset { + display: inline-block; + border: none; + margin: 0; + text-decoration: none; + background-color: transparent; + padding: 0; + cursor: pointer; + transition: all 250ms ease-in-out, transform 150ms ease; + -webkit-appearance: none; + -moz-appearance: none; + } + + .reset:focus { + outline: none; + } + + .button { + margin-right: 5px; + margin-bottom: 5px; + background-color: var(--black); + padding: 12px 13px; + color: var(--white); + font-family: inherit; + text-align: center; + vertical-align: center; + font-size: 14px; + border-radius: 36px; + } + + .button > svg { + width: 24px; + height: 24px; + } + + .rounded { + overflow: hidden; + border-radius: 50%; + } + + .captionButton { + padding: 5px 10px; + font-size: 16px; + line-height: 1.5; + } + + .button svg { + fill: var(--white); + } + + .button:hover, + .button:focus { + background-color: var(--light-orange); + } + + .button.active { + color: var(--red); + } + + .apply { + background-color: var(--red); + border-radius: 4px; + } + + .button.active svg { + fill: var(--red); + } + + .button.light { + color: var(--black); + background-color: var(--light); + } + + .button.light svg { + fill: var(--black); + } + + .button.light.active { + color: var(--red); + } + + .button.light:hover, + .button.light:focus { + background-color: var(--light); + filter: brightness(80%); + } + + .button.accent { + color: var(--white); + background-color: var(--red); + } + + .button.accent svg { + fill: var(--white); + } + + .button.accent:hover, + .button.accent:focus { + background-color: var(--red); + filter: brightness(85%); + } + + .button.accent.active svg { + fill: var(--black); + } + +} + diff --git a/src/ui/Layout/Container.module.css b/src/ui/Layout/Container.module.css index 5dccd630..360144bf 100644 --- a/src/ui/Layout/Container.module.css +++ b/src/ui/Layout/Container.module.css @@ -2,27 +2,55 @@ * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) * SPDX-License-Identifier: Apache-2.0 */ - -.container { - display: inline-flex; - flex-wrap: wrap; - width: fit-content; - border-radius: 10px; - overflow: hidden; +.horizontal { + display: block; } - -.vertical { - flex-direction: column; - width: 50px; +/** check!!! */ +.container button { + display: none; +} +.container button > svg #clear { + display: block; } -.vertical:not(:first-child) { - margin-top: 25px; +@media screen and (min-width: 768px) { + + .container { + display: inline-flex; + flex-wrap: wrap; + width: fit-content; + border-radius: 10px; + overflow: hidden; + } + + .vertical { + flex-direction: column; + width: 50px; + } + + .vertical:not(:first-child) { + margin-top: 25px; + } + + .container button { + display: flex; + } + + .horizontal { + display: none; + } + } -.horizontal { - flex-direction: row; - flex-shrink: 0; - height: 50px; - margin: 0 25px 0 0; +@media screen and (min-width: 1024px) { + .horizontal { + display: flex; + flex-direction: row; + flex-shrink: 0; + height: 50px; + margin: 0 25px 0 0; + } } + + + diff --git a/src/ui/Main.jsx b/src/ui/Main.jsx index ca9d5dfb..e5455d22 100644 --- a/src/ui/Main.jsx +++ b/src/ui/Main.jsx @@ -30,6 +30,7 @@ import StartScreen from './StartScreen/StartScreen'; import css from './Main.module.css'; import cx from 'classnames'; import '../nouislider-custom.css'; +import { BottomMenu } from './BottomMenu/BottomMenu'; export const Main = () => { const dispatch = useDispatch(); @@ -186,6 +187,7 @@ export const Main = () => {
{viewMode === ModeView.VIEW_2D ? : }
{viewMode === ModeView.VIEW_2D && }
+
)} {arrErrors.length > 0 && } diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css index 1c359edb..15eb7ef5 100644 --- a/src/ui/Main.module.css +++ b/src/ui/Main.module.css @@ -2,6 +2,7 @@ * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) * SPDX-License-Identifier: Apache-2.0 */ +/* mobile*/ .app { position: relative; @@ -11,7 +12,6 @@ display: flex; align-items: center; position: relative; - margin: 25px 25px 0; z-index: 1000; } @@ -19,18 +19,14 @@ margin-right: 25px; } -.header__panels { - display: flex; - z-index: 1000; - margin-top: 17px; -} + .header__right { display: flex; flex-wrap: nowrap; align-items: center; margin-left: auto; - margin-top: 17px; + } .fullscreen .header__panels { @@ -52,31 +48,22 @@ z-index: 900; } -.center { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - z-index: 10; -} .settings { - display: flex; - flex-direction: column; - z-index: 800; - position: absolute; - right: 25px; - top: 100px; - background-color: var(--dark-gray); - padding: 25px; - width: 400px; - opacity: var(--opacity); - cursor: all-scroll; - border-radius: 24px; - transition: opacity 300ms ease-in-out; + display: none; +} + +.center div { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 10; + } + .bottleft { display: flex; flex-direction: column; @@ -84,4 +71,67 @@ left: 25px; bottom: 25px; z-index: 1000; +} + +@media screen and (min-width: 768px) { + + .header { + display: flex; + align-items: center; + position: relative; + padding: 1rem; + z-index: 1000; + } + + .settings { + display: flex; + flex-direction: column; + z-index: 800; + position: absolute; + right: 25px; + top: 100px; + background-color: var(--dark-gray); + padding: 25px; + width: 400px; + opacity: var(--opacity); + cursor: all-scroll; + border-radius: 24px; + transition: opacity 300ms ease-in-out; + } + + .center { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 10; + } + + + +} +@media screen and (min-width: 1024px) { + + .header__panels { + display: flex; + } + + .settings { + display: flex; + flex-direction: column; + z-index: 800; + position: absolute; + right: 25px; + top: 100px; + background-color: var(--dark-gray); + padding: 25px; + width: 400px; + opacity: var(--opacity); + cursor: all-scroll; + border-radius: 24px; + transition: opacity 300ms ease-in-out; + } + + } \ No newline at end of file diff --git a/src/ui/Modals/Modals.module.css b/src/ui/Modals/Modals.module.css index 0afc6112..b5e2dab3 100644 --- a/src/ui/Modals/Modals.module.css +++ b/src/ui/Modals/Modals.module.css @@ -157,6 +157,8 @@ margin-top: 8px; } + + @media screen and (min-width: 768px) { .modal { width: 600px; diff --git a/src/ui/Tooltip/Tooltip.module.css b/src/ui/Tooltip/Tooltip.module.css index cfd17829..49e11f45 100644 --- a/src/ui/Tooltip/Tooltip.module.css +++ b/src/ui/Tooltip/Tooltip.module.css @@ -56,4 +56,4 @@ .tooltip[data-popper-placement^='right']>.arrow { left: -6px; -} \ No newline at end of file +} From 9a8a7b6716ca6040f551e77a90dc394489c42e56 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Tue, 29 Aug 2023 15:28:37 +0200 Subject: [PATCH 06/57] add response to canvas for devices --- src/engine/Graphics2d.js | 16 ++++++---- src/index.css | 1 + src/ui/BottomMenu/BottomMenu.jsx | 18 ++++++----- src/ui/BottomMenu/BottomMenu.module.css | 42 +++++++++++++++++++++++-- src/ui/Button/Button.module.css | 1 + src/ui/Main.jsx | 2 +- src/ui/Main.module.css | 3 +- 7 files changed, 66 insertions(+), 17 deletions(-) diff --git a/src/engine/Graphics2d.js b/src/engine/Graphics2d.js index ede63679..fa11427e 100644 --- a/src/engine/Graphics2d.js +++ b/src/engine/Graphics2d.js @@ -693,14 +693,18 @@ class Graphics2d extends React.Component { const wrapperStyles = { display: 'flex', - justifyContent: 'flex-start', - width: `calc(100% - 110px)`, - height: `calc(100% - 110px)`, - // TODO check that - //margin: '100px 125px', - margin: '5rem 0 4rem 5rem', + justifyContent: 'center', + width: '100%', + height: '100%', }; + + if (window.innerWidth > 768) { + wrapperStyles.width = `calc(100% - 110px)`; + wrapperStyles.height = `calc(100% - 110px)`; + wrapperStyles.margin = '6rem'; + } const canvasStyles = { + display: 'block', maxWidth: '100%', border: '2px solid #dc5e47', borderRadius: '10px', diff --git a/src/index.css b/src/index.css index 00997e55..1c325689 100644 --- a/src/index.css +++ b/src/index.css @@ -29,6 +29,7 @@ code { --black: #18191b; /* Additional colors */ + --beige: #f4f2ea; --gray: #636666; --dark-gray: #282a2d; --dark-gray2: #46494e; diff --git a/src/ui/BottomMenu/BottomMenu.jsx b/src/ui/BottomMenu/BottomMenu.jsx index 1a2cfb17..10f6c00b 100644 --- a/src/ui/BottomMenu/BottomMenu.jsx +++ b/src/ui/BottomMenu/BottomMenu.jsx @@ -1,18 +1,22 @@ import React from 'react'; import { UIButton } from '../Button/Button'; import { Tooltip } from '../Tooltip/Tooltip'; +import css from './BottomMenu.module.css'; export const BottomMenu = () => { return ( -
- - +
+ + - - + + - - + + + + +
); diff --git a/src/ui/BottomMenu/BottomMenu.module.css b/src/ui/BottomMenu/BottomMenu.module.css index b0370c43..83e3825b 100644 --- a/src/ui/BottomMenu/BottomMenu.module.css +++ b/src/ui/BottomMenu/BottomMenu.module.css @@ -1,4 +1,42 @@ + .bottomMenu { - display: block; - height: 30px; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 50px; + padding: 1rem; + background-color: var(--beige); + display: flex; + align-items: center; + justify-content: center; + z-index: 20; +} + + .button { + background: inherit; + border: none; + color: var(--black); + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-evenly; + font-size: 0.75rem; + line-height: 12.1px; + } + +.button svg { + fill: var(--black); +} + +@media screen and (min-width: 768px) { + .bottomMenu { + display: none; + } +} + +@media screen and (min-width: 1024px) { + .bottomMenu { + display: none; + } } \ No newline at end of file diff --git a/src/ui/Button/Button.module.css b/src/ui/Button/Button.module.css index 18022f15..a7b60668 100644 --- a/src/ui/Button/Button.module.css +++ b/src/ui/Button/Button.module.css @@ -118,6 +118,7 @@ .button:not(.reset) { display: block; } + @media screen and (min-width: 748px) { .button:not(.reset) { display: block; diff --git a/src/ui/Main.jsx b/src/ui/Main.jsx index e5455d22..318c9b69 100644 --- a/src/ui/Main.jsx +++ b/src/ui/Main.jsx @@ -26,11 +26,11 @@ import { LeftToolbar } from './LeftToolbar/LeftToolbar'; import { useDispatch, useSelector } from 'react-redux'; import { TopToolbar } from './TopToolbar/TopToolbar'; import { UiAbout } from './Header/UiAbout'; +import { BottomMenu } from './BottomMenu/BottomMenu'; import StartScreen from './StartScreen/StartScreen'; import css from './Main.module.css'; import cx from 'classnames'; import '../nouislider-custom.css'; -import { BottomMenu } from './BottomMenu/BottomMenu'; export const Main = () => { const dispatch = useDispatch(); diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css index 15eb7ef5..8409e4a8 100644 --- a/src/ui/Main.module.css +++ b/src/ui/Main.module.css @@ -63,7 +63,6 @@ } - .bottleft { display: flex; flex-direction: column; @@ -115,6 +114,8 @@ .header__panels { display: flex; + align-items: center; + padding: 1rem; } .settings { From 3344e821b77cd70c0e8d46ce946659616b1eaf20 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Tue, 29 Aug 2023 17:05:43 +0200 Subject: [PATCH 07/57] removed background for buttons into start screen --- src/ui/Main.module.css | 4 +--- .../StartScreen/SmartContainer/SmartContainer.module.css | 8 ++++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css index 8409e4a8..d8996568 100644 --- a/src/ui/Main.module.css +++ b/src/ui/Main.module.css @@ -49,9 +49,7 @@ } -.settings { - display: none; -} + .center div { position: absolute; diff --git a/src/ui/StartScreen/SmartContainer/SmartContainer.module.css b/src/ui/StartScreen/SmartContainer/SmartContainer.module.css index 28c93e62..0a2f451a 100644 --- a/src/ui/StartScreen/SmartContainer/SmartContainer.module.css +++ b/src/ui/StartScreen/SmartContainer/SmartContainer.module.css @@ -1,14 +1,12 @@ .smart_container { margin: 0 1rem; padding: 1.05rem 1rem 1rem; - background-color: var(--black); border: none; border-radius: 8px; display: flex; flex-direction: column; align-items: center; position: relative; - border: 2px dashed transparent; transition: 0.25s all ease; } @@ -22,6 +20,10 @@ justify-content: space-between; } +.buttons_toolbar button { + background-color: inherit; +} + .button_start_screen { display: flex; flex-direction: column; @@ -35,6 +37,8 @@ @media screen and (min-width: 768px) { .smart_container { margin: 0; + background-color: var(--black); + border: 2px dashed transparent; } .button_start_screen { From 5d9cfa30e7b02b5de23fb6082a6fc5a6941932bd Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Wed, 30 Aug 2023 16:03:01 +0200 Subject: [PATCH 08/57] worked with settings component and states into main mobile screen --- src/ui/Layout/Container.module.css | 4 +--- src/ui/Main.jsx | 17 +++++++++++++++++ src/ui/Main.module.css | 27 ++++++++++++++++++++------- 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/ui/Layout/Container.module.css b/src/ui/Layout/Container.module.css index 360144bf..c9fd52e9 100644 --- a/src/ui/Layout/Container.module.css +++ b/src/ui/Layout/Container.module.css @@ -6,9 +6,7 @@ display: block; } /** check!!! */ -.container button { - display: none; -} + .container button > svg #clear { display: block; } diff --git a/src/ui/Main.jsx b/src/ui/Main.jsx index 318c9b69..9d1e0446 100644 --- a/src/ui/Main.jsx +++ b/src/ui/Main.jsx @@ -31,6 +31,8 @@ import StartScreen from './StartScreen/StartScreen'; import css from './Main.module.css'; import cx from 'classnames'; import '../nouislider-custom.css'; +import { UIButton } from './Button/Button'; +import { Tooltip } from './Tooltip/Tooltip'; export const Main = () => { const dispatch = useDispatch(); @@ -55,6 +57,7 @@ export const Main = () => { ); const isReady = isLoaded && isWebGl20supported; + const isMobile = window.innerWidth <= 768; const onShowModalText = () => { dispatch({ type: StoreActionType.SET_MODAL_TEXT, showModalText: true }); @@ -165,6 +168,12 @@ export const Main = () => {
handleFullMode()} />
+
+ + + + +
)} @@ -177,6 +186,14 @@ export const Main = () => { ) : ( )} + {isReady && !isMobile && !isFullMode && ( +
+ + + + +
+ )} {isReady && (
diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css index d8996568..67355d59 100644 --- a/src/ui/Main.module.css +++ b/src/ui/Main.module.css @@ -20,7 +20,6 @@ } - .header__right { display: flex; flex-wrap: nowrap; @@ -39,6 +38,24 @@ top: 20px; } +.settings__mobile { + width: 50px; + height: 50px; + background-color: green; + display: flex; + +} + +.settings__mobile div button { + background-color: red; + display: block; +} + +.settings__mobile div button svg { + background-color: red; + display: block; +} + .left { display: flex; flex-direction: column; @@ -49,8 +66,6 @@ } - - .center div { position: absolute; top: 0; @@ -69,7 +84,7 @@ bottom: 25px; z-index: 1000; } - +/* @media screen and (min-width: 768px) { .header { @@ -106,8 +121,7 @@ } - -} +}*/ @media screen and (min-width: 1024px) { .header__panels { @@ -132,5 +146,4 @@ transition: opacity 300ms ease-in-out; } - } \ No newline at end of file From 84586f28fae437b41e14dc14c613bbac940b8fa9 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Fri, 1 Sep 2023 19:51:41 +0200 Subject: [PATCH 09/57] removed prior version of mobile bottom menu as new component; created new mobile menu using css; --- src/ui/BottomMenu/BottomMenu.jsx | 23 ------- src/ui/BottomMenu/BottomMenu.module.css | 42 ------------- src/ui/Button/Button.module.css | 22 ++++++- src/ui/Layout/Container.module.css | 17 ++++- src/ui/Main.jsx | 21 ------- src/ui/Main.module.css | 82 ++++++++++++++++--------- src/ui/OpenFile/UISaveMenu.module.css | 10 +++ src/ui/OpenFile/UiOpenMenu.jsx | 6 +- src/ui/OpenFile/UiOpenMenu.module.css | 25 +++++++- src/ui/OpenFile/UiReportMenu.js | 22 ++++++- src/ui/OpenFile/UiSaveMenu.js | 11 +++- src/ui/Tooltip/Tooltip.module.css | 7 +++ 12 files changed, 165 insertions(+), 123 deletions(-) delete mode 100644 src/ui/BottomMenu/BottomMenu.jsx delete mode 100644 src/ui/BottomMenu/BottomMenu.module.css create mode 100644 src/ui/OpenFile/UISaveMenu.module.css diff --git a/src/ui/BottomMenu/BottomMenu.jsx b/src/ui/BottomMenu/BottomMenu.jsx deleted file mode 100644 index 10f6c00b..00000000 --- a/src/ui/BottomMenu/BottomMenu.jsx +++ /dev/null @@ -1,23 +0,0 @@ -import React from 'react'; -import { UIButton } from '../Button/Button'; -import { Tooltip } from '../Tooltip/Tooltip'; -import css from './BottomMenu.module.css'; - -export const BottomMenu = () => { - return ( -
- - - - - - - - - - - - -
- ); -}; diff --git a/src/ui/BottomMenu/BottomMenu.module.css b/src/ui/BottomMenu/BottomMenu.module.css deleted file mode 100644 index 83e3825b..00000000 --- a/src/ui/BottomMenu/BottomMenu.module.css +++ /dev/null @@ -1,42 +0,0 @@ - -.bottomMenu { - position: absolute; - bottom: 0; - left: 0; - right: 0; - height: 50px; - padding: 1rem; - background-color: var(--beige); - display: flex; - align-items: center; - justify-content: center; - z-index: 20; -} - - .button { - background: inherit; - border: none; - color: var(--black); - display: flex; - flex-direction: column; - align-items: center; - justify-content: space-evenly; - font-size: 0.75rem; - line-height: 12.1px; - } - -.button svg { - fill: var(--black); -} - -@media screen and (min-width: 768px) { - .bottomMenu { - display: none; - } -} - -@media screen and (min-width: 1024px) { - .bottomMenu { - display: none; - } -} \ No newline at end of file diff --git a/src/ui/Button/Button.module.css b/src/ui/Button/Button.module.css index a7b60668..2bce403c 100644 --- a/src/ui/Button/Button.module.css +++ b/src/ui/Button/Button.module.css @@ -2,11 +2,31 @@ * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) * SPDX-License-Identifier: Apache-2.0 */ -@media screen and (max-width: 767px) { +.button.screenshot__link { + background: #438f56; +} + +.button.light svg { + fill: var(--black); +} + +@media screen and (min-width: 768px) { .reset { display: flex; justify-content: end; } + /* + .reset { + background: inherit; + border: none; + color: var(--black); + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-evenly; + font-size: 0.75rem; +} + */ } .reset { diff --git a/src/ui/Layout/Container.module.css b/src/ui/Layout/Container.module.css index c9fd52e9..8441e756 100644 --- a/src/ui/Layout/Container.module.css +++ b/src/ui/Layout/Container.module.css @@ -2,14 +2,29 @@ * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) * SPDX-License-Identifier: Apache-2.0 */ +.vertical { + display: none; +} + .horizontal { display: block; } -/** check!!! */ .container button > svg #clear { display: block; } +.container { + display: inline-flex; + flex-wrap: wrap; + width: fit-content; + border-radius: 10px; + overflow: hidden; +} + +.horizontal button > svg > use[xlinkHref$="#folder"] { + /* Ваши стили для скрытия элемента */ + display: none; +} @media screen and (min-width: 768px) { diff --git a/src/ui/Main.jsx b/src/ui/Main.jsx index 9d1e0446..17dccb74 100644 --- a/src/ui/Main.jsx +++ b/src/ui/Main.jsx @@ -26,13 +26,10 @@ import { LeftToolbar } from './LeftToolbar/LeftToolbar'; import { useDispatch, useSelector } from 'react-redux'; import { TopToolbar } from './TopToolbar/TopToolbar'; import { UiAbout } from './Header/UiAbout'; -import { BottomMenu } from './BottomMenu/BottomMenu'; import StartScreen from './StartScreen/StartScreen'; import css from './Main.module.css'; import cx from 'classnames'; import '../nouislider-custom.css'; -import { UIButton } from './Button/Button'; -import { Tooltip } from './Tooltip/Tooltip'; export const Main = () => { const dispatch = useDispatch(); @@ -57,8 +54,6 @@ export const Main = () => { ); const isReady = isLoaded && isWebGl20supported; - const isMobile = window.innerWidth <= 768; - const onShowModalText = () => { dispatch({ type: StoreActionType.SET_MODAL_TEXT, showModalText: true }); }; @@ -168,12 +163,6 @@ export const Main = () => {
handleFullMode()} />
-
- - - - -
)} @@ -186,15 +175,6 @@ export const Main = () => { ) : ( )} - {isReady && !isMobile && !isFullMode && ( -
- - - - -
- )} - {isReady && (
@@ -204,7 +184,6 @@ export const Main = () => {
{viewMode === ModeView.VIEW_2D ? : }
{viewMode === ModeView.VIEW_2D && }
-
)} {arrErrors.length > 0 && } diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css index 67355d59..369ce329 100644 --- a/src/ui/Main.module.css +++ b/src/ui/Main.module.css @@ -8,26 +8,55 @@ position: relative; } -.header { +/*.header { display: flex; align-items: center; position: relative; z-index: 1000; +}*/ + +.header { + display: flex; + align-items: center; + z-index: 1000; } .header__logo { margin-right: 25px; } - .header__right { + position: absolute; + bottom: 0; display: flex; - flex-wrap: nowrap; + justify-content: center; + flex-direction: row-reverse; + z-index: 1000; + width: 100vw; + right: 0; + height: 50px; + padding: 1rem; + background-color: var(--beige); align-items: center; - margin-left: auto; +} +.header__right > button { + background: inherit; + border: none; + color: var(--black); + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-evenly; + font-size: 0.75rem; + line-height: 12.1px; } +.header__right button svg { + fill: var(--black); +} + + .fullscreen .header__panels { position: absolute; left: 75px; @@ -38,22 +67,8 @@ top: 20px; } -.settings__mobile { - width: 50px; - height: 50px; - background-color: green; - display: flex; - -} - -.settings__mobile div button { - background-color: red; - display: block; -} - -.settings__mobile div button svg { - background-color: red; - display: block; +.bottleft { + display: none; } .left { @@ -76,14 +91,6 @@ } -.bottleft { - display: flex; - flex-direction: column; - position: absolute; - left: 25px; - bottom: 25px; - z-index: 1000; -} /* @media screen and (min-width: 768px) { @@ -122,6 +129,25 @@ }*/ +@media screen and (min-width: 768px) { + .header__right { + display: flex; + flex-wrap: nowrap; + align-items: center; + margin-left: auto; + } + + .bottleft { + display: flex; + flex-direction: column; + position: absolute; + left: 25px; + bottom: 25px; + z-index: 1000; + } + +} + @media screen and (min-width: 1024px) { .header__panels { diff --git a/src/ui/OpenFile/UISaveMenu.module.css b/src/ui/OpenFile/UISaveMenu.module.css new file mode 100644 index 00000000..2101b345 --- /dev/null +++ b/src/ui/OpenFile/UISaveMenu.module.css @@ -0,0 +1,10 @@ +.button.download__link { + color: #18191b; + background: inherit; + display: flex; + flex-direction: column; + align-items: center; +} +.button.download__link svg { + fill: #18191b; +} \ No newline at end of file diff --git a/src/ui/OpenFile/UiOpenMenu.jsx b/src/ui/OpenFile/UiOpenMenu.jsx index ba41436e..5586f1fd 100644 --- a/src/ui/OpenFile/UiOpenMenu.jsx +++ b/src/ui/OpenFile/UiOpenMenu.jsx @@ -940,14 +940,14 @@ class UiOpenMenu extends FileReader { <> - this.onButtonOpenLocalFileClick(evt)} /> + this.onButtonOpenLocalFileClick(evt)} /> - + {NEED_DEMO_MENU && ( - + )} diff --git a/src/ui/OpenFile/UiOpenMenu.module.css b/src/ui/OpenFile/UiOpenMenu.module.css index dc180cf1..aa83bfef 100644 --- a/src/ui/OpenFile/UiOpenMenu.module.css +++ b/src/ui/OpenFile/UiOpenMenu.module.css @@ -3,8 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ + .save-file__area { - height: 50px; + height: 40px; display: flex; align-content: center; align-items: center; @@ -15,6 +16,28 @@ margin-right: 10px; } +.save-file__area div { + background: inherit; +} + .filename { gap: 8px; } + +.open-folder__link,.button.report-menu__report,.button.report-menu__camera { + background: inherit; + display: flex; + flex-direction: column; + align-items: center; + color: #18191b; +} + +.open-file__link, .open-demo__link { + display: none; +} + + @media screen and (min-width: 768px) { + .open-file__link, .open-demo__link { + display: block; + } + } \ No newline at end of file diff --git a/src/ui/OpenFile/UiReportMenu.js b/src/ui/OpenFile/UiReportMenu.js index 7df88cdd..9a6fe862 100644 --- a/src/ui/OpenFile/UiReportMenu.js +++ b/src/ui/OpenFile/UiReportMenu.js @@ -4,6 +4,8 @@ */ import React, { useState } from 'react'; +import cx from 'classnames'; +import css from './UiOpenMenu.module.css'; import Screenshot from '../../engine/utils/Screenshot'; import ViewMode from '../../store/ViewMode'; @@ -45,10 +47,26 @@ export const UiReportMenu = () => { return ( <> - + - + {showModalDicomTags && } diff --git a/src/ui/OpenFile/UiSaveMenu.js b/src/ui/OpenFile/UiSaveMenu.js index 8e8c0be0..fb5a40d1 100644 --- a/src/ui/OpenFile/UiSaveMenu.js +++ b/src/ui/OpenFile/UiSaveMenu.js @@ -10,6 +10,8 @@ import { useSelector } from 'react-redux'; import { UiModalSaveNifti } from '../Modals/UiModalSaveNifti'; import { UIButton } from '../Button/Button'; import { Tooltip } from '../Tooltip/Tooltip'; +import css from './UISaveMenu.module.css'; +import cx from 'classnames'; export const UiSaveMenu = () => { /** @@ -28,7 +30,14 @@ export const UiSaveMenu = () => { return ( <> - onModalSaveNiftiShow(evt)} mode={isLoaded ? 'accent' : ''} /> + onModalSaveNiftiShow(evt)} + mode={isLoaded ? 'accent' : ''} + /> diff --git a/src/ui/Tooltip/Tooltip.module.css b/src/ui/Tooltip/Tooltip.module.css index 49e11f45..fc7bf5f9 100644 --- a/src/ui/Tooltip/Tooltip.module.css +++ b/src/ui/Tooltip/Tooltip.module.css @@ -57,3 +57,10 @@ .tooltip[data-popper-placement^='right']>.arrow { left: -6px; } + + +@media screen and (min-width: 768px) { + .demo__link { + display: block; + } +} From a3744ae24a68e0021e65e4b8c64b30c22d781a3a Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Sun, 3 Sep 2023 21:48:35 +0200 Subject: [PATCH 10/57] add span to render text into buttons; changed canvas styles --- src/engine/Graphics2d.js | 35 ++++++-- src/ui/Button/Button.jsx | 2 +- src/ui/Button/Button.module.css | 8 -- src/ui/Layout/Container.module.css | 10 ++- src/ui/Main.jsx | 2 + src/ui/Main.module.css | 83 +++++++++++++++++-- src/ui/OpenFile/UISaveMenu.module.css | 11 +++ src/ui/OpenFile/UiOpenMenu.module.css | 33 ++++++-- src/ui/OpenFile/UiSaveMenu.js | 2 +- .../RecentlyFiles/RecentlyFiles.module.css | 55 ++++++++++++ src/ui/Tooltip/Tooltip.module.css | 2 + 11 files changed, 211 insertions(+), 32 deletions(-) diff --git a/src/engine/Graphics2d.js b/src/engine/Graphics2d.js index fa11427e..60f26d44 100644 --- a/src/engine/Graphics2d.js +++ b/src/engine/Graphics2d.js @@ -692,23 +692,42 @@ class Graphics2d extends React.Component { this.m_mode2d = this.props.mode2d; const wrapperStyles = { - display: 'flex', justifyContent: 'center', width: '100%', - height: '100%', + height: 'calc(100% - 3rem)', + overflow: 'scroll', }; - - if (window.innerWidth > 768) { - wrapperStyles.width = `calc(100% - 110px)`; - wrapperStyles.height = `calc(100% - 110px)`; - wrapperStyles.margin = '6rem'; + if (window.innerWidth < 768) { + wrapperStyles.width = `100%`; + wrapperStyles.height = `calc(100% - 5rem)`; + wrapperStyles.padding = `0`; + } + if (window.innerWidth >= 768) { + const isLandscape = window.matchMedia('(orientation: landscape)').matches; + + if (isLandscape) { + wrapperStyles.width = `calc(100% - 3rem)`; + wrapperStyles.height = `calc(100% - 3rem)`; + } else { + wrapperStyles.width = `100%`; + wrapperStyles.height = `100%`; + wrapperStyles.justifyContent = 'center'; + wrapperStyles.overflow = 'scroll'; + } } + const canvasStyles = { display: 'block', - maxWidth: '100%', + width: '150vw', border: '2px solid #dc5e47', borderRadius: '10px', }; + if (window.innerWidth < 768) { + canvasStyles.width = `150vw`; + canvasStyles.height = '100%'; + canvasStyles.margin = `0`; + canvasStyles.padding = `0`; + } return (
{icon ? : caption} - {text ? text : ''} + {text ? {text} : ''} ); }; diff --git a/src/ui/Button/Button.module.css b/src/ui/Button/Button.module.css index 2bce403c..bd58e6f6 100644 --- a/src/ui/Button/Button.module.css +++ b/src/ui/Button/Button.module.css @@ -2,9 +2,6 @@ * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) * SPDX-License-Identifier: Apache-2.0 */ -.button.screenshot__link { - background: #438f56; -} .button.light svg { fill: var(--black); @@ -139,12 +136,7 @@ display: block; } -@media screen and (min-width: 748px) { - .button:not(.reset) { - display: block; - } -} @media screen and (min-width: 1024px) { .reset { display: inline-block; diff --git a/src/ui/Layout/Container.module.css b/src/ui/Layout/Container.module.css index 8441e756..c1de1632 100644 --- a/src/ui/Layout/Container.module.css +++ b/src/ui/Layout/Container.module.css @@ -12,6 +12,7 @@ .container button > svg #clear { display: block; + color: #18191b; } .container { display: inline-flex; @@ -22,7 +23,6 @@ } .horizontal button > svg > use[xlinkHref$="#folder"] { - /* Ваши стили для скрытия элемента */ display: none; } @@ -63,6 +63,14 @@ height: 50px; margin: 0 25px 0 0; } + + .container button > svg #clear, + .container button > svg #edit { + display: block; + color: #18191b; + background: red; + } + } diff --git a/src/ui/Main.jsx b/src/ui/Main.jsx index 17dccb74..60febef1 100644 --- a/src/ui/Main.jsx +++ b/src/ui/Main.jsx @@ -30,6 +30,7 @@ import StartScreen from './StartScreen/StartScreen'; import css from './Main.module.css'; import cx from 'classnames'; import '../nouislider-custom.css'; +import RecentlyFiles from './StartScreen/RecentlyFiles/RecentlyFiles'; export const Main = () => { const dispatch = useDispatch(); @@ -159,6 +160,7 @@ export const Main = () => { {isReady && (
+
handleFullMode()} /> diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css index 369ce329..6b1463ef 100644 --- a/src/ui/Main.module.css +++ b/src/ui/Main.module.css @@ -24,6 +24,9 @@ .header__logo { margin-right: 25px; } +.header__panels { + display: none; +} .header__right { position: absolute; @@ -56,11 +59,11 @@ fill: var(--black); } - +/* .fullscreen .header__panels { position: absolute; left: 75px; -} +}*/ .fullscreen .left, .fullscreen .settings { @@ -72,12 +75,7 @@ } .left { - display: flex; - flex-direction: column; - position: absolute; - left: 25px; - top: 100px; - z-index: 900; + display: none; } @@ -90,6 +88,9 @@ z-index: 10; } +.settings { + display: none; +} /* @media screen and (min-width: 768px) { @@ -130,11 +131,46 @@ }*/ @media screen and (min-width: 768px) { + + .header { + display: flex; + align-items: flex-start; + position: relative; + padding: 1rem; + z-index: 1000; + } + + .header__logo { + margin-right: 25px; + } + + .header__panels { + display: flex; + align-items: center; + padding: 1rem; + } + .fullscreen .header__panels { + position: absolute; + left: 75px; + } + .header__right { display: flex; + justify-content: flex-start; flex-wrap: nowrap; align-items: center; margin-left: auto; + position: static; + background: inherit; + } + + .left { + display: flex; + flex-direction: column; + position: absolute; + left: 25px; + top: 100px; + z-index: 900; } .bottleft { @@ -146,16 +182,45 @@ z-index: 1000; } + + .settings { + display: none; + } + + .center { + position: absolute; + top: 6rem; + left: 5rem; + right: 0; + bottom: 0; + z-index: 10; + } + + } + @media screen and (min-width: 1024px) { + .header { + align-items: flex-start; + } + .header__panels { display: flex; + flex-wrap: wrap; align-items: center; padding: 1rem; } + .center { + top: 6rem; + left: 5rem; + right: 0; + bottom: 0; + z-index: 10; + } + .settings { display: flex; flex-direction: column; @@ -172,4 +237,6 @@ transition: opacity 300ms ease-in-out; } + + } \ No newline at end of file diff --git a/src/ui/OpenFile/UISaveMenu.module.css b/src/ui/OpenFile/UISaveMenu.module.css index 2101b345..6bc062e8 100644 --- a/src/ui/OpenFile/UISaveMenu.module.css +++ b/src/ui/OpenFile/UISaveMenu.module.css @@ -7,4 +7,15 @@ } .button.download__link svg { fill: #18191b; +} + +@media screen and (min-width: 768px) { + .button.download__link { + background-color: var(--beige); + } + .download__link > span { + display: none; + } + + } \ No newline at end of file diff --git a/src/ui/OpenFile/UiOpenMenu.module.css b/src/ui/OpenFile/UiOpenMenu.module.css index aa83bfef..2efc459d 100644 --- a/src/ui/OpenFile/UiOpenMenu.module.css +++ b/src/ui/OpenFile/UiOpenMenu.module.css @@ -10,6 +10,7 @@ align-content: center; align-items: center; justify-content: space-between; + color: #18191b; } .save-file__area div { @@ -18,13 +19,16 @@ .save-file__area div { background: inherit; + color: var(--black); } .filename { gap: 8px; } -.open-folder__link,.button.report-menu__report,.button.report-menu__camera { +.open-folder__link, +.button.report-menu__report, +.button.report-menu__camera { background: inherit; display: flex; flex-direction: column; @@ -32,12 +36,31 @@ color: #18191b; } -.open-file__link, .open-demo__link { +.open-file__link, +.open-demo__link { display: none; } @media screen and (min-width: 768px) { - .open-file__link, .open-demo__link { - display: block; + .open-folder__link, + .button.report-menu__report, + .button.report-menu__camera { + background-color: var(--beige); + } + + .open-folder__link > span, + .button.report-menu__report > span, + .button.report-menu__camera > span { + display: none; } - } \ No newline at end of file + + } +@media screen and (min-width: 1024px) { + .open-file__link, + .open-demo__link { + background-color: var(--beige); + } + .save-file__area { + align-items: normal; + } +} \ No newline at end of file diff --git a/src/ui/OpenFile/UiSaveMenu.js b/src/ui/OpenFile/UiSaveMenu.js index fb5a40d1..be6976e9 100644 --- a/src/ui/OpenFile/UiSaveMenu.js +++ b/src/ui/OpenFile/UiSaveMenu.js @@ -31,8 +31,8 @@ export const UiSaveMenu = () => { <> onModalSaveNiftiShow(evt)} diff --git a/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css index 4d5e3cc6..bbdf554f 100644 --- a/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css +++ b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css @@ -1,3 +1,37 @@ + + +@media screen and (min-width: 768px) { + + .files_container { + margin: 0; + margin-top: 10px; + background-color: var(--extreme-black); + font-size: 14px; + width: 100%; + padding: 15px; + border-radius: 6px; + box-sizing: border-box; + } + + .header { + margin-bottom: 10px; + display: flex; + } + + .files { + display: flex; + } + + .left { + color: var(--dark-gray4); + margin-right: 20px; + } + + .element:not(:first-child) { + margin-top: 10px; + } + +} .files_container { margin: 0; margin-top: 10px; @@ -26,3 +60,24 @@ .element:not(:first-child) { margin-top: 10px; } +@media screen and (min-width: 768px) { + .files_container { + margin: 0; + display: flex; + align-items: center; + justify-content: flex-start; + } + .files { + display: none; + } +} + +@media screen and (min-width: 1024px) { +.files_container { + margin: 0; + display: flex; + align-items: center; + justify-content: flex-start; +} +} + diff --git a/src/ui/Tooltip/Tooltip.module.css b/src/ui/Tooltip/Tooltip.module.css index fc7bf5f9..626751e9 100644 --- a/src/ui/Tooltip/Tooltip.module.css +++ b/src/ui/Tooltip/Tooltip.module.css @@ -5,6 +5,7 @@ .wrapper { display: inline-block; + color: #18191b; } .tooltip { @@ -63,4 +64,5 @@ .demo__link { display: block; } + } From d8e2126cfa8498568932185832c85cf9b65d4962 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Mon, 4 Sep 2023 13:35:39 +0200 Subject: [PATCH 11/57] add responsive for canvas --- src/engine/Graphics2d.js | 7 +- src/ui/Layout/Container.module.css | 1 + src/ui/Main.module.css | 73 +++---------------- .../RecentlyFiles/RecentlyFiles.module.css | 11 +-- 4 files changed, 24 insertions(+), 68 deletions(-) diff --git a/src/engine/Graphics2d.js b/src/engine/Graphics2d.js index 60f26d44..f3db2911 100644 --- a/src/engine/Graphics2d.js +++ b/src/engine/Graphics2d.js @@ -707,7 +707,7 @@ class Graphics2d extends React.Component { if (isLandscape) { wrapperStyles.width = `calc(100% - 3rem)`; - wrapperStyles.height = `calc(100% - 3rem)`; + wrapperStyles.height = `100%`; } else { wrapperStyles.width = `100%`; wrapperStyles.height = `100%`; @@ -727,6 +727,11 @@ class Graphics2d extends React.Component { canvasStyles.height = '100%'; canvasStyles.margin = `0`; canvasStyles.padding = `0`; + } else { + canvasStyles.width = `80vw`; + canvasStyles.height = 'calc(100% - 0.5rem)'; + canvasStyles.margin = `0`; + canvasStyles.padding = `0`; } return (
diff --git a/src/ui/Layout/Container.module.css b/src/ui/Layout/Container.module.css index c1de1632..d673cf13 100644 --- a/src/ui/Layout/Container.module.css +++ b/src/ui/Layout/Container.module.css @@ -53,6 +53,7 @@ display: none; } + } @media screen and (min-width: 1024px) { diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css index 6b1463ef..4b518c86 100644 --- a/src/ui/Main.module.css +++ b/src/ui/Main.module.css @@ -2,19 +2,11 @@ * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) * SPDX-License-Identifier: Apache-2.0 */ -/* mobile*/ .app { position: relative; } -/*.header { - display: flex; - align-items: center; - position: relative; - z-index: 1000; -}*/ - .header { display: flex; align-items: center; @@ -59,12 +51,6 @@ fill: var(--black); } -/* -.fullscreen .header__panels { - position: absolute; - left: 75px; -}*/ - .fullscreen .left, .fullscreen .settings { top: 20px; @@ -78,7 +64,6 @@ display: none; } - .center div { position: absolute; top: 0; @@ -92,44 +77,6 @@ display: none; } -/* -@media screen and (min-width: 768px) { - - .header { - display: flex; - align-items: center; - position: relative; - padding: 1rem; - z-index: 1000; - } - - .settings { - display: flex; - flex-direction: column; - z-index: 800; - position: absolute; - right: 25px; - top: 100px; - background-color: var(--dark-gray); - padding: 25px; - width: 400px; - opacity: var(--opacity); - cursor: all-scroll; - border-radius: 24px; - transition: opacity 300ms ease-in-out; - } - - .center { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - z-index: 10; - } - - -}*/ @media screen and (min-width: 768px) { .header { @@ -146,8 +93,9 @@ .header__panels { display: flex; - align-items: center; - padding: 1rem; + flex-direction: column; + align-items: flex-start; + width: 25rem; } .fullscreen .header__panels { position: absolute; @@ -195,29 +143,32 @@ bottom: 0; z-index: 10; } - - } - @media screen and (min-width: 1024px) { .header { align-items: flex-start; } + .header__right { + align-items: stretch; + } + .header__panels { + width: 100%; display: flex; + flex-direction: row; flex-wrap: wrap; align-items: center; - padding: 1rem; + padding: 1rem 1.5rem 1rem 0; } .center { top: 6rem; left: 5rem; right: 0; - bottom: 0; + bottom: 2rem; z-index: 10; } @@ -237,6 +188,4 @@ transition: opacity 300ms ease-in-out; } - - } \ No newline at end of file diff --git a/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css index bbdf554f..c72d950b 100644 --- a/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css +++ b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css @@ -59,17 +59,17 @@ .element:not(:first-child) { margin-top: 10px; + display: none; } @media screen and (min-width: 768px) { .files_container { margin: 0; display: flex; - align-items: center; + align-items: normal; justify-content: flex-start; + margin-bottom: 1rem; } - .files { - display: none; - } + } @media screen and (min-width: 1024px) { @@ -77,7 +77,8 @@ margin: 0; display: flex; align-items: center; - justify-content: flex-start; + justify-content: normal; + margin-bottom: 1rem; } } From 016c3e985263bbc4c8fa9b19d0a336cfdf4dc0ff Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Tue, 5 Sep 2023 12:32:15 +0200 Subject: [PATCH 12/57] add additional render for canvas --- src/engine/Graphics2d.js | 11 +- src/ui/Button/Button.module.css | 112 +++++++----------- src/ui/OpenFile/UISaveMenu.module.css | 6 + src/ui/OpenFile/UiOpenMenu.module.css | 13 +- .../RecentlyFiles/RecentlyFiles.module.css | 67 +++++------ 5 files changed, 99 insertions(+), 110 deletions(-) diff --git a/src/engine/Graphics2d.js b/src/engine/Graphics2d.js index f3db2911..2a90e9fe 100644 --- a/src/engine/Graphics2d.js +++ b/src/engine/Graphics2d.js @@ -701,8 +701,7 @@ class Graphics2d extends React.Component { wrapperStyles.width = `100%`; wrapperStyles.height = `calc(100% - 5rem)`; wrapperStyles.padding = `0`; - } - if (window.innerWidth >= 768) { + } else if (window.innerWidth >= 768) { const isLandscape = window.matchMedia('(orientation: landscape)').matches; if (isLandscape) { @@ -727,8 +726,14 @@ class Graphics2d extends React.Component { canvasStyles.height = '100%'; canvasStyles.margin = `0`; canvasStyles.padding = `0`; - } else { + } else if (window.innerWidth >= 768) { canvasStyles.width = `80vw`; + canvasStyles.height = 'calc(100% - 2.5rem)'; + canvasStyles.margin = `0`; + canvasStyles.padding = `0`; + } + if (window.innerWidth >= 1024) { + canvasStyles.width = `87vw`; canvasStyles.height = 'calc(100% - 0.5rem)'; canvasStyles.margin = `0`; canvasStyles.padding = `0`; diff --git a/src/ui/Button/Button.module.css b/src/ui/Button/Button.module.css index bd58e6f6..e754ac69 100644 --- a/src/ui/Button/Button.module.css +++ b/src/ui/Button/Button.module.css @@ -7,23 +7,54 @@ fill: var(--black); } +button:hover, +.button:focus { + background-color: var(--light-orange); +} + +.button.active { + color: var(--red); +} +.apply { + background-color: var(--red); + border-radius: 4px; +} + +.button.active svg { + fill: var(--red); +} + +.button.light { + color: var(--black); + background-color: var(--light); +} + +.button.light svg { + fill: var(--black); +} + +.button.light.active { + color: var(--red); +} + +.button.light:hover, +.button.light:focus { + background-color: var(--light); + filter: brightness(80%); +} + +.button.accent { + color: var(--white); + background-color: var(--red); +} + + + @media screen and (min-width: 768px) { .reset { display: flex; justify-content: end; } - /* - .reset { - background: inherit; - border: none; - color: var(--black); - display: flex; - flex-direction: column; - align-items: center; - justify-content: space-evenly; - font-size: 0.75rem; -} - */ } .reset { @@ -76,67 +107,10 @@ fill: var(--white); } -.button:hover, -.button:focus { - background-color: var(--light-orange); -} - -.button.active { - color: var(--red); -} - -.apply { - background-color: var(--red); - border-radius: 4px; -} - -.button.active svg { - fill: var(--red); -} - -.button.light { - color: var(--black); - background-color: var(--light); -} - -.button.light svg { - fill: var(--black); -} - -.button.light.active { - color: var(--red); -} - -.button.light:hover, -.button.light:focus { - background-color: var(--light); - filter: brightness(80%); -} - -.button.accent { - color: var(--white); - background-color: var(--red); -} - -.button.accent svg { - fill: var(--white); -} - -.button.accent:hover, -.button.accent:focus { - background-color: var(--red); - filter: brightness(85%); -} - -.button.accent.active svg { - fill: var(--black); -} - .button:not(.reset) { display: block; } - @media screen and (min-width: 1024px) { .reset { display: inline-block; diff --git a/src/ui/OpenFile/UISaveMenu.module.css b/src/ui/OpenFile/UISaveMenu.module.css index 6bc062e8..40aa9bd8 100644 --- a/src/ui/OpenFile/UISaveMenu.module.css +++ b/src/ui/OpenFile/UISaveMenu.module.css @@ -5,6 +5,12 @@ flex-direction: column; align-items: center; } + +.button.download__link:hover, +.button.download__link:focus { + background-color: var(--light-orange); +} + .button.download__link svg { fill: #18191b; } diff --git a/src/ui/OpenFile/UiOpenMenu.module.css b/src/ui/OpenFile/UiOpenMenu.module.css index 2efc459d..bce89bdf 100644 --- a/src/ui/OpenFile/UiOpenMenu.module.css +++ b/src/ui/OpenFile/UiOpenMenu.module.css @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - .save-file__area { height: 40px; display: flex; @@ -35,6 +34,18 @@ align-items: center; color: #18191b; } +.open-folder__link:hover, +.button.report-menu__report:hover, +.button.report-menu__camera:hover { + background-color: var(--light-orange); +} + +.open-folder__link:focus, +.button.report-menu__report:focus, +.button.report-menu__camera:focus { + background-color: var(--light-orange); +} + .open-file__link, .open-demo__link { diff --git a/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css index c72d950b..dc6a5c72 100644 --- a/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css +++ b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css @@ -1,37 +1,3 @@ - - -@media screen and (min-width: 768px) { - - .files_container { - margin: 0; - margin-top: 10px; - background-color: var(--extreme-black); - font-size: 14px; - width: 100%; - padding: 15px; - border-radius: 6px; - box-sizing: border-box; - } - - .header { - margin-bottom: 10px; - display: flex; - } - - .files { - display: flex; - } - - .left { - color: var(--dark-gray4); - margin-right: 20px; - } - - .element:not(:first-child) { - margin-top: 10px; - } - -} .files_container { margin: 0; margin-top: 10px; @@ -61,13 +27,40 @@ margin-top: 10px; display: none; } + @media screen and (min-width: 768px) { + .files_container { - margin: 0; display: flex; align-items: normal; justify-content: flex-start; - margin-bottom: 1rem; + margin: 0; + margin-bottom: 1.1rem; + margin-top: 10px; + background-color: var(--extreme-black); + font-size: 14px; + width: 100%; + padding: 15px; + border-radius: 6px; + box-sizing: border-box; + } + + .header { + margin-bottom: 10px; + display: flex; + } + + .files { + display: flex; + } + + .left { + color: var(--dark-gray4); + margin-right: 20px; + } + + .element:not(:first-child) { + margin-top: 10px; } } @@ -79,6 +72,6 @@ align-items: center; justify-content: normal; margin-bottom: 1rem; -} + } } From 0f75d506a3e80b73bf5280b9dd360440fddeb31e Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Wed, 6 Sep 2023 16:35:24 +0200 Subject: [PATCH 13/57] working on settings component into mobile version --- src/ui/Main.module.css | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css index 4b518c86..2a910b8c 100644 --- a/src/ui/Main.module.css +++ b/src/ui/Main.module.css @@ -17,7 +17,7 @@ margin-right: 25px; } .header__panels { - display: none; + display: block; } .header__right { @@ -61,20 +61,41 @@ } .left { - display: none; + display: block; + width: 100px; + height: 50px; + position: absolute; + right: 0; + transform: translate(50%, -50%); +} +.left > div { + position: relative; +} +.left > div > div:after { + display: block; + position: absolute; + content:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath fill='%23f00' d='M400 256H152V152.9c0-39.6 31.7-72.5 71.3-72.9 40-.4 72.7 32.1 72.7 72v16c0 13.3 10.7 24 24 24h32c13.3 0 24-10.7 24-24v-16C376 68 307.5-.3 223.5 0 139.5.3 72 69.5 72 153.5V256H48c-26.5 0-48 21.5-48 48v160c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48zM264 408c0 22.1-17.9 40-40 40s-40-17.9-40-40v-48c0-22.1 17.9-40 40-40s40 17.9 40 40v48z'%3E%3C/path%3E%3C/svg%3E"); + top:0; + left: 0; + width: 24px; + height: 24px; + background-size: cover; } +.left > div:nth-of-type(2) { + display: none; +} .center div { position: absolute; top: 0; left: 0; right: 0; bottom: 0; - z-index: 10; - + z-index: -1; } + .settings { - display: none; + display: block; } @media screen and (min-width: 768px) { From 5b3f4f21ee0a7fdf64f4bc978f0dc777e9282800 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Thu, 7 Sep 2023 12:33:34 +0200 Subject: [PATCH 14/57] add changes according to rendering canvas on screens --- src/engine/Graphics2d.js | 51 +++++++------------ src/ui/Main.jsx | 2 - src/ui/Main.module.css | 7 +-- .../RecentlyFiles/RecentlyFiles.jsx | 2 +- .../RecentlyFiles/RecentlyFiles.module.css | 3 +- 5 files changed, 26 insertions(+), 39 deletions(-) diff --git a/src/engine/Graphics2d.js b/src/engine/Graphics2d.js index 2a90e9fe..3ad97728 100644 --- a/src/engine/Graphics2d.js +++ b/src/engine/Graphics2d.js @@ -691,52 +691,39 @@ class Graphics2d extends React.Component { this.m_sliceRatio = this.props.sliderValue; this.m_mode2d = this.props.mode2d; + const isLandscape = window.matchMedia('(orientation: landscape)').matches; + const wrapperStyles = { - justifyContent: 'center', width: '100%', - height: 'calc(100% - 3rem)', + height: '100%', + justifyContent: 'center', overflow: 'scroll', + padding: '0', }; - if (window.innerWidth < 768) { - wrapperStyles.width = `100%`; - wrapperStyles.height = `calc(100% - 5rem)`; - wrapperStyles.padding = `0`; - } else if (window.innerWidth >= 768) { - const isLandscape = window.matchMedia('(orientation: landscape)').matches; - - if (isLandscape) { - wrapperStyles.width = `calc(100% - 3rem)`; - wrapperStyles.height = `100%`; - } else { - wrapperStyles.width = `100%`; - wrapperStyles.height = `100%`; - wrapperStyles.justifyContent = 'center'; - wrapperStyles.overflow = 'scroll'; - } - } const canvasStyles = { display: 'block', width: '150vw', + height: '100%', + margin: '0', + padding: '0', border: '2px solid #dc5e47', borderRadius: '10px', }; + if (window.innerWidth < 768) { - canvasStyles.width = `150vw`; + wrapperStyles.height = `calc(100% - 5rem)`; + canvasStyles.width = '150vw'; canvasStyles.height = '100%'; - canvasStyles.margin = `0`; - canvasStyles.padding = `0`; } else if (window.innerWidth >= 768) { - canvasStyles.width = `80vw`; - canvasStyles.height = 'calc(100% - 2.5rem)'; - canvasStyles.margin = `0`; - canvasStyles.padding = `0`; - } - if (window.innerWidth >= 1024) { - canvasStyles.width = `87vw`; - canvasStyles.height = 'calc(100% - 0.5rem)'; - canvasStyles.margin = `0`; - canvasStyles.padding = `0`; + if (isLandscape && window.innerWidth >= 1024) { + wrapperStyles.width = 'calc(100% - 3rem)'; + canvasStyles.width = '70%'; + canvasStyles.height = 'calc(100% - 0.5rem)'; + } else { + canvasStyles.width = '80vw'; + canvasStyles.height = 'calc(100% - 3rem)'; + } } return (
diff --git a/src/ui/Main.jsx b/src/ui/Main.jsx index 60febef1..17dccb74 100644 --- a/src/ui/Main.jsx +++ b/src/ui/Main.jsx @@ -30,7 +30,6 @@ import StartScreen from './StartScreen/StartScreen'; import css from './Main.module.css'; import cx from 'classnames'; import '../nouislider-custom.css'; -import RecentlyFiles from './StartScreen/RecentlyFiles/RecentlyFiles'; export const Main = () => { const dispatch = useDispatch(); @@ -160,7 +159,6 @@ export const Main = () => { {isReady && (
-
handleFullMode()} /> diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css index 4b518c86..dfe31b4a 100644 --- a/src/ui/Main.module.css +++ b/src/ui/Main.module.css @@ -81,7 +81,6 @@ .header { display: flex; - align-items: flex-start; position: relative; padding: 1rem; z-index: 1000; @@ -94,7 +93,6 @@ .header__panels { display: flex; flex-direction: column; - align-items: flex-start; width: 25rem; } .fullscreen .header__panels { @@ -151,6 +149,10 @@ align-items: flex-start; } + .header div { + margin-bottom: 1rem; + } + .header__right { align-items: stretch; } @@ -160,7 +162,6 @@ display: flex; flex-direction: row; flex-wrap: wrap; - align-items: center; padding: 1rem 1.5rem 1rem 0; } diff --git a/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.jsx b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.jsx index 0de6e2c3..6f2d7849 100644 --- a/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.jsx +++ b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.jsx @@ -38,7 +38,7 @@ const RecentlyFiles = () => { return files.length ? (
-
Recently opened files:
+
Recently opened file:
{timestamps.map((timestamp, idx) => ( diff --git a/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css index dc6a5c72..487e5c9d 100644 --- a/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css +++ b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css @@ -10,8 +10,9 @@ } .header { - margin-bottom: 10px; display: flex; + margin-bottom: 10px; + padding-right: 0.5rem; } .files { From 4a69d5a4f6cdaad97d511cf9a3f14e017283bf16 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Fri, 8 Sep 2023 09:24:03 +0200 Subject: [PATCH 15/57] clean up unnecessary styles from recently files --- .../RecentlyFiles/RecentlyFiles.module.css | 27 +++---------------- 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css index 487e5c9d..706af2a9 100644 --- a/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css +++ b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css @@ -1,6 +1,5 @@ .files_container { - margin: 0; - margin-top: 10px; + margin: 10px 0 0 0; background-color: var(--extreme-black); font-size: 14px; width: 100%; @@ -25,7 +24,6 @@ } .element:not(:first-child) { - margin-top: 10px; display: none; } @@ -35,9 +33,7 @@ display: flex; align-items: normal; justify-content: flex-start; - margin: 0; - margin-bottom: 1.1rem; - margin-top: 10px; + margin:10px 0 1.1rem 0; background-color: var(--extreme-black); font-size: 14px; width: 100%; @@ -46,33 +42,16 @@ box-sizing: border-box; } - .header { - margin-bottom: 10px; - display: flex; - } - - .files { - display: flex; - } - - .left { - color: var(--dark-gray4); - margin-right: 20px; - } - .element:not(:first-child) { margin-top: 10px; } - } @media screen and (min-width: 1024px) { .files_container { - margin: 0; + margin: 0 0 1rem 0; display: flex; - align-items: center; justify-content: normal; - margin-bottom: 1rem; } } From 8f759152f05380b3757b1e77de545c5e7497c69c Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Fri, 8 Sep 2023 11:53:18 +0200 Subject: [PATCH 16/57] adding side menu for mobile --- src/ui/Form/Slider.module.css | 6 +++++- src/ui/Main.jsx | 2 -- src/ui/Main.module.css | 35 ++++++++++++++++++++++++------- src/ui/Tooltip/Tooltip.module.css | 25 ++++++++++++++++++++++ 4 files changed, 57 insertions(+), 11 deletions(-) diff --git a/src/ui/Form/Slider.module.css b/src/ui/Form/Slider.module.css index 21bd0efc..5620ebe3 100644 --- a/src/ui/Form/Slider.module.css +++ b/src/ui/Form/Slider.module.css @@ -8,7 +8,7 @@ } .slider { - flex: 1; + flex: 1; } .caption { @@ -17,3 +17,7 @@ line-height: 20px; color: var(--white); } + +@media screen and(min-width: 768px) { + +} diff --git a/src/ui/Main.jsx b/src/ui/Main.jsx index 60febef1..17dccb74 100644 --- a/src/ui/Main.jsx +++ b/src/ui/Main.jsx @@ -30,7 +30,6 @@ import StartScreen from './StartScreen/StartScreen'; import css from './Main.module.css'; import cx from 'classnames'; import '../nouislider-custom.css'; -import RecentlyFiles from './StartScreen/RecentlyFiles/RecentlyFiles'; export const Main = () => { const dispatch = useDispatch(); @@ -160,7 +159,6 @@ export const Main = () => { {isReady && (
-
handleFullMode()} /> diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css index 2a910b8c..a3e79dc4 100644 --- a/src/ui/Main.module.css +++ b/src/ui/Main.module.css @@ -14,10 +14,10 @@ } .header__logo { - margin-right: 25px; + display: none; } .header__panels { - display: block; + display: none; } .header__right { @@ -66,20 +66,38 @@ height: 50px; position: absolute; right: 0; - transform: translate(50%, -50%); + top:50%; + z-index: 10; + } -.left > div { +.left > div > div { position: relative; } + +.left > div > div button { + padding: 1rem 2rem; +} .left > div > div:after { display: block; + content: ''; + background-image: url("data:image/svg+xml;charset=utf-8,"); position: absolute; - content:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath fill='%23f00' d='M400 256H152V152.9c0-39.6 31.7-72.5 71.3-72.9 40-.4 72.7 32.1 72.7 72v16c0 13.3 10.7 24 24 24h32c13.3 0 24-10.7 24-24v-16C376 68 307.5-.3 223.5 0 139.5.3 72 69.5 72 153.5V256H48c-26.5 0-48 21.5-48 48v160c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48zM264 408c0 22.1-17.9 40-40 40s-40-17.9-40-40v-48c0-22.1 17.9-40 40-40s40 17.9 40 40v48z'%3E%3C/path%3E%3C/svg%3E"); - top:0; + top:50%; left: 0; width: 24px; height: 24px; background-size: cover; + transform: translate(2px, -13px); +} + +.left > div > div:hover::after, +.left > div > div:active::after{ + content-fill: "%23dc5e47"; + +} + +.left > div > div:before { + display: none; } .left > div:nth-of-type(2) { @@ -91,11 +109,11 @@ left: 0; right: 0; bottom: 0; - z-index: -1; + z-index: 1; } .settings { - display: block; + display: none; } @media screen and (min-width: 768px) { @@ -137,6 +155,7 @@ display: flex; flex-direction: column; position: absolute; + right: 0; left: 25px; top: 100px; z-index: 900; diff --git a/src/ui/Tooltip/Tooltip.module.css b/src/ui/Tooltip/Tooltip.module.css index 626751e9..38c7ab98 100644 --- a/src/ui/Tooltip/Tooltip.module.css +++ b/src/ui/Tooltip/Tooltip.module.css @@ -45,18 +45,22 @@ .tooltip[data-popper-placement^='top']>.arrow { bottom: -6px; + display: none; } .tooltip[data-popper-placement^='bottom']>.arrow { top: -6px; + display: none; } .tooltip[data-popper-placement^='left']>.arrow { right: -6px; + display: none; } .tooltip[data-popper-placement^='right']>.arrow { left: -6px; + display: none; } @@ -65,4 +69,25 @@ display: block; } + .tooltip[data-popper-placement^='top']>.arrow { + bottom: -6px; + display: none; + } + + .tooltip[data-popper-placement^='bottom']>.arrow { + top: -6px; + display: none; + } + + .tooltip[data-popper-placement^='left']>.arrow { + right: -6px; + display: none; + } + + .tooltip[data-popper-placement^='right']>.arrow { + left: -6px; + display: none; + } + + } From a66d898486afc722a0a569e6faf61a0167c14dc0 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Tue, 12 Sep 2023 15:04:42 +0200 Subject: [PATCH 17/57] +adding mobile side setting menu --- public/sprite.svg | 3 ++ src/ui/Main.jsx | 2 + src/ui/Main.module.css | 36 +------------ src/ui/MobileSettings/MobileSettings.jsx | 54 +++++++++++++++++++ .../MobileSettings/MobileSettings.module.css | 22 ++++++++ 5 files changed, 83 insertions(+), 34 deletions(-) create mode 100644 src/ui/MobileSettings/MobileSettings.jsx create mode 100644 src/ui/MobileSettings/MobileSettings.module.css diff --git a/public/sprite.svg b/public/sprite.svg index 32f9014e..c01baef0 100644 --- a/public/sprite.svg +++ b/public/sprite.svg @@ -209,6 +209,9 @@ + + + diff --git a/src/ui/Main.jsx b/src/ui/Main.jsx index 17dccb74..e1687947 100644 --- a/src/ui/Main.jsx +++ b/src/ui/Main.jsx @@ -30,6 +30,7 @@ import StartScreen from './StartScreen/StartScreen'; import css from './Main.module.css'; import cx from 'classnames'; import '../nouislider-custom.css'; +import { MobileSettings } from './MobileSettings/MobileSettings'; export const Main = () => { const dispatch = useDispatch(); @@ -184,6 +185,7 @@ export const Main = () => {
{viewMode === ModeView.VIEW_2D ? : }
{viewMode === ModeView.VIEW_2D && }
+
)} {arrErrors.length > 0 && } diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css index a3e79dc4..8df1fcd7 100644 --- a/src/ui/Main.module.css +++ b/src/ui/Main.module.css @@ -57,7 +57,7 @@ } .bottleft { - display: none; + display: block; } .left { @@ -69,47 +69,15 @@ top:50%; z-index: 10; -} -.left > div > div { - position: relative; -} - -.left > div > div button { - padding: 1rem 2rem; -} -.left > div > div:after { - display: block; - content: ''; - background-image: url("data:image/svg+xml;charset=utf-8,"); - position: absolute; - top:50%; - left: 0; - width: 24px; - height: 24px; - background-size: cover; - transform: translate(2px, -13px); -} - -.left > div > div:hover::after, -.left > div > div:active::after{ - content-fill: "%23dc5e47"; - } -.left > div > div:before { - display: none; -} - -.left > div:nth-of-type(2) { - display: none; -} .center div { position: absolute; top: 0; left: 0; right: 0; bottom: 0; - z-index: 1; + z-index: -1; } .settings { diff --git a/src/ui/MobileSettings/MobileSettings.jsx b/src/ui/MobileSettings/MobileSettings.jsx new file mode 100644 index 00000000..2b7514ab --- /dev/null +++ b/src/ui/MobileSettings/MobileSettings.jsx @@ -0,0 +1,54 @@ +import React, { useState } from 'react'; +import css from './MobileSettings.module.css'; +import { Tooltip } from '../Tooltip/Tooltip'; +import { UIButton } from '../Button/Button'; +import { SVG } from '../Button/SVG'; +import { LeftToolbar } from '../LeftToolbar/LeftToolbar'; +import { RightPanel } from '../Panels/RightPanel'; +import { TopToolbar } from '../TopToolbar/TopToolbar'; + +export const MobileSettings = () => { + const [isSettingsMenuOpen, setIsSettingsMenuOpen] = useState(false); + const [is2DMenuOpen, setIs2DMenuOpen] = useState(false); + const [isCursorMenuOpen, setIsCursorMenuOpen] = useState(false); + + const toggleSettingsMenu = () => { + setIsSettingsMenuOpen(!isSettingsMenuOpen); + setIs2DMenuOpen(false); // Закрываем другие меню при открытии этого + setIsCursorMenuOpen(false); + }; + + const toggle2DMenu = () => { + setIs2DMenuOpen(!is2DMenuOpen); + setIsSettingsMenuOpen(false); // Закрываем другие меню при открытии этого + setIsCursorMenuOpen(false); + }; + + const toggleCursorMenu = () => { + setIsCursorMenuOpen(!isCursorMenuOpen); + setIsSettingsMenuOpen(false); // Закрываем другие меню при открытии этого + setIs2DMenuOpen(false); + }; + return ( +
+ + + + + + + + + + + + + + + + {isSettingsMenuOpen && } + {is2DMenuOpen && } + {isCursorMenuOpen && } +
+ ); +}; diff --git a/src/ui/MobileSettings/MobileSettings.module.css b/src/ui/MobileSettings/MobileSettings.module.css new file mode 100644 index 00000000..8ce08846 --- /dev/null +++ b/src/ui/MobileSettings/MobileSettings.module.css @@ -0,0 +1,22 @@ +/*! + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +.settings__menu { + display: flex; + flex-direction: column; + align-items: flex-end; + position: relative; + transform: translate(0,0); +} + +.settings__menu__button:after { + display: block; + content: ''; + background-image: url("data:image/svg+xml;charset=utf-8,"); + position: absolute; + width: 24px; + height: 24px; + background-size: cover; + transform: translate(2px, -13px); +} From a42d707ef849b5257ffc66d862760cd492a00e2f Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Wed, 13 Sep 2023 16:08:14 +0200 Subject: [PATCH 18/57] added conditional render to main and click logic into settings component --- src/ui/Main.jsx | 25 +++++-- src/ui/Main.module.css | 2 +- src/ui/MobileSettings/MobileSettings.jsx | 68 ++++++++++++++----- .../MobileSettings/MobileSettings.module.css | 52 +++++++++++++- 4 files changed, 121 insertions(+), 26 deletions(-) diff --git a/src/ui/Main.jsx b/src/ui/Main.jsx index e1687947..791a6016 100644 --- a/src/ui/Main.jsx +++ b/src/ui/Main.jsx @@ -26,11 +26,11 @@ import { LeftToolbar } from './LeftToolbar/LeftToolbar'; import { useDispatch, useSelector } from 'react-redux'; import { TopToolbar } from './TopToolbar/TopToolbar'; import { UiAbout } from './Header/UiAbout'; +import { MobileSettings } from './MobileSettings/MobileSettings'; import StartScreen from './StartScreen/StartScreen'; import css from './Main.module.css'; import cx from 'classnames'; import '../nouislider-custom.css'; -import { MobileSettings } from './MobileSettings/MobileSettings'; export const Main = () => { const dispatch = useDispatch(); @@ -41,8 +41,20 @@ export const Main = () => { const [strAlertTitle, setStrAlertTitle] = useState(''); const [strAlertText, setStrAlertText] = useState(''); const [isFullMode, setIsFullMode] = useState(false); + const [isMobile, setIsMobile] = useState(window.innerWidth <= 768); const appRef = useRef(); + useEffect(() => { + function handleResize() { + setIsMobile(window.innerWidth <= 768); + } + + window.addEventListener('resize', handleResize); + + return () => { + window.removeEventListener('resize', handleResize); + }; + }, []); const [, drop] = useDrop( () => ({ accept: DnDItemTypes.SETTINGS, @@ -96,7 +108,6 @@ export const Main = () => { const onFullScreenChange = () => { setIsFullMode(!isFullMode); }; - useEffect(() => { const strSearch = window.location.search; if (strSearch.length > 0) { @@ -142,7 +153,8 @@ export const Main = () => { return () => { document.removeEventListener('fullscreenchange', onFullScreenChange); }; - }, [isFullMode]); + }, [isFullMode, isMobile]); + console.log(isMobile); return ( @@ -176,7 +188,7 @@ export const Main = () => { ) : ( )} - {isReady && ( + {isReady && !isMobile && (
@@ -185,6 +197,11 @@ export const Main = () => {
{viewMode === ModeView.VIEW_2D ? : }
{viewMode === ModeView.VIEW_2D && }
+
+ )} + {isReady && isMobile && ( +
+
{viewMode === ModeView.VIEW_2D ? : }
)} diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css index 8df1fcd7..04cf03dd 100644 --- a/src/ui/Main.module.css +++ b/src/ui/Main.module.css @@ -77,7 +77,7 @@ left: 0; right: 0; bottom: 0; - z-index: -1; + z-index: 1; } .settings { diff --git a/src/ui/MobileSettings/MobileSettings.jsx b/src/ui/MobileSettings/MobileSettings.jsx index 2b7514ab..6f2ca16c 100644 --- a/src/ui/MobileSettings/MobileSettings.jsx +++ b/src/ui/MobileSettings/MobileSettings.jsx @@ -1,54 +1,86 @@ -import React, { useState } from 'react'; +import React, { useState, useEffect, useRef } from 'react'; import css from './MobileSettings.module.css'; -import { Tooltip } from '../Tooltip/Tooltip'; import { UIButton } from '../Button/Button'; import { SVG } from '../Button/SVG'; -import { LeftToolbar } from '../LeftToolbar/LeftToolbar'; -import { RightPanel } from '../Panels/RightPanel'; import { TopToolbar } from '../TopToolbar/TopToolbar'; +import { LeftToolbar } from '../LeftToolbar/LeftToolbar'; +import { Mode2dSettingsPanel } from '../Panels/Mode2dSettingsPanel'; export const MobileSettings = () => { const [isSettingsMenuOpen, setIsSettingsMenuOpen] = useState(false); const [is2DMenuOpen, setIs2DMenuOpen] = useState(false); const [isCursorMenuOpen, setIsCursorMenuOpen] = useState(false); - + const containerRef = useRef(null); const toggleSettingsMenu = () => { setIsSettingsMenuOpen(!isSettingsMenuOpen); + console.log('Toggle Settings Menu'); setIs2DMenuOpen(false); // Закрываем другие меню при открытии этого setIsCursorMenuOpen(false); }; const toggle2DMenu = () => { setIs2DMenuOpen(!is2DMenuOpen); + console.log('Toggle Settings Menu'); setIsSettingsMenuOpen(false); // Закрываем другие меню при открытии этого setIsCursorMenuOpen(false); }; const toggleCursorMenu = () => { setIsCursorMenuOpen(!isCursorMenuOpen); + console.log('Toggle Settings Menu'); setIsSettingsMenuOpen(false); // Закрываем другие меню при открытии этого setIs2DMenuOpen(false); }; + + useEffect(() => { + const handleClickOutside = (event) => { + console.log('click'); + if (containerRef.current && !containerRef.current.contains(event.target)) { + setIsSettingsMenuOpen(false); + setIs2DMenuOpen(false); + setIsCursorMenuOpen(false); + console.log(is2DMenuOpen, isCursorMenuOpen, isSettingsMenuOpen); + } + }; + + const containerElement = containerRef.current; // Сохраните ссылку на контейнер + + // Добавьте слушателя события click к контейнеру + containerElement.addEventListener('click', handleClickOutside); + + return () => { + // Удалите слушателя события click при размонтировании компонента + containerElement.removeEventListener('click', handleClickOutside); + }; + }, []); return ( -
- - +
+
+ - - - + - - - + - - {isSettingsMenuOpen && } - {is2DMenuOpen && } - {isCursorMenuOpen && } +
+ {isSettingsMenuOpen && ( +
+ +
+ )} + {is2DMenuOpen && ( +
+ +
+ )} + {isCursorMenuOpen && ( +
+ +
+ )}
); }; diff --git a/src/ui/MobileSettings/MobileSettings.module.css b/src/ui/MobileSettings/MobileSettings.module.css index 8ce08846..0f83103d 100644 --- a/src/ui/MobileSettings/MobileSettings.module.css +++ b/src/ui/MobileSettings/MobileSettings.module.css @@ -2,14 +2,42 @@ * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) * SPDX-License-Identifier: Apache-2.0 */ -.settings__menu { + +/*.settings__menu:active { + display: flex; + flex-direction: column; + align-items: flex-end; + position: relative; + justify-content: center; + transform: translate(0, 0); + background: red; + height: 100vh; + z-index: 2; +} +.settings__menu:focus { + opacity: 0; + background: yellow; + z-index: -2; + +}*/ +.buttons__container { + background: #858585; display: flex; flex-direction: column; align-items: flex-end; position: relative; - transform: translate(0,0); + justify-content: center; + transform: translate(320px, 220px); + width: 100px; + z-index: 2; } + +.settings__menu { + position: relative; + background: inherit; + z-index: 2; +} .settings__menu__button:after { display: block; content: ''; @@ -18,5 +46,23 @@ width: 24px; height: 24px; background-size: cover; - transform: translate(2px, -13px); + transform: translate(-32px, -22px); +} +.settings__menu_block { + display: flex; + justify-content: space-around; + position: absolute; + top: 10%; + left: 0; + right: 0; + padding: 10px; } + +.flex { + flex-direction: column; +} + +/*.settings__menu_block:active { + opacity: 0; + background: pink; +}*/ \ No newline at end of file From aefb52cdbbf33d18321a122029ee582a2641b6bb Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Thu, 14 Sep 2023 08:37:36 +0200 Subject: [PATCH 19/57] added styles --- src/ui/MobileSettings/MobileSettings.module.css | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/ui/MobileSettings/MobileSettings.module.css b/src/ui/MobileSettings/MobileSettings.module.css index 0f83103d..1f559e78 100644 --- a/src/ui/MobileSettings/MobileSettings.module.css +++ b/src/ui/MobileSettings/MobileSettings.module.css @@ -21,12 +21,10 @@ }*/ .buttons__container { - background: #858585; + background: inherit; display: flex; flex-direction: column; - align-items: flex-end; position: relative; - justify-content: center; transform: translate(320px, 220px); width: 100px; z-index: 2; From 4dd04499fb59a502487a3c0ef1734ea5a91cd125 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Thu, 14 Sep 2023 11:27:47 +0200 Subject: [PATCH 20/57] moved styled to new file; unlocked slider work --- src/engine/Graphics2d.js | 41 +++------------------- src/engine/Graphics2d.module.css | 60 ++++++++++++++++++++++++++++++++ src/ui/Main.module.css | 2 +- 3 files changed, 65 insertions(+), 38 deletions(-) create mode 100644 src/engine/Graphics2d.module.css diff --git a/src/engine/Graphics2d.js b/src/engine/Graphics2d.js index 3ad97728..a46d90cb 100644 --- a/src/engine/Graphics2d.js +++ b/src/engine/Graphics2d.js @@ -21,6 +21,8 @@ import Segm2d from './Segm2d'; import { getPalette256 } from './loaders/RoiPalette256'; +import css from './Graphics2d.module.css'; + class Graphics2d extends React.Component { constructor(props) { super(props); @@ -690,50 +692,15 @@ class Graphics2d extends React.Component { // const volSet = store.volumeSet; this.m_sliceRatio = this.props.sliderValue; this.m_mode2d = this.props.mode2d; - - const isLandscape = window.matchMedia('(orientation: landscape)').matches; - - const wrapperStyles = { - width: '100%', - height: '100%', - justifyContent: 'center', - overflow: 'scroll', - padding: '0', - }; - - const canvasStyles = { - display: 'block', - width: '150vw', - height: '100%', - margin: '0', - padding: '0', - border: '2px solid #dc5e47', - borderRadius: '10px', - }; - - if (window.innerWidth < 768) { - wrapperStyles.height = `calc(100% - 5rem)`; - canvasStyles.width = '150vw'; - canvasStyles.height = '100%'; - } else if (window.innerWidth >= 768) { - if (isLandscape && window.innerWidth >= 1024) { - wrapperStyles.width = 'calc(100% - 3rem)'; - canvasStyles.width = '70%'; - canvasStyles.height = 'calc(100% - 0.5rem)'; - } else { - canvasStyles.width = '80vw'; - canvasStyles.height = 'calc(100% - 3rem)'; - } - } return ( -
+
); diff --git a/src/engine/Graphics2d.module.css b/src/engine/Graphics2d.module.css new file mode 100644 index 00000000..cd3d7639 --- /dev/null +++ b/src/engine/Graphics2d.module.css @@ -0,0 +1,60 @@ +.wrapperStyles { + width: 100%; + justify-content: center; + overflow: scroll; + padding: 0; + height: calc(100% - 0.5rem); + margin: 0; + +} + +.canvasStyles { + display: block; + width: 150vw; + height: 100%; + margin: 0; + padding: 0; +} + +@media screen and (min-width: 768px) { + .wrapperStyles { + height: calc(100% - 2.5rem); + width: calc(100% - 3rem); + border: 2px solid #dc5e47; + border-radius: 10px; + } + .canvasStyles { + width: 150vw; + height: calc(100% - 3rem); + } +} +@media screen and(min-width: 768px) { + .wrapperStyles { + height: calc(100% - 3rem); + width: calc(100%- 3rem); + } +} + +@media screen and (orientation: landscape) and (min-width: 768px) { + .wrapperStyles { + height: calc(100% - 2.5rem); + width: calc(100%- 3rem); + } + + .canvasStyles { + width: 80vw; + height: calc(100% - 0.5rem); + } +} + +@media screen and (orientation: landscape) and (min-width: 1024px) { + .wrapperStyles { + width: 80%; + height: calc(100% - 0.5rem); + display: flex; + } + .canvasStyles { + width: 150vw; + height: calc(100% - 0.5rem); + } +} diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css index dfe31b4a..6ee69fea 100644 --- a/src/ui/Main.module.css +++ b/src/ui/Main.module.css @@ -176,7 +176,7 @@ .settings { display: flex; flex-direction: column; - z-index: 800; + z-index: 1100; position: absolute; right: 25px; top: 100px; From a8fbfec5a11f77a27859d859a92cd4ac05e3d6df Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Thu, 14 Sep 2023 16:32:49 +0200 Subject: [PATCH 21/57] added styles with aspect ratio; --- src/engine/Graphics2d.module.css | 60 +++++++++++++++----------------- src/ui/Main.module.css | 4 +-- 2 files changed, 31 insertions(+), 33 deletions(-) diff --git a/src/engine/Graphics2d.module.css b/src/engine/Graphics2d.module.css index cd3d7639..00ed5368 100644 --- a/src/engine/Graphics2d.module.css +++ b/src/engine/Graphics2d.module.css @@ -1,22 +1,22 @@ -.wrapperStyles { - width: 100%; - justify-content: center; - overflow: scroll; - padding: 0; - height: calc(100% - 0.5rem); - margin: 0; -} -.canvasStyles { - display: block; - width: 150vw; - height: 100%; - margin: 0; - padding: 0; +@media screen and (max-width: 768px) { + + .wrapperStyles { + width: 100%; + height: 100vh; + justify-content: center; + overflow: scroll; + } + + .canvasStyles { + display: block; + width: 150vw; + } } -@media screen and (min-width: 768px) { +@media screen and (min-width: 768px ) and (max-width: 1024px) { + .wrapperStyles { height: calc(100% - 2.5rem); width: calc(100% - 3rem); @@ -24,37 +24,35 @@ border-radius: 10px; } .canvasStyles { - width: 150vw; - height: calc(100% - 3rem); - } -} -@media screen and(min-width: 768px) { - .wrapperStyles { - height: calc(100% - 3rem); - width: calc(100%- 3rem); + aspect-ratio: 1 / 1; } } @media screen and (orientation: landscape) and (min-width: 768px) { + .wrapperStyles { height: calc(100% - 2.5rem); width: calc(100%- 3rem); + border: none; } - .canvasStyles { - width: 80vw; - height: calc(100% - 0.5rem); + aspect-ratio: 1 / 1; + border: 2px solid #dc5e47; + border-radius: 10px; } + } -@media screen and (orientation: landscape) and (min-width: 1024px) { + +@media screen and (min-width: 1024px) and (orientation: landscape) { + .wrapperStyles { - width: 80%; height: calc(100% - 0.5rem); - display: flex; + aspect-ratio: 1/1; } + .canvasStyles { - width: 150vw; - height: calc(100% - 0.5rem); + margin: 0 auto; } } + diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css index 6ee69fea..7db44401 100644 --- a/src/ui/Main.module.css +++ b/src/ui/Main.module.css @@ -116,7 +116,7 @@ position: absolute; left: 25px; top: 100px; - z-index: 900; + z-index: 1010; } .bottleft { @@ -125,7 +125,7 @@ position: absolute; left: 25px; bottom: 25px; - z-index: 1000; + z-index: 1010; } From 2335e6802e962f2c3e0120a3f4b223ba1c065b3b Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Fri, 15 Sep 2023 13:30:18 +0200 Subject: [PATCH 22/57] added styles with aspect ratio depend on devices ; --- src/engine/Graphics2d.module.css | 73 +++++++++++++++++++++++++++----- 1 file changed, 63 insertions(+), 10 deletions(-) diff --git a/src/engine/Graphics2d.module.css b/src/engine/Graphics2d.module.css index 00ed5368..00776c44 100644 --- a/src/engine/Graphics2d.module.css +++ b/src/engine/Graphics2d.module.css @@ -1,7 +1,4 @@ - -@media screen and (max-width: 768px) { - .wrapperStyles { width: 100%; height: 100vh; @@ -13,32 +10,32 @@ display: block; width: 150vw; } -} -@media screen and (min-width: 768px ) and (max-width: 1024px) { + +@media screen and (min-width: 768px ) and (max-width: 1023px) { .wrapperStyles { height: calc(100% - 2.5rem); width: calc(100% - 3rem); border: 2px solid #dc5e47; border-radius: 10px; + box-sizing: border-box; } .canvasStyles { aspect-ratio: 1 / 1; + } } -@media screen and (orientation: landscape) and (min-width: 768px) { +@media screen and (orientation: landscape) and (min-width: 768px) and (max-width: 1023px) { .wrapperStyles { height: calc(100% - 2.5rem); width: calc(100%- 3rem); - border: none; } .canvasStyles { aspect-ratio: 1 / 1; - border: 2px solid #dc5e47; - border-radius: 10px; + } } @@ -48,11 +45,67 @@ .wrapperStyles { height: calc(100% - 0.5rem); - aspect-ratio: 1/1; + width: 80%; + border: 2px solid #dc5e47; + border-radius: 10px; + } .canvasStyles { margin: 0 auto; + box-sizing: border-box; + } +} + +@media screen and (min-width: 1024px) and (orientation: landscape) and (max-width: 2559px) { + + .wrapperStyles { + display: block; + height: calc(100% - 0.5rem); + width: 80%; + border: 2px solid #dc5e47; + border-radius: 10px; + + } + + .canvasStyles { + width: 150vw; + margin: 0 auto; + box-sizing: border-box; + } +} + +@media screen and (min-width: 1024px) and (max-width: 2559px) and (orientation: portrait) { + .wrapperStyles { + width: 90%; + height: calc(100% - 0.5rem); + border: 2px solid #dc5e47; + border-radius: 10px; + display: block; + } + + .canvasStyles { + aspect-ratio: 1/1; + width:150vw; + } } + +@media screen and (min-width: 2560px) { + .wrapperStyles { + width: 90%; + border: 2px solid #dc5e47; + border-radius: 10px; + display: flex; + align-items: center; + } + + .canvasStyles { + aspect-ratio: 1/1; + + } } + + + + From 4193ce1e62ed9961d683b985be145387f6b346f2 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Fri, 15 Sep 2023 13:32:32 +0200 Subject: [PATCH 23/57] added @copyright; --- src/engine/Graphics2d.module.css | 40 ++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/src/engine/Graphics2d.module.css b/src/engine/Graphics2d.module.css index 00776c44..03f0db87 100644 --- a/src/engine/Graphics2d.module.css +++ b/src/engine/Graphics2d.module.css @@ -1,16 +1,19 @@ - - .wrapperStyles { - width: 100%; - height: 100vh; - justify-content: center; - overflow: scroll; - } - - .canvasStyles { - display: block; - width: 150vw; - } - +/*! +* Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) +* SPDX-License-Identifier: Apache-2.0 +*/ + + .wrapperStyles { + width: 100%; + height: 100vh; + justify-content: center; + overflow: scroll; + } + +.canvasStyles { + display: block; + width: 150vw; +} @media screen and (min-width: 768px ) and (max-width: 1023px) { @@ -21,9 +24,9 @@ border-radius: 10px; box-sizing: border-box; } + .canvasStyles { aspect-ratio: 1 / 1; - } } @@ -33,9 +36,9 @@ height: calc(100% - 2.5rem); width: calc(100%- 3rem); } + .canvasStyles { aspect-ratio: 1 / 1; - } } @@ -48,13 +51,13 @@ width: 80%; border: 2px solid #dc5e47; border-radius: 10px; - } .canvasStyles { margin: 0 auto; box-sizing: border-box; } + } @media screen and (min-width: 1024px) and (orientation: landscape) and (max-width: 2559px) { @@ -73,9 +76,11 @@ margin: 0 auto; box-sizing: border-box; } + } @media screen and (min-width: 1024px) and (max-width: 2559px) and (orientation: portrait) { + .wrapperStyles { width: 90%; height: calc(100% - 0.5rem); @@ -87,9 +92,10 @@ .canvasStyles { aspect-ratio: 1/1; width:150vw; - } } +} + @media screen and (min-width: 2560px) { .wrapperStyles { width: 90%; From 21c322120e3d69a7685cab640e6f4d115c241a48 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Mon, 18 Sep 2023 16:08:00 +0200 Subject: [PATCH 24/57] added styles for tablet; --- src/ui/Layout/Container.module.css | 3 - src/ui/Main.jsx | 4 +- src/ui/Main.module.css | 11 ++-- src/ui/MobileSettings/MobileSettings.jsx | 32 +++++---- .../MobileSettings/MobileSettings.module.css | 65 ++++++++++++++++--- 5 files changed, 84 insertions(+), 31 deletions(-) diff --git a/src/ui/Layout/Container.module.css b/src/ui/Layout/Container.module.css index d673cf13..f77027bc 100644 --- a/src/ui/Layout/Container.module.css +++ b/src/ui/Layout/Container.module.css @@ -38,7 +38,6 @@ .vertical { flex-direction: column; - width: 50px; } .vertical:not(:first-child) { @@ -52,8 +51,6 @@ .horizontal { display: none; } - - } @media screen and (min-width: 1024px) { diff --git a/src/ui/Main.jsx b/src/ui/Main.jsx index 791a6016..bdeb68aa 100644 --- a/src/ui/Main.jsx +++ b/src/ui/Main.jsx @@ -41,12 +41,12 @@ export const Main = () => { const [strAlertTitle, setStrAlertTitle] = useState(''); const [strAlertText, setStrAlertText] = useState(''); const [isFullMode, setIsFullMode] = useState(false); - const [isMobile, setIsMobile] = useState(window.innerWidth <= 768); + const [isMobile, setIsMobile] = useState(window.innerWidth <= 1024); const appRef = useRef(); useEffect(() => { function handleResize() { - setIsMobile(window.innerWidth <= 768); + setIsMobile(window.innerWidth <= 1024); } window.addEventListener('resize', handleResize); diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css index 7ac2ea0f..b990850f 100644 --- a/src/ui/Main.module.css +++ b/src/ui/Main.module.css @@ -94,6 +94,7 @@ } .header__logo { + display: block; margin-right: 25px; } @@ -118,13 +119,11 @@ } .left { - display: flex; - flex-direction: column; + display: block; position: absolute; - right: 0; left: 25px; - top: 100px; z-index: 1010; + top: 10%; } .bottleft { @@ -138,7 +137,9 @@ .settings { - display: none; + display: block; + position: absolute; + z-index: 2000; } .center { diff --git a/src/ui/MobileSettings/MobileSettings.jsx b/src/ui/MobileSettings/MobileSettings.jsx index 6f2ca16c..5ab98e67 100644 --- a/src/ui/MobileSettings/MobileSettings.jsx +++ b/src/ui/MobileSettings/MobileSettings.jsx @@ -10,6 +10,7 @@ export const MobileSettings = () => { const [isSettingsMenuOpen, setIsSettingsMenuOpen] = useState(false); const [is2DMenuOpen, setIs2DMenuOpen] = useState(false); const [isCursorMenuOpen, setIsCursorMenuOpen] = useState(false); + const [isSmallScreen, setIsSmallScreen] = useState(window.matchMedia('(max-width: 767px)').matches); const containerRef = useRef(null); const toggleSettingsMenu = () => { setIsSettingsMenuOpen(!isSettingsMenuOpen); @@ -24,13 +25,22 @@ export const MobileSettings = () => { setIsSettingsMenuOpen(false); // Закрываем другие меню при открытии этого setIsCursorMenuOpen(false); }; - const toggleCursorMenu = () => { setIsCursorMenuOpen(!isCursorMenuOpen); - console.log('Toggle Settings Menu'); - setIsSettingsMenuOpen(false); // Закрываем другие меню при открытии этого + setIsSettingsMenuOpen(false); setIs2DMenuOpen(false); }; + useEffect(() => { + const handleResize = () => { + setIsSmallScreen(window.matchMedia('(max-width: 768px)').matches); + }; + + window.addEventListener('resize', handleResize); + + return () => { + window.removeEventListener('resize', handleResize); + }; + }, []); useEffect(() => { const handleClickOutside = (event) => { @@ -43,9 +53,7 @@ export const MobileSettings = () => { } }; - const containerElement = containerRef.current; // Сохраните ссылку на контейнер - - // Добавьте слушателя события click к контейнеру + const containerElement = containerRef.current; containerElement.addEventListener('click', handleClickOutside); return () => { @@ -59,9 +67,11 @@ export const MobileSettings = () => { - - - + {isSmallScreen && ( + + + + )} @@ -71,8 +81,8 @@ export const MobileSettings = () => {
)} - {is2DMenuOpen && ( -
+ {(is2DMenuOpen || !isSmallScreen) && ( +
)} diff --git a/src/ui/MobileSettings/MobileSettings.module.css b/src/ui/MobileSettings/MobileSettings.module.css index 1f559e78..b582a44d 100644 --- a/src/ui/MobileSettings/MobileSettings.module.css +++ b/src/ui/MobileSettings/MobileSettings.module.css @@ -21,21 +21,31 @@ }*/ .buttons__container { - background: inherit; display: flex; flex-direction: column; - position: relative; - transform: translate(320px, 220px); - width: 100px; + width: 6rem; z-index: 2; + position: absolute; + top: 50%; + right: 0; + border: 1px solid var(--dark-gray); + border-radius: 0.5rem; +} + +.buttons__container button { + background: rgba(0,0,0, 0.5); + border: none; + margin: 0; + border-radius: initial; + padding-right: 0; + padding-left: 1rem; } .settings__menu { - position: relative; background: inherit; - z-index: 2; } + .settings__menu__button:after { display: block; content: ''; @@ -44,23 +54,58 @@ width: 24px; height: 24px; background-size: cover; - transform: translate(-32px, -22px); + transform: translate(-6px, -22px); } + .settings__menu_block { display: flex; justify-content: space-around; position: absolute; - top: 10%; left: 0; right: 0; padding: 10px; + z-index: 2; } .flex { flex-direction: column; } -/*.settings__menu_block:active { +.settings__menu_block:active { opacity: 0; background: pink; -}*/ \ No newline at end of file +} + +@media screen and (min-width: 768px){ + .buttons__container { + z-index: 20; + } + + .settings__menu_block { + display: block; + } + + .hide { + display: none; + } + + .buttons__container { + top: 12%; + right: 8%; + } + .settings__menu_block div { + display: flex; + } + .flex { + position: absolute; + width: 300px; + top:10%; + left: 20%; + z-index: 10; + } + + .horizontal { + background: #438f56; + } + +} \ No newline at end of file From a7e03f7c529f02b803d85e2c99bde3d273f70b4a Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Tue, 19 Sep 2023 11:27:05 +0200 Subject: [PATCH 25/57] fix warning; --- src/ui/Button/Button.module.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/Button/Button.module.css b/src/ui/Button/Button.module.css index e754ac69..465dd7b1 100644 --- a/src/ui/Button/Button.module.css +++ b/src/ui/Button/Button.module.css @@ -53,7 +53,7 @@ button:hover, @media screen and (min-width: 768px) { .reset { display: flex; - justify-content: end; + justify-content: flex-end; } } From 605ed86231dd77b6f24ad6b01c911f9fc8297415 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Tue, 19 Sep 2023 13:29:59 +0200 Subject: [PATCH 26/57] adding styles for settings on the tablets sizes; --- src/ui/Layout/Container.module.css | 1 + src/ui/MobileSettings/MobileSettings.jsx | 9 +++---- .../MobileSettings/MobileSettings.module.css | 26 ++++++++++++++----- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/ui/Layout/Container.module.css b/src/ui/Layout/Container.module.css index f77027bc..5c58688a 100644 --- a/src/ui/Layout/Container.module.css +++ b/src/ui/Layout/Container.module.css @@ -54,6 +54,7 @@ } @media screen and (min-width: 1024px) { + .horizontal { display: flex; flex-direction: row; diff --git a/src/ui/MobileSettings/MobileSettings.jsx b/src/ui/MobileSettings/MobileSettings.jsx index 5ab98e67..72290643 100644 --- a/src/ui/MobileSettings/MobileSettings.jsx +++ b/src/ui/MobileSettings/MobileSettings.jsx @@ -15,14 +15,14 @@ export const MobileSettings = () => { const toggleSettingsMenu = () => { setIsSettingsMenuOpen(!isSettingsMenuOpen); console.log('Toggle Settings Menu'); - setIs2DMenuOpen(false); // Закрываем другие меню при открытии этого + setIs2DMenuOpen(false); setIsCursorMenuOpen(false); }; const toggle2DMenu = () => { setIs2DMenuOpen(!is2DMenuOpen); console.log('Toggle Settings Menu'); - setIsSettingsMenuOpen(false); // Закрываем другие меню при открытии этого + setIsSettingsMenuOpen(false); setIsCursorMenuOpen(false); }; const toggleCursorMenu = () => { @@ -57,7 +57,6 @@ export const MobileSettings = () => { containerElement.addEventListener('click', handleClickOutside); return () => { - // Удалите слушателя события click при размонтировании компонента containerElement.removeEventListener('click', handleClickOutside); }; }, []); @@ -82,12 +81,12 @@ export const MobileSettings = () => {
)} {(is2DMenuOpen || !isSmallScreen) && ( -
+
)} {isCursorMenuOpen && ( -
+
)} diff --git a/src/ui/MobileSettings/MobileSettings.module.css b/src/ui/MobileSettings/MobileSettings.module.css index b582a44d..aabe5d8f 100644 --- a/src/ui/MobileSettings/MobileSettings.module.css +++ b/src/ui/MobileSettings/MobileSettings.module.css @@ -73,16 +73,19 @@ .settings__menu_block:active { opacity: 0; - background: pink; } @media screen and (min-width: 768px){ + .buttons__container { z-index: 20; } .settings__menu_block { display: block; + z-index: 10; + width: 5rem; + padding-left: 1.2rem; } .hide { @@ -90,22 +93,33 @@ } .buttons__container { - top: 12%; + top: 15%; right: 8%; } + .settings__menu_block div { display: flex; + position: relative; } + .flex { position: absolute; width: 300px; - top:10%; - left: 20%; + top: 13%; + left: 12%; z-index: 10; } - .horizontal { - background: #438f56; + width: 10rem; + position: absolute; + top: 15%; + left: 12%; + } + + .horizontal > div { + display: flex; + width: 100%; + } } \ No newline at end of file From 3db1c2b0015f6af3120c4be995655f8fb358e562 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Wed, 20 Sep 2023 15:17:24 +0200 Subject: [PATCH 27/57] adding styles for settings and testing; --- src/ui/Main.jsx | 4 +- src/ui/Main.module.css | 8 ++- src/ui/MobileSettings/MobileSettings.jsx | 6 +- .../MobileSettings/MobileSettings.module.css | 32 ++++----- src/ui/MobileSettings/MobileSettings.test.jsx | 66 +++++++++++++++++++ 5 files changed, 91 insertions(+), 25 deletions(-) create mode 100644 src/ui/MobileSettings/MobileSettings.test.jsx diff --git a/src/ui/Main.jsx b/src/ui/Main.jsx index bdeb68aa..957c0e35 100644 --- a/src/ui/Main.jsx +++ b/src/ui/Main.jsx @@ -41,12 +41,12 @@ export const Main = () => { const [strAlertTitle, setStrAlertTitle] = useState(''); const [strAlertText, setStrAlertText] = useState(''); const [isFullMode, setIsFullMode] = useState(false); - const [isMobile, setIsMobile] = useState(window.innerWidth <= 1024); + const [isMobile, setIsMobile] = useState(window.innerWidth < 1024); const appRef = useRef(); useEffect(() => { function handleResize() { - setIsMobile(window.innerWidth <= 1024); + setIsMobile(window.innerWidth < 1024); } window.addEventListener('resize', handleResize); diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css index b990850f..fb0372ee 100644 --- a/src/ui/Main.module.css +++ b/src/ui/Main.module.css @@ -96,6 +96,7 @@ .header__logo { display: block; margin-right: 25px; + margin-top: 1rem; } .header__panels { @@ -198,4 +199,9 @@ transition: opacity 300ms ease-in-out; } -} \ No newline at end of file +} +@media screen and (min-width: 1024px) and (orientation: landscape) { + .header__panels { + flex-wrap: nowrap; + } +} diff --git a/src/ui/MobileSettings/MobileSettings.jsx b/src/ui/MobileSettings/MobileSettings.jsx index 72290643..e11db042 100644 --- a/src/ui/MobileSettings/MobileSettings.jsx +++ b/src/ui/MobileSettings/MobileSettings.jsx @@ -63,15 +63,15 @@ export const MobileSettings = () => { return (
- + {isSmallScreen && ( - + )} - +
diff --git a/src/ui/MobileSettings/MobileSettings.module.css b/src/ui/MobileSettings/MobileSettings.module.css index aabe5d8f..7f07719a 100644 --- a/src/ui/MobileSettings/MobileSettings.module.css +++ b/src/ui/MobileSettings/MobileSettings.module.css @@ -3,23 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -/*.settings__menu:active { - display: flex; - flex-direction: column; - align-items: flex-end; - position: relative; - justify-content: center; - transform: translate(0, 0); - background: red; - height: 100vh; - z-index: 2; -} -.settings__menu:focus { - opacity: 0; - background: yellow; - z-index: -2; - -}*/ .buttons__container { display: flex; flex-direction: column; @@ -109,17 +92,28 @@ left: 12%; z-index: 10; } + .horizontal { width: 10rem; position: absolute; - top: 15%; - left: 12%; + top: 12%; + left: 10%; } .horizontal > div { display: flex; width: 100%; + } + +} +@media screen and (orientation: portrait) and (min-width: 768px) { + + .buttons__container { + top: 12%; } + .horizontal { + top: 12%; + } } \ No newline at end of file diff --git a/src/ui/MobileSettings/MobileSettings.test.jsx b/src/ui/MobileSettings/MobileSettings.test.jsx new file mode 100644 index 00000000..99062ab4 --- /dev/null +++ b/src/ui/MobileSettings/MobileSettings.test.jsx @@ -0,0 +1,66 @@ +/* + * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { render, fireEvent } from '@testing-library/react'; +import { MobileSettings } from './MobileSettings'; +import { UIButton } from '../Button/Button'; + +window.matchMedia = jest.fn().mockImplementation((query) => ({ + matches: query === '(max-width: 768px)', +})); + +jest.mock('react-modal', () => ({ + setAppElement: jest.fn(), +})); +jest.mock('./MobileSettings', () => ({ MobileSettings: jest.fn(() =>
3 buttons or 2
) })); + +const rootElement = document.createElement('div'); +rootElement.id = 'root'; +document.body.appendChild(rootElement); + +describe('MobileSettings', () => { + it('renders without errors', async () => { + const { container } = await render(); + expect(container).toBeInTheDocument(); + }); + + it('renders without errors', () => { + const { container } = render(); + expect(container).toBeInTheDocument(); + }); + + it('Button settingsLinear shod be on screen', () => { + const { getByTestId } = render(); + const button = getByTestId('buttonSettingsLinear'); + expect(button).toBeInTheDocument(); + }); + + it('should call the toggleSettingsMenu function when clicked', () => { + const toggleSettingsMenu = jest.fn(); + const { getByTestId } = render(); + const button = getByTestId('buttonSettingsLinear'); + fireEvent.click(button); // Имитируем клик на кнопку + expect(toggleSettingsMenu).toHaveBeenCalledTimes(1); + }); + + it('should call the toggleSettingsMenu function when clicked', () => { + const toggle2DMenu = jest.fn(); + const { getByTestId } = render(); + const button = getByTestId('button2D'); + fireEvent.click(button); + expect(toggle2DMenu).toHaveBeenCalledTimes(1); + }); + + it('should call the toggleSettingsMenu function when clicked', () => { + const toggleCursorMenu = jest.fn(); + const { getByTestId } = render(); + + const button = getByTestId('buttonCursor'); + fireEvent.click(button); // Имитируем клик на кнопку + + expect(toggleCursorMenu).toHaveBeenCalledTimes(1); + }); +}); From 20522a196dba400818b49074b08abc2aa15dea41 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko <63155209+katrysja@users.noreply.github.com> Date: Wed, 20 Sep 2023 19:18:54 +0200 Subject: [PATCH 28/57] Feature/EPMUII-5022 Responsiveness - Global layout (#166) * create mobile size for start screen * create mobile size for start screen * create mobile size for start screen * add resize depends on screen * add bottom menu * add response to canvas for devices * removed background for buttons into start screen * worked with settings component and states into main mobile screen * removed prior version of mobile bottom menu as new component; created new mobile menu using css; * add span to render text into buttons; changed canvas styles * add responsive for canvas * add additional render for canvas * add changes according to rendering canvas on screens * clean up unnecessary styles from recently files * moved styled to new file; unlocked slider work * added styles with aspect ratio; * added styles with aspect ratio depend on devices ; * added @copyright; --- src/engine/Graphics2d.js | 19 +- src/engine/Graphics2d.module.css | 117 ++++++++++ src/index.css | 2 + src/ui/Button/Button.jsx | 2 +- src/ui/Button/Button.module.css | 216 +++++++++++++----- src/ui/Layout/Container.module.css | 70 +++++- src/ui/Main.jsx | 2 - src/ui/Main.module.css | 195 ++++++++++++---- src/ui/Modals/Modals.module.css | 2 + src/ui/OpenFile/UISaveMenu.module.css | 27 +++ src/ui/OpenFile/UiOpenMenu.jsx | 6 +- src/ui/OpenFile/UiOpenMenu.module.css | 59 ++++- src/ui/OpenFile/UiReportMenu.js | 22 +- src/ui/OpenFile/UiSaveMenu.js | 11 +- .../RecentlyFiles/RecentlyFiles.jsx | 2 +- .../RecentlyFiles/RecentlyFiles.module.css | 37 ++- .../SmartContainer/SmartContainer.jsx | 16 +- .../SmartContainer/SmartContainer.module.css | 25 +- src/ui/StartScreen/StartScreen.module.css | 60 ++--- src/ui/Tooltip/Tooltip.module.css | 11 +- 20 files changed, 727 insertions(+), 174 deletions(-) create mode 100644 src/engine/Graphics2d.module.css create mode 100644 src/ui/OpenFile/UISaveMenu.module.css diff --git a/src/engine/Graphics2d.js b/src/engine/Graphics2d.js index 02807fd8..a46d90cb 100644 --- a/src/engine/Graphics2d.js +++ b/src/engine/Graphics2d.js @@ -21,6 +21,8 @@ import Segm2d from './Segm2d'; import { getPalette256 } from './loaders/RoiPalette256'; +import css from './Graphics2d.module.css'; + class Graphics2d extends React.Component { constructor(props) { super(props); @@ -690,28 +692,15 @@ class Graphics2d extends React.Component { // const volSet = store.volumeSet; this.m_sliceRatio = this.props.sliderValue; this.m_mode2d = this.props.mode2d; - - const wrapperStyles = { - display: 'flex', - justifyContent: 'flex-start', - width: `calc(100% - 110px)`, - height: `calc(100% - 110px)`, - margin: '100px 125px', - }; - const canvasStyles = { - maxWidth: '100%', - border: '2px solid #dc5e47', - borderRadius: '10px', - }; return ( -
+
); diff --git a/src/engine/Graphics2d.module.css b/src/engine/Graphics2d.module.css new file mode 100644 index 00000000..03f0db87 --- /dev/null +++ b/src/engine/Graphics2d.module.css @@ -0,0 +1,117 @@ +/*! +* Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) +* SPDX-License-Identifier: Apache-2.0 +*/ + + .wrapperStyles { + width: 100%; + height: 100vh; + justify-content: center; + overflow: scroll; + } + +.canvasStyles { + display: block; + width: 150vw; +} + +@media screen and (min-width: 768px ) and (max-width: 1023px) { + + .wrapperStyles { + height: calc(100% - 2.5rem); + width: calc(100% - 3rem); + border: 2px solid #dc5e47; + border-radius: 10px; + box-sizing: border-box; + } + + .canvasStyles { + aspect-ratio: 1 / 1; + } +} + +@media screen and (orientation: landscape) and (min-width: 768px) and (max-width: 1023px) { + + .wrapperStyles { + height: calc(100% - 2.5rem); + width: calc(100%- 3rem); + } + + .canvasStyles { + aspect-ratio: 1 / 1; + } + +} + + +@media screen and (min-width: 1024px) and (orientation: landscape) { + + .wrapperStyles { + height: calc(100% - 0.5rem); + width: 80%; + border: 2px solid #dc5e47; + border-radius: 10px; + } + + .canvasStyles { + margin: 0 auto; + box-sizing: border-box; + } + +} + +@media screen and (min-width: 1024px) and (orientation: landscape) and (max-width: 2559px) { + + .wrapperStyles { + display: block; + height: calc(100% - 0.5rem); + width: 80%; + border: 2px solid #dc5e47; + border-radius: 10px; + + } + + .canvasStyles { + width: 150vw; + margin: 0 auto; + box-sizing: border-box; + } + +} + +@media screen and (min-width: 1024px) and (max-width: 2559px) and (orientation: portrait) { + + .wrapperStyles { + width: 90%; + height: calc(100% - 0.5rem); + border: 2px solid #dc5e47; + border-radius: 10px; + display: block; + } + + .canvasStyles { + aspect-ratio: 1/1; + width:150vw; + } + +} + +@media screen and (min-width: 2560px) { + .wrapperStyles { + width: 90%; + border: 2px solid #dc5e47; + border-radius: 10px; + display: flex; + align-items: center; + } + + .canvasStyles { + aspect-ratio: 1/1; + + } +} + + + + + diff --git a/src/index.css b/src/index.css index 5838fae1..1c325689 100644 --- a/src/index.css +++ b/src/index.css @@ -11,6 +11,7 @@ body { margin: 0; padding: 0; font-family: 'Inter', sans-serif; + font-size: 15px; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; height: 100vh; @@ -28,6 +29,7 @@ code { --black: #18191b; /* Additional colors */ + --beige: #f4f2ea; --gray: #636666; --dark-gray: #282a2d; --dark-gray2: #46494e; diff --git a/src/ui/Button/Button.jsx b/src/ui/Button/Button.jsx index 74246c32..97f7cf5d 100644 --- a/src/ui/Button/Button.jsx +++ b/src/ui/Button/Button.jsx @@ -30,7 +30,7 @@ export const UIButton = ({ icon, caption, handler, active, rounded, type, mode, caption={icon && caption} > {icon ? : caption} - {text ? text : ''} + {text ? {text} : ''} ); }; diff --git a/src/ui/Button/Button.module.css b/src/ui/Button/Button.module.css index d9e75930..e754ac69 100644 --- a/src/ui/Button/Button.module.css +++ b/src/ui/Button/Button.module.css @@ -3,6 +3,60 @@ * SPDX-License-Identifier: Apache-2.0 */ +.button.light svg { + fill: var(--black); +} + +button:hover, +.button:focus { + background-color: var(--light-orange); +} + +.button.active { + color: var(--red); +} +.apply { + background-color: var(--red); + border-radius: 4px; +} + +.button.active svg { + fill: var(--red); +} + +.button.light { + color: var(--black); + background-color: var(--light); +} + +.button.light svg { + fill: var(--black); +} + +.button.light.active { + color: var(--red); +} + +.button.light:hover, +.button.light:focus { + background-color: var(--light); + filter: brightness(80%); +} + +.button.accent { + color: var(--white); + background-color: var(--red); +} + + + +@media screen and (min-width: 768px) { + .reset { + display: flex; + justify-content: end; + } + +} .reset { display: inline-block; border: none; @@ -53,58 +107,116 @@ fill: var(--white); } -.button:hover, -.button:focus { - background-color: var(--light-orange); -} - -.button.active { - color: var(--red); -} - -.apply { - background-color: var(--red); - border-radius: 4px; -} - -.button.active svg { - fill: var(--red); -} - -.button.light { - color: var(--black); - background-color: var(--light); -} +.button:not(.reset) { + display: block; +} + +@media screen and (min-width: 1024px) { + .reset { + display: inline-block; + border: none; + margin: 0; + text-decoration: none; + background-color: transparent; + padding: 0; + cursor: pointer; + transition: all 250ms ease-in-out, transform 150ms ease; + -webkit-appearance: none; + -moz-appearance: none; + } + + .reset:focus { + outline: none; + } + + .button { + margin-right: 5px; + margin-bottom: 5px; + background-color: var(--black); + padding: 12px 13px; + color: var(--white); + font-family: inherit; + text-align: center; + vertical-align: center; + font-size: 14px; + border-radius: 36px; + } + + .button > svg { + width: 24px; + height: 24px; + } + + .rounded { + overflow: hidden; + border-radius: 50%; + } + + .captionButton { + padding: 5px 10px; + font-size: 16px; + line-height: 1.5; + } + + .button svg { + fill: var(--white); + } + + .button:hover, + .button:focus { + background-color: var(--light-orange); + } + + .button.active { + color: var(--red); + } + + .apply { + background-color: var(--red); + border-radius: 4px; + } + + .button.active svg { + fill: var(--red); + } + + .button.light { + color: var(--black); + background-color: var(--light); + } + + .button.light svg { + fill: var(--black); + } + + .button.light.active { + color: var(--red); + } + + .button.light:hover, + .button.light:focus { + background-color: var(--light); + filter: brightness(80%); + } + + .button.accent { + color: var(--white); + background-color: var(--red); + } + + .button.accent svg { + fill: var(--white); + } + + .button.accent:hover, + .button.accent:focus { + background-color: var(--red); + filter: brightness(85%); + } + + .button.accent.active svg { + fill: var(--black); + } -.button.light svg { - fill: var(--black); } -.button.light.active { - color: var(--red); -} - -.button.light:hover, -.button.light:focus { - background-color: var(--light); - filter: brightness(80%); -} - -.button.accent { - color: var(--white); - background-color: var(--red); -} - -.button.accent svg { - fill: var(--white); -} - -.button.accent:hover, -.button.accent:focus { - background-color: var(--red); - filter: brightness(85%); -} - -.button.accent.active svg { - fill: var(--black); -} diff --git a/src/ui/Layout/Container.module.css b/src/ui/Layout/Container.module.css index 5dccd630..d673cf13 100644 --- a/src/ui/Layout/Container.module.css +++ b/src/ui/Layout/Container.module.css @@ -2,7 +2,18 @@ * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) * SPDX-License-Identifier: Apache-2.0 */ +.vertical { + display: none; +} + +.horizontal { + display: block; +} +.container button > svg #clear { + display: block; + color: #18191b; +} .container { display: inline-flex; flex-wrap: wrap; @@ -11,18 +22,57 @@ overflow: hidden; } -.vertical { - flex-direction: column; - width: 50px; +.horizontal button > svg > use[xlinkHref$="#folder"] { + display: none; } -.vertical:not(:first-child) { - margin-top: 25px; +@media screen and (min-width: 768px) { + + .container { + display: inline-flex; + flex-wrap: wrap; + width: fit-content; + border-radius: 10px; + overflow: hidden; + } + + .vertical { + flex-direction: column; + width: 50px; + } + + .vertical:not(:first-child) { + margin-top: 25px; + } + + .container button { + display: flex; + } + + .horizontal { + display: none; + } + + } -.horizontal { - flex-direction: row; - flex-shrink: 0; - height: 50px; - margin: 0 25px 0 0; +@media screen and (min-width: 1024px) { + .horizontal { + display: flex; + flex-direction: row; + flex-shrink: 0; + height: 50px; + margin: 0 25px 0 0; + } + + .container button > svg #clear, + .container button > svg #edit { + display: block; + color: #18191b; + background: red; + } + } + + + diff --git a/src/ui/Main.jsx b/src/ui/Main.jsx index ca9d5dfb..17dccb74 100644 --- a/src/ui/Main.jsx +++ b/src/ui/Main.jsx @@ -54,7 +54,6 @@ export const Main = () => { ); const isReady = isLoaded && isWebGl20supported; - const onShowModalText = () => { dispatch({ type: StoreActionType.SET_MODAL_TEXT, showModalText: true }); }; @@ -176,7 +175,6 @@ export const Main = () => { ) : ( )} - {isReady && (
diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css index 1c359edb..7db44401 100644 --- a/src/ui/Main.module.css +++ b/src/ui/Main.module.css @@ -10,32 +10,45 @@ .header { display: flex; align-items: center; - position: relative; - margin: 25px 25px 0; z-index: 1000; } .header__logo { margin-right: 25px; } - .header__panels { + display: none; +} + +.header__right { + position: absolute; + bottom: 0; display: flex; + justify-content: center; + flex-direction: row-reverse; z-index: 1000; - margin-top: 17px; + width: 100vw; + right: 0; + height: 50px; + padding: 1rem; + background-color: var(--beige); + align-items: center; } -.header__right { +.header__right > button { + background: inherit; + border: none; + color: var(--black); display: flex; - flex-wrap: nowrap; + flex-direction: column; align-items: center; - margin-left: auto; - margin-top: 17px; + justify-content: space-evenly; + font-size: 0.75rem; + line-height: 12.1px; } -.fullscreen .header__panels { - position: absolute; - left: 75px; +.header__right button svg { + fill: var(--black); } .fullscreen .left, @@ -43,45 +56,137 @@ top: 20px; } -.left { - display: flex; - flex-direction: column; - position: absolute; - left: 25px; - top: 100px; - z-index: 900; +.bottleft { + display: none; } -.center { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - z-index: 10; +.left { + display: none; } +.center div { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 10; + +} .settings { - display: flex; - flex-direction: column; - z-index: 800; - position: absolute; - right: 25px; - top: 100px; - background-color: var(--dark-gray); - padding: 25px; - width: 400px; - opacity: var(--opacity); - cursor: all-scroll; - border-radius: 24px; - transition: opacity 300ms ease-in-out; + display: none; } -.bottleft { - display: flex; - flex-direction: column; - position: absolute; - left: 25px; - bottom: 25px; - z-index: 1000; +@media screen and (min-width: 768px) { + + .header { + display: flex; + position: relative; + padding: 1rem; + z-index: 1000; + } + + .header__logo { + margin-right: 25px; + } + + .header__panels { + display: flex; + flex-direction: column; + width: 25rem; + } + .fullscreen .header__panels { + position: absolute; + left: 75px; + } + + .header__right { + display: flex; + justify-content: flex-start; + flex-wrap: nowrap; + align-items: center; + margin-left: auto; + position: static; + background: inherit; + } + + .left { + display: flex; + flex-direction: column; + position: absolute; + left: 25px; + top: 100px; + z-index: 1010; + } + + .bottleft { + display: flex; + flex-direction: column; + position: absolute; + left: 25px; + bottom: 25px; + z-index: 1010; + } + + + .settings { + display: none; + } + + .center { + position: absolute; + top: 6rem; + left: 5rem; + right: 0; + bottom: 0; + z-index: 10; + } +} + +@media screen and (min-width: 1024px) { + + .header { + align-items: flex-start; + } + + .header div { + margin-bottom: 1rem; + } + + .header__right { + align-items: stretch; + } + + .header__panels { + width: 100%; + display: flex; + flex-direction: row; + flex-wrap: wrap; + padding: 1rem 1.5rem 1rem 0; + } + + .center { + top: 6rem; + left: 5rem; + right: 0; + bottom: 2rem; + z-index: 10; + } + + .settings { + display: flex; + flex-direction: column; + z-index: 1100; + position: absolute; + right: 25px; + top: 100px; + background-color: var(--dark-gray); + padding: 25px; + width: 400px; + opacity: var(--opacity); + cursor: all-scroll; + border-radius: 24px; + transition: opacity 300ms ease-in-out; + } + } \ No newline at end of file diff --git a/src/ui/Modals/Modals.module.css b/src/ui/Modals/Modals.module.css index 0afc6112..b5e2dab3 100644 --- a/src/ui/Modals/Modals.module.css +++ b/src/ui/Modals/Modals.module.css @@ -157,6 +157,8 @@ margin-top: 8px; } + + @media screen and (min-width: 768px) { .modal { width: 600px; diff --git a/src/ui/OpenFile/UISaveMenu.module.css b/src/ui/OpenFile/UISaveMenu.module.css new file mode 100644 index 00000000..40aa9bd8 --- /dev/null +++ b/src/ui/OpenFile/UISaveMenu.module.css @@ -0,0 +1,27 @@ +.button.download__link { + color: #18191b; + background: inherit; + display: flex; + flex-direction: column; + align-items: center; +} + +.button.download__link:hover, +.button.download__link:focus { + background-color: var(--light-orange); +} + +.button.download__link svg { + fill: #18191b; +} + +@media screen and (min-width: 768px) { + .button.download__link { + background-color: var(--beige); + } + .download__link > span { + display: none; + } + + +} \ No newline at end of file diff --git a/src/ui/OpenFile/UiOpenMenu.jsx b/src/ui/OpenFile/UiOpenMenu.jsx index ba41436e..5586f1fd 100644 --- a/src/ui/OpenFile/UiOpenMenu.jsx +++ b/src/ui/OpenFile/UiOpenMenu.jsx @@ -940,14 +940,14 @@ class UiOpenMenu extends FileReader { <> - this.onButtonOpenLocalFileClick(evt)} /> + this.onButtonOpenLocalFileClick(evt)} /> - + {NEED_DEMO_MENU && ( - + )} diff --git a/src/ui/OpenFile/UiOpenMenu.module.css b/src/ui/OpenFile/UiOpenMenu.module.css index dc180cf1..bce89bdf 100644 --- a/src/ui/OpenFile/UiOpenMenu.module.css +++ b/src/ui/OpenFile/UiOpenMenu.module.css @@ -4,17 +4,74 @@ */ .save-file__area { - height: 50px; + height: 40px; display: flex; align-content: center; align-items: center; justify-content: space-between; + color: #18191b; } .save-file__area div { margin-right: 10px; } +.save-file__area div { + background: inherit; + color: var(--black); +} + .filename { gap: 8px; } + +.open-folder__link, +.button.report-menu__report, +.button.report-menu__camera { + background: inherit; + display: flex; + flex-direction: column; + align-items: center; + color: #18191b; +} +.open-folder__link:hover, +.button.report-menu__report:hover, +.button.report-menu__camera:hover { + background-color: var(--light-orange); +} + +.open-folder__link:focus, +.button.report-menu__report:focus, +.button.report-menu__camera:focus { + background-color: var(--light-orange); +} + + +.open-file__link, +.open-demo__link { + display: none; +} + + @media screen and (min-width: 768px) { + .open-folder__link, + .button.report-menu__report, + .button.report-menu__camera { + background-color: var(--beige); + } + + .open-folder__link > span, + .button.report-menu__report > span, + .button.report-menu__camera > span { + display: none; + } + + } +@media screen and (min-width: 1024px) { + .open-file__link, + .open-demo__link { + background-color: var(--beige); + } + .save-file__area { + align-items: normal; + } +} \ No newline at end of file diff --git a/src/ui/OpenFile/UiReportMenu.js b/src/ui/OpenFile/UiReportMenu.js index 7df88cdd..9a6fe862 100644 --- a/src/ui/OpenFile/UiReportMenu.js +++ b/src/ui/OpenFile/UiReportMenu.js @@ -4,6 +4,8 @@ */ import React, { useState } from 'react'; +import cx from 'classnames'; +import css from './UiOpenMenu.module.css'; import Screenshot from '../../engine/utils/Screenshot'; import ViewMode from '../../store/ViewMode'; @@ -45,10 +47,26 @@ export const UiReportMenu = () => { return ( <> - + - + {showModalDicomTags && } diff --git a/src/ui/OpenFile/UiSaveMenu.js b/src/ui/OpenFile/UiSaveMenu.js index 8e8c0be0..be6976e9 100644 --- a/src/ui/OpenFile/UiSaveMenu.js +++ b/src/ui/OpenFile/UiSaveMenu.js @@ -10,6 +10,8 @@ import { useSelector } from 'react-redux'; import { UiModalSaveNifti } from '../Modals/UiModalSaveNifti'; import { UIButton } from '../Button/Button'; import { Tooltip } from '../Tooltip/Tooltip'; +import css from './UISaveMenu.module.css'; +import cx from 'classnames'; export const UiSaveMenu = () => { /** @@ -28,7 +30,14 @@ export const UiSaveMenu = () => { return ( <> - onModalSaveNiftiShow(evt)} mode={isLoaded ? 'accent' : ''} /> + onModalSaveNiftiShow(evt)} + mode={isLoaded ? 'accent' : ''} + /> diff --git a/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.jsx b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.jsx index 0de6e2c3..6f2d7849 100644 --- a/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.jsx +++ b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.jsx @@ -38,7 +38,7 @@ const RecentlyFiles = () => { return files.length ? (
-
Recently opened files:
+
Recently opened file:
{timestamps.map((timestamp, idx) => ( diff --git a/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css index 4d5e3cc6..706af2a9 100644 --- a/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css +++ b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css @@ -1,6 +1,5 @@ .files_container { - margin: 0; - margin-top: 10px; + margin: 10px 0 0 0; background-color: var(--extreme-black); font-size: 14px; width: 100%; @@ -10,8 +9,9 @@ } .header { - margin-bottom: 10px; display: flex; + margin-bottom: 10px; + padding-right: 0.5rem; } .files { @@ -24,5 +24,34 @@ } .element:not(:first-child) { - margin-top: 10px; + display: none; +} + +@media screen and (min-width: 768px) { + + .files_container { + display: flex; + align-items: normal; + justify-content: flex-start; + margin:10px 0 1.1rem 0; + background-color: var(--extreme-black); + font-size: 14px; + width: 100%; + padding: 15px; + border-radius: 6px; + box-sizing: border-box; + } + + .element:not(:first-child) { + margin-top: 10px; + } } + +@media screen and (min-width: 1024px) { +.files_container { + margin: 0 0 1rem 0; + display: flex; + justify-content: normal; + } +} + diff --git a/src/ui/StartScreen/SmartContainer/SmartContainer.jsx b/src/ui/StartScreen/SmartContainer/SmartContainer.jsx index 02775944..423a0787 100644 --- a/src/ui/StartScreen/SmartContainer/SmartContainer.jsx +++ b/src/ui/StartScreen/SmartContainer/SmartContainer.jsx @@ -25,8 +25,12 @@ class SmartContainer extends FileReader { } componentDidMount() { - const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent); + const isMobile = window.innerWidth < 768; + //const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent); + //console.log(navigator.userAgent); + window.addEventListener('resize', this.handleWindowResize); this.setState({ isMobile }); + console.log(isMobile); } handleDrag(e) { @@ -45,8 +49,18 @@ class SmartContainer extends FileReader { this.handleFileSelected(e); } + handleWindowResize = () => { + const isMobile = window.innerWidth < 768; + this.setState({ isMobile }); + }; + + componentWillUnmount() { + window.removeEventListener('resize', this.handleWindowResize); + } + render() { const { isMobile } = this.state; + console.log(isMobile); return (
.arrow { left: -6px; -} \ No newline at end of file +} + + +@media screen and (min-width: 768px) { + .demo__link { + display: block; + } + +} From af2e1f83fbff2c6ce96f8f62e0015afd7d1a50e4 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Fri, 22 Sep 2023 10:16:18 +0200 Subject: [PATCH 29/57] added tests for MobileSettings; --- src/ui/MobileSettings/MobileSettings.test.jsx | 44 +++++++++++++++---- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/src/ui/MobileSettings/MobileSettings.test.jsx b/src/ui/MobileSettings/MobileSettings.test.jsx index 99062ab4..ea068536 100644 --- a/src/ui/MobileSettings/MobileSettings.test.jsx +++ b/src/ui/MobileSettings/MobileSettings.test.jsx @@ -5,36 +5,61 @@ import React from 'react'; import { render, fireEvent } from '@testing-library/react'; + +import { renderWithState } from '../../utils/configureTest'; import { MobileSettings } from './MobileSettings'; import { UIButton } from '../Button/Button'; +import { useNeedShow3d } from '../../utils/useNeedShow3d'; +import ViewMode from '../../store/ViewMode'; -window.matchMedia = jest.fn().mockImplementation((query) => ({ - matches: query === '(max-width: 768px)', -})); +jest.mock('../../utils/useNeedShow3d'); +const mockedUseNeedShow3d = useNeedShow3d; jest.mock('react-modal', () => ({ setAppElement: jest.fn(), })); -jest.mock('./MobileSettings', () => ({ MobileSettings: jest.fn(() =>
3 buttons or 2
) })); + +jest.mock('../LeftToolbar/LeftToolbar', () => ({ + LeftToolBar: jest.fn(() =>
LeftToolBar
), +})); + +jest.mock('../LeftToolbar/LeftToolbar', () => ({ + LeftToolBar: jest.fn(() =>
LeftToolBar
), +})); + +jest.mock('./MobileSettings', () => ({ MobileSettings: jest.fn(() =>
3 buttons
) })); const rootElement = document.createElement('div'); rootElement.id = 'root'; document.body.appendChild(rootElement); - describe('MobileSettings', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('test render component', () => { + mockedUseNeedShow3d.mockReturnValue(true); + const { store } = renderWithState(); + + expect(store.getState().viewMode).toBe(ViewMode.VIEW_2D); + }); + it('renders without errors', async () => { const { container } = await render(); + expect(container).toBeInTheDocument(); }); it('renders without errors', () => { - const { container } = render(); + const { container } = render(); + expect(container).toBeInTheDocument(); }); it('Button settingsLinear shod be on screen', () => { const { getByTestId } = render(); const button = getByTestId('buttonSettingsLinear'); + expect(button).toBeInTheDocument(); }); @@ -42,7 +67,8 @@ describe('MobileSettings', () => { const toggleSettingsMenu = jest.fn(); const { getByTestId } = render(); const button = getByTestId('buttonSettingsLinear'); - fireEvent.click(button); // Имитируем клик на кнопку + fireEvent.click(button); + expect(toggleSettingsMenu).toHaveBeenCalledTimes(1); }); @@ -51,15 +77,15 @@ describe('MobileSettings', () => { const { getByTestId } = render(); const button = getByTestId('button2D'); fireEvent.click(button); + expect(toggle2DMenu).toHaveBeenCalledTimes(1); }); it('should call the toggleSettingsMenu function when clicked', () => { const toggleCursorMenu = jest.fn(); const { getByTestId } = render(); - const button = getByTestId('buttonCursor'); - fireEvent.click(button); // Имитируем клик на кнопку + fireEvent.click(button); expect(toggleCursorMenu).toHaveBeenCalledTimes(1); }); From 309926dd604ceb83fcab723785b5df10a2ad1af4 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Fri, 22 Sep 2023 13:11:23 +0200 Subject: [PATCH 30/57] added styles and cleaned up consoles; --- src/ui/Main.jsx | 1 - src/ui/Main.module.css | 53 +++++++++++++++++-- src/ui/MobileSettings/MobileSettings.jsx | 5 +- .../MobileSettings/MobileSettings.module.css | 7 +-- src/ui/OpenFile/UiOpenMenu.module.css | 1 + 5 files changed, 54 insertions(+), 13 deletions(-) diff --git a/src/ui/Main.jsx b/src/ui/Main.jsx index 957c0e35..54d0a08b 100644 --- a/src/ui/Main.jsx +++ b/src/ui/Main.jsx @@ -154,7 +154,6 @@ export const Main = () => { document.removeEventListener('fullscreenchange', onFullScreenChange); }; }, [isFullMode, isMobile]); - console.log(isMobile); return ( diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css index fb0372ee..82e87451 100644 --- a/src/ui/Main.module.css +++ b/src/ui/Main.module.css @@ -16,6 +16,7 @@ .header__logo { display: none; } + .header__panels { display: none; } @@ -25,14 +26,14 @@ bottom: 0; display: flex; justify-content: center; + align-items: center; flex-direction: row-reverse; - z-index: 1000; width: 100vw; right: 0; height: 50px; padding: 1rem; background-color: var(--beige); - align-items: center; + z-index: 1000; } .header__right > button { @@ -104,6 +105,7 @@ flex-direction: column; width: 25rem; } + .fullscreen .header__panels { position: absolute; left: 75px; @@ -123,8 +125,8 @@ display: block; position: absolute; left: 25px; - z-index: 1010; top: 10%; + z-index: 1010; } .bottleft { @@ -138,7 +140,7 @@ .settings { - display: block; + display: block; position: absolute; z-index: 2000; } @@ -186,7 +188,6 @@ .settings { display: flex; flex-direction: column; - z-index: 1100; position: absolute; right: 25px; top: 100px; @@ -197,11 +198,53 @@ cursor: all-scroll; border-radius: 24px; transition: opacity 300ms ease-in-out; + z-index: 1100; } } + @media screen and (min-width: 1024px) and (orientation: landscape) { + + .header__panels { + margin-right: 3rem; + } + + .header__panels > div { + flex-wrap: nowrap; + margin-right: 1rem; + } + + .left { + top:12%; + } + +} + +@media screen and (min-width: 1024px) and (orientation: portrait) { + .header__panels { flex-wrap: nowrap; } + + .settings { + top: 4rem; + } + +} + +@media screen and (min-width: 1440px) { + .header__panels { + flex-wrap: nowrap; + } + +} + +@media screen and (min-width: 2560px) and (orientation: landscape) { + + .left { + top: 5%; + } + .settings { + top: 4rem; + } } diff --git a/src/ui/MobileSettings/MobileSettings.jsx b/src/ui/MobileSettings/MobileSettings.jsx index e11db042..8f76ec95 100644 --- a/src/ui/MobileSettings/MobileSettings.jsx +++ b/src/ui/MobileSettings/MobileSettings.jsx @@ -14,14 +14,12 @@ export const MobileSettings = () => { const containerRef = useRef(null); const toggleSettingsMenu = () => { setIsSettingsMenuOpen(!isSettingsMenuOpen); - console.log('Toggle Settings Menu'); setIs2DMenuOpen(false); setIsCursorMenuOpen(false); }; const toggle2DMenu = () => { setIs2DMenuOpen(!is2DMenuOpen); - console.log('Toggle Settings Menu'); setIsSettingsMenuOpen(false); setIsCursorMenuOpen(false); }; @@ -43,13 +41,12 @@ export const MobileSettings = () => { }, []); useEffect(() => { + //TODO: next step is implementation behavior const handleClickOutside = (event) => { - console.log('click'); if (containerRef.current && !containerRef.current.contains(event.target)) { setIsSettingsMenuOpen(false); setIs2DMenuOpen(false); setIsCursorMenuOpen(false); - console.log(is2DMenuOpen, isCursorMenuOpen, isSettingsMenuOpen); } }; diff --git a/src/ui/MobileSettings/MobileSettings.module.css b/src/ui/MobileSettings/MobileSettings.module.css index 7f07719a..3f97b2fc 100644 --- a/src/ui/MobileSettings/MobileSettings.module.css +++ b/src/ui/MobileSettings/MobileSettings.module.css @@ -66,9 +66,10 @@ .settings__menu_block { display: block; - z-index: 10; + top: 6rem; width: 5rem; padding-left: 1.2rem; + z-index: 10; } .hide { @@ -96,7 +97,7 @@ .horizontal { width: 10rem; position: absolute; - top: 12%; + top: 13%; left: 10%; } @@ -110,7 +111,7 @@ @media screen and (orientation: portrait) and (min-width: 768px) { .buttons__container { - top: 12%; + top: 14%; } .horizontal { diff --git a/src/ui/OpenFile/UiOpenMenu.module.css b/src/ui/OpenFile/UiOpenMenu.module.css index bce89bdf..be2bd0a1 100644 --- a/src/ui/OpenFile/UiOpenMenu.module.css +++ b/src/ui/OpenFile/UiOpenMenu.module.css @@ -10,6 +10,7 @@ align-items: center; justify-content: space-between; color: #18191b; + padding-left: 1rem; } .save-file__area div { From f4c608120bbd43efa4a6a6c62045af2e1f8f7268 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Fri, 22 Sep 2023 13:43:16 +0200 Subject: [PATCH 31/57] fixed build error; --- src/ui/Button/Button.module.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ui/Button/Button.module.css b/src/ui/Button/Button.module.css index 35e40f13..910ddc33 100644 --- a/src/ui/Button/Button.module.css +++ b/src/ui/Button/Button.module.css @@ -217,3 +217,4 @@ button:hover, .button.accent.active svg { fill: var(--black); } +} From df8cd4e9cf03f5a8a0c820726dff0cbb71b54d58 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Tue, 26 Sep 2023 11:16:33 +0200 Subject: [PATCH 32/57] click functionality; --- src/ui/MobileSettings/MobileSettings.jsx | 28 +++++++++++++++++-- .../MobileSettings/MobileSettings.module.css | 7 ++++- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/ui/MobileSettings/MobileSettings.jsx b/src/ui/MobileSettings/MobileSettings.jsx index 8f76ec95..b631cfd6 100644 --- a/src/ui/MobileSettings/MobileSettings.jsx +++ b/src/ui/MobileSettings/MobileSettings.jsx @@ -11,6 +11,8 @@ export const MobileSettings = () => { const [is2DMenuOpen, setIs2DMenuOpen] = useState(false); const [isCursorMenuOpen, setIsCursorMenuOpen] = useState(false); const [isSmallScreen, setIsSmallScreen] = useState(window.matchMedia('(max-width: 767px)').matches); + const [isMenuHidden, setIsMenuHidden] = useState(false); + const containerRef = useRef(null); const toggleSettingsMenu = () => { setIsSettingsMenuOpen(!isSettingsMenuOpen); @@ -28,6 +30,7 @@ export const MobileSettings = () => { setIsSettingsMenuOpen(false); setIs2DMenuOpen(false); }; + useEffect(() => { const handleResize = () => { setIsSmallScreen(window.matchMedia('(max-width: 768px)').matches); @@ -41,24 +44,43 @@ export const MobileSettings = () => { }, []); useEffect(() => { - //TODO: next step is implementation behavior const handleClickOutside = (event) => { if (containerRef.current && !containerRef.current.contains(event.target)) { + console.log('click outside'); + console.log(containerRef.current.contains(event.target)); setIsSettingsMenuOpen(false); setIs2DMenuOpen(false); setIsCursorMenuOpen(false); + setTimeout(() => { + if (!isMenuHidden) { + setIsSettingsMenuOpen(false); + setIs2DMenuOpen(false); + setIsCursorMenuOpen(false); + setIsMenuHidden(true); + } else { + setIsMenuHidden(false); + } + }, 1000); } }; const containerElement = containerRef.current; + console.log(containerElement); + console.log(containerRef); + containerElement.addEventListener('click', handleClickOutside); + document.addEventListener('click', handleClickOutside); + document.addEventListener('touchstart', handleClickOutside); return () => { containerElement.removeEventListener('click', handleClickOutside); + document.removeEventListener('click', handleClickOutside); + document.removeEventListener('touchstart', handleClickOutside); }; - }, []); + }, [isMenuHidden]); + return ( -
+
diff --git a/src/ui/MobileSettings/MobileSettings.module.css b/src/ui/MobileSettings/MobileSettings.module.css index 3f97b2fc..a6887170 100644 --- a/src/ui/MobileSettings/MobileSettings.module.css +++ b/src/ui/MobileSettings/MobileSettings.module.css @@ -26,6 +26,7 @@ .settings__menu { + display: block; background: inherit; } @@ -47,13 +48,17 @@ left: 0; right: 0; padding: 10px; - z-index: 2; + z-index: 20000; } .flex { flex-direction: column; } +.hidden { + display: none; +} + .settings__menu_block:active { opacity: 0; } From 619a62b1a3a3170aed436dab8091704f8e1c213f Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Tue, 26 Sep 2023 16:01:28 +0200 Subject: [PATCH 33/57] added animation onshow/hide blocks; --- .../MobileSettings/MobileSettings.module.css | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/src/ui/MobileSettings/MobileSettings.module.css b/src/ui/MobileSettings/MobileSettings.module.css index a6887170..88e579fd 100644 --- a/src/ui/MobileSettings/MobileSettings.module.css +++ b/src/ui/MobileSettings/MobileSettings.module.css @@ -11,8 +11,12 @@ position: absolute; top: 50%; right: 0; + opacity: 1; border: 1px solid var(--dark-gray); border-radius: 0.5rem; + animation: onHide 1s ease-in-out; + animation-fill-mode: forwards; + } .buttons__container button { @@ -24,10 +28,20 @@ padding-left: 1rem; } - .settings__menu { display: block; background: inherit; + opacity: 1; +} + +.hidden { + display: none; + width: 0; + opacity: 0; + overflow: hidden; + visibility: hidden; + animation: onHide 1s ease-in-out; + animation-fill-mode: forwards; } .settings__menu__button:after { @@ -49,19 +63,26 @@ right: 0; padding: 10px; z-index: 20000; + animation: onHide 1s ease-in-out; + animation-fill-mode: forwards; } .flex { flex-direction: column; } -.hidden { - display: none; +@keyframes onHide { + 0% { + opacity: 0; + } + 50% { + opacity: 0.9; + } + 100% { + opacity: 1; + } } -.settings__menu_block:active { - opacity: 0; -} @media screen and (min-width: 768px){ @@ -122,4 +143,4 @@ .horizontal { top: 12%; } -} \ No newline at end of file +} From a1cc52e15896120eeab288e32be62bc15bb9e402 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Tue, 26 Sep 2023 17:07:25 +0200 Subject: [PATCH 34/57] fix to animation; --- src/ui/MobileSettings/MobileSettings.jsx | 2 +- .../MobileSettings/MobileSettings.module.css | 34 ++++++++++--------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/ui/MobileSettings/MobileSettings.jsx b/src/ui/MobileSettings/MobileSettings.jsx index b631cfd6..9572dd16 100644 --- a/src/ui/MobileSettings/MobileSettings.jsx +++ b/src/ui/MobileSettings/MobileSettings.jsx @@ -100,7 +100,7 @@ export const MobileSettings = () => {
)} {(is2DMenuOpen || !isSmallScreen) && ( -
+
)} diff --git a/src/ui/MobileSettings/MobileSettings.module.css b/src/ui/MobileSettings/MobileSettings.module.css index 88e579fd..24591f91 100644 --- a/src/ui/MobileSettings/MobileSettings.module.css +++ b/src/ui/MobileSettings/MobileSettings.module.css @@ -14,7 +14,7 @@ opacity: 1; border: 1px solid var(--dark-gray); border-radius: 0.5rem; - animation: onHide 1s ease-in-out; + animation: onHide .6s ease-in-out; animation-fill-mode: forwards; } @@ -36,11 +36,8 @@ .hidden { display: none; - width: 0; opacity: 0; - overflow: hidden; - visibility: hidden; - animation: onHide 1s ease-in-out; + animation: onHide .6s ease-in-out; animation-fill-mode: forwards; } @@ -63,7 +60,7 @@ right: 0; padding: 10px; z-index: 20000; - animation: onHide 1s ease-in-out; + animation: onHide .6s ease-in-out; animation-fill-mode: forwards; } @@ -71,19 +68,21 @@ flex-direction: column; } -@keyframes onHide { - 0% { - opacity: 0; - } - 50% { - opacity: 0.9; - } - 100% { - opacity: 1; +@media screen and (max-width: 1024px){ + + @keyframes onHide { + 0% { + opacity: 0; + } + 50% { + opacity: 0.9; + } + 100% { + opacity: 1; + } } } - @media screen and (min-width: 768px){ .buttons__container { @@ -119,6 +118,9 @@ left: 12%; z-index: 10; } + .animation { + animation: none; + } .horizontal { width: 10rem; From def3e6a5010ba911ce1ebab7cb21eda7fedc7712 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Wed, 27 Sep 2023 10:21:08 +0200 Subject: [PATCH 35/57] fixed logic to outside click, removed console; --- src/ui/MobileSettings/MobileSettings.jsx | 32 ++++++++++++++---------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/ui/MobileSettings/MobileSettings.jsx b/src/ui/MobileSettings/MobileSettings.jsx index 9572dd16..20971275 100644 --- a/src/ui/MobileSettings/MobileSettings.jsx +++ b/src/ui/MobileSettings/MobileSettings.jsx @@ -44,10 +44,15 @@ export const MobileSettings = () => { }, []); useEffect(() => { - const handleClickOutside = (event) => { + let touchStartTime; + let touchEndTime; + + const handleTouchStart = () => { + touchStartTime = new Date().getTime(); + }; + + const handleClickOutside = () => { if (containerRef.current && !containerRef.current.contains(event.target)) { - console.log('click outside'); - console.log(containerRef.current.contains(event.target)); setIsSettingsMenuOpen(false); setIs2DMenuOpen(false); setIsCursorMenuOpen(false); @@ -64,21 +69,22 @@ export const MobileSettings = () => { } }; - const containerElement = containerRef.current; - console.log(containerElement); - console.log(containerRef); + const handleTouchEnd = () => { + touchEndTime = new Date().getTime(); + const touchDuration = touchEndTime - touchStartTime; - containerElement.addEventListener('click', handleClickOutside); - document.addEventListener('click', handleClickOutside); - document.addEventListener('touchstart', handleClickOutside); + if (touchDuration >= 1000) { + handleClickOutside(); + } + }; + document.addEventListener('touchstart', handleTouchStart); + document.addEventListener('touchend', handleTouchEnd); return () => { - containerElement.removeEventListener('click', handleClickOutside); - document.removeEventListener('click', handleClickOutside); - document.removeEventListener('touchstart', handleClickOutside); + document.removeEventListener('touchstart', handleTouchStart); + document.removeEventListener('touchend', handleTouchEnd); }; }, [isMenuHidden]); - return (
From 76a415b15b7c03dbb9fa4c78f3001cebc4c9f1d3 Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Wed, 27 Sep 2023 10:52:28 +0200 Subject: [PATCH 36/57] fixed user selection; --- src/engine/Graphics2d.module.css | 2 +- src/ui/Main.module.css | 1 + src/ui/MobileSettings/MobileSettings.jsx | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/engine/Graphics2d.module.css b/src/engine/Graphics2d.module.css index 03f0db87..82a72dfd 100644 --- a/src/engine/Graphics2d.module.css +++ b/src/engine/Graphics2d.module.css @@ -4,7 +4,7 @@ */ .wrapperStyles { - width: 100%; + width: 100%; height: 100vh; justify-content: center; overflow: scroll; diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css index 82e87451..b85fb5f4 100644 --- a/src/ui/Main.module.css +++ b/src/ui/Main.module.css @@ -79,6 +79,7 @@ right: 0; bottom: 0; z-index: 1; + user-select: none; } .settings { diff --git a/src/ui/MobileSettings/MobileSettings.jsx b/src/ui/MobileSettings/MobileSettings.jsx index 20971275..afc81623 100644 --- a/src/ui/MobileSettings/MobileSettings.jsx +++ b/src/ui/MobileSettings/MobileSettings.jsx @@ -50,7 +50,6 @@ export const MobileSettings = () => { const handleTouchStart = () => { touchStartTime = new Date().getTime(); }; - const handleClickOutside = () => { if (containerRef.current && !containerRef.current.contains(event.target)) { setIsSettingsMenuOpen(false); From 7149653c45ff2aa5402a2c435786a582e619208c Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Wed, 27 Sep 2023 19:22:38 +0200 Subject: [PATCH 37/57] refactored clicks logic; --- src/ui/MobileSettings/MobileSettings.jsx | 69 ++++++++++-------------- 1 file changed, 28 insertions(+), 41 deletions(-) diff --git a/src/ui/MobileSettings/MobileSettings.jsx b/src/ui/MobileSettings/MobileSettings.jsx index afc81623..48df9bf6 100644 --- a/src/ui/MobileSettings/MobileSettings.jsx +++ b/src/ui/MobileSettings/MobileSettings.jsx @@ -14,12 +14,12 @@ export const MobileSettings = () => { const [isMenuHidden, setIsMenuHidden] = useState(false); const containerRef = useRef(null); + const pressTimer = useRef(null); const toggleSettingsMenu = () => { setIsSettingsMenuOpen(!isSettingsMenuOpen); setIs2DMenuOpen(false); setIsCursorMenuOpen(false); }; - const toggle2DMenu = () => { setIs2DMenuOpen(!is2DMenuOpen); setIsSettingsMenuOpen(false); @@ -30,60 +30,47 @@ export const MobileSettings = () => { setIsSettingsMenuOpen(false); setIs2DMenuOpen(false); }; + const closeAllMenu = () => { + setIsSettingsMenuOpen(false); + setIs2DMenuOpen(false); + setIsCursorMenuOpen(false); + }; useEffect(() => { - const handleResize = () => { - setIsSmallScreen(window.matchMedia('(max-width: 768px)').matches); + const onLongPress = () => { + setIsMenuHidden((current) => !current); + closeAllMenu(); }; - window.addEventListener('resize', handleResize); + const startPress = () => { + pressTimer.current = setTimeout(() => { + onLongPress(); + }, 1000); + }; - return () => { - window.removeEventListener('resize', handleResize); + const endPress = () => { + clearTimeout(pressTimer.current); }; - }, []); - useEffect(() => { - let touchStartTime; - let touchEndTime; + document.addEventListener('touchstart', startPress); + document.addEventListener('touchend', endPress); - const handleTouchStart = () => { - touchStartTime = new Date().getTime(); + return () => { + document.removeEventListener('touchstart', startPress); + document.removeEventListener('touchend', endPress); }; - const handleClickOutside = () => { - if (containerRef.current && !containerRef.current.contains(event.target)) { - setIsSettingsMenuOpen(false); - setIs2DMenuOpen(false); - setIsCursorMenuOpen(false); - setTimeout(() => { - if (!isMenuHidden) { - setIsSettingsMenuOpen(false); - setIs2DMenuOpen(false); - setIsCursorMenuOpen(false); - setIsMenuHidden(true); - } else { - setIsMenuHidden(false); - } - }, 1000); - } + }, []); + useEffect(() => { + const handleResize = () => { + setIsSmallScreen(window.matchMedia('(max-width: 768px)').matches); }; - const handleTouchEnd = () => { - touchEndTime = new Date().getTime(); - const touchDuration = touchEndTime - touchStartTime; - - if (touchDuration >= 1000) { - handleClickOutside(); - } - }; - document.addEventListener('touchstart', handleTouchStart); - document.addEventListener('touchend', handleTouchEnd); + window.addEventListener('resize', handleResize); return () => { - document.removeEventListener('touchstart', handleTouchStart); - document.removeEventListener('touchend', handleTouchEnd); + window.removeEventListener('resize', handleResize); }; - }, [isMenuHidden]); + }, []); return (
From 76498e92b26586e704003aa5519ab38f60986ddf Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Thu, 28 Sep 2023 13:51:07 +0200 Subject: [PATCH 38/57] cleanup unnecessary and bugs fixed; --- src/engine/Graphics2d.module.css | 2 +- src/ui/Main.jsx | 4 +- src/ui/Main.module.css | 17 +++-- src/ui/MobileSettings/MobileSettings.jsx | 64 ++++++++++++++++--- .../MobileSettings/MobileSettings.module.css | 5 +- 5 files changed, 74 insertions(+), 18 deletions(-) diff --git a/src/engine/Graphics2d.module.css b/src/engine/Graphics2d.module.css index 82a72dfd..58f22c7d 100644 --- a/src/engine/Graphics2d.module.css +++ b/src/engine/Graphics2d.module.css @@ -98,7 +98,7 @@ @media screen and (min-width: 2560px) { .wrapperStyles { - width: 90%; + width: 80%; border: 2px solid #dc5e47; border-radius: 10px; display: flex; diff --git a/src/ui/Main.jsx b/src/ui/Main.jsx index 54d0a08b..196474e0 100644 --- a/src/ui/Main.jsx +++ b/src/ui/Main.jsx @@ -41,7 +41,7 @@ export const Main = () => { const [strAlertTitle, setStrAlertTitle] = useState(''); const [strAlertText, setStrAlertText] = useState(''); const [isFullMode, setIsFullMode] = useState(false); - const [isMobile, setIsMobile] = useState(window.innerWidth < 1024); + const [isMobile, setIsMobile] = useState(window.innerWidth <= 768); const appRef = useRef(); useEffect(() => { @@ -187,7 +187,7 @@ export const Main = () => { ) : ( )} - {isReady && !isMobile && ( + {isReady && (
diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css index b85fb5f4..e50468f2 100644 --- a/src/ui/Main.module.css +++ b/src/ui/Main.module.css @@ -69,7 +69,9 @@ right: 0; top:50%; z-index: 10; - +} +.left { + display: none; } .center div { @@ -126,7 +128,7 @@ display: block; position: absolute; left: 25px; - top: 10%; + top: 12%; z-index: 1010; } @@ -135,7 +137,7 @@ flex-direction: column; position: absolute; left: 25px; - bottom: 25px; + bottom: 2rem; z-index: 1010; } @@ -146,6 +148,10 @@ z-index: 2000; } + .settings { + display: none; + } + .center { position: absolute; top: 6rem; @@ -201,6 +207,9 @@ transition: opacity 300ms ease-in-out; z-index: 1100; } + .left { + top: 8%; + } } @@ -224,7 +233,7 @@ @media screen and (min-width: 1024px) and (orientation: portrait) { .header__panels { - flex-wrap: nowrap; + flex-wrap: wrap; } .settings { diff --git a/src/ui/MobileSettings/MobileSettings.jsx b/src/ui/MobileSettings/MobileSettings.jsx index 48df9bf6..7d9150fc 100644 --- a/src/ui/MobileSettings/MobileSettings.jsx +++ b/src/ui/MobileSettings/MobileSettings.jsx @@ -10,7 +10,7 @@ export const MobileSettings = () => { const [isSettingsMenuOpen, setIsSettingsMenuOpen] = useState(false); const [is2DMenuOpen, setIs2DMenuOpen] = useState(false); const [isCursorMenuOpen, setIsCursorMenuOpen] = useState(false); - const [isSmallScreen, setIsSmallScreen] = useState(window.matchMedia('(max-width: 767px)').matches); + const [isSmallScreen, setIsSmallScreen] = useState(window.matchMedia('(max-width: 768px)').matches); const [isMenuHidden, setIsMenuHidden] = useState(false); const containerRef = useRef(null); @@ -41,17 +41,14 @@ export const MobileSettings = () => { setIsMenuHidden((current) => !current); closeAllMenu(); }; - const startPress = () => { pressTimer.current = setTimeout(() => { onLongPress(); }, 1000); }; - const endPress = () => { clearTimeout(pressTimer.current); }; - document.addEventListener('touchstart', startPress); document.addEventListener('touchend', endPress); @@ -71,7 +68,59 @@ export const MobileSettings = () => { window.removeEventListener('resize', handleResize); }; }, []); - return ( + return isSmallScreen ? ( +
+
+ + + + + + + + + +
+ {isSettingsMenuOpen && ( +
+ +
+ )} + {(is2DMenuOpen || !isSmallScreen) && ( +
+ +
+ )} + {isCursorMenuOpen && ( +
+ +
+ )} +
+ ) : ( +
+
+ + + + + + +
+ {isSettingsMenuOpen && ( +
+ +
+ )} + {isCursorMenuOpen && ( +
+ +
+ )} +
+ ); +}; +/*
@@ -92,7 +141,7 @@ export const MobileSettings = () => {
)} {(is2DMenuOpen || !isSmallScreen) && ( -
+
)} @@ -102,5 +151,4 @@ export const MobileSettings = () => {
)}
- ); -}; + );*/ diff --git a/src/ui/MobileSettings/MobileSettings.module.css b/src/ui/MobileSettings/MobileSettings.module.css index 24591f91..206be866 100644 --- a/src/ui/MobileSettings/MobileSettings.module.css +++ b/src/ui/MobileSettings/MobileSettings.module.css @@ -56,6 +56,7 @@ display: flex; justify-content: space-around; position: absolute; + top: 0; left: 0; right: 0; padding: 10px; @@ -118,9 +119,6 @@ left: 12%; z-index: 10; } - .animation { - animation: none; - } .horizontal { width: 10rem; @@ -146,3 +144,4 @@ top: 12%; } } + From b5c1de4da540cedbe5c42afb350dddc888a3981c Mon Sep 17 00:00:00 2001 From: Kateryna Sliepchenko Date: Fri, 29 Sep 2023 11:05:20 +0200 Subject: [PATCH 39/57] fixed styles; --- src/ui/Main.module.css | 10 ++-------- src/ui/MobileSettings/MobileSettings.module.css | 9 +++++++-- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css index e50468f2..5c2cbbd3 100644 --- a/src/ui/Main.module.css +++ b/src/ui/Main.module.css @@ -141,13 +141,6 @@ z-index: 1010; } - - .settings { - display: block; - position: absolute; - z-index: 2000; - } - .settings { display: none; } @@ -225,7 +218,7 @@ } .left { - top:12%; + top:10%; } } @@ -249,6 +242,7 @@ } + @media screen and (min-width: 2560px) and (orientation: landscape) { .left { diff --git a/src/ui/MobileSettings/MobileSettings.module.css b/src/ui/MobileSettings/MobileSettings.module.css index 206be866..8fd52d2f 100644 --- a/src/ui/MobileSettings/MobileSettings.module.css +++ b/src/ui/MobileSettings/MobileSettings.module.css @@ -16,7 +16,6 @@ border-radius: 0.5rem; animation: onHide .6s ease-in-out; animation-fill-mode: forwards; - } .buttons__container button { @@ -137,7 +136,7 @@ @media screen and (orientation: portrait) and (min-width: 768px) { .buttons__container { - top: 14%; + top: 12%; } .horizontal { @@ -145,3 +144,9 @@ } } +@media screen and (min-width: 768px) and (orientation: landscape){ + + .settings__menu_block { + top: 12%; + } +} \ No newline at end of file From b63a671f99fdaa83f93f86293991097decde8411 Mon Sep 17 00:00:00 2001 From: Vika Abysova Date: Tue, 3 Oct 2023 19:25:14 +0300 Subject: [PATCH 40/57] fix responsive layout --- src/engine/Graphics2d.module.css | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/engine/Graphics2d.module.css b/src/engine/Graphics2d.module.css index 58f22c7d..dca09c69 100644 --- a/src/engine/Graphics2d.module.css +++ b/src/engine/Graphics2d.module.css @@ -12,7 +12,10 @@ .canvasStyles { display: block; - width: 150vw; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); } @media screen and (min-width: 768px ) and (max-width: 1023px) { @@ -72,7 +75,7 @@ } .canvasStyles { - width: 150vw; + width: 40vw; margin: 0 auto; box-sizing: border-box; } From f55045a4a6d69979b00e7be114313467e07c5879 Mon Sep 17 00:00:00 2001 From: Sergey_Belyaev Date: Tue, 10 Oct 2023 18:30:58 +0300 Subject: [PATCH 41/57] fixs_In_3D --- src/engine/VolumeRenderer3d.js | 10 +++++----- src/ui/Modals/UiModalWinCW.jsx | 2 +- src/ui/Panels/Tabs/Mode3dSelectionTabs.jsx | 3 --- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/engine/VolumeRenderer3d.js b/src/engine/VolumeRenderer3d.js index a537b1bf..c87f4834 100644 --- a/src/engine/VolumeRenderer3d.js +++ b/src/engine/VolumeRenderer3d.js @@ -1406,7 +1406,7 @@ export default class VolumeRenderer3d { onMouseDown(xx, yy) { if (this.Tool23D) { - this.graphics23d.onMouseDown(xx / this.windowWidth, yy / this.windowHeight); + this.graphics23d.onMouseDown(xx / this.windowWidth, -yy / this.windowHeight); return; } this.orbitControl.onMouseDown(xx, yy); @@ -1418,14 +1418,14 @@ export default class VolumeRenderer3d { this.eraserMouseDown = true; if (this.isEraseMode && this.eraserStart) { this.lockEraserBuffersUpdating = true; - this.volumeUpdater.eraser.eraseStart(xx, yy, this.windowWidth, this.matVolumeRender.uniforms.isoThreshold.value, true); + this.volumeUpdater.eraser.eraseStart(xx, -yy, this.windowWidth, this.matVolumeRender.uniforms.isoThreshold.value, true); } } onMouseMove(xx, yy) { //this.tools23d.onMouseMove(xx / this.windowWidth, yy / this.windowHeight); if (this.Tool23D) { - this.graphics23d.onMouseMove(xx / this.windowWidth, yy / this.windowHeight); + this.graphics23d.onMouseMove(xx / this.windowWidth, -yy / this.windowHeight); return; } if (this.checkFrameBufferMode !== CHECK_MODE_RESULT_OK) { @@ -1435,13 +1435,13 @@ export default class VolumeRenderer3d { if (!(this.isEraseMode && this.eraserMouseDown && this.eraserStart)) { this.orbitControl.onMouseMove(xx, yy); } else { - this.volumeUpdater.eraser.eraseStart(xx, yy, this.windowWidth, this.matVolumeRender.uniforms.isoThreshold.value, false); + this.volumeUpdater.eraser.eraseStart(xx, -yy, this.windowWidth, this.matVolumeRender.uniforms.isoThreshold.value, false); } } onMouseUp(xx, yy) { if (this.Tool23D) { - this.graphics23d.onMouseUp(xx / this.windowWidth, yy / this.windowHeight); + this.graphics23d.onMouseUp(xx / this.windowWidth, -yy / this.windowHeight); return; } //this.tools23d.onMouseUp(xx / this.windowWidth, yy / this.windowHeight); diff --git a/src/ui/Modals/UiModalWinCW.jsx b/src/ui/Modals/UiModalWinCW.jsx index 434bc8bb..189387eb 100644 --- a/src/ui/Modals/UiModalWinCW.jsx +++ b/src/ui/Modals/UiModalWinCW.jsx @@ -267,7 +267,7 @@ class UiModalWindowCenterWidth extends React.Component { } // end render preview onSliderWindowRange(value) { - this.m_updateEnable = false; + this.m_updateEnable = true; const [min, max] = value; this.setState({ windowMin: min }); this.setState({ windowMax: max }); diff --git a/src/ui/Panels/Tabs/Mode3dSelectionTabs.jsx b/src/ui/Panels/Tabs/Mode3dSelectionTabs.jsx index 5d7c1bcb..a1a956b3 100644 --- a/src/ui/Panels/Tabs/Mode3dSelectionTabs.jsx +++ b/src/ui/Panels/Tabs/Mode3dSelectionTabs.jsx @@ -10,7 +10,6 @@ import Modes3d from '../../../store/Modes3d'; import { Box, Tab, Tabs } from '@mui/material'; import { TabPanel } from './TabPanel'; import css from '../../Form/Slider.module.css'; -import { HistogramProperty } from '../Properties3d/HistogramProperty'; import { IsosurfaceProperty } from '../Properties3d/IsosurfaceProperty'; import { AmbientOcclusionProperty } from '../Properties3d/AmbientOcclusionProperty'; import { SliderCaption } from '../../Form'; @@ -65,12 +64,10 @@ export function Mode3dSelectionTabs() { - - From b16a62f7ff5ca57d5b6e8bcab057502770fef938 Mon Sep 17 00:00:00 2001 From: Vika Abysova Date: Thu, 12 Oct 2023 14:36:04 +0300 Subject: [PATCH 42/57] fix change layout --- src/engine/Graphics2d.module.css | 174 ++++++++++++++----------------- 1 file changed, 80 insertions(+), 94 deletions(-) diff --git a/src/engine/Graphics2d.module.css b/src/engine/Graphics2d.module.css index dca09c69..1b31bedd 100644 --- a/src/engine/Graphics2d.module.css +++ b/src/engine/Graphics2d.module.css @@ -3,118 +3,104 @@ * SPDX-License-Identifier: Apache-2.0 */ - .wrapperStyles { - width: 100%; - height: 100vh; - justify-content: center; - overflow: scroll; - } +.wrapperStyles { + width: 100%; + height: 100vh; + justify-content: center; + overflow: scroll; +} .canvasStyles { - display: block; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); + display: block; + width: 150vw; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); } -@media screen and (min-width: 768px ) and (max-width: 1023px) { - - .wrapperStyles { - height: calc(100% - 2.5rem); - width: calc(100% - 3rem); - border: 2px solid #dc5e47; - border-radius: 10px; - box-sizing: border-box; - } - - .canvasStyles { - aspect-ratio: 1 / 1; - } +@media screen and (min-width: 768px) and (max-width: 1023px) { + .wrapperStyles { + height: calc(100% - 2.5rem); + width: calc(100% - 3rem); + border: 2px solid #dc5e47; + border-radius: 10px; + box-sizing: border-box; + } + + .canvasStyles { + aspect-ratio: 1 / 1; + width:40vw; + } } @media screen and (orientation: landscape) and (min-width: 768px) and (max-width: 1023px) { - - .wrapperStyles { - height: calc(100% - 2.5rem); - width: calc(100%- 3rem); - } - - .canvasStyles { - aspect-ratio: 1 / 1; - } - + .wrapperStyles { + height: calc(100% - 2.5rem); + width: calc(100%- 3rem); + } + + .canvasStyles { + aspect-ratio: 1 / 1; + } } - @media screen and (min-width: 1024px) and (orientation: landscape) { - - .wrapperStyles { - height: calc(100% - 0.5rem); - width: 80%; - border: 2px solid #dc5e47; - border-radius: 10px; - } - - .canvasStyles { - margin: 0 auto; - box-sizing: border-box; - } - + .wrapperStyles { + height: calc(100% - 0.5rem); + width: 80%; + border: 2px solid #dc5e47; + border-radius: 10px; + } + + .canvasStyles { + margin: 0 auto; + box-sizing: border-box; + } } @media screen and (min-width: 1024px) and (orientation: landscape) and (max-width: 2559px) { - - .wrapperStyles { - display: block; - height: calc(100% - 0.5rem); - width: 80%; - border: 2px solid #dc5e47; - border-radius: 10px; - - } - - .canvasStyles { - width: 40vw; - margin: 0 auto; - box-sizing: border-box; - } - + .wrapperStyles { + display: block; + height: calc(100% - 0.5rem); + width: 80%; + border: 2px solid #dc5e47; + border-radius: 10px; + } + + .canvasStyles { + width: auto; + margin: 0 auto; + box-sizing: border-box; + } } @media screen and (min-width: 1024px) and (max-width: 2559px) and (orientation: portrait) { + .wrapperStyles { + width: 90%; + height: calc(100% - 0.5rem); + border: 2px solid #dc5e47; + border-radius: 10px; + display: block; + } - .wrapperStyles { - width: 90%; - height: calc(100% - 0.5rem); - border: 2px solid #dc5e47; - border-radius: 10px; - display: block; - } - - .canvasStyles { - aspect-ratio: 1/1; - width:150vw; - } - + .canvasStyles { + aspect-ratio: 1/1; + width: 150vw; + } } @media screen and (min-width: 2560px) { - .wrapperStyles { - width: 80%; - border: 2px solid #dc5e47; - border-radius: 10px; - display: flex; - align-items: center; - } - - .canvasStyles { - aspect-ratio: 1/1; - - } + .wrapperStyles { + width: 80%; + border: 2px solid #dc5e47; + border-radius: 10px; + display: flex; + align-items: center; + } + + .canvasStyles { + aspect-ratio: 1/1; + width: auto; + } } - - - - - From 01b34793de9234b7381eae5115b4e528dd617f51 Mon Sep 17 00:00:00 2001 From: Vika Abysova Date: Thu, 12 Oct 2023 14:48:34 +0300 Subject: [PATCH 43/57] fix change layout2 --- src/engine/Graphics2d.module.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/Graphics2d.module.css b/src/engine/Graphics2d.module.css index 1b31bedd..8bdfb5e1 100644 --- a/src/engine/Graphics2d.module.css +++ b/src/engine/Graphics2d.module.css @@ -30,7 +30,7 @@ .canvasStyles { aspect-ratio: 1 / 1; - width:40vw; + width: 150vh; } } From 5456198ae1d6c366488228a01b1ac3932fd103c7 Mon Sep 17 00:00:00 2001 From: Vika Abysova Date: Thu, 12 Oct 2023 17:33:24 +0300 Subject: [PATCH 44/57] fix tablet layout --- src/engine/Graphics2d.module.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/Graphics2d.module.css b/src/engine/Graphics2d.module.css index 8bdfb5e1..74ba56bb 100644 --- a/src/engine/Graphics2d.module.css +++ b/src/engine/Graphics2d.module.css @@ -30,7 +30,7 @@ .canvasStyles { aspect-ratio: 1 / 1; - width: 150vh; + width: 100vh; } } From 225c81b27f4885454f771f77709b86071879a793 Mon Sep 17 00:00:00 2001 From: Vika Abysova Date: Mon, 16 Oct 2023 20:02:40 +0300 Subject: [PATCH 45/57] change behavior of canvas deleter --- src/engine/tools2d/ToolDelete.js | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/engine/tools2d/ToolDelete.js b/src/engine/tools2d/ToolDelete.js index 42c8a6e6..f397d474 100644 --- a/src/engine/tools2d/ToolDelete.js +++ b/src/engine/tools2d/ToolDelete.js @@ -13,7 +13,7 @@ // Imports // ********************************************** -import ToolDistance from './ToolDistance'; +// import ToolDistance from './ToolDistance'; // ********************************************** // Class @@ -91,7 +91,7 @@ class ToolDelete { const vDetect = objTool.getEditPoint(vScr, store); if (vDetect !== null) { // console.log(`ToolEdit. point tracked: ${vDetect.x}, ${vDetect.y}`); - this.m_pointTracked = vDetect; + this.m_pointTracked = vScr; this.m_toolTracked = objTool; break; } @@ -124,17 +124,20 @@ class ToolDelete { * @param {object} ctx - html5 canvas context * @param {object} store - global store with app parameters */ - render(ctx, store) { + render(ctx) { if (this.m_pointTracked !== null) { - const vScr = ToolDistance.textureToScreen(this.m_pointTracked.x, this.m_pointTracked.y, this.m_wScreen, this.m_hScreen, store); - const RAD_CIRCLE_EDIT = 4; - //ctx.lineWidth = 2; + // const vScr = ToolDistance.textureToScreen(this.m_pointTracked.x, this.m_pointTracked.y, this.m_wScreen, this.m_hScreen, store); + // const RAD_CIRCLE_EDIT = 10; + // ctx.lineWidth = 2; //ctx.strokeStyle = 'green'; - ctx.fillStyle = 'rgb(250, 120, 120)'; + // ctx.fillStyle = 'rgb(220, 94, 71)'; + // ctx.arc(vScr.x, vScr.y, RAD_CIRCLE_EDIT, 0.0, 2 * 3.1415962, false); + // ctx.fill(); + const vScr = this.m_pointTracked; ctx.beginPath(); - ctx.arc(vScr.x, vScr.y, RAD_CIRCLE_EDIT, 0.0, 2 * 3.1415962, false); - // ctx.stroke(); - ctx.fill(); + ctx.font = '45px Arial'; + ctx.strokeText('X', vScr.x, vScr.y); + ctx.stroke(); } } // end render } // end class ToolText From e30e2501df78111b80775788192bf857ed73d312 Mon Sep 17 00:00:00 2001 From: Vika Abysova Date: Mon, 16 Oct 2023 22:19:29 +0300 Subject: [PATCH 46/57] increasing length of canvas delete --- src/engine/tools2d/ToolText.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/engine/tools2d/ToolText.js b/src/engine/tools2d/ToolText.js index 8dc05f0d..33110f47 100644 --- a/src/engine/tools2d/ToolText.js +++ b/src/engine/tools2d/ToolText.js @@ -65,7 +65,8 @@ class ToolText { for (let i = 0; i < numTexts; i++) { const objText = this.m_texts[i]; const vScrProj = ToolDistance.textureToScreen(objText.point.x, objText.point.y, this.m_wScreen, this.m_hScreen, store); - const MIN_DIST = 4.0; + // const MIN_DIST = 4.0; + const MIN_DIST = objText.text.length * 0.8; if (this.getDistMm(vScr, vScrProj) <= MIN_DIST) { this.m_objEdit = objText; return objText.point; From b9b398af8cab17c956d0765d536d9bac101e28e2 Mon Sep 17 00:00:00 2001 From: Vika Abysova Date: Mon, 23 Oct 2023 22:43:40 +0300 Subject: [PATCH 47/57] improve delete functionality fot text, rect, distance, area, angle tools --- src/engine/tools2d/ToolAngle.js | 35 ++++++++++++++++------ src/engine/utils/PointerChecker.js | 48 ++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 src/engine/utils/PointerChecker.js diff --git a/src/engine/tools2d/ToolAngle.js b/src/engine/tools2d/ToolAngle.js index c8a0d03a..47b32cc8 100644 --- a/src/engine/tools2d/ToolAngle.js +++ b/src/engine/tools2d/ToolAngle.js @@ -14,6 +14,7 @@ // ********************************************** // import Modes2d from '../../store/Modes2d'; +import PointerChecker from '../utils/PointerChecker'; import ToolDistance from './ToolDistance'; // ********************************************** @@ -78,20 +79,36 @@ class ToolAngle { const vScr0 = ToolDistance.textureToScreen(objAngle.points[0].x, objAngle.points[0].y, this.m_wScreen, this.m_hScreen, store); const vScr1 = ToolDistance.textureToScreen(objAngle.points[1].x, objAngle.points[1].y, this.m_wScreen, this.m_hScreen, store); const vScr2 = ToolDistance.textureToScreen(objAngle.points[2].x, objAngle.points[2].y, this.m_wScreen, this.m_hScreen, store); - const MIN_DIST = 4.0; - if (this.getDistMm(vScr, vScr0) <= MIN_DIST) { - this.m_objEdit = objAngle; - return objAngle.points[0]; - } - if (this.getDistMm(vScr, vScr1) <= MIN_DIST) { + + const vScrLine1_S = vScr0; + const vScrLine1_E = vScr1; + const vScrLine2_S = vScr0; + const vScrLine2_E = vScr2; + + if (PointerChecker.isPointerOnLine(vScrLine1_S, vScrLine1_E, vScr)) { this.m_objEdit = objAngle; - return objAngle.points[1]; + return objAngle.points; } - if (this.getDistMm(vScr, vScr2) <= MIN_DIST) { + if (PointerChecker.isPointerOnLine(vScrLine2_S, vScrLine2_E, vScr)) { this.m_objEdit = objAngle; - return objAngle.points[2]; + return objAngle.points; } } + + // const MIN_DIST = 4.0; + // if (this.getDistMm(vScr, vScr0) <= MIN_DIST) { + // this.m_objEdit = objAngle; + // return objAngle.points[0]; + // } + // if (this.getDistMm(vScr, vScr1) <= MIN_DIST) { + // this.m_objEdit = objAngle; + // return objAngle.points[1]; + // } + // if (this.getDistMm(vScr, vScr2) <= MIN_DIST) { + // this.m_objEdit = objAngle; + // return objAngle.points[2]; + // } + return null; } diff --git a/src/engine/utils/PointerChecker.js b/src/engine/utils/PointerChecker.js new file mode 100644 index 00000000..285f0d3f --- /dev/null +++ b/src/engine/utils/PointerChecker.js @@ -0,0 +1,48 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +/** + * This is a tool for checking whether a pointer is on the line + * @module demo/engine/utils/tool + */ +// absolute imports +/** + * Class PointerChecker to check if the point is on the line + * @class PointerChecker + */ +class PointerChecker { + static isPointerOnLine(vs, ve, vScr) { + // Define the center point of the line by "y" coordinate + const centerLineY = (vs.y + ve.y) / 2; + // Define the angle slope of the line + const m = (ve.y - vs.y) / (ve.x - vs.x); + // Define the intercept of the line + const b = vs.y - m * vs.x; + // Define the length of the line by "y" + const widthY = Math.abs(ve.y - vs.y); + // Define the distance to the line by "y" + const MIN_DIST_Y = 10; + // Check if the point is on the border of the line + if ( + vs.x != ve.x && + (vs.x < ve.x ? vScr.x >= vs.x && vScr.x <= ve.x : vScr.x <= vs.x && vScr.x >= ve.x) && + Math.floor(vScr.y) >= Math.floor(m * vScr.x + b) - MIN_DIST_Y && + Math.floor(vScr.y) <= Math.floor(m * vScr.x + b) + MIN_DIST_Y + ) { + return true; + } + // Check if the point is on the border of the vertical line + if ( + vs.x === ve.x && + vScr.x <= vs.x + 10 && + vScr.x >= vs.x - 10 && + vScr.y >= centerLineY - widthY / 2 && + vScr.y <= centerLineY + widthY / 2 + ) { + return true; + } + } +} + +export default PointerChecker; From b6ffa3e9dbdbd7002d322481422261895cd60583 Mon Sep 17 00:00:00 2001 From: Vika Abysova Date: Mon, 23 Oct 2023 22:58:20 +0300 Subject: [PATCH 48/57] update --- src/engine/tools2d/ToolArea.js | 29 +++++++++++++++++++++++++---- src/engine/tools2d/ToolDelete.js | 15 +++++++++++++-- src/engine/tools2d/ToolDistance.js | 17 +++++++++++------ src/engine/tools2d/ToolRect.js | 16 ++++++++++------ src/engine/tools2d/ToolText.js | 16 ++++++++++++++-- 5 files changed, 73 insertions(+), 20 deletions(-) diff --git a/src/engine/tools2d/ToolArea.js b/src/engine/tools2d/ToolArea.js index ca6dfe00..c49f0d61 100644 --- a/src/engine/tools2d/ToolArea.js +++ b/src/engine/tools2d/ToolArea.js @@ -14,6 +14,7 @@ // ********************************************** import Modes2d from '../../store/Modes2d'; +import PointerChecker from '../utils/PointerChecker'; import ToolDistance from './ToolDistance'; // ********************************************** @@ -71,13 +72,33 @@ class ToolArea { const numAreas = this.m_areas.length; for (let i = 0; i < numAreas; i++) { const objArea = this.m_areas[i]; + const lastPoint = {}; for (let j = 0; j < objArea.m_points.length; j++) { - const vScrProj = ToolDistance.textureToScreen(objArea.m_points[j].x, objArea.m_points[j].y, this.m_wScreen, this.m_hScreen, store); - const MIN_DIST = 4.0; - if (this.getDistMm(vScr, vScrProj) <= MIN_DIST) { + const vScrProj_S = ToolDistance.textureToScreen( + objArea.m_points[j].x, + objArea.m_points[j].y, + this.m_wScreen, + this.m_hScreen, + store + ); + if (j === 0) { + lastPoint.x = vScrProj_S.x; + lastPoint.y = vScrProj_S.y; + } + const vScrProj_E = + j < objArea.m_points.length - 1 + ? ToolDistance.textureToScreen(objArea.m_points[j + 1].x, objArea.m_points[j + 1].y, this.m_wScreen, this.m_hScreen, store) + : lastPoint; + if (PointerChecker.isPointerOnLine(vScrProj_S, vScrProj_E, vScr)) { this.m_objEdit = objArea; return objArea.m_points[j]; - } // if too close pick + } + // const MIN_DIST = 4.0; + // if (this.getDistMm(vScr, vScrProj_S) <= MIN_DIST) { + // this.m_objEdit = objArea; + // return objArea.m_points[j]; + // } + // if too close pick } // for (j) all point in area } // for (i) all areas return null; diff --git a/src/engine/tools2d/ToolDelete.js b/src/engine/tools2d/ToolDelete.js index f397d474..ed206d08 100644 --- a/src/engine/tools2d/ToolDelete.js +++ b/src/engine/tools2d/ToolDelete.js @@ -135,8 +135,19 @@ class ToolDelete { // ctx.fill(); const vScr = this.m_pointTracked; ctx.beginPath(); - ctx.font = '45px Arial'; - ctx.strokeText('X', vScr.x, vScr.y); + + // Set the line style + ctx.lineWidth = 4; + ctx.strokeStyle = 'red'; + + // Draw the "x" symbol + ctx.beginPath(); + ctx.moveTo(vScr.x - 15, vScr.y - 15); // Move to the starting point (x-15, y-15) + ctx.lineTo(vScr.x + 15, vScr.y + 15); // Draw a line to (x+15, y+15) + ctx.moveTo(vScr.x + 15, vScr.y - 15); // Move to (x+15, y-15) + ctx.lineTo(vScr.x - 15, vScr.y + 15); + + // Stroke the line to actually draw the lines ctx.stroke(); } } // end render diff --git a/src/engine/tools2d/ToolDistance.js b/src/engine/tools2d/ToolDistance.js index 16e7a9cb..32c2b1e3 100644 --- a/src/engine/tools2d/ToolDistance.js +++ b/src/engine/tools2d/ToolDistance.js @@ -14,6 +14,7 @@ // ********************************************** import Modes2d from '../../store/Modes2d'; +import PointerChecker from '../utils/PointerChecker'; // ********************************************** // Class @@ -64,15 +65,19 @@ class ToolDistance { const objLine = this.m_lines[i]; const vScrS = ToolDistance.textureToScreen(objLine.vs.x, objLine.vs.y, this.m_wScreen, this.m_hScreen, store); const vScrE = ToolDistance.textureToScreen(objLine.ve.x, objLine.ve.y, this.m_wScreen, this.m_hScreen, store); - const MIN_DIST = 4.0; - if (this.getDistMm(vScr, vScrS) <= MIN_DIST) { + if (PointerChecker.isPointerOnLine(vScrS, vScrE, vScr)) { this.m_objEdit = objLine; return objLine.vs; } - if (this.getDistMm(vScr, vScrE) <= MIN_DIST) { - this.m_objEdit = objLine; - return objLine.ve; - } + // const MIN_DIST = 4.0; + // if (this.getDistMm(vScr, vScrS) <= MIN_DIST) { + // this.m_objEdit = objLine; + // return objLine.vs; + // } + // if (this.getDistMm(vScr, vScrE) <= MIN_DIST) { + // this.m_objEdit = objLine; + // return objLine.ve; + // } } return null; } diff --git a/src/engine/tools2d/ToolRect.js b/src/engine/tools2d/ToolRect.js index 48f41311..0febc10c 100644 --- a/src/engine/tools2d/ToolRect.js +++ b/src/engine/tools2d/ToolRect.js @@ -59,7 +59,10 @@ class ToolRect { getDistMm(vs, ve) { const dx = vs.x - ve.x; const dy = vs.y - ve.y; + console.log('dx', dx); + console.log('dy', dy); const dist = Math.sqrt(dx * dx * this.m_xPixelSize * this.m_xPixelSize + dy * dy * this.m_yPixelSize * this.m_yPixelSize); + console.log('dist', dist); return dist; } @@ -78,15 +81,16 @@ class ToolRect { const vScrMin = ToolDistance.textureToScreen(objRect.vMin.x, objRect.vMin.y, this.m_wScreen, this.m_hScreen, store); const vScrMax = ToolDistance.textureToScreen(objRect.vMax.x, objRect.vMax.y, this.m_wScreen, this.m_hScreen, store); - const MIN_DIST = 4.0; - if (this.getDistMm(vScr, vScrMin) <= MIN_DIST) { + // Check if the point is inside or on the border of the rectangle + if (vScrMin.x <= vScr.x && vScr.x <= vScrMax.x && vScrMin.y <= vScr.y && vScr.y <= vScrMax.y) { this.m_objEdit = objRect; return objRect.vMin; } - if (this.getDistMm(vScr, vScrMax) <= MIN_DIST) { - this.m_objEdit = objRect; - return objRect.vMax; - } + // const MIN_DIST = 4.0; + // if (this.getDistMm(vScr, vScrMax) <= MIN_DIST) { + // this.m_objEdit = objRect; + // return objRect.vMax; + // } } return null; } diff --git a/src/engine/tools2d/ToolText.js b/src/engine/tools2d/ToolText.js index 33110f47..7c902cf7 100644 --- a/src/engine/tools2d/ToolText.js +++ b/src/engine/tools2d/ToolText.js @@ -66,8 +66,20 @@ class ToolText { const objText = this.m_texts[i]; const vScrProj = ToolDistance.textureToScreen(objText.point.x, objText.point.y, this.m_wScreen, this.m_hScreen, store); // const MIN_DIST = 4.0; - const MIN_DIST = objText.text.length * 0.8; - if (this.getDistMm(vScr, vScrProj) <= MIN_DIST) { + + // Define the distance by "x" coordinate from the center of the text + const MIN_DIST_X = objText.text.length * 4; + // Define the distance by "y" coordinate from the text + const MIN_DIST_Y = 16; + // if (this.getDistMm(vScr, vScrProj) <= MIN_DIST) + + // Check if the point is on the text + if ( + vScr.x >= vScrProj.x - MIN_DIST_X && + vScr.x <= vScrProj.x + MIN_DIST_X && + vScr.y >= vScrProj.y - MIN_DIST_Y && + vScr.y <= vScrProj.y + MIN_DIST_Y + ) { this.m_objEdit = objText; return objText.point; } From bac099ae2909dba907229f60427af954ace17122 Mon Sep 17 00:00:00 2001 From: Vika Abysova Date: Tue, 24 Oct 2023 16:28:55 +0300 Subject: [PATCH 49/57] delete ald comments, update ToolRect --- src/engine/tools2d/ToolAngle.js | 21 --------------------- src/engine/tools2d/ToolArea.js | 19 ------------------- src/engine/tools2d/ToolDelete.js | 19 ------------------- src/engine/tools2d/ToolDistance.js | 11 ----------- src/engine/tools2d/ToolRect.js | 22 ++++++++++++++++------ src/engine/tools2d/ToolText.js | 27 --------------------------- 6 files changed, 16 insertions(+), 103 deletions(-) diff --git a/src/engine/tools2d/ToolAngle.js b/src/engine/tools2d/ToolAngle.js index 47b32cc8..ab50f516 100644 --- a/src/engine/tools2d/ToolAngle.js +++ b/src/engine/tools2d/ToolAngle.js @@ -13,7 +13,6 @@ // Imports // ********************************************** -// import Modes2d from '../../store/Modes2d'; import PointerChecker from '../utils/PointerChecker'; import ToolDistance from './ToolDistance'; @@ -94,21 +93,6 @@ class ToolAngle { return objAngle.points; } } - - // const MIN_DIST = 4.0; - // if (this.getDistMm(vScr, vScr0) <= MIN_DIST) { - // this.m_objEdit = objAngle; - // return objAngle.points[0]; - // } - // if (this.getDistMm(vScr, vScr1) <= MIN_DIST) { - // this.m_objEdit = objAngle; - // return objAngle.points[1]; - // } - // if (this.getDistMm(vScr, vScr2) <= MIN_DIST) { - // this.m_objEdit = objAngle; - // return objAngle.points[2]; - // } - return null; } @@ -159,11 +143,9 @@ class ToolAngle { const M_180 = 180.0; const M_PI = 3.1415926535; if (cosAlp > 1.0) { - // console.log('get Angle > 1'); return 0.0; } if (cosAlp < -1.0) { - // console.log('get Angle < -1'); return 180.0; } const ang = (Math.acos(cosAlp) * M_180) / M_PI; @@ -180,10 +162,8 @@ class ToolAngle { } this.m_numClicks++; - // console.log('1st click: add 3 points'); } else if (this.m_numClicks === 1) { this.m_numClicks++; - // console.log(`2st click: points are: ${this.m_points[0].x}, ${this.m_points[0].y} -> ${this.m_points[1].x}, ${this.m_points[1].y}`); } else { console.log('3rd click: finalize angle'); // this.m_numClicks === 2 @@ -220,7 +200,6 @@ class ToolAngle { for (let idx = this.m_numClicks; idx < NUM_3; idx++) { this.m_points[idx].x = vTex.x; this.m_points[idx].y = vTex.y; - // console.log(`onMouseMove. modify point[${idx}]: now = ${vTex.x}, ${vTex.y}`); } // invoke redraw this.m_objGraphics2d.forceUpdate(); diff --git a/src/engine/tools2d/ToolArea.js b/src/engine/tools2d/ToolArea.js index c49f0d61..c945df05 100644 --- a/src/engine/tools2d/ToolArea.js +++ b/src/engine/tools2d/ToolArea.js @@ -93,12 +93,6 @@ class ToolArea { this.m_objEdit = objArea; return objArea.m_points[j]; } - // const MIN_DIST = 4.0; - // if (this.getDistMm(vScr, vScrProj_S) <= MIN_DIST) { - // this.m_objEdit = objArea; - // return objArea.m_points[j]; - // } - // if too close pick } // for (j) all point in area } // for (i) all areas return null; @@ -115,11 +109,8 @@ class ToolArea { const y = vVolOld.y; vVolOld.x = vVolNew.x; vVolOld.y = vVolNew.y; - //const vObjSelfInters = ToolArea.getSelfIntersectPoint(this.m_objEdit.m_points); - //if (vObjSelfInters !== null) { const hasInters = ToolArea.hasSelfIntersection(this.m_objEdit.m_points); if (hasInters) { - // console.log('ToolArea. self inters found'); vVolOld.x = x; vVolOld.y = y; } @@ -263,7 +254,6 @@ class ToolArea { m_vIntersection: vInter, m_lineIndex: 0, }; - // console.log('getSelfIntersection: detect with start'); return objInter; } return null; @@ -465,7 +455,6 @@ class ToolArea { const objArea = this.m_areas[a]; const isClosed = objArea.m_isClosed; const numPoints = isClosed ? objArea.m_points.length + 1 : objArea.m_points.length; - // console.log(`ToolArea. render ${numPoints} points in poly`); // calc area centroid in screen let xScrCenter = 0.0; @@ -475,7 +464,6 @@ class ToolArea { for (let i = 0; i < numPoints; i++) { const iPoly = i < objArea.m_points.length ? i : 0; const vTex0 = objArea.m_points[iPoly]; - // console.log(`ToolArea. render point ${vTex0.x}, ${vTex0.y} `); const vScr = ToolDistance.textureToScreen(vTex0.x, vTex0.y, this.m_wScreen, this.m_hScreen, store); if (i === 0) { ctx.moveTo(vScr.x, vScr.y); @@ -495,13 +483,6 @@ class ToolArea { // draw area if (isClosed) { const strMsg = objArea.m_area.toFixed(2) + ' mm^2'; - // const SHIFT_UP = 8; - //const vTex0 = objArea.m_points[0]; - //const vs0 = ToolDistance.textureToScreen(vTex0.x, vTex0.y, this.m_wScreen, this.m_hScreen, store); - //const xText = vs0.x; - //const yText = vs0.y - SHIFT_UP; - // ctx.fillText(strMsg, xText, yText); - ctx.fillText(strMsg, xScrCenter, yScrCenter); } // if this poly closed } // for (a) all polys diff --git a/src/engine/tools2d/ToolDelete.js b/src/engine/tools2d/ToolDelete.js index ed206d08..bf861718 100644 --- a/src/engine/tools2d/ToolDelete.js +++ b/src/engine/tools2d/ToolDelete.js @@ -13,8 +13,6 @@ // Imports // ********************************************** -// import ToolDistance from './ToolDistance'; - // ********************************************** // Class // ********************************************** @@ -90,7 +88,6 @@ class ToolDelete { const objTool = tools[i]; const vDetect = objTool.getEditPoint(vScr, store); if (vDetect !== null) { - // console.log(`ToolEdit. point tracked: ${vDetect.x}, ${vDetect.y}`); this.m_pointTracked = vScr; this.m_toolTracked = objTool; break; @@ -101,15 +98,6 @@ class ToolDelete { // invoke forced 2d render this.m_objGraphics2d.forceUpdate(); } - } else { - /* - if (this.m_pointTracked !== null) { - const vTexNew = ToolDistance.screenToTexture(xScr, yScr, this.m_wScreen, this.m_hScreen, store); - this.m_toolTracked.moveEditPoint(this.m_pointTracked, vTexNew); - // invoke forced 2d render - this.m_objGraphics2d.forceUpdate(); - } // if we have tracked point - */ } } @@ -126,13 +114,6 @@ class ToolDelete { */ render(ctx) { if (this.m_pointTracked !== null) { - // const vScr = ToolDistance.textureToScreen(this.m_pointTracked.x, this.m_pointTracked.y, this.m_wScreen, this.m_hScreen, store); - // const RAD_CIRCLE_EDIT = 10; - // ctx.lineWidth = 2; - //ctx.strokeStyle = 'green'; - // ctx.fillStyle = 'rgb(220, 94, 71)'; - // ctx.arc(vScr.x, vScr.y, RAD_CIRCLE_EDIT, 0.0, 2 * 3.1415962, false); - // ctx.fill(); const vScr = this.m_pointTracked; ctx.beginPath(); diff --git a/src/engine/tools2d/ToolDistance.js b/src/engine/tools2d/ToolDistance.js index 32c2b1e3..254832b5 100644 --- a/src/engine/tools2d/ToolDistance.js +++ b/src/engine/tools2d/ToolDistance.js @@ -69,15 +69,6 @@ class ToolDistance { this.m_objEdit = objLine; return objLine.vs; } - // const MIN_DIST = 4.0; - // if (this.getDistMm(vScr, vScrS) <= MIN_DIST) { - // this.m_objEdit = objLine; - // return objLine.vs; - // } - // if (this.getDistMm(vScr, vScrE) <= MIN_DIST) { - // this.m_objEdit = objLine; - // return objLine.ve; - // } } return null; } @@ -204,8 +195,6 @@ class ToolDistance { }; this.m_lines.push(objLine); this.m_mouseDown = true; - // this.m_pointStart = v; - // console.log(`onMouseDown: ${xScr}, ${yScr}`); } onMouseMove(xScr, yScr, store) { diff --git a/src/engine/tools2d/ToolRect.js b/src/engine/tools2d/ToolRect.js index 0febc10c..4953a8e9 100644 --- a/src/engine/tools2d/ToolRect.js +++ b/src/engine/tools2d/ToolRect.js @@ -82,15 +82,25 @@ class ToolRect { const vScrMax = ToolDistance.textureToScreen(objRect.vMax.x, objRect.vMax.y, this.m_wScreen, this.m_hScreen, store); // Check if the point is inside or on the border of the rectangle - if (vScrMin.x <= vScr.x && vScr.x <= vScrMax.x && vScrMin.y <= vScr.y && vScr.y <= vScrMax.y) { + if ( + (vScrMin.x < vScrMax.x && vScrMin.x <= vScr.x && vScr.x <= vScrMax.x && vScrMin.y <= vScr.y && vScr.y <= vScrMax.y) || + (vScrMin.x < vScrMax.x && + vScrMin.y > vScrMax.y && + vScrMin.x <= vScr.x && + vScr.x <= vScrMax.x && + vScrMin.y >= vScr.y && + vScr.y >= vScrMax.y) || + (vScrMin.x > vScrMax.x && vScrMin.x >= vScr.x && vScr.x >= vScrMax.x && vScrMin.y <= vScr.y && vScr.y <= vScrMax.y) || + (vScrMin.x > vScrMax.x && + vScrMin.y > vScrMax.y && + vScrMin.x >= vScr.x && + vScr.x >= vScrMax.x && + vScrMin.y >= vScr.y && + vScr.y >= vScrMax.y) + ) { this.m_objEdit = objRect; return objRect.vMin; } - // const MIN_DIST = 4.0; - // if (this.getDistMm(vScr, vScrMax) <= MIN_DIST) { - // this.m_objEdit = objRect; - // return objRect.vMax; - // } } return null; } diff --git a/src/engine/tools2d/ToolText.js b/src/engine/tools2d/ToolText.js index 7c902cf7..19d7d5a5 100644 --- a/src/engine/tools2d/ToolText.js +++ b/src/engine/tools2d/ToolText.js @@ -15,7 +15,6 @@ import ToolDistance from './ToolDistance'; import StoreActionType from '../../store/ActionTypes'; -// import UiModalText from '../../ui/UiModalText'; // ********************************************** // Class @@ -65,14 +64,11 @@ class ToolText { for (let i = 0; i < numTexts; i++) { const objText = this.m_texts[i]; const vScrProj = ToolDistance.textureToScreen(objText.point.x, objText.point.y, this.m_wScreen, this.m_hScreen, store); - // const MIN_DIST = 4.0; // Define the distance by "x" coordinate from the center of the text const MIN_DIST_X = objText.text.length * 4; // Define the distance by "y" coordinate from the text const MIN_DIST_Y = 16; - // if (this.getDistMm(vScr, vScrProj) <= MIN_DIST) - // Check if the point is on the text if ( vScr.x >= vScrProj.x - MIN_DIST_X && @@ -191,29 +187,6 @@ class ToolText { ctx.fillText(lines[j], vScr.x, vScr.y + j * LINE_HEIGHT - ((lines.length - 1) * LINE_HEIGHT) / 2); } } // for (i) - - /* - const numRects = this.m_rects.length; - for (let i = 0; i < numRects; i++) { - const objRect = this.m_rects[i]; - const vTexMin = objRect.vMin; - const vTexMax = objRect.vMax; - const vScrMin = ToolDistance.textureToScreen(vTexMin.x, vTexMin.y, this.m_wScreen, this.m_hScreen, store); - const vScrMax = ToolDistance.textureToScreen(vTexMax.x, vTexMax.y, this.m_wScreen, this.m_hScreen, store); - ctx.beginPath(); - ctx.moveTo(vScrMin.x, vScrMin.y); - ctx.lineTo(vScrMax.x, vScrMin.y); - ctx.lineTo(vScrMax.x, vScrMax.y); - ctx.lineTo(vScrMin.x, vScrMax.y); - ctx.lineTo(vScrMin.x, vScrMin.y); - ctx.stroke(); - // draw text - const xText = Math.floor((vScrMin.x + vScrMax.x) * 0.5); - const yText = Math.floor((vScrMin.y + vScrMax.y) * 0.5); - const strMsg = objRect.area.toFixed(2) + ' mm^2'; - ctx.fillText(strMsg, xText, yText); - } // for (i) all rects - */ } // end render } // end class ToolText From 04a9fba17ae4a42f0c589ac01614f693f3bdc6b9 Mon Sep 17 00:00:00 2001 From: Vika Abysova Date: Wed, 25 Oct 2023 11:18:54 +0300 Subject: [PATCH 50/57] make shorter conditional in ToolArea --- src/engine/tools2d/ToolArea.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/tools2d/ToolArea.js b/src/engine/tools2d/ToolArea.js index c945df05..9137d7ac 100644 --- a/src/engine/tools2d/ToolArea.js +++ b/src/engine/tools2d/ToolArea.js @@ -81,7 +81,7 @@ class ToolArea { this.m_hScreen, store ); - if (j === 0) { + if (!j) { lastPoint.x = vScrProj_S.x; lastPoint.y = vScrProj_S.y; } From 6481b0721244dc383eb607bc0837774e126608d6 Mon Sep 17 00:00:00 2001 From: Vika Abysova Date: Wed, 25 Oct 2023 15:27:53 +0300 Subject: [PATCH 51/57] fixed magic number --- src/engine/utils/PointerChecker.js | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/engine/utils/PointerChecker.js b/src/engine/utils/PointerChecker.js index 285f0d3f..33dccc14 100644 --- a/src/engine/utils/PointerChecker.js +++ b/src/engine/utils/PointerChecker.js @@ -13,32 +13,34 @@ */ class PointerChecker { static isPointerOnLine(vs, ve, vScr) { + // The distance to the line by "x" and "y" + const MIN_DIST = 10; + // The number for define a half of the distance + const TWO = 2; // Define the center point of the line by "y" coordinate - const centerLineY = (vs.y + ve.y) / 2; + const centerLineY = (vs.y + ve.y) / TWO; // Define the angle slope of the line const m = (ve.y - vs.y) / (ve.x - vs.x); // Define the intercept of the line const b = vs.y - m * vs.x; // Define the length of the line by "y" const widthY = Math.abs(ve.y - vs.y); - // Define the distance to the line by "y" - const MIN_DIST_Y = 10; // Check if the point is on the border of the line if ( vs.x != ve.x && (vs.x < ve.x ? vScr.x >= vs.x && vScr.x <= ve.x : vScr.x <= vs.x && vScr.x >= ve.x) && - Math.floor(vScr.y) >= Math.floor(m * vScr.x + b) - MIN_DIST_Y && - Math.floor(vScr.y) <= Math.floor(m * vScr.x + b) + MIN_DIST_Y + Math.floor(vScr.y) >= Math.floor(m * vScr.x + b) - MIN_DIST && + Math.floor(vScr.y) <= Math.floor(m * vScr.x + b) + MIN_DIST ) { return true; } // Check if the point is on the border of the vertical line if ( vs.x === ve.x && - vScr.x <= vs.x + 10 && - vScr.x >= vs.x - 10 && - vScr.y >= centerLineY - widthY / 2 && - vScr.y <= centerLineY + widthY / 2 + vScr.x <= vs.x + MIN_DIST && + vScr.x >= vs.x - MIN_DIST && + vScr.y >= centerLineY - widthY / TWO && + vScr.y <= centerLineY + widthY / TWO ) { return true; } From 4097e09c8a4de2051b740189aaac0c35c4106a9b Mon Sep 17 00:00:00 2001 From: Vika Abysova Date: Wed, 25 Oct 2023 16:25:15 +0300 Subject: [PATCH 52/57] delete unnecessary constant variable --- src/engine/utils/PointerChecker.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/engine/utils/PointerChecker.js b/src/engine/utils/PointerChecker.js index 33dccc14..23996a3b 100644 --- a/src/engine/utils/PointerChecker.js +++ b/src/engine/utils/PointerChecker.js @@ -15,10 +15,8 @@ class PointerChecker { static isPointerOnLine(vs, ve, vScr) { // The distance to the line by "x" and "y" const MIN_DIST = 10; - // The number for define a half of the distance - const TWO = 2; // Define the center point of the line by "y" coordinate - const centerLineY = (vs.y + ve.y) / TWO; + const centerLineY = (vs.y + ve.y) / 2; // Define the angle slope of the line const m = (ve.y - vs.y) / (ve.x - vs.x); // Define the intercept of the line @@ -39,8 +37,8 @@ class PointerChecker { vs.x === ve.x && vScr.x <= vs.x + MIN_DIST && vScr.x >= vs.x - MIN_DIST && - vScr.y >= centerLineY - widthY / TWO && - vScr.y <= centerLineY + widthY / TWO + vScr.y >= centerLineY - widthY / 2 && + vScr.y <= centerLineY + widthY / 2 ) { return true; } From 62c8764ccfac674f99bf02c8fad3deaf51f0c3f9 Mon Sep 17 00:00:00 2001 From: Vika Abysova Date: Mon, 6 Nov 2023 15:20:37 +0200 Subject: [PATCH 53/57] fixed graphiics2d layout --- src/engine/Graphics2d.module.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/engine/Graphics2d.module.css b/src/engine/Graphics2d.module.css index 74ba56bb..2f40942b 100644 --- a/src/engine/Graphics2d.module.css +++ b/src/engine/Graphics2d.module.css @@ -63,7 +63,8 @@ .wrapperStyles { display: block; height: calc(100% - 0.5rem); - width: 80%; + width: 43%; + overflow: hidden; border: 2px solid #dc5e47; border-radius: 10px; } From 70d89e170ffc19aa45b7d9717f2988ad655d7f8c Mon Sep 17 00:00:00 2001 From: Oleksandr Zhynzher Date: Sun, 5 Nov 2023 12:49:31 +0200 Subject: [PATCH 54/57] Refactor the loading logic --- .babelrc | 14 + .eslintrc | 23 +- .github/workflows/aws-dev.yml | 4 +- .github/workflows/aws-prd.yml | 4 +- .github/workflows/aws-tst.yml | 4 +- .github/workflows/build.yml | 4 +- .github/workflows/release.yml | 8 +- package-lock.json | 7471 ++++++++++------- package.json | 19 +- src/config/config.js | 11 +- src/engine/Volume.js | 2 +- src/engine/VolumeSet.js | 80 +- src/engine/VolumeSet.test.js | 207 - src/engine/lib/MRIViewer.ts | 23 + src/engine/lib/config/volume.config.ts | 3 + src/engine/lib/core/loaders/MRIFileLoader.ts | 194 + src/engine/lib/core/readers/MRIReader.ts | 25 + .../AbstractFileReader.ts | 106 + .../readers/archive-reader/ArchiveReader.ts | 69 + .../file-reader-factory/MRIReaderFactory.ts | 51 + src/engine/lib/core/readers/index.ts | 3 + .../multi-file-reader/MultiFileReader.ts | 178 + .../single-file-reader/SingleFileReader.ts | 167 + src/engine/lib/enums/events.enum.ts | 19 + src/engine/lib/enums/index.ts | 1 + src/engine/lib/index.d.ts | 0 src/engine/lib/interfaces/index.ts | 3 + src/engine/lib/services/ConfigService.ts | 12 + src/engine/lib/services/EventsService.ts | 28 + .../lib/services/LocalStorageService.ts | 38 + src/engine/lib/services/StoreService.ts | 101 + src/engine/lib/services/index.ts | 5 + src/engine/lib/utils/index.ts | 1 + src/engine/lib/utils/url.ts | 59 + src/engine/loaders/FileLoader.js | 101 - src/engine/loaders/FileReader.js | 904 -- src/engine/loaders/FileTools.js | 46 - src/engine/loaders/LoadDcmUrlDiakon.js | 233 - src/engine/loaders/LoadPromise.js | 95 - src/engine/loaders/LoaderDcmDaikon.js | 2 +- src/engine/loaders/LoaderDicom.js | 237 - src/engine/loaders/LoaderHdr.js | 177 +- src/engine/loaders/LoaderKtx.js | 25 - src/engine/loaders/LoaderNifti.js | 25 - src/engine/loaders/LoaderUrlDicom.js | 61 - src/index.js | 11 +- src/react-app-env.d.ts | 1 + src/store/ActionTypes.js | 2 + src/store/Store.js | 4 + src/store/index.js | 4 + src/ui/Button/Button.module.css | 79 +- src/ui/FileReaders/DragAndDrop.module.css | 13 + src/ui/FileReaders/DragAndDropComponent.jsx | 40 + src/ui/FileReaders/OpenDemoComponent.jsx | 29 + src/ui/FileReaders/OpenFromDeviceButton.jsx | 26 + .../FileReaders/OpenFromDeviceComponent.jsx | 45 + src/ui/FileReaders/OpenFromURLComponent.jsx | 28 + src/ui/FileReaders/index.js | 5 + src/ui/Header/Header.jsx | 44 +- src/ui/Header/Header.module.css | 9 + src/ui/Header/UiAbout.js | 2 +- src/ui/Main.jsx | 2 +- src/ui/Modals/ModalInfo.jsx | 4 +- src/ui/Modals/ModalSelectFile.jsx | 26 + src/ui/Modals/ModalUrl.jsx | 54 +- src/ui/Modals/Modals.module.css | 39 +- src/ui/Modals/UiModalWinCW.jsx | 5 + src/ui/OpenFile/UiOpenMenu.jsx | 981 --- src/ui/OpenFile/UiOpenMenu.module.css | 78 - src/ui/OpenFile/UiReportMenu.js | 4 +- src/ui/OpenFile/UiReportMenu.module.css | 39 + .../Properties2d/SelectVolumeProperty.js | 13 +- src/ui/Panels/Properties2d/UiVolIcon.js | 29 +- src/ui/ProgressBar/UISpinner.jsx | 9 +- src/ui/ProgressBar/UISpinner.module.css | 29 +- .../RecentlyFiles/RecentlyFiles.jsx | 2 +- .../RecentlyFiles/RecentlyFiles.module.css | 20 +- .../SmartContainer/SmartContainer.jsx | 125 +- .../SmartContainer/SmartContainer.module.css | 8 +- src/ui/StartScreen/StartScreen.module.css | 5 +- src/ui/TopToolbar/Filter/LungsTool.test.jsx | 45 - src/ui/hooks/useOnEvent.js | 14 + tsconfig.json | 29 + 83 files changed, 6045 insertions(+), 6700 deletions(-) create mode 100644 .babelrc create mode 100644 src/engine/lib/MRIViewer.ts create mode 100644 src/engine/lib/config/volume.config.ts create mode 100644 src/engine/lib/core/loaders/MRIFileLoader.ts create mode 100644 src/engine/lib/core/readers/MRIReader.ts create mode 100644 src/engine/lib/core/readers/abstract-file-reader/AbstractFileReader.ts create mode 100644 src/engine/lib/core/readers/archive-reader/ArchiveReader.ts create mode 100644 src/engine/lib/core/readers/file-reader-factory/MRIReaderFactory.ts create mode 100644 src/engine/lib/core/readers/index.ts create mode 100644 src/engine/lib/core/readers/multi-file-reader/MultiFileReader.ts create mode 100644 src/engine/lib/core/readers/single-file-reader/SingleFileReader.ts create mode 100644 src/engine/lib/enums/events.enum.ts create mode 100644 src/engine/lib/enums/index.ts create mode 100644 src/engine/lib/index.d.ts create mode 100644 src/engine/lib/interfaces/index.ts create mode 100644 src/engine/lib/services/ConfigService.ts create mode 100644 src/engine/lib/services/EventsService.ts create mode 100644 src/engine/lib/services/LocalStorageService.ts create mode 100644 src/engine/lib/services/StoreService.ts create mode 100644 src/engine/lib/services/index.ts create mode 100644 src/engine/lib/utils/index.ts create mode 100644 src/engine/lib/utils/url.ts delete mode 100644 src/engine/loaders/FileLoader.js delete mode 100644 src/engine/loaders/FileReader.js delete mode 100644 src/engine/loaders/FileTools.js delete mode 100644 src/engine/loaders/LoadDcmUrlDiakon.js delete mode 100644 src/engine/loaders/LoadPromise.js delete mode 100644 src/engine/loaders/LoaderUrlDicom.js create mode 100644 src/react-app-env.d.ts create mode 100644 src/store/index.js create mode 100644 src/ui/FileReaders/DragAndDrop.module.css create mode 100644 src/ui/FileReaders/DragAndDropComponent.jsx create mode 100644 src/ui/FileReaders/OpenDemoComponent.jsx create mode 100644 src/ui/FileReaders/OpenFromDeviceButton.jsx create mode 100644 src/ui/FileReaders/OpenFromDeviceComponent.jsx create mode 100644 src/ui/FileReaders/OpenFromURLComponent.jsx create mode 100644 src/ui/FileReaders/index.js create mode 100644 src/ui/Header/Header.module.css create mode 100644 src/ui/Modals/ModalSelectFile.jsx delete mode 100644 src/ui/OpenFile/UiOpenMenu.jsx delete mode 100644 src/ui/OpenFile/UiOpenMenu.module.css create mode 100644 src/ui/OpenFile/UiReportMenu.module.css delete mode 100644 src/ui/TopToolbar/Filter/LungsTool.test.jsx create mode 100644 src/ui/hooks/useOnEvent.js create mode 100644 tsconfig.json diff --git a/.babelrc b/.babelrc new file mode 100644 index 00000000..607dba75 --- /dev/null +++ b/.babelrc @@ -0,0 +1,14 @@ +{ + "presets": ["@babel/preset-env", "@babel/preset-react"], + "plugins": [ + [ + "@babel/plugin-transform-runtime", + { + "corejs": false, + "helpers": true, + "regenerator": true, + "useESModules": false + } + ] + ] +} diff --git a/.eslintrc b/.eslintrc index 56b2c036..1a9a2f5f 100644 --- a/.eslintrc +++ b/.eslintrc @@ -6,9 +6,16 @@ "es6": true }, "root": true, - "parser": "babel-eslint", - "plugins": ["react", "prettier"], - "extends": ["eslint:recommended", "plugin:react/recommended", "prettier"], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2020, + "sourceType": "module", + "ecmaFeatures": { + "jsx": true + } + }, + "plugins": ["react", "prettier", "@typescript-eslint"], + "extends": ["eslint:recommended", "plugin:react/recommended", "prettier", "plugin:@typescript-eslint/recommended"], "settings": { "react": { "createClass": "createReactClass", @@ -28,6 +35,7 @@ "react/no-string-refs": "off", "react/jsx-no-undef": "off", "react/jsx-key": "off", + "react/react-in-jsx-scope": "off", "no-case-declarations": "off", "react/no-unescaped-entities": "off", "linebreak-style": "off", @@ -53,7 +61,7 @@ "no-multi-spaces": "off", "no-prototype-builtins": "off", "wrap-iife": ["error", "any"], - "no-use-before-define": ["error", "nofunc"], + "no-use-before-define": "off", "object-property-newline": "off", "no-restricted-syntax": "off", "no-else-return": "off", @@ -66,8 +74,11 @@ "no-plusplus": "off", "no-multi-assign": "off", "react/no-unknown-property": "off", - "lines-between-class-members": ["error", "always"], + "lines-between-class-members": ["off"], "no-debugger": "warn", - "prettier/prettier": ["error"] + "prettier/prettier": ["error"], + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/ban-types": "off", + "@typescript-eslint/explicit-module-boundary-types": "off" } } diff --git a/.github/workflows/aws-dev.yml b/.github/workflows/aws-dev.yml index eb4b5285..e52e3bdd 100644 --- a/.github/workflows/aws-dev.yml +++ b/.github/workflows/aws-dev.yml @@ -15,10 +15,10 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Use Node.js 12.x + - name: Use Node.js 16.x uses: actions/setup-node@v2 with: - node-version: 12.x + node-version: 16.x - name: Reconfigure git to use HTTP authentication run: > git config --global url."https://github.com/".insteadOf diff --git a/.github/workflows/aws-prd.yml b/.github/workflows/aws-prd.yml index 3f59fb73..9c6bdf4f 100644 --- a/.github/workflows/aws-prd.yml +++ b/.github/workflows/aws-prd.yml @@ -15,10 +15,10 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Use Node.js 12.x + - name: Use Node.js 16.x uses: actions/setup-node@v2 with: - node-version: 12.x + node-version: 16.x - name: Reconfigure git to use HTTP authentication run: > git config --global url."https://github.com/".insteadOf diff --git a/.github/workflows/aws-tst.yml b/.github/workflows/aws-tst.yml index 1c1e5f30..8b400b86 100644 --- a/.github/workflows/aws-tst.yml +++ b/.github/workflows/aws-tst.yml @@ -11,10 +11,10 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Use Node.js 12.x + - name: Use Node.js 16.x uses: actions/setup-node@v2 with: - node-version: 12.x + node-version: 16.x - name: Reconfigure git to use HTTP authentication run: > git config --global url."https://github.com/".insteadOf diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3b33f107..6594b12f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,10 +14,10 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Use Node.js 12.x + - name: Use Node.js 16.x uses: actions/setup-node@v2 with: - node-version: 12.x + node-version: 16.x - name: Reconfigure git to use HTTP authentication run: > git config --global url."https://github.com/".insteadOf diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d37902d3..51e2ad7c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,10 +24,10 @@ jobs: uses: gittools/actions/gitversion/execute@v0.9.7 id: gitversion - - name: Use Node.js 12 + - name: Use Node.js 16 uses: actions/setup-node@v1 with: - node-version: 12.x + node-version: 16.x - name: Cache Node.js modules uses: actions/cache@v2 @@ -54,7 +54,7 @@ jobs: uses: docker/setup-buildx-action@v1 - name: Login to DockerHub - uses: docker/login-action@v1 + uses: docker/login-action@v1 with: username: ${{ secrets.DOCKER_HUB_USER }} password: ${{ secrets.DOCKER_HUB_TOKEN }} @@ -74,4 +74,4 @@ jobs: cache-to: type=local,dest=/tmp/.buildx-cache - name: Image digest - run: echo ${{ steps.docker_build.outputs.digest }} \ No newline at end of file + run: echo ${{ steps.docker_build.outputs.digest }} diff --git a/package-lock.json b/package-lock.json index d9ed9bf2..23cafe6b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.2", "license": "Apache-2.0", "dependencies": { + "@babel/runtime": "^7.23.1", "@emotion/react": "^11.8.1", "@emotion/styled": "^11.8.1", "@mui/material": "^5.4.3", @@ -16,8 +17,7 @@ "@tensorflow/tfjs": "^3.6.0", "classnames": "^2.3.1", "daikon": "^1.2.42", - "eslint": "^7.27.0", - "filereader-stream": "^2.0.0", + "jszip": "^3.10.1", "react": "^17.0.2", "react-dnd": "^14.0.2", "react-dnd-html5-backend": "^14.0.0", @@ -28,27 +28,42 @@ "react-scripts": "4.0.3", "redux": "4.1.0", "seedrandom": "^2.4.4", - "three": "0.101.1", - "zlib": "1.x.x" + "three": "0.101.1" }, "devDependencies": { "@babel/core": "7.14.3", + "@babel/plugin-proposal-private-property-in-object": "^7.21.11", + "@babel/plugin-transform-runtime": "^7.22.15", "@testing-library/jest-dom": "^5.14.1", "@testing-library/react": "^12.1.0", "@testing-library/react-hooks": "^7.0.2", "@testing-library/user-event": "^13.2.1", + "@types/react": "^18.2.14", + "@types/react-dom": "^18.2.6", + "@typescript-eslint/eslint-plugin": "^6.10.0", + "@typescript-eslint/parser": "^6.10.0", + "eslint": "^7.27.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-react": "7.x.x", "husky": "^7.0.0", "lint-staged": "^11.0.0", - "prettier": "^2.4.1" + "prettier": "^2.4.1", + "typescript": "^4.9.5" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "engines": { + "node": ">=0.10.0" } }, "node_modules/@adobe/css-tools": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz", - "integrity": "sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.1.tgz", + "integrity": "sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==", "dev": true }, "node_modules/@ampproject/remapping": { @@ -64,20 +79,21 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dependencies": { - "@babel/highlight": "^7.22.5" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", - "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", "engines": { "node": ">=6.9.0" } @@ -112,11 +128,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", - "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dependencies": { - "@babel/types": "^7.22.5", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -137,48 +153,45 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", - "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", - "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dependencies": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.5.tgz", - "integrity": "sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "semver": "^6.3.0" + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -188,13 +201,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.5.tgz", - "integrity": "sha512-1VpEFOIbMRaXyDeUwUfmTIxExLwQ+zkW+Bh5zXpApA3oQedBx9v/updixWxnx/bZpKw7u8VxWjb/qWpIcmPq8A==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "regexpu-core": "^5.3.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -204,36 +217,35 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz", - "integrity": "sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", + "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "resolve": "^1.14.2" }, "peerDependencies": { - "@babel/core": "^7.4.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -251,43 +263,43 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", - "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { @@ -310,14 +322,13 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz", - "integrity": "sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -327,19 +338,19 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz", - "integrity": "sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { @@ -365,9 +376,9 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", - "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dependencies": { "@babel/types": "^7.22.5" }, @@ -384,55 +395,54 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz", - "integrity": "sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dependencies": { "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", - "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -440,9 +450,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", - "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -451,9 +461,9 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", - "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", + "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -465,13 +475,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", - "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", + "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.5" + "@babel/plugin-transform-optional-chaining": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -484,6 +494,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -496,15 +507,15 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.5.tgz", - "integrity": "sha512-h8hlezQ4dl6ixodgXkH8lUfcD7x+WAuIqPUjwGoItynrXOAv4a4Tci1zA/qjzQjjcl0v3QpLdc2LM6ZACQuY7A==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.2.tgz", + "integrity": "sha512-eR0gJQc830fJVGz37oKLvt9W9uUIQSAovUl0e9sJ3YeO09dlcoBVYD3CLrjCj4qHdXmfiyTyFt8yeQYSN5fxLg==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/plugin-syntax-decorators": "^7.22.5" + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/plugin-syntax-decorators": "^7.22.10" }, "engines": { "node": ">=6.9.0" @@ -517,6 +528,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -532,6 +544,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -547,6 +560,7 @@ "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", @@ -563,6 +577,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -575,26 +590,19 @@ } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", + "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -648,9 +656,9 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.5.tgz", - "integrity": "sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz", + "integrity": "sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -899,13 +907,13 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.5.tgz", - "integrity": "sha512-gGOEvFzm3fWoyD5uZq7vVTD57pPJ3PczPUD/xCFGjzBpUosnklmXyKnGQbbbGs1NPNPskFex0j93yKbHt0cHyg==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", + "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -946,9 +954,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", - "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", + "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -975,11 +983,11 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", - "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", + "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, @@ -991,18 +999,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.5.tgz", - "integrity": "sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", + "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, "engines": { @@ -1028,9 +1036,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", - "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", + "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1071,9 +1079,9 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", - "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", + "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -1101,9 +1109,9 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", - "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", + "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -1131,9 +1139,9 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", - "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", + "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1161,9 +1169,9 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", - "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", + "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -1190,9 +1198,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", - "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", + "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -1219,11 +1227,11 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", - "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", + "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1234,11 +1242,11 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", - "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", + "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-simple-access": "^7.22.5" }, @@ -1250,14 +1258,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", - "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", + "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1311,9 +1319,9 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", - "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", + "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -1326,9 +1334,9 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", - "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", + "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -1341,15 +1349,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", - "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", + "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", "dependencies": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.5" + "@babel/plugin-transform-parameters": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1374,9 +1382,9 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", - "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", + "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -1389,9 +1397,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.5.tgz", - "integrity": "sha512-AconbMKOMkyG+xCng2JogMCDcqW8wedQAqpVIL4cOSescZ7+iW8utC6YDZLMCSUIReEA733gzRSaOSXMAt/4WQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", + "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", @@ -1405,9 +1413,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", - "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", + "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1434,12 +1442,12 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", - "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", + "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, @@ -1493,15 +1501,15 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz", - "integrity": "sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", + "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1540,12 +1548,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", - "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.1" + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -1569,16 +1577,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.5.tgz", - "integrity": "sha512-bg4Wxd1FWeFx3daHFTWk1pkSWK/AyQuiyAoeZAOkAOUBjnZPH6KT7eMxouV47tQ6hl6ax2zyAWBdWZXbrvXlaw==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz", + "integrity": "sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==", "dependencies": { - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.3", - "babel-plugin-polyfill-corejs3": "^0.8.1", - "babel-plugin-polyfill-regenerator": "^0.5.0", - "semver": "^6.3.0" + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1659,12 +1667,12 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.5.tgz", - "integrity": "sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz", + "integrity": "sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-typescript": "^7.22.5" }, @@ -1676,9 +1684,9 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", - "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1735,16 +1743,16 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.5.tgz", - "integrity": "sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", + "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", "dependencies": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", + "@babel/compat-data": "^7.23.2", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -1765,61 +1773,72 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.23.2", "@babel/plugin-transform-async-to-generator": "^7.22.5", "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.23.0", "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.5", - "@babel/plugin-transform-classes": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.11", + "@babel/plugin-transform-classes": "^7.22.15", "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.23.0", "@babel/plugin-transform-dotall-regex": "^7.22.5", "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.11", "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.5", - "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-for-of": "^7.22.15", "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.11", "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.5", - "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.23.0", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-modules-systemjs": "^7.23.0", "@babel/plugin-transform-modules-umd": "^7.22.5", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", - "@babel/plugin-transform-numeric-separator": "^7.22.5", - "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.5", - "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.23.0", + "@babel/plugin-transform-parameters": "^7.22.15", "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", "@babel/plugin-transform-reserved-words": "^7.22.5", "@babel/plugin-transform-shorthand-properties": "^7.22.5", "@babel/plugin-transform-spread": "^7.22.5", "@babel/plugin-transform-sticky-regex": "^7.22.5", "@babel/plugin-transform-template-literals": "^7.22.5", "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", "@babel/plugin-transform-unicode-property-regex": "^7.22.5", "@babel/plugin-transform-unicode-regex": "^7.22.5", "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.3", - "babel-plugin-polyfill-corejs3": "^0.8.1", - "babel-plugin-polyfill-regenerator": "^0.5.0", - "core-js-compat": "^3.30.2", - "semver": "^6.3.0" + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.23.0", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "engines": { "node": ">=6.9.0" }, @@ -1828,29 +1847,27 @@ } }, "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/preset-react": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.5.tgz", - "integrity": "sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.15.tgz", + "integrity": "sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "@babel/plugin-transform-react-display-name": "^7.22.5", - "@babel/plugin-transform-react-jsx": "^7.22.5", + "@babel/plugin-transform-react-jsx": "^7.22.15", "@babel/plugin-transform-react-jsx-development": "^7.22.5", "@babel/plugin-transform-react-pure-annotations": "^7.22.5" }, @@ -1862,15 +1879,15 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz", - "integrity": "sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz", + "integrity": "sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.5", - "@babel/plugin-transform-typescript": "^7.22.5" + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-typescript": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1885,42 +1902,42 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", - "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", - "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1929,12 +1946,12 @@ } }, "node_modules/@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2107,6 +2124,30 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "devOptional": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "devOptional": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -2127,9 +2168,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dependencies": { "type-fest": "^0.20.2" }, @@ -2140,6 +2181,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "engines": { + "node": ">= 4" + } + }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -2151,6 +2200,40 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@floating-ui/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "dependencies": { + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "dependencies": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", + "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", + "dependencies": { + "@floating-ui/dom": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + }, "node_modules/@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", @@ -2284,9 +2367,9 @@ } }, "node_modules/@jest/console/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -2463,9 +2546,9 @@ } }, "node_modules/@jest/core/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -2636,9 +2719,9 @@ } }, "node_modules/@jest/environment/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -2708,12 +2791,12 @@ } }, "node_modules/@jest/expect-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", - "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { - "jest-get-type": "^29.4.3" + "jest-get-type": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2751,9 +2834,9 @@ } }, "node_modules/@jest/fake-timers/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -2905,9 +2988,9 @@ } }, "node_modules/@jest/globals/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -3127,9 +3210,9 @@ } }, "node_modules/@jest/reporters/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -3268,12 +3351,12 @@ } }, "node_modules/@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "dependencies": { - "@sinclair/typebox": "^0.25.16" + "@sinclair/typebox": "^0.27.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3330,9 +3413,9 @@ } }, "node_modules/@jest/test-result/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -3457,9 +3540,9 @@ } }, "node_modules/@jest/transform/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -3553,12 +3636,12 @@ } }, "node_modules/@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -3653,9 +3736,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "engines": { "node": ">=6.0.0" } @@ -3669,9 +3752,9 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -3683,32 +3766,26 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, "node_modules/@mui/base": { - "version": "5.0.0-beta.5", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.5.tgz", - "integrity": "sha512-vy3TWLQYdGNecTaufR4wDNQFV2WEg6wRPi6BVbx6q1vP3K1mbxIn1+XOqOzfYBXjFHvMx0gZAo2TgWbaqfgvAA==", - "dependencies": { - "@babel/runtime": "^7.22.5", - "@emotion/is-prop-valid": "^1.2.1", - "@mui/types": "^7.2.4", - "@mui/utils": "^5.13.6", + "version": "5.0.0-beta.22", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.22.tgz", + "integrity": "sha512-l4asGID5tmyerx9emJfXOKLyXzaBtdXNIFE3M+IrSZaFtGFvaQKHhc3+nxxSxPf1+G44psjczM0ekRQCdXx9HA==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@floating-ui/react-dom": "^2.0.2", + "@mui/types": "^7.2.8", + "@mui/utils": "^5.14.16", "@popperjs/core": "^2.11.8", - "clsx": "^1.2.1", - "prop-types": "^15.8.1", - "react-is": "^18.2.0" + "clsx": "^2.0.0", + "prop-types": "^15.8.1" }, "engines": { "node": ">=12.0.0" @@ -3729,27 +3806,27 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.13.4", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.13.4.tgz", - "integrity": "sha512-yFrMWcrlI0TqRN5jpb6Ma9iI7sGTHpytdzzL33oskFHNQ8UgrtPas33Y1K7sWAMwCrr1qbWDrOHLAQG4tAzuSw==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.16.tgz", + "integrity": "sha512-97isBjzH2v1K7oB4UH2f4NOkBShOynY6dhnoR2XlUk/g6bb7ZBv2I3D1hvvqPtpEigKu93e7f/jAYr5d9LOc5w==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui" } }, "node_modules/@mui/material": { - "version": "5.13.6", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.13.6.tgz", - "integrity": "sha512-/c2ZApeQm2sTYdQXjqEnldaBMBcUEiyu2VRS6bS39ZeNaAcCLBQbYocLR46R+f0S5dgpBzB0T4AsOABPOFYZ5Q==", - "dependencies": { - "@babel/runtime": "^7.22.5", - "@mui/base": "5.0.0-beta.5", - "@mui/core-downloads-tracker": "^5.13.4", - "@mui/system": "^5.13.6", - "@mui/types": "^7.2.4", - "@mui/utils": "^5.13.6", - "@types/react-transition-group": "^4.4.6", - "clsx": "^1.2.1", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.16.tgz", + "integrity": "sha512-W4zZ4vnxgGk6/HqBwgsDHKU7x2l2NhX+r8gAwfg58Rhu3ikfY7NkIS6y8Gl3NkATc4GG1FNaGjjpQKfJx3U6Jw==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/base": "5.0.0-beta.22", + "@mui/core-downloads-tracker": "^5.14.16", + "@mui/system": "^5.14.16", + "@mui/types": "^7.2.8", + "@mui/utils": "^5.14.16", + "@types/react-transition-group": "^4.4.8", + "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1", "react-is": "^18.2.0", @@ -3782,12 +3859,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.13.1", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.13.1.tgz", - "integrity": "sha512-HW4npLUD9BAkVppOUZHeO1FOKUJWAwbpy0VQoGe3McUYTlck1HezGHQCfBQ5S/Nszi7EViqiimECVl9xi+/WjQ==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.16.tgz", + "integrity": "sha512-FNlL0pTSEBh8nXsVWreCHDSHk+jG8cBx1sxRbT8JVtL+PYbYPi802zfV4B00Kkf0LNRVRvAVQwojMWSR/MYGng==", "dependencies": { - "@babel/runtime": "^7.21.0", - "@mui/utils": "^5.13.1", + "@babel/runtime": "^7.23.2", + "@mui/utils": "^5.14.16", "prop-types": "^15.8.1" }, "engines": { @@ -3808,11 +3885,11 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.13.2", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz", - "integrity": "sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.16.tgz", + "integrity": "sha512-FfvYvTG/Zd+KXMMImbcMYEeQAbONGuX5Vx3gBmmtB6KyA7Mvm9Pma1ly3R0gc44yeoFd+2wBjn1feS8h42HW5w==", "dependencies": { - "@babel/runtime": "^7.21.0", + "@babel/runtime": "^7.23.2", "@emotion/cache": "^11.11.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -3839,16 +3916,16 @@ } }, "node_modules/@mui/system": { - "version": "5.13.6", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.13.6.tgz", - "integrity": "sha512-G3Xr28uLqU3DyF6r2LQkHGw/ku4P0AHzlKVe7FGXOPl7X1u+hoe2xxj8Vdiq/69II/mh9OP21i38yBWgWb7WgQ==", - "dependencies": { - "@babel/runtime": "^7.22.5", - "@mui/private-theming": "^5.13.1", - "@mui/styled-engine": "^5.13.2", - "@mui/types": "^7.2.4", - "@mui/utils": "^5.13.6", - "clsx": "^1.2.1", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.16.tgz", + "integrity": "sha512-uKnPfsDqDs8bbN54TviAuoGWOmFiQLwNZ3Wvj+OBkJCzwA6QnLb/sSeCB7Pk3ilH4h4jQ0BHtbR+Xpjy9wlOuA==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/private-theming": "^5.14.16", + "@mui/styled-engine": "^5.14.16", + "@mui/types": "^7.2.8", + "@mui/utils": "^5.14.16", + "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" }, @@ -3878,11 +3955,11 @@ } }, "node_modules/@mui/types": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", - "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", + "version": "7.2.8", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.8.tgz", + "integrity": "sha512-9u0ji+xspl96WPqvrYJF/iO+1tQ1L5GTaDOeG3vCR893yy7VcWwRNiVMmPdPNpMDqx0WV1wtEW9OMwK9acWJzQ==", "peerDependencies": { - "@types/react": "*" + "@types/react": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -3891,13 +3968,12 @@ } }, "node_modules/@mui/utils": { - "version": "5.13.6", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.13.6.tgz", - "integrity": "sha512-ggNlxl5NPSbp+kNcQLmSig6WVB0Id+4gOxhx644987v4fsji+CSXc+MFYLocFB/x4oHtzCUlSzbVHlJfP/fXoQ==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.16.tgz", + "integrity": "sha512-3xV31GposHkwRbQzwJJuooWpK2ybWdEdeUPtRjv/6vjomyi97F3+68l+QVj9tPTvmfSbr2sx5c/NuvDulrdRmA==", "dependencies": { - "@babel/runtime": "^7.22.5", - "@types/prop-types": "^15.7.5", - "@types/react-is": "^18.2.0", + "@babel/runtime": "^7.23.2", + "@types/prop-types": "^15.7.9", "prop-types": "^15.8.1", "react-is": "^18.2.0" }, @@ -3909,7 +3985,13 @@ "url": "https://opencollective.com/mui" }, "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/@nodelib/fs.scandir": { @@ -3965,9 +4047,9 @@ } }, "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4083,9 +4165,9 @@ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" }, "node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "node_modules/@sinonjs/commons": { @@ -4491,6 +4573,11 @@ "node": ">=8" } }, + "node_modules/@tensorflow/tfjs/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, "node_modules/@tensorflow/tfjs/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -4536,9 +4623,9 @@ } }, "node_modules/@testing-library/dom": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.1.tgz", - "integrity": "sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w==", + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz", + "integrity": "sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==", "dev": true, "peer": true, "dependencies": { @@ -4632,9 +4719,9 @@ } }, "node_modules/@testing-library/jest-dom": { - "version": "5.16.5", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz", - "integrity": "sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", + "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", "dev": true, "dependencies": { "@adobe/css-tools": "^4.0.1", @@ -4786,6 +4873,26 @@ "node": ">=12" } }, + "node_modules/@testing-library/react/node_modules/@types/react": { + "version": "17.0.69", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.69.tgz", + "integrity": "sha512-klEeru//GhiQvXUBayz0Q4l3rKHWsBR/EUOhOeow6hK2jV7MlO44+8yEk6+OtPeOlRfnpUnrLXzGK+iGph5aeg==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@testing-library/react/node_modules/@types/react-dom": { + "version": "17.0.22", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.22.tgz", + "integrity": "sha512-wHt4gkdSMb4jPp1vc30MLJxoWGsZs88URfmt3FRXoOEYrrqK3I8IuZLE/uFBb4UT6MRfI0wXFu4DS7LS0kUC7Q==", + "dev": true, + "dependencies": { + "@types/react": "^17" + } + }, "node_modules/@testing-library/react/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -4881,15 +4988,15 @@ } }, "node_modules/@types/aria-query": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", - "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.3.tgz", + "integrity": "sha512-0Z6Tr7wjKJIk4OUEjVUQMtyunLDy339vcMaj38Kpj6jM2OE1p3S4kXExKZ7a3uXQAPCoy3sbrP1wibDKaf39oA==", "dev": true }, "node_modules/@types/babel__core": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", - "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.3.tgz", + "integrity": "sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -4899,26 +5006,26 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "version": "7.6.6", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.6.tgz", + "integrity": "sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.3.tgz", + "integrity": "sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", - "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.3.tgz", + "integrity": "sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==", "dependencies": { "@babel/types": "^7.20.7" } @@ -4933,9 +5040,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.4.tgz", + "integrity": "sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==" }, "node_modules/@types/glob": { "version": "7.2.0", @@ -4947,17 +5054,17 @@ } }, "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.8.tgz", + "integrity": "sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.4.tgz", + "integrity": "sha512-ZchYkbieA+7tnxwX/SCBySx9WwvWR8TaP5tb2jRAzwvLb/rWchGw3v0w3pqUbUvj0GCwW2Xz/AVPSk6kUGctXQ==", "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" @@ -4969,30 +5076,30 @@ "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==" }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==" }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz", + "integrity": "sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==", "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz", + "integrity": "sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==", "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/jest": { - "version": "29.5.2", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.2.tgz", - "integrity": "sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg==", + "version": "29.5.7", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.7.tgz", + "integrity": "sha512-HLyetab6KVPSiF+7pFcUyMeLsx25LDNDemw9mGsJBkai/oouwrjTycocSDYopMEwFhN2Y4s9oPyOCZNofgSt2g==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -5012,12 +5119,12 @@ } }, "node_modules/@types/jest/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -5026,9 +5133,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -5046,23 +5153,39 @@ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" }, "node_modules/@types/node": { - "version": "20.3.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", - "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==" + "version": "20.8.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", + "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/node-fetch": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", - "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.8.tgz", + "integrity": "sha512-nnH5lV9QCMPsbEVdTb5Y+F3GQxLSw1xQgIydrb2gSfEavRPs50FnMr+KUaa+LoPSqibm2N+ZZxH7lavZlAT4GA==", "dependencies": { "@types/node": "*", - "form-data": "^3.0.0" + "form-data": "^4.0.0" + } + }, + "node_modules/@types/node-fetch/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" } }, "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz", + "integrity": "sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==" }, "node_modules/@types/offscreencanvas": { "version": "2019.3.0", @@ -5070,9 +5193,9 @@ "integrity": "sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==" }, "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.1.tgz", + "integrity": "sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==" }, "node_modules/@types/prettier": { "version": "2.7.3", @@ -5080,19 +5203,19 @@ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" }, "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "version": "15.7.9", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz", + "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==" }, "node_modules/@types/q": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", - "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.7.tgz", + "integrity": "sha512-HBPgtzp44867rkL+IzQ3560/E/BlobwCjeXsuKqogrcE99SKgZR4tvBBCuNJZMhUFMz26M7cjKWZg785lllwpA==" }, "node_modules/@types/react": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.14.tgz", - "integrity": "sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==", + "version": "18.2.35", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.35.tgz", + "integrity": "sha512-LG3xpFZ++rTndV+/XFyX5vUP7NI9yxyk+MQvBDq+CVs8I9DLSc3Ymwb1Vmw5YDoeNeHN4PDZa3HylMKJYT9PNQ==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -5100,37 +5223,18 @@ } }, "node_modules/@types/react-dom": { - "version": "17.0.20", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz", - "integrity": "sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==", - "dev": true, - "dependencies": { - "@types/react": "^17" - } - }, - "node_modules/@types/react-dom/node_modules/@types/react": { - "version": "17.0.62", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.62.tgz", - "integrity": "sha512-eANCyz9DG8p/Vdhr0ZKST8JV12PhH2ACCDYlFw6DIO+D+ca+uP4jtEDEpVqXZrh/uZdXQGwk7whJa3ah5DtyLw==", + "version": "18.2.14", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.14.tgz", + "integrity": "sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==", "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-is": { - "version": "18.2.1", - "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.1.tgz", - "integrity": "sha512-wyUkmaaSZEzFZivD8F2ftSyAfk6L+DfFliVj/mYdOXbVjRcS87fQJLTnhk6dRZPuJjI+9g6RZJO4PNCngUrmyw==", "dependencies": { "@types/react": "*" } }, "node_modules/@types/react-redux": { - "version": "7.1.25", - "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.25.tgz", - "integrity": "sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg==", + "version": "7.1.28", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.28.tgz", + "integrity": "sha512-EQr7cChVzVUuqbA+J8ArWK1H0hLAHKOs21SIMrskKZ3nHNeE+LFYA+IsoZGhVOT8Ktjn3M20v4rnZKN3fLbypw==", "dependencies": { "@types/hoist-non-react-statics": "^3.3.0", "@types/react": "*", @@ -5139,18 +5243,18 @@ } }, "node_modules/@types/react-test-renderer": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.0.0.tgz", - "integrity": "sha512-C7/5FBJ3g3sqUahguGi03O79b8afNeSD6T8/GU50oQrJCU0bVCCGQHaGKUbg2Ce8VQEEqTw8/HiS6lXHHdgkdQ==", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.0.5.tgz", + "integrity": "sha512-PsnmF4Hpi61PTRX+dTxkjgDdtZ09kFFgPXczoF+yBfOVxn7xBLPvKP1BUrSasYHmerj33rhoJuvpIMsJuyRqHw==", "dev": true, "dependencies": { "@types/react": "*" } }, "node_modules/@types/react-transition-group": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz", - "integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.8.tgz", + "integrity": "sha512-QmQ22q+Pb+HQSn04NL3HtrqHwYMf4h3QKArOy5F8U5nEVMaihBs3SR10WiOM1iwPz5jIo8x/u11al+iEGZZrvg==", "dependencies": { "@types/react": "*" } @@ -5164,43 +5268,49 @@ } }, "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.5.tgz", + "integrity": "sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==" }, "node_modules/@types/seedrandom": { - "version": "2.4.30", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.30.tgz", - "integrity": "sha512-AnxLHewubLVzoF/A4qdxBGHCKifw8cY32iro3DQX9TPcetE95zBeVt3jnsvtvAUf1vwzMfwzp4t/L2yqPlnjkQ==" + "version": "2.4.32", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.32.tgz", + "integrity": "sha512-pGzjoMhPpuIxBOMMQMiZ5xMMFQMnXgJAi0SkljX/q6KOFkaSW7yNIXZT8jTpMtEsz72WXE+whu/4fGCn16cjaQ==" + }, + "node_modules/@types/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", + "devOptional": true }, "node_modules/@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.4.tgz", + "integrity": "sha512-Kdfm7Sk5VX8dFW7Vbp18+fmAatBewzBILa1raHYxrGEFXT0jNl9x3LWfuW7bTbjEKFNey9Dfkj/UzT6z/NvRlg==" }, "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw==" }, "node_modules/@types/tapable": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", - "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==" + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.10.tgz", + "integrity": "sha512-q8F20SdXG5fdVJQ5yxsVlH+f+oekP42QeHv4s5KlrxTMT0eopXn7ol1rhxMcksf8ph7XNv811iVDE2hOpUvEPg==" }, "node_modules/@types/testing-library__jest-dom": { - "version": "5.14.6", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.6.tgz", - "integrity": "sha512-FkHXCb+ikSoUP4Y4rOslzTdX5sqYwMxfefKh1GmZ8ce1GOkEHntSp6b5cGadmNfp5e4BMEWOMx+WSKd5/MqlDA==", + "version": "5.14.9", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", + "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", "dev": true, "dependencies": { "@types/jest": "*" } }, "node_modules/@types/uglify-js": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.1.tgz", - "integrity": "sha512-GkewRA4i5oXacU/n4MA9+bLgt5/L3F1mKrYvFGm7r2ouLXhRKjuWwo9XHNnbx6WF3vlGW21S3fCvgqxvxXXc5g==", + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.3.tgz", + "integrity": "sha512-ToldSfJ6wxO21cakcz63oFD1GjqQbKzhZCD57eH7zWuYT5UEZvfUoqvrjX5d+jB9g4a/sFO0n6QSVzzn5sMsjg==", "dependencies": { "source-map": "^0.6.1" } @@ -5224,9 +5334,9 @@ "integrity": "sha512-50GQhDVTq/herLMiqSQkdtRu+d5q/cWHn4VvKJtrj4DJAjo1MNkWYa2MA41BaBO1q1HgsUjuQvEOk0QHvlnAaQ==" }, "node_modules/@types/webpack": { - "version": "4.41.33", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.33.tgz", - "integrity": "sha512-PPajH64Ft2vWevkerISMtnZ8rTs4YmRbs+23c402J0INmxDKCrhZNvwZYtzx96gY2wAtXdrK1BS2fiC8MlLr3g==", + "version": "4.41.35", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.35.tgz", + "integrity": "sha512-XRC6HLGHtNfN8/xWeu1YUQV1GSE+28q8lSqvcJ+0xt/zW9Wmn4j9pCSvaXPyRlCKrl5OuqECQNEJUy2vo8oWqg==", "dependencies": { "@types/node": "*", "@types/tapable": "^1", @@ -5237,9 +5347,9 @@ } }, "node_modules/@types/webpack-sources": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", - "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.2.tgz", + "integrity": "sha512-acCzhuVe+UJy8abiSFQWXELhhNMZjQjQKpLNEi1pKGgKXZj0ul614ATcx4kkhunPost6Xw+aCq8y8cn1/WwAiA==", "dependencies": { "@types/node": "*", "@types/source-list-map": "*", @@ -5263,43 +5373,47 @@ } }, "node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "version": "17.0.29", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.29.tgz", + "integrity": "sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.2.tgz", + "integrity": "sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", - "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", - "dependencies": { - "@typescript-eslint/experimental-utils": "4.33.0", - "@typescript-eslint/scope-manager": "4.33.0", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz", + "integrity": "sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==", + "devOptional": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/type-utils": "6.10.0", + "@typescript-eslint/utils": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -5307,18 +5421,11 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "engines": { - "node": ">= 4" - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "devOptional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -5327,9 +5434,10 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "devOptional": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -5343,7 +5451,8 @@ "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true }, "node_modules/@typescript-eslint/experimental-utils": { "version": "4.33.0", @@ -5368,6 +5477,76 @@ "eslint": "*" } }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/scope-manager": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", + "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/types": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-utils": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", @@ -5385,25 +5564,65 @@ "eslint": ">=5" } }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/@typescript-eslint/parser": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", - "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz", + "integrity": "sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==", + "devOptional": true, "dependencies": { - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", + "debug": "^4.3.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -5412,27 +5631,56 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", + "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", + "devOptional": true, "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz", + "integrity": "sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==", + "devOptional": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/utils": "6.10.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", + "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", + "devOptional": true, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -5440,20 +5688,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", + "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", + "devOptional": true, + "dependencies": { + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -5469,6 +5718,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "devOptional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -5477,9 +5727,10 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "devOptional": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -5493,18 +5744,78 @@ "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", + "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==", + "devOptional": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "devOptional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "devOptional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", + "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", + "devOptional": true, "dependencies": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/types": "6.10.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -5904,6 +6215,7 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, "dependencies": { "deep-equal": "^2.0.5" } @@ -5955,14 +6267,14 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -5996,14 +6308,32 @@ "node": ">=0.10.0" } }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -6014,13 +6344,13 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -6031,13 +6361,13 @@ } }, "node_modules/array.prototype.reduce": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", - "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", + "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-array-method-boxes-properly": "^1.0.0", "is-string": "^1.0.7" }, @@ -6049,15 +6379,35 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", + "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/arrify": { @@ -6090,25 +6440,25 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", + "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" + "object.assign": "^4.1.4", + "util": "^0.10.4" } }, "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" }, "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", "dependencies": { - "inherits": "2.0.1" + "inherits": "2.0.3" } }, "node_modules/assign-symbols": { @@ -6120,9 +6470,9 @@ } }, "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" }, "node_modules/astral-regex": { "version": "2.0.0", @@ -6156,6 +6506,14 @@ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dependencies": { + "has-symbols": "^1.0.3" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -6213,9 +6571,9 @@ } }, "node_modules/axe-core": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", - "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", "engines": { "node": ">=4" } @@ -6304,9 +6662,9 @@ } }, "node_modules/babel-jest/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -6470,39 +6828,39 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz", - "integrity": "sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw==", + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", + "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.4.0", - "semver": "^6.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.3", + "semver": "^6.3.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz", - "integrity": "sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q==", + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", + "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.0", - "core-js-compat": "^3.30.1" + "@babel/helper-define-polyfill-provider": "^0.4.3", + "core-js-compat": "^3.33.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz", - "integrity": "sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", + "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.0" + "@babel/helper-define-polyfill-provider": "^0.4.3" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-syntax-object-rest-spread": { @@ -6585,25 +6943,25 @@ } }, "node_modules/babel-preset-react-app/node_modules/@babel/core": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", - "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -6613,6 +6971,11 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/babel-preset-react-app/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, "node_modules/babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", @@ -6700,13 +7063,14 @@ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" }, "node_modules/bfj": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", - "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", "dependencies": { - "bluebird": "^3.5.5", - "check-types": "^11.1.1", + "bluebird": "^3.7.2", + "check-types": "^11.2.3", "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", "tryer": "^1.0.1" }, "engines": { @@ -6915,19 +7279,22 @@ } }, "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", + "elliptic": "^6.5.4", "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 4" } }, "node_modules/browserify-sign/node_modules/readable-stream": { @@ -6971,9 +7338,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "funding": [ { "type": "opencollective", @@ -6989,10 +7356,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -7138,12 +7505,13 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7219,9 +7587,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001507", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001507.tgz", - "integrity": "sha512-SFpUDoSLCaE5XYL2jfqe9ova/pbQHEmbheDf5r4diNwbAgR3qxM9NQtfsiSscjqoya5K7kFcHPUQ+VsUkIJR4A==", + "version": "1.0.30001561", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", + "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", "funding": [ { "type": "opencollective", @@ -7286,9 +7654,9 @@ } }, "node_modules/check-types": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.2.tgz", - "integrity": "sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA==" + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==" }, "node_modules/chokidar": { "version": "3.5.3", @@ -7334,9 +7702,9 @@ } }, "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -7387,69 +7755,16 @@ "node": ">=0.10.0" } }, - "node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/classnames": { @@ -7523,9 +7838,9 @@ } }, "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", "engines": { "node": ">=6" } @@ -7553,9 +7868,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" }, "node_modules/collection-visit": { "version": "1.0.0", @@ -7824,9 +8139,9 @@ } }, "node_modules/core-js": { - "version": "3.31.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.31.0.tgz", - "integrity": "sha512-NIp2TQSGfR6ba5aalZD+ZQ1fSxGhDo/s1w0nx3RYzf2pnJxt7YynxFlFScP6eV7+GZsKO95NSjGxyJsU3DZgeQ==", + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.2.tgz", + "integrity": "sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -7834,11 +8149,11 @@ } }, "node_modules/core-js-compat": { - "version": "3.31.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.0.tgz", - "integrity": "sha512-hM7YCu1cU6Opx7MXNu0NuumM0ezNeAeRKadixyiQELWY3vT3De9S4J5ZBMraWV2vZnrE1Cirl0GtFtDtMUXzPw==", + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz", + "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==", "dependencies": { - "browserslist": "^4.21.5" + "browserslist": "^4.22.1" }, "funding": { "type": "opencollective", @@ -8071,9 +8386,9 @@ } }, "node_modules/css-loader/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -8492,14 +8807,15 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" }, "node_modules/deep-equal": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz", - "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", + "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", + "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "is-arguments": "^1.1.1", "is-array-buffer": "^3.0.2", "is-date-object": "^1.0.5", @@ -8615,9 +8931,9 @@ } }, "node_modules/default-gateway/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } @@ -8652,11 +8968,25 @@ "which": "bin/which" } }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -8834,9 +9164,9 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -9093,9 +9423,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.440", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.440.tgz", - "integrity": "sha512-r6dCgNpRhPwiWlxbHzZQ/d9swfPaEJGi8ekqRBwQYaR3WmA5VkqQfBWSDDjuJU1ntO+W9tHx8OHV/96Q8e0dVw==" + "version": "1.4.576", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.576.tgz", + "integrity": "sha512-yXsZyXJfAqzWk1WKryr0Wl0MN2D47xodPvEEwlVePBnhU5E7raevLQR+E6b9JAD3GfL/7MbAL9ZtWQQPcLx7wA==" }, "node_modules/elliptic": { "version": "6.5.4", @@ -9182,11 +9512,12 @@ } }, "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dependencies": { - "ansi-colors": "^4.1.1" + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8.6" @@ -9228,24 +9559,25 @@ } }, "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dependencies": { "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", + "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", @@ -9253,19 +9585,23 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -9283,6 +9619,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -9298,25 +9635,46 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-iterator-helpers": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -9393,14 +9751,13 @@ } }, "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "esutils": "^2.0.2" }, "bin": { "escodegen": "bin/escodegen.js", @@ -9413,42 +9770,6 @@ "source-map": "~0.6.1" } }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/escodegen/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -9458,17 +9779,6 @@ "node": ">=0.10.0" } }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/eslint": { "version": "7.32.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", @@ -9526,9 +9836,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -9537,46 +9847,14 @@ "eslint": ">=7.0.0" } }, - "node_modules/eslint-config-react-app": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", - "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", - "dependencies": { - "confusing-browser-globals": "^1.0.10" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^4.0.0", - "@typescript-eslint/parser": "^4.0.0", - "babel-eslint": "^10.0.0", - "eslint": "^7.5.0", - "eslint-plugin-flowtype": "^5.2.0", - "eslint-plugin-import": "^2.22.0", - "eslint-plugin-jest": "^24.0.0", - "eslint-plugin-jsx-a11y": "^6.3.1", - "eslint-plugin-react": "^7.20.3", - "eslint-plugin-react-hooks": "^4.0.8", - "eslint-plugin-testing-library": "^3.9.0" - }, - "peerDependenciesMeta": { - "eslint-plugin-jest": { - "optional": true - }, - "eslint-plugin-testing-library": { - "optional": true - } - } - }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -9627,25 +9905,27 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", + "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" }, "engines": { "node": ">=4" @@ -9694,26 +9974,26 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", - "dependencies": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" }, "engines": { "node": ">=4.0" @@ -9722,6 +10002,14 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dependencies": { + "dequal": "^2.0.3" + } + }, "node_modules/eslint-plugin-prettier": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", @@ -9744,14 +10032,15 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dependencies": { "array-includes": "^3.1.6", "array.prototype.flatmap": "^1.3.1", "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", @@ -9761,7 +10050,7 @@ "object.values": "^1.1.6", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", + "semver": "^6.3.1", "string.prototype.matchall": "^4.0.8" }, "engines": { @@ -9794,11 +10083,11 @@ } }, "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -9920,9 +10209,9 @@ } }, "node_modules/eslint-plugin-testing-library/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -9981,11 +10270,15 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "devOptional": true, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-webpack-plugin": { @@ -10082,10 +10375,18 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "engines": { + "node": ">=10" + } + }, "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dependencies": { "type-fest": "^0.20.2" }, @@ -10104,6 +10405,14 @@ "node": ">=8" } }, + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "engines": { + "node": ">= 4" + } + }, "node_modules/eslint/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -10116,9 +10425,9 @@ } }, "node_modules/eslint/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -10358,61 +10667,16 @@ "node": ">=0.10.0" } }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/expand-brackets/node_modules/is-extendable": { @@ -10423,30 +10687,22 @@ "node": ">=0.10.0" } }, - "node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/expand-brackets/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -10629,9 +10885,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -10681,9 +10937,9 @@ } }, "node_modules/fflate": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.0.tgz", - "integrity": "sha512-FAdS4qMuFjsJj6XHbBaZeXOgaypXp8iw/Tpyuq/w3XA41jjLHT8NPA+n7czH/DDhdncq0nAyDZmPeWXh2qmdIg==" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.1.tgz", + "integrity": "sha512-/exOvEuc+/iaUm105QIiOt4LpBdMTWsXxqR0HDF35vx3fmaKzw7354gTilCh5rkzEt8WYyG//ku3h3nRmd7CHQ==" }, "node_modules/figgy-pudding": { "version": "3.5.2", @@ -10743,15 +10999,6 @@ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "optional": true }, - "node_modules/filereader-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filereader-stream/-/filereader-stream-2.0.0.tgz", - "integrity": "sha512-U1OzPNA5quv2/ejRikN/G8llfdtHpblOuKNgxooVjbr/i9uEJ/QIQ7eslx/RqHRJVuTqwr6v5/XG87935t/daA==", - "dependencies": { - "from2": "^2.1.0", - "typedarray-to-buffer": "^3.0.4" - } - }, "node_modules/filesize": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", @@ -10832,21 +11079,22 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" }, "node_modules/flatten": { "version": "1.0.3", @@ -10864,9 +11112,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "funding": [ { "type": "individual", @@ -11026,9 +11274,9 @@ } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } @@ -11136,9 +11384,9 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, "optional": true, "os": [ @@ -11149,19 +11397,22 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -11200,14 +11451,14 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11367,14 +11618,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "engines": { - "node": ">= 4" - } - }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -11391,6 +11634,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "devOptional": true + }, "node_modules/growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", @@ -11420,12 +11669,9 @@ "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" }, "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", "engines": { "node": ">= 0.4.0" } @@ -11447,11 +11693,11 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dependencies": { - "get-intrinsic": "^1.1.1" + "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11605,6 +11851,17 @@ "minimalistic-assert": "^1.0.1" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -12073,13 +12330,18 @@ "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==" }, "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "engines": { "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "node_modules/immer": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", @@ -12221,12 +12483,12 @@ } }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -12263,14 +12525,14 @@ } }, "node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", "dependencies": { - "kind-of": "^6.0.0" + "hasown": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.10" } }, "node_modules/is-arguments": { @@ -12306,6 +12568,20 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -12390,25 +12666,25 @@ } }, "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", "dependencies": { - "kind-of": "^6.0.0" + "hasown": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/is-date-object": { @@ -12426,16 +12702,15 @@ } }, "node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/is-directory": { @@ -12479,6 +12754,17 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -12495,6 +12781,20 @@ "node": ">=6" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -12709,15 +13009,11 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -12823,16 +13119,16 @@ } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-lib-report/node_modules/has-flag": { @@ -12843,20 +13139,45 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-report/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -12868,6 +13189,11 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-report/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", @@ -12890,9 +13216,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -12901,6 +13227,18 @@ "node": ">=8" } }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, "node_modules/jest": { "version": "26.6.0", "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", @@ -12946,9 +13284,9 @@ } }, "node_modules/jest-changed-files/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -13108,9 +13446,9 @@ } }, "node_modules/jest-circus/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -13335,9 +13673,9 @@ } }, "node_modules/jest-cli/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -13543,9 +13881,9 @@ } }, "node_modules/jest-config/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -13676,15 +14014,15 @@ } }, "node_modules/jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -13749,12 +14087,12 @@ } }, "node_modules/jest-diff/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -13828,9 +14166,9 @@ } }, "node_modules/jest-each/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -13975,9 +14313,9 @@ } }, "node_modules/jest-environment-jsdom/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -14094,9 +14432,9 @@ } }, "node_modules/jest-environment-node/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -14182,9 +14520,9 @@ } }, "node_modules/jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -14232,9 +14570,9 @@ } }, "node_modules/jest-haste-map/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -14376,9 +14714,9 @@ } }, "node_modules/jest-jasmine2/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -14589,9 +14927,9 @@ } }, "node_modules/jest-leak-detector/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -14688,15 +15026,15 @@ } }, "node_modules/jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -14761,12 +15099,12 @@ } }, "node_modules/jest-matcher-utils/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -14799,18 +15137,18 @@ } }, "node_modules/jest-message-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -14877,12 +15215,12 @@ } }, "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -14942,9 +15280,9 @@ } }, "node_modules/jest-mock/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -15084,9 +15422,9 @@ } }, "node_modules/jest-resolve-dependencies/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -15171,9 +15509,9 @@ } }, "node_modules/jest-resolve/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -15304,9 +15642,9 @@ } }, "node_modules/jest-runner/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -15516,9 +15854,9 @@ } }, "node_modules/jest-runtime/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -15782,9 +16120,9 @@ } }, "node_modules/jest-snapshot/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -15986,9 +16324,9 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -16016,12 +16354,12 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -16134,9 +16472,9 @@ } }, "node_modules/jest-validate/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -16349,9 +16687,9 @@ } }, "node_modules/jest-watcher/node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "dependencies": { "@types/yargs-parser": "*" } @@ -16539,9 +16877,9 @@ } }, "node_modules/jsdom/node_modules/acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "bin": { "acorn": "bin/acorn" }, @@ -16584,6 +16922,11 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -16626,18 +16969,61 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "dependencies": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + } + }, + "node_modules/jsonpath/node_modules/esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dependencies": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" }, "engines": { "node": ">=4.0" } }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -16673,11 +17059,14 @@ "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" }, "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dependencies": { - "language-subtag-registry": "~0.3.2" + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/last-call-webpack-plugin": { @@ -16709,6 +17098,14 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -17039,9 +17436,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } @@ -17455,9 +17852,9 @@ "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==" }, "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", "optional": true }, "node_modules/nanoid": { @@ -17544,9 +17941,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -17637,9 +18034,9 @@ } }, "node_modules/node-notifier/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "optional": true, "dependencies": { "lru-cache": "^6.0.0" @@ -17658,9 +18055,9 @@ "optional": true }, "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==" + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" }, "node_modules/normalize-package-data": { "version": "2.5.0", @@ -17674,9 +18071,9 @@ } }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } @@ -17739,9 +18136,9 @@ "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==" }, "node_modules/nwsapi": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.5.tgz", - "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==" + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" }, "node_modules/object-assign": { "version": "4.1.1", @@ -17775,47 +18172,16 @@ "node": ">=0.10.0" } }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/object-copy/node_modules/kind-of": { @@ -17830,9 +18196,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -17889,26 +18255,26 @@ } }, "node_modules/object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -17918,14 +18284,14 @@ } }, "node_modules/object.getownpropertydescriptors": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz", - "integrity": "sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", + "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", "dependencies": { - "array.prototype.reduce": "^1.0.5", + "array.prototype.reduce": "^1.0.6", "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "es-abstract": "^1.21.2", + "es-abstract": "^1.22.1", "safe-array-concat": "^1.0.0" }, "engines": { @@ -17935,13 +18301,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, "node_modules/object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -17959,13 +18336,13 @@ } }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -18067,16 +18444,16 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -19632,9 +20009,9 @@ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/postcss-safe-parser/node_modules/postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -19970,9 +20347,9 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } @@ -20136,6 +20513,11 @@ "node": ">=10" } }, + "node_modules/react-app-polyfill/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, "node_modules/react-dev-utils": { "version": "11.0.4", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", @@ -20226,14 +20608,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/react-dev-utils/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "engines": { - "node": ">= 4" - } - }, "node_modules/react-dev-utils/node_modules/loader-utils": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", @@ -20532,9 +20906,9 @@ } }, "node_modules/react-scripts/node_modules/@babel/core/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } @@ -20593,6 +20967,212 @@ "node": ">= 8" } }, + "node_modules/react-scripts/node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", + "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", + "dependencies": { + "@typescript-eslint/experimental-utils": "4.33.0", + "@typescript-eslint/scope-manager": "4.33.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^4.0.0", + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/react-scripts/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-scripts/node_modules/@typescript-eslint/parser": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", + "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", + "dependencies": { + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "debug": "^4.3.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/react-scripts/node_modules/@typescript-eslint/scope-manager": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", + "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/react-scripts/node_modules/@typescript-eslint/types": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/react-scripts/node_modules/@typescript-eslint/typescript-estree": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/react-scripts/node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-scripts/node_modules/@typescript-eslint/visitor-keys": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/react-scripts/node_modules/eslint-config-react-app": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", + "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", + "dependencies": { + "confusing-browser-globals": "^1.0.10" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0", + "@typescript-eslint/parser": "^4.0.0", + "babel-eslint": "^10.0.0", + "eslint": "^7.5.0", + "eslint-plugin-flowtype": "^5.2.0", + "eslint-plugin-import": "^2.22.0", + "eslint-plugin-jest": "^24.0.0", + "eslint-plugin-jsx-a11y": "^6.3.1", + "eslint-plugin-react": "^7.20.3", + "eslint-plugin-react-hooks": "^4.0.8", + "eslint-plugin-testing-library": "^3.9.0" + }, + "peerDependenciesMeta": { + "eslint-plugin-jest": { + "optional": true + }, + "eslint-plugin-testing-library": { + "optional": true + } + } + }, + "node_modules/react-scripts/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/react-scripts/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/react-scripts/node_modules/resolve": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", @@ -20629,6 +21209,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/react-scripts/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -20764,15 +21349,34 @@ "@babel/runtime": "^7.9.2" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dependencies": { "regenerate": "^1.4.2" }, @@ -20781,14 +21385,14 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dependencies": { "@babel/runtime": "^7.8.4" } @@ -20811,13 +21415,13 @@ "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -20959,11 +21563,11 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -21334,12 +21938,12 @@ } }, "node_modules/safe-array-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -21604,9 +22208,9 @@ } }, "node_modules/sane/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } @@ -21723,9 +22327,9 @@ } }, "node_modules/sass-loader/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -21802,9 +22406,9 @@ } }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -21953,6 +22557,33 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -22223,61 +22854,16 @@ "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/snapdragon/node_modules/is-extendable": { @@ -22288,14 +22874,6 @@ "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/snapdragon/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -22435,9 +23013,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==" }, "node_modules/spdy": { "version": "4.0.2", @@ -22537,92 +23115,132 @@ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "node_modules/static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "escodegen": "^1.8.1" } }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "node_modules/static-eval/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "dependencies": { - "is-descriptor": "^0.1.0" + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "node_modules/static-eval/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dependencies": { - "kind-of": "^3.0.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "node_modules/static-eval/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dependencies": { - "is-buffer": "^1.1.5" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "node_modules/static-eval/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dependencies": { - "kind-of": "^3.0.2" + "prelude-ls": "~1.1.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", "dependencies": { - "is-buffer": "^1.1.5" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-descriptor": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/static-extend/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/statuses": { @@ -22637,6 +23255,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, "dependencies": { "internal-slot": "^1.0.4" }, @@ -22740,17 +23359,18 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", "side-channel": "^1.0.4" }, "funding": { @@ -22758,13 +23378,13 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -22774,26 +23394,26 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -23165,9 +23785,9 @@ } }, "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -23291,9 +23911,9 @@ } }, "node_modules/terser-webpack-plugin/node_modules/acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "bin": { "acorn": "bin/acorn" }, @@ -23419,9 +24039,9 @@ } }, "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.18.1.tgz", - "integrity": "sha512-j1n0Ao919h/Ai5r43VAnfV/7azUYW43GPxK7qSATzrsERfW7+y2QW9Cp9ufnRF5CQUWbnLSo7UJokSWCqg4tsQ==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", + "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -23617,6 +24237,18 @@ "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "devOptional": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-pnp": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", @@ -23661,9 +24293,9 @@ } }, "node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -23736,6 +24368,54 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -23763,16 +24443,15 @@ } }, "node_modules/typescript": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", - "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", - "peer": true, + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=14.17" + "node": ">=4.2.0" } }, "node_modules/unbox-primitive": { @@ -23789,6 +24468,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -23885,9 +24574,9 @@ } }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "engines": { "node": ">= 10.0.0" } @@ -23964,9 +24653,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "funding": [ { "type": "opencollective", @@ -24012,12 +24701,12 @@ "deprecated": "Please see https://github.com/lydell/urix#deprecated" }, "node_modules/url": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.1.tgz", - "integrity": "sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", "dependencies": { "punycode": "^1.4.1", - "qs": "^6.11.0" + "qs": "^6.11.2" } }, "node_modules/url-loader": { @@ -24134,9 +24823,9 @@ } }, "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==" }, "node_modules/v8-to-istanbul": { "version": "7.1.2", @@ -25566,9 +26255,9 @@ } }, "node_modules/whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + "version": "3.6.19", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", + "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==" }, "node_modules/whatwg-mimetype": { "version": "2.3.0", @@ -25618,6 +26307,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-collection": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", @@ -25638,16 +26352,15 @@ "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dependencies": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -25657,9 +26370,9 @@ } }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "engines": { "node": ">=0.10.0" } @@ -26057,22 +26770,18 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zlib": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zlib/-/zlib-1.0.5.tgz", - "integrity": "sha512-40fpE2II+Cd3k8HWTWONfeKE2jL+P42iWJ1zzps5W51qcTsOUKM5Q5m2PFb0CLxlmFAaUuUdJGc3OfZy947v0w==", - "hasInstallScript": true, - "engines": { - "node": ">=0.2.0" - } } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==" + }, "@adobe/css-tools": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz", - "integrity": "sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.1.tgz", + "integrity": "sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==", "dev": true }, "@ampproject/remapping": { @@ -26085,17 +26794,18 @@ } }, "@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "requires": { - "@babel/highlight": "^7.22.5" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" } }, "@babel/compat-data": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", - "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==" + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==" }, "@babel/core": { "version": "7.14.3", @@ -26120,11 +26830,11 @@ } }, "@babel/generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", - "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "requires": { - "@babel/types": "^7.22.5", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -26139,76 +26849,75 @@ } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", - "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "requires": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" } }, "@babel/helper-compilation-targets": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", - "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "requires": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.5.tgz", - "integrity": "sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "semver": "^6.3.0" + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.5.tgz", - "integrity": "sha512-1VpEFOIbMRaXyDeUwUfmTIxExLwQ+zkW+Bh5zXpApA3oQedBx9v/updixWxnx/bZpKw7u8VxWjb/qWpIcmPq8A==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", "regexpu-core": "^5.3.1", - "semver": "^6.3.0" + "semver": "^6.3.1" } }, "@babel/helper-define-polyfill-provider": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz", - "integrity": "sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", + "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", "requires": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "resolve": "^1.14.2" } }, "@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==" + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" }, "@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "requires": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@babel/helper-hoist-variables": { @@ -26220,34 +26929,31 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", - "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "requires": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.23.0" } }, "@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "requires": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" } }, "@babel/helper-module-transforms": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", "requires": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" } }, "@babel/helper-optimise-call-expression": { @@ -26264,27 +26970,23 @@ "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==" }, "@babel/helper-remap-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz", - "integrity": "sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" } }, "@babel/helper-replace-supers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz", - "integrity": "sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "requires": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" } }, "@babel/helper-simple-access": { @@ -26304,9 +27006,9 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", - "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "requires": { "@babel/types": "^7.22.5" } @@ -26317,67 +27019,66 @@ "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" }, "@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==" + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" }, "@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==" + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==" }, "@babel/helper-wrap-function": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz", - "integrity": "sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "requires": { "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" } }, "@babel/helpers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", - "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", "requires": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" } }, "@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "requires": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", - "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==" + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", - "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", + "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", - "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", + "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", "requires": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.5" + "@babel/plugin-transform-optional-chaining": "^7.22.15" } }, "@babel/plugin-proposal-class-properties": { @@ -26390,15 +27091,15 @@ } }, "@babel/plugin-proposal-decorators": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.5.tgz", - "integrity": "sha512-h8hlezQ4dl6ixodgXkH8lUfcD7x+WAuIqPUjwGoItynrXOAv4a4Tci1zA/qjzQjjcl0v3QpLdc2LM6ZACQuY7A==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.2.tgz", + "integrity": "sha512-eR0gJQc830fJVGz37oKLvt9W9uUIQSAovUl0e9sJ3YeO09dlcoBVYD3CLrjCj4qHdXmfiyTyFt8yeQYSN5fxLg==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/plugin-syntax-decorators": "^7.22.5" + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/plugin-syntax-decorators": "^7.22.10" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { @@ -26439,18 +27140,15 @@ } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "requires": {} - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-syntax-async-generators": { @@ -26486,9 +27184,9 @@ } }, "@babel/plugin-syntax-decorators": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.5.tgz", - "integrity": "sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz", + "integrity": "sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==", "requires": { "@babel/helper-plugin-utils": "^7.22.5" } @@ -26647,13 +27345,13 @@ } }, "@babel/plugin-transform-async-generator-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.5.tgz", - "integrity": "sha512-gGOEvFzm3fWoyD5uZq7vVTD57pPJ3PczPUD/xCFGjzBpUosnklmXyKnGQbbbGs1NPNPskFex0j93yKbHt0cHyg==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", + "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", "requires": { - "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, @@ -26676,9 +27374,9 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", - "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", + "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", "requires": { "@babel/helper-plugin-utils": "^7.22.5" } @@ -26693,28 +27391,28 @@ } }, "@babel/plugin-transform-class-static-block": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", - "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", + "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-transform-classes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.5.tgz", - "integrity": "sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", + "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" } }, @@ -26728,9 +27426,9 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", - "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", + "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", "requires": { "@babel/helper-plugin-utils": "^7.22.5" } @@ -26753,9 +27451,9 @@ } }, "@babel/plugin-transform-dynamic-import": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", - "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", + "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", "requires": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -26771,9 +27469,9 @@ } }, "@babel/plugin-transform-export-namespace-from": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", - "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", + "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", "requires": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -26789,9 +27487,9 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", - "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", + "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", "requires": { "@babel/helper-plugin-utils": "^7.22.5" } @@ -26807,9 +27505,9 @@ } }, "@babel/plugin-transform-json-strings": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", - "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", + "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", "requires": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -26824,9 +27522,9 @@ } }, "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", - "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", + "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", "requires": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -26841,33 +27539,33 @@ } }, "@babel/plugin-transform-modules-amd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", - "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", + "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", "requires": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", - "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", + "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", "requires": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-simple-access": "^7.22.5" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", - "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", + "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", "requires": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-validator-identifier": "^7.22.20" } }, "@babel/plugin-transform-modules-umd": { @@ -26897,33 +27595,33 @@ } }, "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", - "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", + "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", "requires": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-transform-numeric-separator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", - "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", + "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", "requires": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-transform-object-rest-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", - "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", + "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", "requires": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.5" + "@babel/plugin-transform-parameters": "^7.22.15" } }, "@babel/plugin-transform-object-super": { @@ -26936,18 +27634,18 @@ } }, "@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", - "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", + "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", "requires": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-transform-optional-chaining": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.5.tgz", - "integrity": "sha512-AconbMKOMkyG+xCng2JogMCDcqW8wedQAqpVIL4cOSescZ7+iW8utC6YDZLMCSUIReEA733gzRSaOSXMAt/4WQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", + "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", "requires": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", @@ -26955,9 +27653,9 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", - "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", + "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", "requires": { "@babel/helper-plugin-utils": "^7.22.5" } @@ -26972,12 +27670,12 @@ } }, "@babel/plugin-transform-private-property-in-object": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", - "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", + "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } @@ -27007,15 +27705,15 @@ } }, "@babel/plugin-transform-react-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz", - "integrity": "sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", + "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==", "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" } }, "@babel/plugin-transform-react-jsx-development": { @@ -27036,12 +27734,12 @@ } }, "@babel/plugin-transform-regenerator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", - "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", "requires": { "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.1" + "regenerator-transform": "^0.15.2" } }, "@babel/plugin-transform-reserved-words": { @@ -27053,16 +27751,16 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.5.tgz", - "integrity": "sha512-bg4Wxd1FWeFx3daHFTWk1pkSWK/AyQuiyAoeZAOkAOUBjnZPH6KT7eMxouV47tQ6hl6ax2zyAWBdWZXbrvXlaw==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz", + "integrity": "sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==", "requires": { - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.3", - "babel-plugin-polyfill-corejs3": "^0.8.1", - "babel-plugin-polyfill-regenerator": "^0.5.0", - "semver": "^6.3.0" + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "semver": "^6.3.1" } }, "@babel/plugin-transform-shorthand-properties": { @@ -27107,20 +27805,20 @@ } }, "@babel/plugin-transform-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.5.tgz", - "integrity": "sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz", + "integrity": "sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==", "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-typescript": "^7.22.5" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", - "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", "requires": { "@babel/helper-plugin-utils": "^7.22.5" } @@ -27153,16 +27851,16 @@ } }, "@babel/preset-env": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.5.tgz", - "integrity": "sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", + "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", "requires": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", + "@babel/compat-data": "^7.23.2", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -27183,97 +27881,103 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.23.2", "@babel/plugin-transform-async-to-generator": "^7.22.5", "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.23.0", "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.5", - "@babel/plugin-transform-classes": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.11", + "@babel/plugin-transform-classes": "^7.22.15", "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.23.0", "@babel/plugin-transform-dotall-regex": "^7.22.5", "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.11", "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.5", - "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-for-of": "^7.22.15", "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.11", "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.5", - "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.23.0", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-modules-systemjs": "^7.23.0", "@babel/plugin-transform-modules-umd": "^7.22.5", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", - "@babel/plugin-transform-numeric-separator": "^7.22.5", - "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.5", - "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.23.0", + "@babel/plugin-transform-parameters": "^7.22.15", "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", "@babel/plugin-transform-reserved-words": "^7.22.5", "@babel/plugin-transform-shorthand-properties": "^7.22.5", "@babel/plugin-transform-spread": "^7.22.5", "@babel/plugin-transform-sticky-regex": "^7.22.5", "@babel/plugin-transform-template-literals": "^7.22.5", "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", "@babel/plugin-transform-unicode-property-regex": "^7.22.5", "@babel/plugin-transform-unicode-regex": "^7.22.5", "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.3", - "babel-plugin-polyfill-corejs3": "^0.8.1", - "babel-plugin-polyfill-regenerator": "^0.5.0", - "core-js-compat": "^3.30.2", - "semver": "^6.3.0" + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.23.0", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "dependencies": { + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "requires": {} + } } }, "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" } }, "@babel/preset-react": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.5.tgz", - "integrity": "sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.15.tgz", + "integrity": "sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==", "requires": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "@babel/plugin-transform-react-display-name": "^7.22.5", - "@babel/plugin-transform-react-jsx": "^7.22.5", + "@babel/plugin-transform-react-jsx": "^7.22.15", "@babel/plugin-transform-react-jsx-development": "^7.22.5", "@babel/plugin-transform-react-pure-annotations": "^7.22.5" } }, "@babel/preset-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz", - "integrity": "sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz", + "integrity": "sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==", "requires": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.5", - "@babel/plugin-transform-typescript": "^7.22.5" + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-typescript": "^7.22.15" } }, "@babel/regjsgen": { @@ -27282,47 +27986,47 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "@babel/runtime": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", - "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", "requires": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" } }, "@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "requires": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" } }, "@babel/traverse": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", - "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", - "requires": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "requires": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, @@ -27464,6 +28168,21 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "devOptional": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "devOptional": true + }, "@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -27481,13 +28200,18 @@ }, "dependencies": { "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "requires": { "type-fest": "^0.20.2" } }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -27495,6 +28219,36 @@ } } }, + "@floating-ui/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "requires": { + "@floating-ui/utils": "^0.1.3" + } + }, + "@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "requires": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "@floating-ui/react-dom": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", + "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", + "requires": { + "@floating-ui/dom": "^1.5.1" + } + }, + "@floating-ui/utils": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + }, "@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", @@ -27604,9 +28358,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -27749,9 +28503,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -27885,9 +28639,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -27938,12 +28692,12 @@ } }, "@jest/expect-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", - "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "requires": { - "jest-get-type": "^29.4.3" + "jest-get-type": "^29.6.3" } }, "@jest/fake-timers": { @@ -27972,9 +28726,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -28092,9 +28846,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -28266,9 +29020,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -28373,12 +29127,12 @@ } }, "@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "requires": { - "@sinclair/typebox": "^0.25.16" + "@sinclair/typebox": "^0.27.8" } }, "@jest/source-map": { @@ -28422,9 +29176,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -28521,9 +29275,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -28592,12 +29346,12 @@ } }, "@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -28667,9 +29421,9 @@ } }, "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==" }, "@jridgewell/set-array": { "version": "1.1.2", @@ -28677,9 +29431,9 @@ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" }, "@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -28691,54 +29445,46 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - }, - "dependencies": { - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - } + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@mui/base": { - "version": "5.0.0-beta.5", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.5.tgz", - "integrity": "sha512-vy3TWLQYdGNecTaufR4wDNQFV2WEg6wRPi6BVbx6q1vP3K1mbxIn1+XOqOzfYBXjFHvMx0gZAo2TgWbaqfgvAA==", - "requires": { - "@babel/runtime": "^7.22.5", - "@emotion/is-prop-valid": "^1.2.1", - "@mui/types": "^7.2.4", - "@mui/utils": "^5.13.6", + "version": "5.0.0-beta.22", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.22.tgz", + "integrity": "sha512-l4asGID5tmyerx9emJfXOKLyXzaBtdXNIFE3M+IrSZaFtGFvaQKHhc3+nxxSxPf1+G44psjczM0ekRQCdXx9HA==", + "requires": { + "@babel/runtime": "^7.23.2", + "@floating-ui/react-dom": "^2.0.2", + "@mui/types": "^7.2.8", + "@mui/utils": "^5.14.16", "@popperjs/core": "^2.11.8", - "clsx": "^1.2.1", - "prop-types": "^15.8.1", - "react-is": "^18.2.0" + "clsx": "^2.0.0", + "prop-types": "^15.8.1" } }, "@mui/core-downloads-tracker": { - "version": "5.13.4", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.13.4.tgz", - "integrity": "sha512-yFrMWcrlI0TqRN5jpb6Ma9iI7sGTHpytdzzL33oskFHNQ8UgrtPas33Y1K7sWAMwCrr1qbWDrOHLAQG4tAzuSw==" + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.16.tgz", + "integrity": "sha512-97isBjzH2v1K7oB4UH2f4NOkBShOynY6dhnoR2XlUk/g6bb7ZBv2I3D1hvvqPtpEigKu93e7f/jAYr5d9LOc5w==" }, "@mui/material": { - "version": "5.13.6", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.13.6.tgz", - "integrity": "sha512-/c2ZApeQm2sTYdQXjqEnldaBMBcUEiyu2VRS6bS39ZeNaAcCLBQbYocLR46R+f0S5dgpBzB0T4AsOABPOFYZ5Q==", - "requires": { - "@babel/runtime": "^7.22.5", - "@mui/base": "5.0.0-beta.5", - "@mui/core-downloads-tracker": "^5.13.4", - "@mui/system": "^5.13.6", - "@mui/types": "^7.2.4", - "@mui/utils": "^5.13.6", - "@types/react-transition-group": "^4.4.6", - "clsx": "^1.2.1", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.16.tgz", + "integrity": "sha512-W4zZ4vnxgGk6/HqBwgsDHKU7x2l2NhX+r8gAwfg58Rhu3ikfY7NkIS6y8Gl3NkATc4GG1FNaGjjpQKfJx3U6Jw==", + "requires": { + "@babel/runtime": "^7.23.2", + "@mui/base": "5.0.0-beta.22", + "@mui/core-downloads-tracker": "^5.14.16", + "@mui/system": "^5.14.16", + "@mui/types": "^7.2.8", + "@mui/utils": "^5.14.16", + "@types/react-transition-group": "^4.4.8", + "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1", "react-is": "^18.2.0", @@ -28746,55 +29492,54 @@ } }, "@mui/private-theming": { - "version": "5.13.1", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.13.1.tgz", - "integrity": "sha512-HW4npLUD9BAkVppOUZHeO1FOKUJWAwbpy0VQoGe3McUYTlck1HezGHQCfBQ5S/Nszi7EViqiimECVl9xi+/WjQ==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.16.tgz", + "integrity": "sha512-FNlL0pTSEBh8nXsVWreCHDSHk+jG8cBx1sxRbT8JVtL+PYbYPi802zfV4B00Kkf0LNRVRvAVQwojMWSR/MYGng==", "requires": { - "@babel/runtime": "^7.21.0", - "@mui/utils": "^5.13.1", + "@babel/runtime": "^7.23.2", + "@mui/utils": "^5.14.16", "prop-types": "^15.8.1" } }, "@mui/styled-engine": { - "version": "5.13.2", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz", - "integrity": "sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.16.tgz", + "integrity": "sha512-FfvYvTG/Zd+KXMMImbcMYEeQAbONGuX5Vx3gBmmtB6KyA7Mvm9Pma1ly3R0gc44yeoFd+2wBjn1feS8h42HW5w==", "requires": { - "@babel/runtime": "^7.21.0", + "@babel/runtime": "^7.23.2", "@emotion/cache": "^11.11.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" } }, "@mui/system": { - "version": "5.13.6", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.13.6.tgz", - "integrity": "sha512-G3Xr28uLqU3DyF6r2LQkHGw/ku4P0AHzlKVe7FGXOPl7X1u+hoe2xxj8Vdiq/69II/mh9OP21i38yBWgWb7WgQ==", - "requires": { - "@babel/runtime": "^7.22.5", - "@mui/private-theming": "^5.13.1", - "@mui/styled-engine": "^5.13.2", - "@mui/types": "^7.2.4", - "@mui/utils": "^5.13.6", - "clsx": "^1.2.1", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.16.tgz", + "integrity": "sha512-uKnPfsDqDs8bbN54TviAuoGWOmFiQLwNZ3Wvj+OBkJCzwA6QnLb/sSeCB7Pk3ilH4h4jQ0BHtbR+Xpjy9wlOuA==", + "requires": { + "@babel/runtime": "^7.23.2", + "@mui/private-theming": "^5.14.16", + "@mui/styled-engine": "^5.14.16", + "@mui/types": "^7.2.8", + "@mui/utils": "^5.14.16", + "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" } }, "@mui/types": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", - "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", + "version": "7.2.8", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.8.tgz", + "integrity": "sha512-9u0ji+xspl96WPqvrYJF/iO+1tQ1L5GTaDOeG3vCR893yy7VcWwRNiVMmPdPNpMDqx0WV1wtEW9OMwK9acWJzQ==", "requires": {} }, "@mui/utils": { - "version": "5.13.6", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.13.6.tgz", - "integrity": "sha512-ggNlxl5NPSbp+kNcQLmSig6WVB0Id+4gOxhx644987v4fsji+CSXc+MFYLocFB/x4oHtzCUlSzbVHlJfP/fXoQ==", + "version": "5.14.16", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.16.tgz", + "integrity": "sha512-3xV31GposHkwRbQzwJJuooWpK2ybWdEdeUPtRjv/6vjomyi97F3+68l+QVj9tPTvmfSbr2sx5c/NuvDulrdRmA==", "requires": { - "@babel/runtime": "^7.22.5", - "@types/prop-types": "^15.7.5", - "@types/react-is": "^18.2.0", + "@babel/runtime": "^7.23.2", + "@types/prop-types": "^15.7.9", "prop-types": "^15.8.1", "react-is": "^18.2.0" } @@ -28840,9 +29585,9 @@ } }, "semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } @@ -28929,9 +29674,9 @@ } }, "@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "@sinonjs/commons": { @@ -29131,6 +29876,11 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -29231,9 +29981,9 @@ "requires": {} }, "@testing-library/dom": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.1.tgz", - "integrity": "sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w==", + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz", + "integrity": "sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==", "dev": true, "peer": true, "requires": { @@ -29305,9 +30055,9 @@ } }, "@testing-library/jest-dom": { - "version": "5.16.5", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz", - "integrity": "sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", + "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", "dev": true, "requires": { "@adobe/css-tools": "^4.0.1", @@ -29399,6 +30149,26 @@ "pretty-format": "^27.0.2" } }, + "@types/react": { + "version": "17.0.69", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.69.tgz", + "integrity": "sha512-klEeru//GhiQvXUBayz0Q4l3rKHWsBR/EUOhOeow6hK2jV7MlO44+8yEk6+OtPeOlRfnpUnrLXzGK+iGph5aeg==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "17.0.22", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.22.tgz", + "integrity": "sha512-wHt4gkdSMb4jPp1vc30MLJxoWGsZs88URfmt3FRXoOEYrrqK3I8IuZLE/uFBb4UT6MRfI0wXFu4DS7LS0kUC7Q==", + "dev": true, + "requires": { + "@types/react": "^17" + } + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -29478,15 +30248,15 @@ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" }, "@types/aria-query": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", - "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.3.tgz", + "integrity": "sha512-0Z6Tr7wjKJIk4OUEjVUQMtyunLDy339vcMaj38Kpj6jM2OE1p3S4kXExKZ7a3uXQAPCoy3sbrP1wibDKaf39oA==", "dev": true }, "@types/babel__core": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", - "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.3.tgz", + "integrity": "sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==", "requires": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -29496,26 +30266,26 @@ } }, "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "version": "7.6.6", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.6.tgz", + "integrity": "sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==", "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.3.tgz", + "integrity": "sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "@types/babel__traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", - "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.3.tgz", + "integrity": "sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==", "requires": { "@babel/types": "^7.20.7" } @@ -29530,9 +30300,9 @@ } }, "@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.4.tgz", + "integrity": "sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==" }, "@types/glob": { "version": "7.2.0", @@ -29544,17 +30314,17 @@ } }, "@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.8.tgz", + "integrity": "sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==", "requires": { "@types/node": "*" } }, "@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.4.tgz", + "integrity": "sha512-ZchYkbieA+7tnxwX/SCBySx9WwvWR8TaP5tb2jRAzwvLb/rWchGw3v0w3pqUbUvj0GCwW2Xz/AVPSk6kUGctXQ==", "requires": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" @@ -29566,30 +30336,30 @@ "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==" }, "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==" }, "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz", + "integrity": "sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==", "requires": { "@types/istanbul-lib-coverage": "*" } }, "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz", + "integrity": "sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==", "requires": { "@types/istanbul-lib-report": "*" } }, "@types/jest": { - "version": "29.5.2", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.2.tgz", - "integrity": "sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg==", + "version": "29.5.7", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.7.tgz", + "integrity": "sha512-HLyetab6KVPSiF+7pFcUyMeLsx25LDNDemw9mGsJBkai/oouwrjTycocSDYopMEwFhN2Y4s9oPyOCZNofgSt2g==", "dev": true, "requires": { "expect": "^29.0.0", @@ -29603,12 +30373,12 @@ "dev": true }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } @@ -29616,9 +30386,9 @@ } }, "@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==" }, "@types/json5": { "version": "0.0.29", @@ -29636,23 +30406,38 @@ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" }, "@types/node": { - "version": "20.3.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", - "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==" + "version": "20.8.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", + "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "requires": { + "undici-types": "~5.26.4" + } }, "@types/node-fetch": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", - "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.8.tgz", + "integrity": "sha512-nnH5lV9QCMPsbEVdTb5Y+F3GQxLSw1xQgIydrb2gSfEavRPs50FnMr+KUaa+LoPSqibm2N+ZZxH7lavZlAT4GA==", "requires": { "@types/node": "*", - "form-data": "^3.0.0" + "form-data": "^4.0.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } } }, "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz", + "integrity": "sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==" }, "@types/offscreencanvas": { "version": "2019.3.0", @@ -29660,9 +30445,9 @@ "integrity": "sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==" }, "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.1.tgz", + "integrity": "sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==" }, "@types/prettier": { "version": "2.7.3", @@ -29670,19 +30455,19 @@ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" }, "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "version": "15.7.9", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz", + "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==" }, "@types/q": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", - "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.7.tgz", + "integrity": "sha512-HBPgtzp44867rkL+IzQ3560/E/BlobwCjeXsuKqogrcE99SKgZR4tvBBCuNJZMhUFMz26M7cjKWZg785lllwpA==" }, "@types/react": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.14.tgz", - "integrity": "sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==", + "version": "18.2.35", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.35.tgz", + "integrity": "sha512-LG3xpFZ++rTndV+/XFyX5vUP7NI9yxyk+MQvBDq+CVs8I9DLSc3Ymwb1Vmw5YDoeNeHN4PDZa3HylMKJYT9PNQ==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -29690,39 +30475,18 @@ } }, "@types/react-dom": { - "version": "17.0.20", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz", - "integrity": "sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==", + "version": "18.2.14", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.14.tgz", + "integrity": "sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==", "dev": true, - "requires": { - "@types/react": "^17" - }, - "dependencies": { - "@types/react": { - "version": "17.0.62", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.62.tgz", - "integrity": "sha512-eANCyz9DG8p/Vdhr0ZKST8JV12PhH2ACCDYlFw6DIO+D+ca+uP4jtEDEpVqXZrh/uZdXQGwk7whJa3ah5DtyLw==", - "dev": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - } - } - }, - "@types/react-is": { - "version": "18.2.1", - "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.1.tgz", - "integrity": "sha512-wyUkmaaSZEzFZivD8F2ftSyAfk6L+DfFliVj/mYdOXbVjRcS87fQJLTnhk6dRZPuJjI+9g6RZJO4PNCngUrmyw==", "requires": { "@types/react": "*" } }, "@types/react-redux": { - "version": "7.1.25", - "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.25.tgz", - "integrity": "sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg==", + "version": "7.1.28", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.28.tgz", + "integrity": "sha512-EQr7cChVzVUuqbA+J8ArWK1H0hLAHKOs21SIMrskKZ3nHNeE+LFYA+IsoZGhVOT8Ktjn3M20v4rnZKN3fLbypw==", "requires": { "@types/hoist-non-react-statics": "^3.3.0", "@types/react": "*", @@ -29731,18 +30495,18 @@ } }, "@types/react-test-renderer": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.0.0.tgz", - "integrity": "sha512-C7/5FBJ3g3sqUahguGi03O79b8afNeSD6T8/GU50oQrJCU0bVCCGQHaGKUbg2Ce8VQEEqTw8/HiS6lXHHdgkdQ==", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.0.5.tgz", + "integrity": "sha512-PsnmF4Hpi61PTRX+dTxkjgDdtZ09kFFgPXczoF+yBfOVxn7xBLPvKP1BUrSasYHmerj33rhoJuvpIMsJuyRqHw==", "dev": true, "requires": { "@types/react": "*" } }, "@types/react-transition-group": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz", - "integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.8.tgz", + "integrity": "sha512-QmQ22q+Pb+HQSn04NL3HtrqHwYMf4h3QKArOy5F8U5nEVMaihBs3SR10WiOM1iwPz5jIo8x/u11al+iEGZZrvg==", "requires": { "@types/react": "*" } @@ -29756,43 +30520,49 @@ } }, "@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.5.tgz", + "integrity": "sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==" }, "@types/seedrandom": { - "version": "2.4.30", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.30.tgz", - "integrity": "sha512-AnxLHewubLVzoF/A4qdxBGHCKifw8cY32iro3DQX9TPcetE95zBeVt3jnsvtvAUf1vwzMfwzp4t/L2yqPlnjkQ==" + "version": "2.4.32", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.32.tgz", + "integrity": "sha512-pGzjoMhPpuIxBOMMQMiZ5xMMFQMnXgJAi0SkljX/q6KOFkaSW7yNIXZT8jTpMtEsz72WXE+whu/4fGCn16cjaQ==" + }, + "@types/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", + "devOptional": true }, "@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.4.tgz", + "integrity": "sha512-Kdfm7Sk5VX8dFW7Vbp18+fmAatBewzBILa1raHYxrGEFXT0jNl9x3LWfuW7bTbjEKFNey9Dfkj/UzT6z/NvRlg==" }, "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw==" }, "@types/tapable": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", - "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==" + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.10.tgz", + "integrity": "sha512-q8F20SdXG5fdVJQ5yxsVlH+f+oekP42QeHv4s5KlrxTMT0eopXn7ol1rhxMcksf8ph7XNv811iVDE2hOpUvEPg==" }, "@types/testing-library__jest-dom": { - "version": "5.14.6", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.6.tgz", - "integrity": "sha512-FkHXCb+ikSoUP4Y4rOslzTdX5sqYwMxfefKh1GmZ8ce1GOkEHntSp6b5cGadmNfp5e4BMEWOMx+WSKd5/MqlDA==", + "version": "5.14.9", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", + "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", "dev": true, "requires": { "@types/jest": "*" } }, "@types/uglify-js": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.1.tgz", - "integrity": "sha512-GkewRA4i5oXacU/n4MA9+bLgt5/L3F1mKrYvFGm7r2ouLXhRKjuWwo9XHNnbx6WF3vlGW21S3fCvgqxvxXXc5g==", + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.3.tgz", + "integrity": "sha512-ToldSfJ6wxO21cakcz63oFD1GjqQbKzhZCD57eH7zWuYT5UEZvfUoqvrjX5d+jB9g4a/sFO0n6QSVzzn5sMsjg==", "requires": { "source-map": "^0.6.1" }, @@ -29815,9 +30585,9 @@ "integrity": "sha512-50GQhDVTq/herLMiqSQkdtRu+d5q/cWHn4VvKJtrj4DJAjo1MNkWYa2MA41BaBO1q1HgsUjuQvEOk0QHvlnAaQ==" }, "@types/webpack": { - "version": "4.41.33", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.33.tgz", - "integrity": "sha512-PPajH64Ft2vWevkerISMtnZ8rTs4YmRbs+23c402J0INmxDKCrhZNvwZYtzx96gY2wAtXdrK1BS2fiC8MlLr3g==", + "version": "4.41.35", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.35.tgz", + "integrity": "sha512-XRC6HLGHtNfN8/xWeu1YUQV1GSE+28q8lSqvcJ+0xt/zW9Wmn4j9pCSvaXPyRlCKrl5OuqECQNEJUy2vo8oWqg==", "requires": { "@types/node": "*", "@types/tapable": "^1", @@ -29835,9 +30605,9 @@ } }, "@types/webpack-sources": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", - "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.2.tgz", + "integrity": "sha512-acCzhuVe+UJy8abiSFQWXELhhNMZjQjQKpLNEi1pKGgKXZj0ul614ATcx4kkhunPost6Xw+aCq8y8cn1/WwAiA==", "requires": { "@types/node": "*", "@types/source-list-map": "*", @@ -29852,51 +30622,52 @@ } }, "@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "version": "17.0.29", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.29.tgz", + "integrity": "sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==", "dev": true, "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.2.tgz", + "integrity": "sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==" }, "@typescript-eslint/eslint-plugin": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", - "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", - "requires": { - "@typescript-eslint/experimental-utils": "4.33.0", - "@typescript-eslint/scope-manager": "4.33.0", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz", + "integrity": "sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==", + "devOptional": true, + "requires": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/type-utils": "6.10.0", + "@typescript-eslint/utils": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "dependencies": { - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" - }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "devOptional": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "devOptional": true, "requires": { "lru-cache": "^6.0.0" } @@ -29904,7 +30675,8 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true } } }, @@ -29921,6 +30693,43 @@ "eslint-utils": "^3.0.0" }, "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", + "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", + "requires": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0" + } + }, + "@typescript-eslint/types": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==" + }, + "@typescript-eslint/typescript-estree": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "requires": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "requires": { + "@typescript-eslint/types": "4.33.0", + "eslint-visitor-keys": "^2.0.0" + } + }, "eslint-utils": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", @@ -29928,60 +30737,146 @@ "requires": { "eslint-visitor-keys": "^2.0.0" } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "@typescript-eslint/parser": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", - "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz", + "integrity": "sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==", + "devOptional": true, "requires": { - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", + "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", + "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", + "devOptional": true, "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz", + "integrity": "sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==", + "devOptional": true, + "requires": { + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/utils": "6.10.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==" + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", + "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", + "devOptional": true }, "@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", + "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", + "devOptional": true, + "requires": { + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "devOptional": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "devOptional": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + } + } + }, + "@typescript-eslint/utils": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", + "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==", + "devOptional": true, "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", + "semver": "^7.5.4" }, "dependencies": { "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "devOptional": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "devOptional": true, "requires": { "lru-cache": "^6.0.0" } @@ -29989,17 +30884,19 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true } } }, "@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", + "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", + "devOptional": true, "requires": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/types": "6.10.0", + "eslint-visitor-keys": "^3.4.1" } }, "@wearemothership/dicom-character-set": { @@ -30334,6 +31231,7 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, "requires": { "deep-equal": "^2.0.5" } @@ -30373,14 +31271,14 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" } }, @@ -30399,50 +31297,76 @@ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==" }, + "array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + } + }, "array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" } }, "array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" } }, "array.prototype.reduce": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", - "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", + "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-array-method-boxes-properly": "^1.0.0", "is-string": "^1.0.7" } }, "array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", + "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "get-intrinsic": "^1.2.1" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" } }, "arrify": { @@ -30474,25 +31398,25 @@ } }, "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", + "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" + "object.assign": "^4.1.4", + "util": "^0.10.4" }, "dependencies": { "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" }, "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", "requires": { - "inherits": "2.0.1" + "inherits": "2.0.3" } } } @@ -30503,9 +31427,9 @@ "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==" }, "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" }, "astral-regex": { "version": "2.0.0", @@ -30530,6 +31454,14 @@ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, + "asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "requires": { + "has-symbols": "^1.0.3" + } + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -30565,9 +31497,9 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, "axe-core": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", - "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==" + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==" }, "axobject-query": { "version": "3.2.1", @@ -30633,9 +31565,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -30757,30 +31689,30 @@ "requires": {} }, "babel-plugin-polyfill-corejs2": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz", - "integrity": "sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw==", + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", + "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.4.0", - "semver": "^6.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.3", + "semver": "^6.3.1" } }, "babel-plugin-polyfill-corejs3": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz", - "integrity": "sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q==", + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", + "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.0", - "core-js-compat": "^3.30.1" + "@babel/helper-define-polyfill-provider": "^0.4.3", + "core-js-compat": "^3.33.1" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz", - "integrity": "sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", + "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.0" + "@babel/helper-define-polyfill-provider": "^0.4.3" } }, "babel-plugin-syntax-object-rest-spread": { @@ -30854,26 +31786,31 @@ }, "dependencies": { "@babel/core": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", - "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" } + }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" } } }, @@ -30943,13 +31880,14 @@ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" }, "bfj": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", - "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", "requires": { - "bluebird": "^3.5.5", - "check-types": "^11.1.1", + "bluebird": "^3.7.2", + "check-types": "^11.2.3", "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", "tryer": "^1.0.1" } }, @@ -31134,19 +32072,19 @@ } }, "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", + "elliptic": "^6.5.4", "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" }, "dependencies": { "readable-stream": { @@ -31175,14 +32113,14 @@ } }, "browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "requires": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" } }, "bser": { @@ -31302,12 +32240,13 @@ } }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" } }, "caller-callsite": { @@ -31364,9 +32303,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001507", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001507.tgz", - "integrity": "sha512-SFpUDoSLCaE5XYL2jfqe9ova/pbQHEmbheDf5r4diNwbAgR3qxM9NQtfsiSscjqoya5K7kFcHPUQ+VsUkIJR4A==" + "version": "1.0.30001561", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", + "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==" }, "capture-exit": { "version": "2.0.0", @@ -31404,9 +32343,9 @@ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" }, "check-types": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.2.tgz", - "integrity": "sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA==" + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==" }, "chokidar": { "version": "3.5.3", @@ -31435,9 +32374,9 @@ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" }, "ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true }, "cipher-base": { @@ -31473,56 +32412,14 @@ "is-descriptor": "^0.1.0" } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" } } }, @@ -31581,9 +32478,9 @@ } }, "clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==" }, "co": { "version": "4.6.0", @@ -31601,9 +32498,9 @@ } }, "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" }, "collection-visit": { "version": "1.0.0", @@ -31825,16 +32722,16 @@ "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==" }, "core-js": { - "version": "3.31.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.31.0.tgz", - "integrity": "sha512-NIp2TQSGfR6ba5aalZD+ZQ1fSxGhDo/s1w0nx3RYzf2pnJxt7YynxFlFScP6eV7+GZsKO95NSjGxyJsU3DZgeQ==" + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.2.tgz", + "integrity": "sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==" }, "core-js-compat": { - "version": "3.31.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.0.tgz", - "integrity": "sha512-hM7YCu1cU6Opx7MXNu0NuumM0ezNeAeRKadixyiQELWY3vT3De9S4J5ZBMraWV2vZnrE1Cirl0GtFtDtMUXzPw==", + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz", + "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==", "requires": { - "browserslist": "^4.21.5" + "browserslist": "^4.22.1" } }, "core-util-is": { @@ -32022,9 +32919,9 @@ } }, "semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } @@ -32349,14 +33246,15 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" }, "deep-equal": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz", - "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", + "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", + "dev": true, "requires": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "is-arguments": "^1.1.1", "is-array-buffer": "^3.0.2", "is-date-object": "^1.0.5", @@ -32445,9 +33343,9 @@ "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" }, "shebang-command": { "version": "1.2.0", @@ -32472,11 +33370,22 @@ } } }, + "define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "requires": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "requires": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } @@ -32610,9 +33519,9 @@ } }, "diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true }, "diffie-hellman": { @@ -32827,9 +33736,9 @@ "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" }, "electron-to-chromium": { - "version": "1.4.440", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.440.tgz", - "integrity": "sha512-r6dCgNpRhPwiWlxbHzZQ/d9swfPaEJGi8ekqRBwQYaR3WmA5VkqQfBWSDDjuJU1ntO+W9tHx8OHV/96Q8e0dVw==" + "version": "1.4.576", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.576.tgz", + "integrity": "sha512-yXsZyXJfAqzWk1WKryr0Wl0MN2D47xodPvEEwlVePBnhU5E7raevLQR+E6b9JAD3GfL/7MbAL9ZtWQQPcLx7wA==" }, "elliptic": { "version": "6.5.4", @@ -32902,11 +33811,12 @@ } }, "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "requires": { - "ansi-colors": "^4.1.1" + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" } }, "entities": { @@ -32939,24 +33849,25 @@ } }, "es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "requires": { "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", + "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", @@ -32964,19 +33875,23 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.13" } }, "es-array-method-boxes-properly": { @@ -32988,6 +33903,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -33000,22 +33916,43 @@ "stop-iteration-iterator": "^1.0.0" } }, + "es-iterator-helpers": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "requires": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" + } + }, "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" } }, "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "requires": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "es-to-primitive": { @@ -33073,57 +34010,21 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "requires": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2", - "optionator": "^0.8.1", "source-map": "~0.6.1" }, "dependencies": { - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "optional": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "requires": { - "prelude-ls": "~1.1.2" - } } } }, @@ -33212,10 +34113,15 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + }, "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "requires": { "type-fest": "^0.20.2" } @@ -33225,6 +34131,11 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -33234,9 +34145,9 @@ } }, "semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } @@ -33262,28 +34173,20 @@ } }, "eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", "dev": true, "requires": {} }, - "eslint-config-react-app": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", - "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", - "requires": { - "confusing-browser-globals": "^1.0.10" - } - }, "eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "requires": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" }, "dependencies": { "debug": { @@ -33324,25 +34227,27 @@ } }, "eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", - "requires": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", + "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", + "requires": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" }, "dependencies": { "debug": { @@ -33372,26 +34277,36 @@ } }, "eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", - "requires": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "requires": { + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" + }, + "dependencies": { + "aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "requires": { + "dequal": "^2.0.3" + } + } } }, "eslint-plugin-prettier": { @@ -33404,14 +34319,15 @@ } }, "eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "requires": { "array-includes": "^3.1.6", "array.prototype.flatmap": "^1.3.1", "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", @@ -33421,7 +34337,7 @@ "object.values": "^1.1.6", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", + "semver": "^6.3.1", "string.prototype.matchall": "^4.0.8" }, "dependencies": { @@ -33434,11 +34350,11 @@ } }, "resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -33513,9 +34429,9 @@ } }, "semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } @@ -33559,9 +34475,10 @@ } }, "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "devOptional": true }, "eslint-webpack-plugin": { "version": "2.7.0", @@ -33740,50 +34657,13 @@ "is-extendable": "^0.1.0" } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" } }, "is-extendable": { @@ -33791,11 +34671,6 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -33804,16 +34679,16 @@ } }, "expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "requires": { - "@jest/expect-utils": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" } }, "express": { @@ -33961,9 +34836,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -34007,9 +34882,9 @@ } }, "fflate": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.0.tgz", - "integrity": "sha512-FAdS4qMuFjsJj6XHbBaZeXOgaypXp8iw/Tpyuq/w3XA41jjLHT8NPA+n7czH/DDhdncq0nAyDZmPeWXh2qmdIg==" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.1.tgz", + "integrity": "sha512-/exOvEuc+/iaUm105QIiOt4LpBdMTWsXxqR0HDF35vx3fmaKzw7354gTilCh5rkzEt8WYyG//ku3h3nRmd7CHQ==" }, "figgy-pudding": { "version": "3.5.2", @@ -34051,15 +34926,6 @@ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "optional": true }, - "filereader-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filereader-stream/-/filereader-stream-2.0.0.tgz", - "integrity": "sha512-U1OzPNA5quv2/ejRikN/G8llfdtHpblOuKNgxooVjbr/i9uEJ/QIQ7eslx/RqHRJVuTqwr6v5/XG87935t/daA==", - "requires": { - "from2": "^2.1.0", - "typedarray-to-buffer": "^3.0.4" - } - }, "filesize": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", @@ -34127,18 +34993,19 @@ } }, "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", "requires": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" }, "flatten": { "version": "1.0.3", @@ -34155,9 +35022,9 @@ } }, "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==" }, "for-each": { "version": "0.3.3", @@ -34278,9 +35145,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" }, "to-regex-range": { "version": "2.1.1", @@ -34366,25 +35233,25 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" } }, "functional-red-black-tree": { @@ -34408,14 +35275,14 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, "get-own-enumerable-property-symbols": { @@ -34521,13 +35388,6 @@ "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" - } } }, "gopd": { @@ -34543,6 +35403,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "devOptional": true + }, "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", @@ -34569,12 +35435,9 @@ "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" }, "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==" }, "has-bigints": { "version": "1.0.2", @@ -34587,11 +35450,11 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "requires": { - "get-intrinsic": "^1.1.1" + "get-intrinsic": "^1.2.2" } }, "has-proto": { @@ -34695,6 +35558,14 @@ "minimalistic-assert": "^1.0.1" } }, + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "requires": { + "function-bind": "^1.1.2" + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -35063,9 +35934,14 @@ "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==" }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" }, "immer": { "version": "8.0.1", @@ -35172,12 +36048,12 @@ } }, "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "requires": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "side-channel": "^1.0.4" } }, @@ -35202,11 +36078,11 @@ "integrity": "sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==" }, "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", "requires": { - "kind-of": "^6.0.0" + "hasown": "^2.0.0" } }, "is-arguments": { @@ -35233,6 +36109,14 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, + "is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -35298,19 +36182,19 @@ } }, "is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "requires": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", "requires": { - "kind-of": "^6.0.0" + "hasown": "^2.0.0" } }, "is-date-object": { @@ -35322,13 +36206,12 @@ } }, "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" } }, "is-directory": { @@ -35354,6 +36237,14 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, + "is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "requires": { + "call-bind": "^1.0.2" + } + }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -35364,6 +36255,14 @@ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -35503,15 +36402,11 @@ } }, "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" } }, "is-typedarray": { @@ -35587,12 +36482,12 @@ } }, "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "requires": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "dependencies": { @@ -35601,12 +36496,28 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "requires": { - "semver": "^6.0.0" + "semver": "^7.5.3" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" } }, "supports-color": { @@ -35616,6 +36527,11 @@ "requires": { "has-flag": "^4.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -35637,14 +36553,26 @@ } }, "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "requires": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, + "iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "requires": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, "jest": { "version": "26.6.0", "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", @@ -35678,9 +36606,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -35800,9 +36728,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -35975,9 +36903,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -36135,9 +37063,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -36237,15 +37165,15 @@ } }, "jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "dependencies": { "ansi-styles": { @@ -36289,12 +37217,12 @@ "dev": true }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -36351,9 +37279,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -36464,9 +37392,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -36555,9 +37483,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -36621,9 +37549,9 @@ } }, "jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true }, "jest-haste-map": { @@ -36660,9 +37588,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -36773,9 +37701,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -36937,9 +37865,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -37011,15 +37939,15 @@ } }, "jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "dependencies": { "ansi-styles": { @@ -37063,12 +37991,12 @@ "dev": true }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -37093,18 +38021,18 @@ } }, "jest-message-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -37150,12 +38078,12 @@ "dev": true }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -37201,9 +38129,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -37292,9 +38220,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -37380,9 +38308,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -37472,9 +38400,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -37641,9 +38569,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -37855,9 +38783,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -38011,9 +38939,9 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } @@ -38034,12 +38962,12 @@ } }, "jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "requires": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -38124,9 +39052,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -38283,9 +39211,9 @@ } }, "@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", + "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", "requires": { "@types/yargs-parser": "*" } @@ -38427,9 +39355,9 @@ }, "dependencies": { "acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==" + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==" }, "tr46": { "version": "2.1.0", @@ -38456,6 +39384,11 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -38490,13 +39423,51 @@ "universalify": "^2.0.0" } }, + "jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "requires": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + }, + "dependencies": { + "esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==" + } + } + }, "jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + } + }, + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", "requires": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "requires": { + "json-buffer": "3.0.1" } }, "killable": { @@ -38525,11 +39496,11 @@ "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" }, "language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "requires": { - "language-subtag-registry": "~0.3.2" + "language-subtag-registry": "^0.3.20" } }, "last-call-webpack-plugin": { @@ -38555,6 +39526,14 @@ "type-check": "~0.4.0" } }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -38816,9 +39795,9 @@ }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" } } }, @@ -39147,9 +40126,9 @@ "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==" }, "nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", "optional": true }, "nanoid": { @@ -39218,9 +40197,9 @@ } }, "node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", "requires": { "whatwg-url": "^5.0.0" } @@ -39296,9 +40275,9 @@ } }, "semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "optional": true, "requires": { "lru-cache": "^6.0.0" @@ -39313,9 +40292,9 @@ } }, "node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==" + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" }, "normalize-package-data": { "version": "2.5.0", @@ -39329,9 +40308,9 @@ }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" } } }, @@ -39378,9 +40357,9 @@ "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==" }, "nwsapi": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.5.tgz", - "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==" + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" }, "object-assign": { "version": "4.1.1", @@ -39405,37 +40384,13 @@ "is-descriptor": "^0.1.0" } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "requires": { - "kind-of": "^3.0.2" - } - }, "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" } }, "kind-of": { @@ -39449,9 +40404,9 @@ } }, "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" }, "object-is": { "version": "1.1.5", @@ -39487,44 +40442,55 @@ } }, "object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "object.getownpropertydescriptors": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz", - "integrity": "sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", + "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", "requires": { - "array.prototype.reduce": "^1.0.5", + "array.prototype.reduce": "^1.0.6", "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "es-abstract": "^1.21.2", + "es-abstract": "^1.22.1", "safe-array-concat": "^1.0.0" } }, + "object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, "object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", "requires": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "object.pick": { @@ -39536,13 +40502,13 @@ } }, "object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "obuf": { @@ -39613,16 +40579,16 @@ } }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" } }, "os-browserify": { @@ -40877,9 +41843,9 @@ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "requires": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", @@ -41145,9 +42111,9 @@ } }, "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" }, "q": { "version": "1.5.1", @@ -41259,6 +42225,13 @@ "raf": "^3.4.1", "regenerator-runtime": "^0.13.7", "whatwg-fetch": "^3.4.1" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + } } }, "react-dev-utils": { @@ -41329,11 +42302,6 @@ "slash": "^3.0.0" } }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" - }, "loader-utils": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", @@ -41553,9 +42521,9 @@ }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" } } }, @@ -41579,6 +42547,110 @@ } } }, + "@typescript-eslint/eslint-plugin": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", + "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", + "requires": { + "@typescript-eslint/experimental-utils": "4.33.0", + "@typescript-eslint/scope-manager": "4.33.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", + "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", + "requires": { + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "debug": "^4.3.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", + "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", + "requires": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0" + } + }, + "@typescript-eslint/types": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==" + }, + "@typescript-eslint/typescript-estree": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "requires": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "requires": { + "@typescript-eslint/types": "4.33.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-config-react-app": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", + "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", + "requires": { + "confusing-browser-globals": "^1.0.10" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "resolve": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", @@ -41599,6 +42671,11 @@ "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", "optional": true, "peer": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -41714,28 +42791,41 @@ "@babel/runtime": "^7.9.2" } }, + "reflect.getprototypeof": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + } + }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "requires": { "regenerate": "^1.4.2" } }, "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "requires": { "@babel/runtime": "^7.8.4" } @@ -41755,13 +42845,13 @@ "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" }, "regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" } }, "regexpp": { @@ -41865,11 +42955,11 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "requires": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -42155,12 +43245,12 @@ } }, "safe-array-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "requires": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", "isarray": "^2.0.5" } @@ -42370,9 +43460,9 @@ "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" }, "shebang-command": { "version": "1.2.0", @@ -42442,9 +43532,9 @@ } }, "semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } @@ -42507,9 +43597,9 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" }, "semver-compare": { "version": "1.0.0", @@ -42643,6 +43733,27 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "requires": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, + "set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "requires": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + } + }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -42828,50 +43939,13 @@ "is-extendable": "^0.1.0" } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" } }, "is-extendable": { @@ -42879,11 +43953,6 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -43046,9 +44115,9 @@ } }, "spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==" }, "spdy": { "version": "4.0.2", @@ -43133,6 +44202,74 @@ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" }, + "static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "requires": { + "escodegen": "^1.8.1" + }, + "dependencies": { + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -43150,56 +44287,14 @@ "is-descriptor": "^0.1.0" } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" } } }, @@ -43212,6 +44307,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, "requires": { "internal-slot": "^1.0.4" } @@ -43302,48 +44398,49 @@ } }, "string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", "side-channel": "^1.0.4" } }, "string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "stringify-object": { @@ -43623,9 +44720,9 @@ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, "tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -43722,9 +44819,9 @@ }, "dependencies": { "acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==" + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==" }, "commander": { "version": "2.20.3", @@ -43804,9 +44901,9 @@ } }, "terser": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.18.1.tgz", - "integrity": "sha512-j1n0Ao919h/Ai5r43VAnfV/7azUYW43GPxK7qSATzrsERfW7+y2QW9Cp9ufnRF5CQUWbnLSo7UJokSWCqg4tsQ==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", + "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", "requires": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -43959,6 +45056,13 @@ "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, + "ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "devOptional": true, + "requires": {} + }, "ts-pnp": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", @@ -43991,9 +45095,9 @@ } }, "tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "tsutils": { "version": "3.21.0", @@ -44047,6 +45151,39 @@ "mime-types": "~2.1.24" } }, + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, "typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -44071,10 +45208,9 @@ } }, "typescript": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", - "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", - "peer": true + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" }, "unbox-primitive": { "version": "1.0.2", @@ -44087,6 +45223,16 @@ "which-boxed-primitive": "^1.0.2" } }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -44164,9 +45310,9 @@ } }, "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" }, "unpipe": { "version": "1.0.0", @@ -44225,9 +45371,9 @@ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" }, "update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "requires": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -44254,12 +45400,12 @@ "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==" }, "url": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.1.tgz", - "integrity": "sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", "requires": { "punycode": "^1.4.1", - "qs": "^6.11.0" + "qs": "^6.11.2" }, "dependencies": { "punycode": { @@ -44350,9 +45496,9 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==" }, "v8-to-istanbul": { "version": "7.1.2", @@ -45495,9 +46641,9 @@ } }, "whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + "version": "3.6.19", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", + "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==" }, "whatwg-mimetype": { "version": "2.3.0", @@ -45540,6 +46686,25 @@ "is-symbol": "^1.0.3" } }, + "which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "requires": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + } + }, "which-collection": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", @@ -45557,22 +46722,21 @@ "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" }, "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "requires": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" } }, "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==" }, "workbox-background-sync": { "version": "5.1.4", @@ -45900,11 +47064,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" - }, - "zlib": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zlib/-/zlib-1.0.5.tgz", - "integrity": "sha512-40fpE2II+Cd3k8HWTWONfeKE2jL+P42iWJ1zzps5W51qcTsOUKM5Q5m2PFb0CLxlmFAaUuUdJGc3OfZy947v0w==" } } } diff --git a/package.json b/package.json index 2790db08..446e0330 100644 --- a/package.json +++ b/package.json @@ -23,12 +23,13 @@ "build": "react-scripts build", "test": "react-scripts test --detectOpenHandles", "debugtest": "DEBUG=true react-scripts test", - "lint": "eslint src/**/*.js", + "lint": "eslint \"src/**/*.{js,jsx,ts,tsx}\"", "format": "prettier --write \"src/**/*.{js,jsx,html,css}\"", "docker": "npm run build && docker run --name mri-viewer -v ./build:/usr/share/nginx/html:ro -d -p 8080:80 nginx", "prepare": "husky install" }, "dependencies": { + "@babel/runtime": "^7.23.1", "@emotion/react": "^11.8.1", "@emotion/styled": "^11.8.1", "@mui/material": "^5.4.3", @@ -36,8 +37,7 @@ "@tensorflow/tfjs": "^3.6.0", "classnames": "^2.3.1", "daikon": "^1.2.42", - "eslint": "^7.27.0", - "filereader-stream": "^2.0.0", + "jszip": "^3.10.1", "react": "^17.0.2", "react-dnd": "^14.0.2", "react-dnd-html5-backend": "^14.0.0", @@ -48,21 +48,28 @@ "react-scripts": "4.0.3", "redux": "4.1.0", "seedrandom": "^2.4.4", - "three": "0.101.1", - "zlib": "1.x.x" + "three": "0.101.1" }, "devDependencies": { "@babel/core": "7.14.3", + "@babel/plugin-proposal-private-property-in-object": "^7.21.11", + "@babel/plugin-transform-runtime": "^7.22.15", "@testing-library/jest-dom": "^5.14.1", "@testing-library/react": "^12.1.0", "@testing-library/react-hooks": "^7.0.2", "@testing-library/user-event": "^13.2.1", + "@types/react": "^18.2.14", + "@types/react-dom": "^18.2.6", + "@typescript-eslint/eslint-plugin": "^6.10.0", + "@typescript-eslint/parser": "^6.10.0", + "eslint": "^7.27.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-react": "7.x.x", "husky": "^7.0.0", "lint-staged": "^11.0.0", - "prettier": "^2.4.1" + "prettier": "^2.4.1", + "typescript": "^4.9.5" }, "jest": { "resetMocks": false, diff --git a/src/config/config.js b/src/config/config.js index 3c6f3a74..453acb8c 100644 --- a/src/config/config.js +++ b/src/config/config.js @@ -6,7 +6,16 @@ const config = { // special demo dialog file locations - demoUrls: [], + demoUrls: [ + 'https://daentjnvnffrh.cloudfront.net/demo/01_lungs/20101108.ktx', + 'https://daentjnvnffrh.cloudfront.net/demo/02_brain_set/brain256.ktx', + 'https://daentjnvnffrh.cloudfront.net/demo/03_grandmother_gm3/gm3_512_512_165.nii', + 'https://daentjnvnffrh.cloudfront.net/demo/04_woman_pelvis/file_list.txt', + 'https://daentjnvnffrh.cloudfront.net/demo/05_lungs_00cba/file_list.txt', + 'https://daentjnvnffrh.cloudfront.net/demo/06_ct_256/ct_256_256_256.ktx', + 'https://daentjnvnffrh.cloudfront.net/demo/07_lungs_256/lungs_256_256_256.ktx', + 'https://daentjnvnffrh.cloudfront.net/demo/08_brain_with_roi/set_intn.hdr', + ], googleCloudDemoActivce: false, arrMenuGoogle: [ diff --git a/src/engine/Volume.js b/src/engine/Volume.js index d9c6dcea..3758ea46 100644 --- a/src/engine/Volume.js +++ b/src/engine/Volume.js @@ -172,7 +172,7 @@ class Volume extends React.Component { // do nothing. But we need to implement render() to run Volume tests render() { - return

>

; + return

; } } // end class Volume diff --git a/src/engine/VolumeSet.js b/src/engine/VolumeSet.js index 30b0e1a2..e060f8f3 100644 --- a/src/engine/VolumeSet.js +++ b/src/engine/VolumeSet.js @@ -17,11 +17,6 @@ import React from 'react'; import Volume from './Volume'; -import LoaderKtx from './loaders/LoaderKtx'; -import LoaderNifti from './loaders/LoaderNifti'; -import LoaderDicom from './loaders/LoaderDicom'; -import LoaderHdr from './loaders/LoaderHdr'; - // ******************************************************** // Const // ******************************************************** @@ -32,11 +27,8 @@ import LoaderHdr from './loaders/LoaderHdr'; * See Volume class as an element of volume set */ class VolumeSet extends React.Component { - /** - * @param {object} props - props from up level object - */ - constructor(props) { - super(props); + constructor() { + super(); /** nuber of volumes in set */ this.m_numVolumes = 0; /** volumes array. see more details in class Volume */ @@ -101,73 +93,7 @@ class VolumeSet extends React.Component { // do nothing. But we need to implement render() to run Volume tests render() { - return

>

; - } - - // ******************************************** - // Read metyhods. From Ktx, Dicom, .. - // ******************************************** - /** - * Read KTX from local file buffer - * - * @param {char array} arrBuf - * @param {func} callbackProgress - * @param {func} callbackComplete - */ - readFromKtx(arrBuf, callbackProgress, callbackComplete) { - console.assert(arrBuf != null); - console.assert(arrBuf.constructor.name === 'ArrayBuffer', 'Should be ArrayBuf in arrBuf'); - const loader = new LoaderKtx(); - const vol = this.getVolume(0); - const ret = loader.readFromBuffer(vol, arrBuf, callbackProgress, callbackComplete); - return ret; - } - - readFromKtxUrl(strUrl, callbackProgress, callbackComplete) { - const loader = new LoaderKtx(); - const vol = this.getVolume(0); - loader.readFromUrl(vol, strUrl, callbackProgress, callbackComplete); - } - - readFromNiiUrl(strUrl, callbackProgress, callbackComplete) { - const loader = new LoaderNifti(); - const vol = this.getVolume(0); - const ret = loader.readFromUrl(vol, strUrl, callbackProgress, callbackComplete); - return ret; - } - - readFromDicomUrl(strUrl, callbackProgress, callbackComplete) { - const NUM_FILES = 0; // will be filled later - const loader = new LoaderDicom(NUM_FILES); - const ret = loader.readFromUrl(this, strUrl, callbackProgress, callbackComplete); - return ret; - } - - readFromHdrUrl(strUrl, callbackProgress, callbackComplete) { - const loader = new LoaderHdr(); - const ret = loader.readFromUrl(this, strUrl, callbackProgress, callbackComplete); - return ret; - } - - readFromNifti(arrBuf, callbackProgress, callbackComplete) { - const loader = new LoaderNifti(); - const vol = this.getVolume(0); - const ret = loader.readFromBuffer(vol, arrBuf, callbackProgress, callbackComplete); - return ret; - } - - readFromDicom(loader, arrBuf, callbackProgress, callbackComplete) { - const indexFile = 0; - const fileName = 'file???'; - const ratio = 0.0; - - const ret = loader.readFromBuffer(indexFile, fileName, ratio, arrBuf, callbackProgress, callbackComplete); - return ret; - } - - readSingleSliceFromDicom(loader, indexFile, fileName, ratioLoaded, arrBuf, callbackProgress, callbackComplete) { - const ret = loader.readFromBuffer(indexFile, fileName, ratioLoaded, arrBuf, callbackProgress, callbackComplete); - return ret; + return

; } } // end VolumeSet diff --git a/src/engine/VolumeSet.test.js b/src/engine/VolumeSet.test.js index 411847b6..21d866c1 100644 --- a/src/engine/VolumeSet.test.js +++ b/src/engine/VolumeSet.test.js @@ -9,219 +9,12 @@ import VolumeSet from './VolumeSet'; import Volume from './Volume'; -import { KtxHeader } from './loaders/LoaderKtx'; -import LoadResult from './LoadResult'; // ******************************************************** // Tests // ******************************************************** describe('VolumeSetTests', () => { - // special finction to creatre ktx in memory - const _writeInt = (arrBuf, offs, valInt) => { - let offsNew = offs; - let val = valInt; - for (let i = 0; i < 4; i++) { - const bt = val & 0xff; - val >>= 8; - arrBuf[offsNew++] = bt; - } - return offsNew; - }; - - it('testWriteInt', () => { - const SIZE_BUF = 4; - const bufBytes = new Uint8Array(SIZE_BUF); - const VAL_0 = 0x67; - const VAL_1 = 0x58; - const VAL_2 = 0x13; - const VAL_3 = 0x2e; - - const SHIFT_8 = 8; - const SHIFT_16 = 16; - const SHIFT_24 = 24; - - const VAL_DWORD = VAL_0 | (VAL_1 << SHIFT_8) | (VAL_2 << SHIFT_16) | (VAL_3 << SHIFT_24); - // console.log(`test. dword = ${VAL_DWORD.toString(16)}`); - _writeInt(bufBytes, 0, VAL_DWORD); - // console.log(`test. array0 = ${bufBytes[0].toString(16)}`); - // console.log(`test. array1 = ${bufBytes[1].toString(16)}`); - // console.log(`test. array2 = ${bufBytes[2].toString(16)}`); - // console.log(`test. array3 = ${bufBytes[3].toString(16)}`); - const isOk0 = bufBytes[0] === VAL_0; - const isOk1 = bufBytes[1] === VAL_1; - const isOk2 = bufBytes[2] === VAL_2; - const isOk3 = bufBytes[3] === VAL_3; - expect(isOk0).toBeTruthy(); - expect(isOk1).toBeTruthy(); - expect(isOk2).toBeTruthy(); - expect(isOk3).toBeTruthy(); - }); - it('testLoaderKtxBadHeader', () => { - const MAX_SIZE_TEST = 64; - const bufTest = new Uint8Array(MAX_SIZE_TEST); - for (let i = 0; i < MAX_SIZE_TEST; i++) { - bufTest[0] = 'a'; - } - const callbackProgress = undefined; - const callbackComplete = undefined; - const volSet = new VolumeSet(); - volSet.addVolume(new Volume()); - const readOk = volSet.readFromKtx(bufTest, callbackProgress, callbackComplete); - expect(readOk === true).toBeFalsy(); - }); - it('testLoaderKtxBadEndianness', () => { - const MAX_SIZE_TEST = 512; - const bufTest = new Uint8Array(MAX_SIZE_TEST); - let i; - let iDst = 0; - // write header - const arrayHeaderSign = [0xab, 0x4b, 0x54, 0x58, 0x20, 0x31, 0x31, 0xbb, 0x0d, 0x0a, 0x1a, 0x0a]; - const lenHeaderSign = arrayHeaderSign.length; - - for (i = 0; i < lenHeaderSign; i++) { - bufTest[iDst++] = arrayHeaderSign[i]; - } - // write endianness - iDst = _writeInt(bufTest, iDst, 5555); - - const callbackProgress = undefined; - const callbackComplete = undefined; - const volSet = new VolumeSet(); - volSet.addVolume(new Volume()); - const readOk = volSet.readFromKtx(bufTest, callbackProgress, callbackComplete); - expect(readOk === true).toBeFalsy(); - }); - it('testLoaderKtxBadGlType', () => { - const MAX_SIZE_TEST = 512; - const bufTest = new Uint8Array(MAX_SIZE_TEST); - let i; - let iDst = 0; - // write header - const arrayHeaderSign = [0xab, 0x4b, 0x54, 0x58, 0x20, 0x31, 0x31, 0xbb, 0x0d, 0x0a, 0x1a, 0x0a]; - const lenHeaderSign = arrayHeaderSign.length; - - for (i = 0; i < lenHeaderSign; i++) { - bufTest[iDst++] = arrayHeaderSign[i]; - } - // write endianness - const ENDIANNESS_CONST = 0x04030201; - iDst = _writeInt(bufTest, iDst, ENDIANNESS_CONST); - const BAD = 44; - // write type - iDst = _writeInt(bufTest, iDst, BAD); - // writ type size - iDst = _writeInt(bufTest, iDst, BAD); - // write gl format - iDst = _writeInt(bufTest, iDst, BAD); - - const callbackProgress = undefined; - const callbackComplete = undefined; - const volSet = new VolumeSet(); - volSet.addVolume(new Volume()); - const readOk = volSet.readFromKtx(bufTest, callbackProgress, callbackComplete); - expect(readOk === true).toBeFalsy(); - }); - - it('testLoaderKtxBadDims', () => { - const MAX_SIZE_TEST = 512; - const bufTest = new Uint8Array(MAX_SIZE_TEST); - let i; - let iDst = 0; - // write header - const arrayHeaderSign = [0xab, 0x4b, 0x54, 0x58, 0x20, 0x31, 0x31, 0xbb, 0x0d, 0x0a, 0x1a, 0x0a]; - const lenHeaderSign = arrayHeaderSign.length; - - for (i = 0; i < lenHeaderSign; i++) { - bufTest[iDst++] = arrayHeaderSign[i]; - } - // write endianness - const ENDIANNESS_CONST = 0x04030201; - iDst = _writeInt(bufTest, iDst, ENDIANNESS_CONST); - // write gl type - iDst = _writeInt(bufTest, iDst, KtxHeader.KTX_GL_RED); - // write gl type size - iDst = _writeInt(bufTest, iDst, 4); - // write gl format - iDst = _writeInt(bufTest, iDst, KtxHeader.KTX_GL_RED); - // internal format - iDst = _writeInt(bufTest, iDst, KtxHeader.KTX_GL_RED); - // base int format - iDst = _writeInt(bufTest, iDst, KtxHeader.KTX_GL_RED); - const TOO_SMALL = 1; - // write xDim, yDim, zDim - iDst = _writeInt(bufTest, iDst, TOO_SMALL); - iDst = _writeInt(bufTest, iDst, TOO_SMALL); - iDst = _writeInt(bufTest, iDst, TOO_SMALL); - - const callbackProgress = undefined; - const callbackComplete = undefined; - const volSet = new VolumeSet(); - volSet.addVolume(new Volume()); - const readOk = volSet.readFromKtx(bufTest, callbackProgress, callbackComplete); - // console.log(`Test. Vol dim = ${vol.m_xDim} * ${vol.m_yDim} * ${vol.m_zDim} `); - expect(readOk === true).toBeFalsy(); - }); - - it('testLoaderKtxGood888', () => { - const MAX_SIZE_TEST = 512; - const bufTest = new Uint8Array(MAX_SIZE_TEST); - let i; - let iDst = 0; - // write header - const arrayHeaderSign = [0xab, 0x4b, 0x54, 0x58, 0x20, 0x31, 0x31, 0xbb, 0x0d, 0x0a, 0x1a, 0x0a]; - const lenHeaderSign = arrayHeaderSign.length; - - for (i = 0; i < lenHeaderSign; i++) { - bufTest[iDst++] = arrayHeaderSign[i]; - } - // write endianness - const ENDIANNESS_CONST = 0x04030201; - iDst = _writeInt(bufTest, iDst, ENDIANNESS_CONST); - // write gl type - iDst = _writeInt(bufTest, iDst, KtxHeader.KTX_GL_RED); - // write gl type size - iDst = _writeInt(bufTest, iDst, 4); - // write gl format - iDst = _writeInt(bufTest, iDst, KtxHeader.KTX_GL_RED); - // internal format - iDst = _writeInt(bufTest, iDst, KtxHeader.KTX_GL_RED); - // base int format - iDst = _writeInt(bufTest, iDst, KtxHeader.KTX_GL_RED); - const SIDE = 8; - // write xDim, yDim, zDim - iDst = _writeInt(bufTest, iDst, SIDE); - iDst = _writeInt(bufTest, iDst, SIDE); - iDst = _writeInt(bufTest, iDst, SIDE); - - const ZERO = 0; - // num arr elems - iDst = _writeInt(bufTest, iDst, ZERO); - // num faces - iDst = _writeInt(bufTest, iDst, ZERO); - // num mip maps - iDst = _writeInt(bufTest, iDst, ZERO); - // num bytes key value - iDst = _writeInt(bufTest, iDst, ZERO); - - // data size - const DTSIZE = SIDE * SIDE * SIDE; - iDst = _writeInt(bufTest, iDst, DTSIZE); - - // write data - for (i = 0; i < DTSIZE; i++) { - bufTest[iDst++] = i & 0xff; - } - - const callbackProgress = undefined; - const callbackComplete = undefined; - const volSet = new VolumeSet(); - volSet.addVolume(new Volume()); - const readOk = volSet.readFromKtx(bufTest, callbackProgress, callbackComplete); - // console.log(`Test. Vol dim = ${vol.m_xDim} * ${vol.m_yDim} * ${vol.m_zDim} `); - expect(readOk === LoadResult.SUCCESS).toBeTruthy(); - }); - // it('testCreateSingleVolume', () => { const volumeSet = new VolumeSet(); diff --git a/src/engine/lib/MRIViewer.ts b/src/engine/lib/MRIViewer.ts new file mode 100644 index 00000000..a24340d2 --- /dev/null +++ b/src/engine/lib/MRIViewer.ts @@ -0,0 +1,23 @@ +import { MRIReader, mriReader } from './core/readers'; +import { MRIEventsService } from './services'; +import mriEventsService from './services/EventsService'; + +export class MRIViwer { + public mriReader: MRIReader; + public events: MRIEventsService; + + constructor() { + this.events = mriEventsService; + this.mriReader = mriReader; + } + + read(data: File[] | string): void { + this.mriReader.read(data); + } +} + +// Create the singleton instance and freeze it +const MriViwer = new MRIViwer(); +Object.freeze(MriViwer); + +export default MriViwer; diff --git a/src/engine/lib/config/volume.config.ts b/src/engine/lib/config/volume.config.ts new file mode 100644 index 00000000..01a40b41 --- /dev/null +++ b/src/engine/lib/config/volume.config.ts @@ -0,0 +1,3 @@ +export const volumeConfig: any = { + setTextureSize4X: true, +}; diff --git a/src/engine/lib/core/loaders/MRIFileLoader.ts b/src/engine/lib/core/loaders/MRIFileLoader.ts new file mode 100644 index 00000000..7738988e --- /dev/null +++ b/src/engine/lib/core/loaders/MRIFileLoader.ts @@ -0,0 +1,194 @@ +import { MriEvents, MriExtensions } from '../../enums'; +import { MRIEventsService, MRIStoreService, mriEventsService, mriStoreService } from '../../services'; +import { getFileNameFromUrl, getFolderNameFromUrl } from '../../utils'; + +/** + * Class responsible for loading MRI files from URLs. + * It handles different file types and tracks the loading progress. + */ +export class MRIFileLoader { + fileName = ''; + filesLength = 0; + filesLoaded = 0; + filesProgressByLength = false; + store: MRIStoreService = mriStoreService; + events: MRIEventsService = mriEventsService; + + constructor() { + this.load = this.load.bind(this); + this.callbackLoadProgress = this.callbackLoadProgress.bind(this); + } + + /** + * Main load function responsible for loading a file from a given URL. + * @param {string} url - The URL of the file to load. + * @returns {Promise} A promise that resolves to an array of Files or rejects with an error. + */ + async load(url: string): Promise { + this.filesLoaded = 0; + this.filesProgressByLength = false; + this.store.setLoadingProgress(0); + this.store.startLoadingSpinner('Loading File...'); + const fileExtension = url.slice(url.lastIndexOf('.') + 1); + + switch (fileExtension) { + case MriExtensions.KTX: + case MriExtensions.NII: + case MriExtensions.DCM: + case MriExtensions.ZIP: + return await this.fetchSingleFile(url); + case MriExtensions.TXT: + return await this.fetchTxtFile(url); + case MriExtensions.HDR: + return await this.fetchHdrFile(url); + default: + this.handleVolumeLoadFailed(`Unsupported file extension: ${fileExtension}`); + return []; + } + } + + /** + * Fetches a single file from the given URL and tracks its progress. + * @param {string} url - The URL from which to fetch the file. + * @returns {Promise} A promise that resolves to an array containing the fetched file as a File object. + */ + async fetchSingleFile(url: string): Promise { + const response = await this.fetchWithProgress(url, this.callbackLoadProgress); + + if (!response.ok) { + this.handleVolumeLoadFailed(`Failed to fetch file from URL: ${url}`); + return []; + } + + const blob = await response.blob(); + const fileName = getFileNameFromUrl(url); + const file = new File([blob], fileName, { + type: blob.type, + }); + + return [file]; + } + + /** + * Fetches the content of a .txt file and splits it by newlines. + * @param {string} url - The URL of the .txt file. + * @returns {Promise} A promise that resolves to an array of strings from the .txt file. + */ + async fetchTxtContent(url: string): Promise { + const response = await fetch(url); + + if (!response.ok) { + this.handleVolumeLoadFailed(`Failed to fetch file list from URL: ${url}`); + return []; + } + + const content = await response.text(); + return content.split('\n').filter((line) => line.trim() !== ''); + } + + /** + * Fetches multiple files defined in a .txt file located at the given URL. + * @param {string} txtUrl - The URL of the .txt file containing the list of file URLs. + * @returns {Promise} A promise that resolves to an array of File objects. + */ + async fetchTxtFile(txtUrl: string): Promise { + this.filesProgressByLength = true; + const base = txtUrl.substring(0, txtUrl.lastIndexOf('/') + 1); + const fileNames = await this.fetchTxtContent(txtUrl); + this.filesLength = fileNames.length; + const filePromises = fileNames.map((filename: string) => this.fetchSingleFile(base + filename)); + const files = await Promise.all(filePromises); + return files.flat(); + } + + /** + * Fetches a set of related .hdr and .img files for MRI data. + * @param {string} url - The URL of the .hdr file. + * @returns {Promise} A promise that resolves to an array of File objects, or [] if failed. + */ + async fetchHdrFile(url: string): Promise { + const folder = getFolderNameFromUrl(url); + const fileName = getFileNameFromUrl(url); + const regExp = /(\w+)_intn.(h|hdr)/; + const arrGrp = regExp.exec(fileName) || []; + const namePrefix = arrGrp[1]; + + if (arrGrp.length !== 3) { + this.handleVolumeLoadFailed(`LoaderHdr.readFromUrl: bad URL name = ${url}. Should be in template NNN_intn.h`); + return []; + } + + const fileNameIntensityHeader = folder + '/' + namePrefix + '_intn.hdr'; + const fileNameIntensityImage = folder + '/' + namePrefix + '_intn.img'; + const fileNameMaskHeader = folder + '/' + namePrefix + '_mask.hdr'; + const fileNameMaskImage = folder + '/' + namePrefix + '_mask.img'; + + const urls = [fileNameIntensityHeader, fileNameIntensityImage, fileNameMaskHeader, fileNameMaskImage]; + this.filesProgressByLength = true; + this.filesLength = urls.length; + + const filePromises = urls.map((url: string) => this.fetchSingleFile(url)); + + const files = await Promise.all(filePromises); + + return files.flat(); + } + + /** + * Fetches a file with progress tracking via XMLHttpRequest. + * @param {string} url - The URL from which to fetch the file. + * @param {Function} onProgress - Callback function to report progress. + * @returns {Promise} A promise that resolves to the Response object of the request. + */ + async fetchWithProgress(url: string, onProgress: Function): Promise { + return new Promise((resolve, reject) => { + const xhr = new XMLHttpRequest(); + + xhr.open('GET', url); + + xhr.onprogress = (event) => { + if (event.lengthComputable && !this.filesProgressByLength) { + const percentComplete = event.loaded / event.total; + onProgress(percentComplete); + } + }; + + xhr.onload = () => { + if (this.filesProgressByLength) { + this.filesLoaded = this.filesLoaded + 1; + const percentComplete = this.filesLoaded / this.filesLength; + onProgress(percentComplete); + } + + const blob = xhr.response; + resolve(new Response(blob)); + }; + + xhr.onerror = () => { + this.handleVolumeLoadFailed(`Failed to fetch file from URL: ${url}`); + reject(new Error()); + }; + + xhr.responseType = 'blob'; + xhr.send(); + }); + } + + /** + * Callback function to handle the progress of file loading. + * @param {number} progress - The progress of the loading, as a number between 0 and 1. + */ + callbackLoadProgress(progress: number) { + const progressPercentage = Math.floor(progress * 100); + this.store.setLoadingProgress(progressPercentage); + } + + /** + * Handles the event of a failed volume load operation. + * @param {string} error - The error message to be handled. + */ + handleVolumeLoadFailed(error: string) { + this.events.emit(MriEvents.FILE_READ_ERROR, { error }); + this.store.setVolumeLoadFailed(this.fileName, [error]); + } +} diff --git a/src/engine/lib/core/readers/MRIReader.ts b/src/engine/lib/core/readers/MRIReader.ts new file mode 100644 index 00000000..f4e12778 --- /dev/null +++ b/src/engine/lib/core/readers/MRIReader.ts @@ -0,0 +1,25 @@ +import { isValidUrl } from '../../utils'; +import { MRIFileLoader } from '../loaders/MRIFileLoader'; +import { MRIFileReaderFactory } from './file-reader-factory/MRIReaderFactory'; + +export class MRIReader { + fileLoader = new MRIFileLoader(); + fileReader = new MRIFileReaderFactory(); + + async read(data: File[] | string): Promise { + if (data && data.length && data[0] instanceof File) { + this.fileReader.read(data as File[]); + } else if (isValidUrl(data as string)) { + const files: File[] = await this.fileLoader.load(data as string); + this.fileReader.read(files); + } else { + throw new Error('Invalid input. Expected a File or URL.'); + } + } +} + +// Create the singleton instance and freeze it +const mriReader = new MRIReader(); +Object.freeze(mriReader); + +export default mriReader; diff --git a/src/engine/lib/core/readers/abstract-file-reader/AbstractFileReader.ts b/src/engine/lib/core/readers/abstract-file-reader/AbstractFileReader.ts new file mode 100644 index 00000000..bbeb9a6a --- /dev/null +++ b/src/engine/lib/core/readers/abstract-file-reader/AbstractFileReader.ts @@ -0,0 +1,106 @@ +import LoadResult from '../../../../LoadResult'; +import VolumeSet from '../../../../VolumeSet'; +import LoaderDicom from '../../../../loaders/LoaderDicom'; +import LoaderHdr from '../../../../loaders/LoaderHdr'; +import MriViwer from '../../../MRIViewer'; +import { volumeConfig } from '../../../config/volume.config'; +import { MriEvents, MriExtensions } from '../../../enums'; +import { + MRIEventsService, + MRILocalStorageService, + MRIStoreService, + mriEventsService, + mriLocalStorageService, + mriStoreService, +} from '../../../services'; + +/** + * AbstractFileReader is an abstract class designed to be extended by specific file reader + * implementations for medical imaging data. It provides basic functionality for reading files, + * handling loading success or failure, and communicating with application services for state management + * and event handling. + * + * @abstract + */ +export abstract class AbstractFileReader { + // VolumeData + volumeSet = new VolumeSet(); + volumeIndex: number = 0; + // FileData + fileName = ''; + fileExtension: MriExtensions | '' = ''; + // File Handlers + loader: LoaderDicom | LoaderHdr | undefined; + fileReader: FileReader = new FileReader(); + + // Services + store: MRIStoreService = mriStoreService; + events: MRIEventsService = mriEventsService; + localStorage: MRILocalStorageService = mriLocalStorageService; + + constructor() { + this.callbackReadProgress = this.callbackReadProgress.bind(this); + this.callbackReadComplete = this.callbackReadComplete.bind(this); + } + + /** + * Handles the successful loading of a volume. It updates the volume set, emits a success event, + * and updates the local storage with the recent file. + */ + public handleVolumeLoadSuccess() { + const volume = this.volumeSet.getVolume(this.volumeIndex); + + if (!volume.m_dataArray) return; + + if (volumeConfig.setTextureSize4X) { + volume.makeDimensions4x(); + } + + this.callbackReadProgress(1); + MriViwer.events.emit(MriEvents.VOLUME_LOAD_SUCCESS); + this.store.setVolume(this.volumeSet, this.volumeIndex, this.fileName); + + this.localStorage.saveRecentFiles(this.fileName); + + if (this.store.getState().graphics2d) { + this.store.getState().graphics2d.forceUpdate(); + } + } + + /** + * Handles the failed read attempt of a volume by emitting an error event and updating the store with + * the failure information. + * + * @param {string} error - The error message describing the failure. + */ + public handleVolumeReadFailed(error: string) { + this.events.emit(MriEvents.FILE_READ_ERROR, { error }); + this.store.setVolumeLoadFailed(this.fileName, [error]); + } + + /** + * A callback function that is called to update the read progress. It calculates the progress percentage + * and updates the store with the new progress value. + * + * @param {number} progress - The current progress value as a fraction from 0 to 1. + */ + public callbackReadProgress(progress: number) { + const progressPercentage: number = Math.floor(progress * 100); + this.store.setLoadingProgress(progressPercentage); + } + + /** + * A callback function that is called upon the completion of the read operation. It determines whether + * the read was successful and either triggers the load success handler or the read failed handler. + * + * @param {number} status - The status code indicating the result of the file read operation. + */ + public callbackReadComplete(status: number) { + if (status === LoadResult.SUCCESS) { + this.handleVolumeLoadSuccess(); + } else { + const error = LoadResult.getResultString(status); + this.handleVolumeReadFailed(error); + } + } +} diff --git a/src/engine/lib/core/readers/archive-reader/ArchiveReader.ts b/src/engine/lib/core/readers/archive-reader/ArchiveReader.ts new file mode 100644 index 00000000..a15595b8 --- /dev/null +++ b/src/engine/lib/core/readers/archive-reader/ArchiveReader.ts @@ -0,0 +1,69 @@ +import JSZip from 'jszip'; + +const IGNORED_FILE_PREFIXES = ['__MACOSX/', '._']; + +/** + * ArchiveReader is a utility class for reading and extracting files from ZIP archives. + * It uses the JSZip library to handle the zip file format. The class can filter out + * unnecessary files based on predefined rules, such as ignoring certain file prefixes. + */ +export class ArchiveReader { + /** + * Reads the provided ZIP file and returns a list of extracted files, omitting any + * files that meet the criteria to be ignored. + * + * @param {File} file - The ZIP file to be read. + * @returns {Promise} A promise that resolves to an array of File objects extracted from the ZIP archive, + * sorted by their last modified date. + */ + async readZipFile(file: File): Promise { + const zip = new JSZip(); + const unzippedFiles: File[] = []; + + const arrayBuffer = await this.readFileAsArrayBuffer(file); + + await zip.loadAsync(arrayBuffer); + + for (const fileName in zip.files) { + if (this.shouldSkipFile(fileName)) { + continue; + } + + const zipObject = zip.files[fileName]; + + if (!zipObject.dir) { + const blob = await zipObject.async('blob'); + unzippedFiles.push(new File([blob], fileName, { type: blob.type })); + } + } + + return unzippedFiles.sort((a, b) => a.lastModified - b.lastModified); + } + + /** + * Checks whether a file from the ZIP archive should be ignored based on its file name. + * Files starting with certain prefixes (e.g., '__MACOSX/', '._') are ignored. + * + * @param {string} fileName - The name of the file to check. + * @returns {boolean} True if the file should be skipped; false otherwise. + */ + private shouldSkipFile(fileName: string): boolean { + return IGNORED_FILE_PREFIXES.some((prefix) => fileName.startsWith(prefix)); + } + + /** + * Reads the content of the provided File object as an ArrayBuffer. + * This is a utility method used internally by the readZipFile method. + * + * @param {File} file - The file whose contents are to be read. + * @returns {Promise} A promise that resolves with the ArrayBuffer representation of the file's content. + */ + readFileAsArrayBuffer(file: File): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = () => resolve(reader.result as ArrayBuffer); + reader.onerror = reject; + reader.readAsArrayBuffer(file); + }); + } +} diff --git a/src/engine/lib/core/readers/file-reader-factory/MRIReaderFactory.ts b/src/engine/lib/core/readers/file-reader-factory/MRIReaderFactory.ts new file mode 100644 index 00000000..07ff6381 --- /dev/null +++ b/src/engine/lib/core/readers/file-reader-factory/MRIReaderFactory.ts @@ -0,0 +1,51 @@ +import { MriEvents, MriExtensions } from '../../../enums'; +import { ArchiveReader } from '../archive-reader/ArchiveReader'; +import { MultiFileReader } from '../multi-file-reader/MultiFileReader'; +import { SingleFileReader } from '../single-file-reader/SingleFileReader'; +import { MRIStoreService, MRIEventsService, mriEventsService, mriStoreService } from '../../../services'; + +/** + * Factory class for creating file readers based on the type and number of files provided. + * It handles the reading of single, multiple, and archived files by delegating to specific reader classes. + */ +export class MRIFileReaderFactory { + fileReader: SingleFileReader | MultiFileReader | ArchiveReader | undefined; + store: MRIStoreService = mriStoreService; + events: MRIEventsService = mriEventsService; + + constructor() { + this.read = this.read.bind(this); + } + + /** + * Reads the provided files and processes them according to their type and quantity. + * Emits an event in case of an error or delegates the file reading to the appropriate reader. + * + * @param {File[]} files - An array of files to be read. + * @returns {Promise} A promise that resolves when the file reading operation is complete. + */ + async read(files: File[]): Promise { + if (!files || !files.length) { + return this.events.emit(MriEvents.FILE_READ_ERROR, { error: 'No files provided' }); + } + + this.store.startLoadingSpinner('Processing File...'); + + // Single ZIP file scenario + if (files.length === 1 && files[0].name.endsWith(MriExtensions.ZIP)) { + this.fileReader = new ArchiveReader(); + const unzippedFiles = await this.fileReader.readZipFile(files[0]); + return this.read(unzippedFiles); + } + + // Single non-ZIP file scenario + if (files.length === 1) { + this.fileReader = new SingleFileReader(); + return this.fileReader.read(files[0]); + } + + // Multiple files scenario + this.fileReader = new MultiFileReader(); + (this.fileReader as MultiFileReader).read(files); + } +} diff --git a/src/engine/lib/core/readers/index.ts b/src/engine/lib/core/readers/index.ts new file mode 100644 index 00000000..b9c37f2d --- /dev/null +++ b/src/engine/lib/core/readers/index.ts @@ -0,0 +1,3 @@ +import mriReader, { MRIReader } from './MRIReader'; + +export { mriReader, MRIReader }; diff --git a/src/engine/lib/core/readers/multi-file-reader/MultiFileReader.ts b/src/engine/lib/core/readers/multi-file-reader/MultiFileReader.ts new file mode 100644 index 00000000..866e2838 --- /dev/null +++ b/src/engine/lib/core/readers/multi-file-reader/MultiFileReader.ts @@ -0,0 +1,178 @@ +import LoadResult from '../../../../LoadResult'; +import Volume from '../../../../Volume'; +import LoaderDcmDaikon from '../../../../loaders/LoaderDcmDaikon'; +import LoaderDicom from '../../../../loaders/LoaderDicom'; +import LoaderHdr from '../../../../loaders/LoaderHdr'; +import { MriExtensions } from '../../../enums'; +import { SingleFileReader } from '../single-file-reader/SingleFileReader'; + +/** + * The `MultiFileReader` class extends `SingleFileReader` to handle reading and processing + * multiple files. It supports reading DICOM series and header-image pairs for volume rendering. + */ +export class MultiFileReader extends SingleFileReader { + files: Array = []; + fileIndex: number = 0; + filesLength: number = 0; + + volumeRoi = new Volume(); + + constructor() { + super(); + + this.read = this.read.bind(this); + this.readMultipleHdr = this.readMultipleHdr.bind(this); + this.onFileContentReadMultipleDicom = this.onFileContentReadMultipleDicom.bind(this); + } + + /** + * Reads multiple files and determines the processing method based on file extension. + * @param {File[]} files - An array of `File` objects to be read. + */ + read(files: any): void { + this.files = this.getFilesOrderToRead(files); + this.filesLength = this.files.length; + this.setFileData(this.files[0]); + this.volumeSet.addVolume(new Volume()); + this.readFile(0); + + switch (this.fileExtension) { + case '': + case MriExtensions.DCM: + this.loader = new LoaderDicom(this.filesLength); + this.store.setDicomLoader(this.loader); + this.fileReader.onloadend = this.onFileContentReadMultipleDicom; + break; + case MriExtensions.HDR: + case MriExtensions.IMG: + this.loader = new LoaderHdr(); + this.fileReader.onloadend = this.readMultipleHdr; + break; + default: + this.handleVolumeReadFailed(`Unsupported file extension: ${this.fileExtension}`); + break; + } + } + + /** + * Orders files based on their last modified date and filters out files that don't match the primary file extension. + * @param {File[]} files - An array of `File` objects to be ordered. + * @returns {File[]} An ordered array of `File` objects. + */ + getFilesOrderToRead(files: File[]): File[] { + const plainFiles: File[] = Array.from(files); + const fileExtension = this.getFileExtension(plainFiles[0]); + + if (fileExtension === MriExtensions.HDR || fileExtension === MriExtensions.IMG) { + return plainFiles; + } + + return plainFiles + .filter((file) => { + return this.getFileExtension(file) === fileExtension; + }) + .sort((a, b) => a.lastModified - b.lastModified); + } + + /** + * Reads a slice of a DICOM file using the Daikon loader. + * @param {string | ArrayBuffer | null} content - The content of the DICOM file. + * @returns {LoadResult} The result of the read operation. + */ + readSliceDicomViaDaikon(content: string | ArrayBuffer | null) { + const loaderDaikon = new LoaderDcmDaikon(); + return loaderDaikon.readSlice(this.loader, this.fileIndex, this.fileName, content); + } + + /** + * Reads the file at the given index. + * @param {number} index - The index of the file to read. + */ + readFile(index: number): void { + const file = this.files[index]; + this.setFileData(file); + this.fileReader.readAsArrayBuffer(file); + this.callbackReadProgress(this.fileIndex / this.filesLength); + } + + /** + * Handler for when content of a DICOM file is read. + */ + onFileContentReadMultipleDicom(): void { + this.fileIndex++; + + if (this.fileIndex === this.files.length) { + return this.callbackReadSingleDicomComplete(LoadResult.SUCCESS); + } + const readStatus = this.readSliceDicomViaDaikon(this.fileReader.result); + + if (readStatus === LoadResult.SUCCESS && this.fileIndex < this.filesLength) { + this.readFile(this.fileIndex); + this.fileReader.onloadend = this.onFileContentReadMultipleDicom; + } else { + this.handleVolumeReadFailed(`Failed on parsing of this file: ${this.fileName}.${this.fileExtension}`); + } + } + + /** + * Handler for reading multiple HDR (header) files. + */ + readMultipleHdr() { + this.fileIndex++; + + const VALID_NUM_FILES_2 = 2; + const VALID_NUM_FILES_4 = 4; + + // Extract main part of the filename + const regExpFileName = /([\S]+)\.[\S]+/; + const fnameArr = regExpFileName.exec(this.fileName); + let detectedMask = false; + let detectedIntensity = false; + + if (fnameArr && fnameArr.length === 2) { + const fname = fnameArr[1]; + detectedMask = fname.endsWith('_mask'); + detectedIntensity = fname.endsWith('_intn'); + } + + let volDst = this.volumeSet.getVolume(0); + + if (this.fileIndex > VALID_NUM_FILES_2) { + volDst = this.volumeRoi; + } + + if (detectedIntensity) { + volDst = this.volumeSet.getVolume(0); + } + + if (detectedMask && this.filesLength !== VALID_NUM_FILES_4) { + volDst = this.volumeRoi; + } + + const content = this.fileReader.result; + + const readSuccess = + this.fileExtension === MriExtensions.HDR + ? (this.loader as LoaderHdr).readFromBufferHeader(volDst, content, this.callbackReadProgress, this.callbackReadComplete) + : (this.loader as LoaderHdr).readFromBufferImage(volDst, content, this.callbackReadProgress, this.callbackReadComplete); + + volDst = this.volumeSet.getVolume(0); + + if (readSuccess && this.fileIndex === this.filesLength) { + const loaderHdr = this.loader as LoaderHdr; + let ok = loaderHdr.createVolumeFromHeaderAndImage(volDst); + + if (this.filesLength === VALID_NUM_FILES_4 && ok) { + ok = loaderHdr.createRoiVolumeFromHeaderAndImage(volDst, this.volumeRoi); + } + + this.callbackReadProgress(1.0); + this.callbackReadComplete(ok ? LoadResult.SUCCESS : LoadResult.UNKNOWN); + } + + if (this.fileIndex < this.filesLength) { + this.readFile(this.fileIndex); + this.fileReader.onloadend = this.readMultipleHdr; + } + } +} diff --git a/src/engine/lib/core/readers/single-file-reader/SingleFileReader.ts b/src/engine/lib/core/readers/single-file-reader/SingleFileReader.ts new file mode 100644 index 00000000..fa3d8535 --- /dev/null +++ b/src/engine/lib/core/readers/single-file-reader/SingleFileReader.ts @@ -0,0 +1,167 @@ +import StoreActionType from '../../../../../store/ActionTypes'; +import LoadResult from '../../../../LoadResult'; +import Volume from '../../../../Volume'; +import LoaderDcmDaikon from '../../../../loaders/LoaderDcmDaikon'; +import LoaderDicom from '../../../../loaders/LoaderDicom'; +import LoaderKtx from '../../../../loaders/LoaderKtx'; +import LoaderNifti from '../../../../loaders/LoaderNifti'; +import { MriEvents, MriExtensions } from '../../../enums'; +import { AbstractFileReader } from '../abstract-file-reader/AbstractFileReader'; + +/** + * The `SingleFileReader` class extends `AbstractFileReader` to handle the reading and processing + * of single files. It supports reading various medical imaging formats such as DICOM, KTX, and NIFTI. + */ +export class SingleFileReader extends AbstractFileReader { + constructor() { + super(); + this.read = this.read.bind(this); + this.readSingleFile = this.readSingleFile.bind(this); + this.fileReadProgress = this.fileReadProgress.bind(this); + this.callbackReadSingleDicomComplete = this.callbackReadSingleDicomComplete.bind(this); + this.handleVolumeParametersSetSuccess = this.handleVolumeParametersSetSuccess.bind(this); + + this.events.on(MriEvents.VOLUME_PARAMETERS_SET_SUCCESS, this.handleVolumeParametersSetSuccess); + } + + /** + * Initiates reading of a single file. + * @param {File} file - The file to be read. + */ + read(file: File): void { + this.setFileData(file); + this.fileReader.readAsArrayBuffer(file); + this.fileReader.onloadend = this.readSingleFile; + this.fileReader.addEventListener('progress', this.fileReadProgress); + } + + /** + * Called when the FileReader has completed loading the file's data. + * Delegates to readFileData for processing the content. + */ + readSingleFile() { + const data = this.fileReader.result as ArrayBuffer; + this.volumeSet.addVolume(new Volume()); + this.readFileData(data); + } + + /** + * Processes the read data based on the file extension. + * @param {ArrayBuffer} data - The data to be processed. + */ + readFileData(data: ArrayBuffer) { + switch (this.fileExtension) { + case '': + case MriExtensions.DCM: + case MriExtensions.TXT: + this.readFromDicom(data); + break; + case MriExtensions.KTX: + this.readFromKtx(data); + break; + case MriExtensions.NII: + this.readFromNifti(data); + break; + default: + this.handleVolumeReadFailed(`Unsupported file extension: ${this.fileExtension}`); + break; + } + } + + /** + * Reads and processes a KTX file's data. + * @param {ArrayBuffer} content - The file content. + * @returns {LoadResult} The result of the read operation. + */ + readFromKtx(content: ArrayBuffer) { + const loader = new LoaderKtx(); + const vol = this.volumeSet.getVolume(0); + const ret = loader.readFromBuffer(vol, content, this.callbackReadProgress, this.callbackReadComplete); + return ret; + } + + /** + * Reads and processes a NIFTI file's data. + * @param {ArrayBuffer} content - The file content. + * @returns {LoadResult} The result of the read operation. + */ + readFromNifti(content: ArrayBuffer) { + const loader = new LoaderNifti(); + const vol = this.volumeSet.getVolume(0); + const ret = loader.readFromBuffer(vol, content, this.callbackReadProgress, this.callbackReadComplete); + return ret; + } + + /** + * Reads and processes a DICOM file's data. + * @param {ArrayBuffer} content - The file content. + * @returns {LoadResult} The result of the read operation. + */ + readFromDicom(content: ArrayBuffer) { + this.loader = new LoaderDicom(1); + const loaderDcm = new LoaderDcmDaikon(); + const status = loaderDcm.readSingleSlice(this.store, this.loader, 0, this.fileName, content); + this.callbackReadSingleDicomComplete(status); + return status; + } + + /** + * Sets metadata such as the file name and extension for the file being processed. + * @param {File} file - The file for which to set data. + */ + setFileData(file: File): void { + this.fileName = file.name.toLowerCase(); + this.fileExtension = this.getFileExtension(file); + } + + /** + * Retrieves the extension of the given file. + * @param {File} file - The file from which to extract the extension. + * @returns {MriExtensions | ''} The file extension, or an empty string if no extension is found. + */ + getFileExtension(file: File): MriExtensions | '' { + const parts = file.name.toLowerCase().split('.'); + + if (parts.length === 1) { + return ''; + } + + return (parts[parts.length - 1] as MriExtensions) || ''; + } + + /** + * Handles the progress event of the FileReader, updating the callback with the load progress. + * @param {Object} progressEvent - The progress event emitted by FileReader. + * @param {number} progressEvent.loaded - The number of bytes loaded. + * @param {number} progressEvent.total - The total number of bytes. + */ + fileReadProgress({ loaded, total }: { loaded: number; total: number }) { + this.callbackReadProgress(loaded / total); + } + + /** + * Callback invoked upon completion of reading a single DICOM file. + * @param {number} status - The status of the read operation. + */ + callbackReadSingleDicomComplete(status: number) { + if (status !== LoadResult.SUCCESS) { + return this.callbackReadComplete(status); + } + + this.callbackReadProgress(1); + this.store.setSingleDicom(this.volumeSet, this.volumeIndex, this.loader); + this.events.emit(MriEvents.FILE_READ_SUCCESS); + } + + /** + * Handles the successful setting of volume parameters after reading the file. + */ + handleVolumeParametersSetSuccess(): void { + this.handleVolumeLoadSuccess(); + + if (this.loader && this.loader instanceof LoaderDicom) { + const dicomSeries = this.loader.m_slicesVolume.getSeries(); + this.store.dispatch({ type: StoreActionType.SET_DICOM_SERIES, dicomSeries }); + } + } +} diff --git a/src/engine/lib/enums/events.enum.ts b/src/engine/lib/enums/events.enum.ts new file mode 100644 index 00000000..18d5c4b4 --- /dev/null +++ b/src/engine/lib/enums/events.enum.ts @@ -0,0 +1,19 @@ +/* eslint-disable no-unused-vars */ +export enum MriEvents { + FILE_READ_SUCCESS = 'fileReadSuccess', + FILE_READ_ERROR = 'fileReadError', + FILE_SELECTED = 'fileSelectSucces', + VOLUME_PARAMETERS_SET_SUCCESS = 'VolumeParametersSetSuccess', + VOLUME_LOAD_SUCCESS = 'VolumeLoadSuccess', +} + +export enum MriExtensions { + DCM = 'dcm', + KTX = 'ktx', + NII = 'nii', + HDR = 'hdr', + IMG = 'img', + TXT = 'txt', + ZIP = 'zip', +} +/* eslint-enable no-unused-vars */ diff --git a/src/engine/lib/enums/index.ts b/src/engine/lib/enums/index.ts new file mode 100644 index 00000000..c556eeed --- /dev/null +++ b/src/engine/lib/enums/index.ts @@ -0,0 +1 @@ +export * from './events.enum'; diff --git a/src/engine/lib/index.d.ts b/src/engine/lib/index.d.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/engine/lib/interfaces/index.ts b/src/engine/lib/interfaces/index.ts new file mode 100644 index 00000000..52b56386 --- /dev/null +++ b/src/engine/lib/interfaces/index.ts @@ -0,0 +1,3 @@ +export interface data { + data: any; +} diff --git a/src/engine/lib/services/ConfigService.ts b/src/engine/lib/services/ConfigService.ts new file mode 100644 index 00000000..c1100e7a --- /dev/null +++ b/src/engine/lib/services/ConfigService.ts @@ -0,0 +1,12 @@ +export class MRIConfigService { + get config(): any { + return {}; + } +} + +// Create the singleton instance and freeze it +const mriEventsService = new MRIConfigService(); +Object.freeze(mriEventsService); + +// Export the MRIEventsService singleton instance +export default mriEventsService; diff --git a/src/engine/lib/services/EventsService.ts b/src/engine/lib/services/EventsService.ts new file mode 100644 index 00000000..deab2824 --- /dev/null +++ b/src/engine/lib/services/EventsService.ts @@ -0,0 +1,28 @@ +export class MRIEventsService { + private events: { [key: string]: Function[] } = {}; + + on(eventName: string, fn: Function): Function { + if (!this.events[eventName]) { + this.events[eventName] = []; + } + this.events[eventName].push(fn); + return () => this.off(eventName, fn); + } + + off(eventName: string, fn: Function): void { + if (!this.events[eventName]) return; + this.events[eventName] = this.events[eventName].filter((subscriber) => subscriber !== fn); + } + + emit(eventName: string, data = {}): void { + if (!this.events[eventName]) return; + this.events[eventName].forEach((fn) => fn(data)); + } +} + +// Create the singleton instance and freeze it +const mriEventsService = new MRIEventsService(); +Object.freeze(mriEventsService); + +// Export the MRIEventsService singleton instance +export default mriEventsService; diff --git a/src/engine/lib/services/LocalStorageService.ts b/src/engine/lib/services/LocalStorageService.ts new file mode 100644 index 00000000..167521c5 --- /dev/null +++ b/src/engine/lib/services/LocalStorageService.ts @@ -0,0 +1,38 @@ +export class MRILocalStorageService { + RECENT_FILES_KEY: string = 'recentFiles'; + + constructor() { + this.saveRecentFiles = this.saveRecentFiles.bind(this); + } + + get localStorage(): Storage { + if (!localStorage) { + throw new Error('Local Storage is not available'); + } + + return localStorage; + } + + getData(key: string): string { + const stringData = this.localStorage.getItem(key); + return stringData ? JSON.parse(stringData) : ''; + } + + setData(key: string, data: any): void { + this.localStorage.setItem(key, JSON.stringify(data)); + } + + saveRecentFiles(fileName: string): void { + const recentFiles = this.getData(this.RECENT_FILES_KEY); + const limitedRecentFiles = recentFiles.slice(0, 2); + const data = [{ fileName, timestamp: Date.now() }, ...limitedRecentFiles]; + this.setData(this.RECENT_FILES_KEY, data); + } +} + +// Create the singleton instance and freeze it +const mriLocalStorageService = new MRILocalStorageService(); +Object.freeze(mriLocalStorageService); + +// Export the FileLoader singleton instance +export default mriLocalStorageService; diff --git a/src/engine/lib/services/StoreService.ts b/src/engine/lib/services/StoreService.ts new file mode 100644 index 00000000..e0b1a876 --- /dev/null +++ b/src/engine/lib/services/StoreService.ts @@ -0,0 +1,101 @@ +import { Store } from 'redux'; +import { store } from '../../../store'; +import StoreActionType from '../../../store/ActionTypes'; +import Modes3d from '../../../store/Modes3d'; +import ViewMode from '../../../store/ViewMode'; +import VolumeSet from '../../VolumeSet'; +import LoaderDicom from '../../loaders/LoaderDicom'; +import LoaderHdr from '../../loaders/LoaderHdr'; + +export class MRIStoreService { + private store: Store; + public dispatch: Function; + + constructor() { + this.store = store; + this.dispatch = store.dispatch; + + this.getState = this.getState.bind(this); + this.setVolume = this.setVolume.bind(this); + this.dispatchActions = this.dispatchActions.bind(this); + this.setLoadingProgress = this.setLoadingProgress.bind(this); + } + + public getState(): any { + return this.store.getState(); + } + + public dispatchActions(actions: any): void { + actions.forEach(this.dispatch); + } + + public startLoadingSpinner(spinnerTitle: string): void { + this.setLoadingProgress(0); + this.dispatchActions([ + { type: StoreActionType.SET_SPINNER, spinner: true }, + { type: StoreActionType.SET_SPINNER_TITLE, spinnerTitle }, + ]); + } + + public setLoadingProgress(value: number): void { + this.dispatch({ + type: StoreActionType.SET_SPINNER_PROGRESS, + spinnerProgress: value, + }); + } + + public setVolume(volumeSet: VolumeSet, volumeIndex: number, fileName: string): void { + const actions = [ + { type: StoreActionType.SET_FILENAME, fileName }, + { type: StoreActionType.SET_VOLUME_SET, volumeSet }, + { type: StoreActionType.SET_VOLUME_INDEX, volumeIndex }, + { type: StoreActionType.SET_MODE_3D, mode3d: Modes3d.RAYCAST }, + { type: StoreActionType.SET_MODE_VIEW, viewMode: ViewMode.VIEW_2D }, + { type: StoreActionType.SET_PROGRESS, progress: 0 }, + { type: StoreActionType.SET_SPINNER, spinner: false }, + { type: StoreActionType.SET_IS_LOADED, isLoaded: true }, + { type: StoreActionType.SET_ERR_ARRAY, arrErrors: [] }, + ]; + + this.dispatchActions(actions); + } + + public setSingleDicom(volumeSet: VolumeSet, volumeIndex: number, loaderDicom: LoaderDicom | LoaderHdr | undefined): void { + const actions = [ + { type: StoreActionType.SET_VOLUME_SET, volumeSet }, + { type: StoreActionType.SET_LOADER_DICOM, loaderDicom }, + { type: StoreActionType.SET_VOLUME_INDEX, volumeIndex }, + { type: StoreActionType.SET_SPINNER, spinner: false }, + ]; + + this.dispatchActions(actions); + } + + public setDicomLoader(loaderDicom: LoaderDicom): void { + const actions = [ + { type: StoreActionType.SET_LOADER_DICOM, loaderDicom }, + { type: StoreActionType.SET_DICOM_INFO, dicomInfo: loaderDicom.m_dicomInfo }, + ]; + + this.dispatchActions(actions); + } + + public setVolumeLoadFailed(fileName: string, errors: string[]): void { + const actions = [ + { type: StoreActionType.SET_ERR_ARRAY, errors }, + { type: StoreActionType.SET_VOLUME_SET, volume: null }, + { type: StoreActionType.SET_FILENAME, fileName: fileName }, + { type: StoreActionType.SET_PROGRESS, progress: 0 }, + { type: StoreActionType.SET_SPINNER, spinner: false }, + { type: StoreActionType.SET_IS_LOADED, isLoaded: false }, + ]; + + this.dispatchActions(actions); + } +} + +// Create the singleton instance and freeze it +const mriStoreService = new MRIStoreService(); +Object.freeze(mriStoreService); + +export default mriStoreService; diff --git a/src/engine/lib/services/index.ts b/src/engine/lib/services/index.ts new file mode 100644 index 00000000..d5a20c57 --- /dev/null +++ b/src/engine/lib/services/index.ts @@ -0,0 +1,5 @@ +import mriEventsService, { MRIEventsService } from './EventsService'; +import mriLocalStorageService, { MRILocalStorageService } from './LocalStorageService'; +import mriStoreService, { MRIStoreService } from './StoreService'; + +export { mriEventsService, mriLocalStorageService, mriStoreService, MRIEventsService, MRILocalStorageService, MRIStoreService }; diff --git a/src/engine/lib/utils/index.ts b/src/engine/lib/utils/index.ts new file mode 100644 index 00000000..944a376a --- /dev/null +++ b/src/engine/lib/utils/index.ts @@ -0,0 +1 @@ +export * from './url'; diff --git a/src/engine/lib/utils/url.ts b/src/engine/lib/utils/url.ts new file mode 100644 index 00000000..169b9a64 --- /dev/null +++ b/src/engine/lib/utils/url.ts @@ -0,0 +1,59 @@ +/** + * Checks if a given string is a valid URL with http or https protocol. + * @param {string} urlString - The string to be checked. + * @returns {boolean} True if the string is a valid URL, false otherwise. + */ +const isValidUrl = (urlString: string) => { + try { + const url = new URL(urlString); + return url.protocol === 'http:' || url.protocol === 'https:'; + } catch (error) { + return false; + } +}; + +/** + * Extracts the file name from a URL. + * @param {string} url - The URL from which to extract the file name. + * @returns {string} The file name, or an empty string if the URL is invalid. + */ +const getFileNameFromUrl = (url: string) => { + const lastSlashIndex = Math.max(url.lastIndexOf('/'), url.lastIndexOf('\\')); + if (lastSlashIndex < 0) { + console.warn('getFileNameFromUrl: wrong URL!'); + return ''; + } + const strFileName = url.substring(lastSlashIndex + 1); + const MAX_LEN = 40; + return strFileName.length <= MAX_LEN ? strFileName : strFileName.substring(0, MAX_LEN); +}; + +/** + * Extracts the folder name from a URL. + * @param {string} url - The URL from which to extract the folder name. + * @returns {string} The folder name, or an empty string if the URL is invalid. + */ +const getFolderNameFromUrl = (url: string) => { + const lastSlashIndex = Math.max(url.lastIndexOf('/'), url.lastIndexOf('\\')); + if (lastSlashIndex < 0) { + console.warn('getFolderNameFromUrl: wrong URL!'); + return ''; + } + return url.substring(0, lastSlashIndex); +}; + +/** + * Extracts the extension from a URL. + * @param {string} url - The URL from which to extract the extension. + * @returns {string} The extracted extension. + */ +const getExtensionFromUrl = (url: string) => { + const lastDotIndex = url.lastIndexOf('.'); + if (lastDotIndex < 0) { + console.warn('getExtensionFromUrl: No extension found in URL!'); + return ''; + } + return url.slice(lastDotIndex + 1); +}; + +export { isValidUrl, getFileNameFromUrl, getFolderNameFromUrl, getExtensionFromUrl }; diff --git a/src/engine/loaders/FileLoader.js b/src/engine/loaders/FileLoader.js deleted file mode 100644 index bc3c62c6..00000000 --- a/src/engine/loaders/FileLoader.js +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * Common binary file loader - * @module src/demo/engine/loaders/FileLoader - */ - -// ****************************************************************** -// File loader -// ****************************************************************** - -/** Instance habdle for loader */ -let GInstanceFileLoader = null; - -/** Class FileLoader for load binary files */ -export default class FileLoader { - /** Create empty loader - * @param {string} strUrl - URL for loaded file - */ - constructor(strUrl) { - if (!GInstanceFileLoader) { - GInstanceFileLoader = this; - } - /** @property {string} m_url - Urlf ror file being read */ - this.m_url = strUrl; - /** @property {object} m_request - XMLHttpRequest object, used for acees to resource */ - this.m_request = null; - this.readFile = this.readFile.bind(this); - } - - /** Read file - * @param {object} doneCallback - invoked callback - */ - readFile(doneCallback, rejectCallback) { - const METHOD = 'GET'; - this.m_request = new XMLHttpRequest(); - if (!this.m_request) { - console.log('Cant create object request'); - } - if ('withCredentials' in this.m_request) { - // this.m_request.withCredentials = true; - const NEED_ASYNC = true; - this.m_request.open(METHOD, this.m_url, NEED_ASYNC); - // } else if (typeof XDomainRequest !== 'undefined') { - // console.log('HttpRequest: XDomainRequest will be used'); - // this.m_request = new XDomainRequest(); - // this.m_request.open(METHOD, this.m_url); - } else { - this.m_request = null; - console.log('This browser cant support CORS requests'); - return; - } - - this.m_request.responseType = 'arraybuffer'; // "blob" - this.m_request.addEventListener( - 'load', - (event) => { - const arrBuf = event.target.response; - if (arrBuf === null) { - console.log('Bad response type. Expect object type in response.'); - } else if (doneCallback) { - // console.log(`FileFromServer response received. url = ${this.m_url}`); - - // check wrong buffer content - const enc = new TextDecoder('utf-8'); - let sz = arrBuf.byteLength; - if (sz > 4000) { - sz = 4000; - } - const bufHead = arrBuf.slice(0, sz); - const strBuf = enc.decode(bufHead); - if (strBuf.substr(0, 9) === ' { - // console.log(`Error event happend for XMLHttpRequest: loaded = ${event.loaded}, total = ${event.total}`); - const errMsg = `Error accessing file ${this.m_url}`; - rejectCallback(errMsg); - }, - false - ); - - this.m_request.send(); - const RES_FAIL_404 = 404; - if (this.m_request.status === RES_FAIL_404) { - const errMsg = `Cant access url = ${this.m_url}`; - rejectCallback(errMsg); - } - } -} // end class FileLoader diff --git a/src/engine/loaders/FileReader.js b/src/engine/loaders/FileReader.js deleted file mode 100644 index 16b4728a..00000000 --- a/src/engine/loaders/FileReader.js +++ /dev/null @@ -1,904 +0,0 @@ -/* - * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) - * SPDX-License-Identifier: Apache-2.0 - */ - -// import { gzip, ungzip } from 'node-gzip'; -// import UiModalDicomSeries from './UiModalDicomSeries'; - -import React from 'react'; -import zlib from 'zlib'; -import createReadStream from 'filereader-stream'; - -import StoreActionType from '../../store/ActionTypes'; -import ViewMode from '../../store/ViewMode'; -import Modes3d from '../../store/Modes3d'; - -import Volume from '../Volume'; -import VolumeSet from '../VolumeSet'; - -import LoaderHdr from './LoaderHdr'; -import FileTools from './FileTools'; -import LoadResult from '../LoadResult'; -import LoaderDicom from './LoaderDicom'; -import LoaderUrlDicom from './LoaderUrlDicom'; -import LoaderDcmDaikon from './LoaderDcmDaikon'; -import LoaderDcmUrlDaikon from './LoadDcmUrlDiakon'; - -import config from '../../config/config'; - -const NEED_TEXTURE_SIZE_4X = true; -const READ_DICOM_VIA_DAIKON = true; - -class FileReader extends React.Component { - constructor(props) { - super(props); - this.onButtonOpenLocalFileClick = this.onButtonOpenLocalFileClick.bind(this); - this.handleFileSelected = this.handleFileSelected.bind(this); - this.onFileContentReadSingleFile = this.onFileContentReadSingleFile.bind(this); - this.onFileContentReadMultipleDicom = this.onFileContentReadMultipleDicom.bind(this); - this.onFileContentReadMultipleHdr = this.onFileContentReadMultipleHdr.bind(this); - this.setErrorString = this.setErrorString.bind(this); - this.onModalUrlShow = this.onModalUrlShow.bind(this); - this.onModalUrlHide = this.onModalUrlHide.bind(this); - this.onClickLoadUrl = this.onClickLoadUrl.bind(this); - this.callbackReadCompleteUrlKtxNii = this.callbackReadCompleteUrlKtxNii.bind(this); - this.onModalDemoOpenShow = this.onModalDemoOpenShow.bind(this); - this.onModalDemoOpenHide = this.onModalDemoOpenHide.bind(this); - this.onDemoSelected = this.onDemoSelected.bind(this); - this.onModalWindowCWHide = this.onModalWindowCWHide.bind(this); - this.onModalGoogleShow = this.onModalGoogleShow.bind(this); - this.onModalGoogleHide = this.onModalGoogleHide.bind(this); - this.onGoogleSelected = this.onGoogleSelected.bind(this); - this.onModalDicomSeriesHide = this.onModalDicomSeriesHide.bind(this); - this.onDicomSerieSelected = this.onDicomSerieSelected.bind(this); - this.callbackReadProgress = this.callbackReadProgress.bind(this); - this.callbackReadComplete = this.callbackReadComplete.bind(this); - this.callbackReadSingleDicomComplete = this.callbackReadSingleDicomComplete.bind(this); - this.callbackReadMultipleComplete = this.callbackReadMultipleComplete.bind(this); - this.callbackCompleteMultipleDicom = this.callbackCompleteMultipleDicom.bind(this); - - this.m_fileNameOnLoad = ''; - this.m_fileName = ''; - this.m_fileIndex = 0; - this.m_fileReader = null; - this.m_fileSelector = this.buildFileSelector(); - this.m_fileSize = null; - this.state = { - showModalUrl: false, - showModalDemo: false, - showModalGoogle: false, - showModalWindowCW: false, - onLoadCounter: 1, - }; - this.m_volumeSet = null; - this.m_volumeRoi = null; - this.m_updateEnable = true; - this.roiMode = false; - } - - finalizeSuccessLoadedVolume(volSet, fileNameIn) { - const store = this.props; - - console.assert(volSet instanceof VolumeSet, 'finalizeSuccessLoadedVolume: should be VolumeSet'); - console.assert(volSet.getNumVolumes() >= 1, 'finalizeSuccessLoadedVolume: should be more or 1 volume'); - const indexVol = 0; - - const vol = volSet.getVolume(indexVol); - console.assert(vol !== null, 'finalizeSuccessLoadedVolume: should be non zero volume'); - - if (vol.m_dataArray !== null) { - console.log(`success loaded volume from ${fileNameIn}`); - - this.saveFileNameToLocalStorage(fileNameIn); - - if (NEED_TEXTURE_SIZE_4X) { - vol.makeDimensions4x(); - } - // invoke notification - - // send update (repaint) if was loaded prev model - if (store.isLoaded) { - store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: false }); - } - - store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volumeSet: volSet }); - store.dispatch({ type: StoreActionType.SET_VOLUME_INDEX, volumeIndex: 0 }); - store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: true }); - store.dispatch({ type: StoreActionType.SET_FILENAME, fileName: fileNameIn }); - store.dispatch({ type: StoreActionType.SET_ERR_ARRAY, arrErrors: [] }); - store.dispatch({ type: StoreActionType.SET_MODE_VIEW, viewMode: ViewMode.VIEW_2D }); - store.dispatch({ type: StoreActionType.SET_MODE_3D, mode3d: Modes3d.RAYCAST }); - store.dispatch({ type: StoreActionType.SET_SPINNER, spinner: false }); - } - } - - setErrorString(strErr) { - const store = this.props; - const arrErrors = []; - arrErrors.push(strErr); - store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: false }); - store.dispatch({ type: StoreActionType.SET_ERR_ARRAY, arrErrors: arrErrors }); - store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volume: null }); - } - - finalizeFailedLoadedVolume(volSet, fileNameIn, arrErrors) { - console.assert(arrErrors !== undefined); - // invoke notification - const store = this.props; - store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: false }); - store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volume: null }); - store.dispatch({ type: StoreActionType.SET_ERR_ARRAY, arrErrors: arrErrors }); - store.dispatch({ type: StoreActionType.SET_FILENAME, fileName: fileNameIn }); - store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: 0 }); - } - - callbackReadProgress(ratio01) { - // console.log(`callbackReadProgress = ${ratio01}`); - const ratioPrc = Math.floor(ratio01 * 100); - const store = this.props; - console.log('ratioPrc ===================> ' + ratioPrc); - console.log('ratio01 ===================> ' + ratio01); - if (ratioPrc >= 99) { - // console.log(`callbackReadProgress. hide on = ${ratio01}`); - store.dispatch({ - type: StoreActionType.SET_PROGRESS, - progress: 0, - }); - } else { - store.dispatch({ - type: StoreActionType.SET_PROGRESS, - progress: ratioPrc, - }); - } - } // callback progress - - callbackReadComplete(errCode) { - if (errCode === undefined) { - console.log('callbackReadComplete. should be errCode'); - } else { - if (errCode !== LoadResult.SUCCESS) { - const strErr = LoadResult.getResultString(errCode); - this.setErrorString(strErr); - } - } - const store = this.props; - store.dispatch({ - type: StoreActionType.SET_PROGRESS, - progress: 0, - }); - if (errCode === LoadResult.SUCCESS) { - // console.log('callbackReadComplete finished OK'); - this.finalizeSuccessLoadedVolume(this.m_volumeSet, this.m_fileName); - } else { - console.log(`callbackReadComplete failed! reading ${this.m_fileName} file`); - const arrErr = []; - const strErr = LoadResult.getResultString(errCode); - arrErr.push(strErr); - this.finalizeFailedLoadedVolume(this.m_volumeSet, this.m_fileName, arrErr); - } - } - - callbackReadSingleDicomComplete(errCode) { - if (errCode === LoadResult.SUCCESS) { - const store = this.props; - store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volumeSet: this.m_volumeSet }); - store.dispatch({ type: StoreActionType.SET_VOLUME_INDEX, volumeIndex: 0 }); - // save dicom loader to store - store.dispatch({ type: StoreActionType.SET_LOADER_DICOM, loaderDicom: this.m_loader }); - - // show modal: select window center, width - this.setState({ showModalWindowCW: true }); - return; // do nothing immediately after: wait for dialog - } - this.callbackReadComplete(errCode); - } - - callbackReadMultipleComplete(errCode) { - if (errCode !== LoadResult.SUCCESS) { - const strErr = LoadResult.getResultString(errCode); - this.setErrorString(strErr); - } - } - - onFileContentReadSingleFile() { - let strContent = this.m_fileReader.result; - this.onFileReadSingleBuffer(strContent); - console.log(this.onFileReadSingleBuffer(strContent)); - } - - // - // daikon read individual slice from file buffer (one from multiple files) - // strContent is ArrayBuffer - readSliceDicomViaDaikon(fileIndex, fileName, ratioLoad, strContent) { - const loaderDaikon = new LoaderDcmDaikon(); - return loaderDaikon.readSlice(this.m_loader, fileIndex, fileName, strContent); - } // end read single slice via daikon - - // - // based on local file read - // read from string content in this.m_fileReader.result - // - onFileReadSingleBuffer(strContent) { - // daikon read - // strContent is ArrayBuffer - if ((this.m_fileName.endsWith('.dcm') || this.m_fileName.endsWith('.DCM')) && READ_DICOM_VIA_DAIKON) { - const loaderDcm = new LoaderDcmDaikon(); - const store = this.props; - const fileIndex = this.m_fileIndex; - const fileName = this.m_fileName; - this.m_loader = new LoaderDicom(1); - const ret = loaderDcm.readSingleSlice(store, this.m_loader, fileIndex, fileName, strContent); - this.callbackReadSingleDicomComplete(ret); - return ret; - } - - console.log('UiOpenMenu. onFileReadSingleBuffer ...'); - // console.log(`file content = ${strContent.substring(0, 64)}`); - // console.log(`onFileContentRead. type = ${typeof strContent}`); - this.m_volumeSet = new VolumeSet(); - // add empty [0]-th volume in set to read single file - this.m_volumeSet.addVolume(new Volume()); - const callbackProgress = this.callbackReadProgress; - const callbackComplete = this.callbackReadComplete; - const callbackCompleteSingleDicom = this.callbackReadSingleDicomComplete; - - if (this.m_fileName.endsWith('.ktx') || this.m_fileName.endsWith('.KTX')) { - // if read ktx - // debugger; - this.m_volumeSet.readFromKtx(strContent, callbackProgress, callbackComplete); - } else if (this.m_fileName.endsWith('.nii') || this.m_fileName.endsWith('.NII')) { - this.m_volumeSet.readFromNifti(strContent, callbackProgress, callbackComplete); - } else if (this.m_fileName.endsWith('.dcm') || this.m_fileName.endsWith('.DCM')) { - this.m_loader = new LoaderDicom(); - this.m_loader.m_zDim = 1; - this.m_loader.m_numFiles = 1; - this.m_volumeSet.readFromDicom(this.m_loader, strContent, callbackProgress, callbackCompleteSingleDicom); - // save dicomInfo to store - const dicomInfo = this.m_loader.m_dicomInfo; - const sliceInfo = dicomInfo.m_sliceInfo[0]; - sliceInfo.m_fileName = this.m_fileName; - sliceInfo.m_sliceName = 'Slice 0'; - const store = this.props; - store.dispatch({ type: StoreActionType.SET_DICOM_INFO, dicomInfo: dicomInfo }); - } else if (this.m_fileName.endsWith('.hdr') || this.m_fileName.endsWith('.HDR')) { - // readOk = vol.readFromHdrHeader(strContent, callbackProgress, callbackComplete); - console.log(`cant read single hdr file: ${this.m_fileName}`); - // readStatus = LoadResult.BAD_HEADER; - } else if (this.m_fileName.endsWith('.img') || this.m_fileName.endsWith('.IMG')) { - // readOk = vol.readFromHdrImage(strContent, callbackProgress, callbackComplete); - console.log(`cant read single img file: ${this.m_fileName}`); - // readStatus = LoadResult.BAD_HEADER; - } else { - console.log(`onFileContentReadSingleFile: unknown file type: ${this.m_fileName}`); - } - } - - // - // read hdr/img. content is in this.m_fileReader.result - // - onFileContentReadMultipleHdr() { - const VALID_NUM_FILES_2 = 2; - const VALID_NUM_FILES_4 = 4; - if (this.m_numFiles !== VALID_NUM_FILES_2 && this.m_numFiles !== VALID_NUM_FILES_4) { - console.log(`onFileContentReadMultipleHdr: can read ${VALID_NUM_FILES_2} or ${VALID_NUM_FILES_4} files for multiple hdr loader`); - return; - } - - const isHdr = this.m_fileName.endsWith('hdr') || this.m_fileName.endsWith('HDR'); - console.log(`onFileContentReadMultipleHdr: read file ${this.m_fileName}. Ratio=${this.m_fileIndex} / ${this.m_numFiles}`); - this.m_fileIndex++; - const ratioLoad = this.m_fileIndex / this.m_numFiles; - const strContent = this.m_fileReader.result; - // const lenContent = strContent.length; - - if (this.m_fileIndex <= 1) { - // add single volume to set - if (this.m_volumeSet.getNumVolumes() === 0) { - this.m_volumeSet.addVolume(new Volume()); - } - this.callbackReadProgress(0.0); - } - - if (this.m_numFiles === VALID_NUM_FILES_4 && this.m_volumeRoi === null) { - this.m_volumeRoi = new Volume(); - } - - const callbackProgress = null; - const callbackComplete = null; - - const regExpFileName = /([\S]+)\.[\S]+/; - const fnameArr = regExpFileName.exec(this.m_fileName); - const numFN = fnameArr.length; - let detectedMask = false; - let detectedIntensity = false; - if (numFN === 2) { - const fname = fnameArr[1]; - if (fname.endsWith('_mask')) { - detectedMask = true; - } - if (fname.endsWith('_intn')) { - detectedIntensity = true; - } - } - let volDst = this.m_volumeSet.getVolume(0); - if (this.m_fileIndex > VALID_NUM_FILES_2) { - volDst = this.m_volumeRoi; - } - if (detectedIntensity) { - volDst = this.m_volumeSet.getVolume(0); - } - if (detectedMask) { - volDst = this.m_volumeRoi; - this.roiMode = true; - // console.log('mask vol by name'); - if (this.m_numFiles !== VALID_NUM_FILES_4) { - console.log('You need to load 4 files, if one of them has _mask in name'); - return; - } - } - - // read header or image from src files - let readOk; - if (isHdr) { - readOk = this.m_loader.readFromBufferHeader(volDst, strContent, callbackProgress, callbackComplete); - } else { - readOk = this.m_loader.readFromBufferImage(volDst, strContent, callbackProgress, callbackComplete); - } - - // create final volume from readed data - volDst = this.m_volumeSet.getVolume(0); - if (readOk && this.m_fileIndex === this.m_numFiles) { - let ok = false; - if (this.m_numFiles === VALID_NUM_FILES_2) { - ok = this.m_loader.createVolumeFromHeaderAndImage(volDst); - } else if (this.m_numFiles === VALID_NUM_FILES_4) { - // intensity data 16 -> 8 bpp - ok = this.m_loader.createVolumeFromHeaderAndImage(volDst); - if (ok) { - // mix 8 bpp intensity and roi pixels - ok = this.m_loader.createRoiVolumeFromHeaderAndImage(volDst, this.m_volumeRoi); - } - } - this.callbackReadProgress(1.0); - if (!ok) { - this.callbackReadComplete(LoadResult.FAIL); - } else { - this.callbackReadComplete(LoadResult.SUCCESS); - } - } - - // read again new file - if (this.m_fileIndex < this.m_numFiles) { - this.callbackReadProgress(ratioLoad); - this.m_fileReader.onloadend = this.onFileContentReadMultipleHdr; - const file = this.m_files[this.m_fileIndex]; - this.m_fileName = file.name; - this.m_fileReader.readAsArrayBuffer(file); - } - } // on multuple hdr - - // on complete read multuple dicom - callbackCompleteMultipleDicom(errCode) { - if (errCode !== LoadResult.SUCCESS) { - const strErr = LoadResult.getResultString(errCode); - this.setErrorString(strErr); - } - } - - // - // read from string content in this.m_fileReader.result - // - onFileContentReadMultipleDicom() { - // console.log('UiOpenMenu. onFileContentReadMultipleDicom ...'); - const strContent = this.m_fileReader.result; - this.m_fileIndex++; - const ratioLoad = this.m_fileIndex / this.m_numFiles; - // console.log(`onFileContentReadMultipleDicom. r = ${ratioLoad}`); - const callbackProgress = null; - // const callbackComplete = this.callbackReadMultipleComplete; - - if (this.m_fileIndex <= 1) { - // add new volume to volume set on the first slice - const vol = new Volume(); - this.m_volumeSet.addVolume(vol); - // init progress on the first file loading - this.callbackReadProgress(0.0); - } - - // FIX 05/06/2020: read multiple dicom callback complete - // can be invoked with error code - const callbackColmpleteVoid = this.callbackCompleteMultipleDicom; - - let readStatus; - - if (READ_DICOM_VIA_DAIKON) { - readStatus = this.readSliceDicomViaDaikon(this.m_fileIndex - 1, this.m_fileName, ratioLoad, strContent); - } else { - readStatus = this.m_volumeSet.readSingleSliceFromDicom( - this.m_loader, - this.m_fileIndex - 1, - this.m_fileName, - ratioLoad, - strContent, - callbackProgress, - callbackColmpleteVoid - ); - } - - if (readStatus !== LoadResult.SUCCESS) { - console.log('onFileContentReadMultipleDicom. Error read individual file'); - } - if (readStatus === LoadResult.SUCCESS && this.m_fileIndex === this.m_numFiles) { - // setup global vars - const store = this.props; - store.dispatch({ type: StoreActionType.SET_VOLUME_INDEX, volumeIndex: 0 }); - store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volumeSet: this.m_volumeSet }); - - // save dicom loader to store - store.dispatch({ type: StoreActionType.SET_LOADER_DICOM, loaderDicom: this.m_loader }); - // stop show loading progress bar - this.callbackReadProgress(1.0); - this.callbackReadComplete(LoadResult.SUCCESS); - - // show modal: select window center, width - this.setState({ showModalWindowCW: true }); - return; // do nothing immediately after: wait for dialog - } // end if successfully read all files (multiple dicom read) - // read again new file - if (readStatus === LoadResult.SUCCESS) { - if (this.m_fileIndex < this.m_numFiles) { - // print console loading progress - const NUM_PARTS_REPORT = 16; - const STEP_PROGRESS = Math.floor(this.m_numFiles / NUM_PARTS_REPORT); - if (this.m_fileIndex % STEP_PROGRESS === 0) { - // console.log(`onFileContentReadMultipleDicom. Loading completed = ${ratioLoad}`); - this.callbackReadProgress(ratioLoad); - } - - this.m_fileReader.onloadend = this.onFileContentReadMultipleDicom; - const file = this.m_files[this.m_fileIndex]; - this.m_fileName = file.name; - this.m_fileReader.readAsArrayBuffer(file); - } // if still need files - } else { - const arrErr = []; - const strErr = this.props.arrErrors[0]; - arrErr.push(strErr); - this.finalizeFailedLoadedVolume(this.m_volumeSet, this.m_fileName, arrErr); - } // if result is not success - } - - // - // Perform open file after it selected in dialog - handleFileSelected(evt) { - const files = evt.target.files || evt.dataTransfer.files; - - if (!files) { - return; - } - - let numFiles = files.length; - console.log(`UiOpenMenu. Trying to open ${numFiles} files`); - if (numFiles <= 0) { - return; - } - console.log(`UiOpenMenu. handleFileSelected. file[0] = ${files[0].name}`); - // debugger; - console.log('evt = ' + files); - this.m_volumeSet = new VolumeSet(); - if (numFiles === 1) { - const file = files[0]; - this.m_fileName = file.name; - this.m_fileSize = file.size; - console.log('this.m_fileSize ->>>>>>>>>>>>>> ' + this.m_fileSize); - console.log('evt.loaded ->>>>>>>>>>>>>> ' + evt.loaded); - console.log('evt.total ->>>>>>>>>>>>>> ' + evt.total); - - // read gzip - if (this.m_fileName.endsWith('.gz')) { - // here will be result raw buffer - this.m_unzippedBuffer = null; - - // remove last 3 chars form file name string - this.m_fileName = this.m_fileName.slice(0, -3); - - const store = this.props; - - const gunzip = zlib.createGunzip(); - createReadStream(file).pipe(gunzip); - gunzip.on('data', (data) => { - if (this.m_unzippedBuffer == null) { - store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: 0 }); - } else { - const readSize = this.m_unzippedBuffer.length; - const allSize = file.size; - const KOEF_DEFLATE = 0.28; - const ratio100 = Math.floor((readSize * 100.0 * KOEF_DEFLATE) / allSize); - store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: ratio100 }); - } - - // read the data chunk-by-chunk - // data is Uint8Array - const dataSize = data.length; - if (this.m_unzippedBuffer == null) { - // create buffer from first ungzipped data chunk - this.m_unzippedBuffer = new Uint8Array(dataSize); - this.m_unzippedBuffer.set(data, 0); - } else { - // append buffer from 2,3,... ungzipped data chunks - const dataCollectedSize = this.m_unzippedBuffer.length; - const arrNew = new Uint8Array(dataCollectedSize + dataSize); - arrNew.set(this.m_unzippedBuffer, 0); - arrNew.set(data, dataCollectedSize); - this.m_unzippedBuffer = arrNew; - } - }); - gunzip.on('close', () => { - console.log('gzip on close'); - }); - - gunzip.on('end', () => { - store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: 0 }); - // now all chunks are read. Need to check raw ungzipped buffer - const sizeBuffer = this.m_unzippedBuffer.length; - if (sizeBuffer < 128) { - console.log('Too small ungzipped data: ' + sizeBuffer.toString() + " bytes. can't read volume data"); - return; - } - // check correct nifti header after extract raw bytes from gzip - const headTemplate = [0x00, 0x00, 0x01, 0x5c]; - let correctHead0 = true; - for (let i = 0; i < 4; i++) { - if (this.m_unzippedBuffer[i] !== headTemplate[i]) { - correctHead0 = false; - } - } - let correctHead1 = true; - for (let i = 0; i < 4; i++) { - if (this.m_unzippedBuffer[i] !== headTemplate[3 - i]) { - correctHead1 = false; - } - } - if (!correctHead0 && !correctHead1) { - console.log('Wrong nifi header, cant read gzipped file'); - return; - } - console.log('ungzip done with ' + sizeBuffer.toString() + ' bytes. Correct nifti header detected'); - // process raw data buffer - this.onFileReadSingleBuffer(this.m_unzippedBuffer); - }); - return; - } // if gzipped file - this.m_fileReader = new window.FileReader(); - - const progressHandler = ({ loaded, total }) => { - this.callbackReadProgress(loaded / total); - }; - - console.log(this.m_fileReader); - - this.m_fileReader.addEventListener('progress', progressHandler); - this.m_fileReader.onloadend = this.onFileContentReadSingleFile; - this.m_fileReader.readAsArrayBuffer(file); - } else { - // not single file was open - this.m_files = Array.from(files); // FileList -> Array - this.m_fileIndex = 0; - this.m_numFiles = numFiles; - this.m_fileReader = new window.FileReader(); - // if multiple files, create Dicom loader - this.m_loader = null; - if (files[0].name.endsWith('.dcm')) { - // remove non-dcm files - let numFilesNew = 0; - for (let i = numFiles - 1; i >= 0; i--) { - if (this.m_files[i].name.endsWith('.dcm')) { - numFilesNew++; - } else { - this.m_files.splice(i, 1); - } - } - numFiles = numFilesNew; - this.m_numFiles = numFilesNew; - - this.m_loader = new LoaderDicom(numFiles); - const dicomInfo = this.m_loader.m_dicomInfo; - - // save dicomInfo to store - const store = this.props; - store.dispatch({ type: StoreActionType.SET_DICOM_INFO, dicomInfo: dicomInfo }); - - // save dicom loader to store - store.dispatch({ type: StoreActionType.SET_LOADER_DICOM, loaderDicom: this.m_loader }); - - this.m_fileReader.onloadend = this.onFileContentReadMultipleDicom; - } else if (files[0].name.endsWith('.hdr') || files[0].name.endsWith('.img')) { - this.m_loader = new LoaderHdr(numFiles); - this.m_fileReader.onloadend = this.onFileContentReadMultipleHdr; - } - - //const vol = new Volume(); - //this.m_volume = vol; - this.m_volumeRoi = null; - - const file = files[0]; - this.m_fileName = file.name; - this.m_fileReader.readAsArrayBuffer(file); - } // if event is not empty - } - - buildFileSelector() { - const fileSelector = document.createElement('input'); - fileSelector.setAttribute('type', 'file'); - fileSelector.setAttribute('hidden', 'true'); - fileSelector.setAttribute('accept', '.txt,.ktx,.dcm,.nii,.hdr,.h,.img,.gz'); - fileSelector.setAttribute('multiple', 'true'); - document.body.appendChild(fileSelector); - fileSelector.onchange = this.handleFileSelected; - return fileSelector; - } - - onButtonOpenLocalFileClick(evt) { - // console.log('onButtonLocalFile started'); - // debugger; - evt.preventDefault(); - this.m_fileSelector.click(); - } - - // - onModalUrlShow() { - console.log(`onModalUrlShow`); - this.setState({ showModalUrl: true }); - } - - onModalUrlHide() { - console.log(`onModalUrlHide`); - this.setState({ showModalUrl: false }); - } - - callbackReadCompleteUrlKtxNii(codeResult) { - if (codeResult !== LoadResult.SUCCESS) { - console.log(`onCompleteFromUrlKtx. Bad result: ${codeResult}`); - - const arrErrors = []; - const strErr = LoadResult.getResultString(codeResult); - arrErrors.push(strErr); - this.finalizeFailedLoadedVolume(this.m_volumeSet, this.m_fileName, arrErrors); - } else { - this.finalizeSuccessLoadedVolume(this.m_volumeSet, this.m_fileName); - this.callbackReadComplete(LoadResult.SUCCESS, null, 0, null); - } - } - - loadFromUrl(strUrl) { - if (FileTools.isValidUrl(strUrl)) { - this.m_url = strUrl; - - this.m_fileName = FileTools.getFileNameFromUrl(strUrl); - this.m_volumeSet = new VolumeSet(); - this.m_volumeSet.addVolume(new Volume()); - - if (strUrl.endsWith('.ktx')) { - // debugger; - const callbackProgress = this.callbackReadProgress; - const callbackComplete = this.callbackReadCompleteUrlKtxNii; - this.callbackReadProgress(0.0); - // debugger; - this.m_volumeSet.readFromKtxUrl(strUrl, callbackProgress, callbackComplete); - // if KTX - } else if (strUrl.endsWith('.nii')) { - const callbackProgress = this.callbackReadProgress; - const callbackComplete = this.callbackReadCompleteUrlKtxNii; - this.callbackReadProgress(0.0); - this.m_volumeSet.readFromNiiUrl(strUrl, callbackProgress, callbackComplete); - // if NII (Nifti format) - } else if (strUrl.endsWith('.dcm')) { - if (READ_DICOM_VIA_DAIKON) { - const loaderUrlDcm = new LoaderDcmUrlDaikon(); - return loaderUrlDcm.readFromUrl(this.m_volumeSet, strUrl, this.callbackReadCompleteUrlKtxNii, this.callbackReadProgress); - } - - const callbackProgress = this.callbackReadProgress; - const callbackComplete = this.callbackReadCompleteUrlKtxNii; - this.callbackReadProgress(0.0); - this.m_volumeSet.readFromDicomUrl(strUrl, callbackProgress, callbackComplete); - // if Dicom - } else if (strUrl.endsWith('.hdr')) { - const callbackProgress = this.callbackReadProgress; - const callbackComplete = this.callbackReadCompleteUrlKtxNii; - this.callbackReadProgress(0.0); - this.m_volumeSet.readFromHdrUrl(strUrl, callbackProgress, callbackComplete); - // if Hdr - } else { - console.log(`UiOpenMenu. Unknown file type from URL = ${strUrl}`); - } - } else { - const strErr = `UiOpenMenu. Bad URL = ${strUrl}`; - console.log(strErr); - this.setErrorString(strErr); - } - } - - onClickLoadUrl(strUrl) { - this.setState({ showModalUrl: false }); - console.log(`onClickLoadUrl with strUrl = ${strUrl}`); - this.loadFromUrl(strUrl); - } - - // - onModalDemoOpenShow() { - this.setState({ showModalDemo: true }); - } - - onModalDemoOpenHide() { - this.setState({ showModalDemo: false }); - } - - // - arrNumToStr(arrNums) { - const numLet = arrNums.length; - let str = ''; - for (let i = 0; i < numLet; i++) { - const n = arrNums[i]; - str = str.concat(String.fromCharCode(n)); - } - return str; - } - - onModalGoogleShow() { - this.setState({ showModalGoogle: true }); - } - - onModalGoogleHide() { - this.setState({ showModalGoogle: false }); - } - - onGoogleSelected(index) { - // perform action on click i-th item in Google cloud menu . Or remove this menu completely - console.log(`onGoogleSelected(${index}) ... `); - } - - onDemoSelected(index) { - const store = this.props; - store.dispatch({ - type: StoreActionType.SET_PROGRESS, - progress: 0, - }); - store.dispatch({ type: StoreActionType.SET_SPINNER, spinner: true }); - const arr = config.demoUrls; - if (arr.length >= 8) { - const fileName = arr[index]; - console.log(`onDemoSelected: load file ${fileName}, config[ ${index} ]`); - this.loadFromUrl(fileName); - return; - } - - const DEMO_URL = 'https://daentjnvnffrh.cloudfront.net/demo/'; - - let fileName = - DEMO_URL + - [ - '01_lungs/20101108.ktx', - '02_brain_set/brain256.ktx', - '03_grandmother_gm3/gm3_512_512_165.nii', - '04_woman_pelvis/file_list.txt', - '05_lungs_00cba/file_list.txt', - '06_ct_256/ct_256_256_256.ktx', - '07_lungs_256/lungs_256_256_256.ktx', - '08_brain_with_roi/set_intn.hdr', - ][index] || console.log(`onDemoSelected. not implemented for index = ${index}`); - - if (fileName === '04_woman_pelvis/file_list.txt') { - const numUrls = config.demoWomanPelvisUrls.length; - if (numUrls > 0) { - const strPrefix = config.demoWomanPelvisPrefix; - // console.log(`config. prefix = ${strPrefix}`); - const arrFileNames = []; - for (let i = 0; i < numUrls; i++) { - const strFn = config.demoWomanPelvisUrls[i]; - const url = `${strPrefix}${strFn}`; - arrFileNames.push(url); - } - const store = this.props; - const loader = new LoaderUrlDicom(store); - const GOOGLE_HEADER = false; - loader.loadFromUrlArray(arrFileNames, GOOGLE_HEADER); - return; - } - } - if (fileName === '05_lungs_00cba/file_list.txt') { - const numUrls = config.demoLungsUrls.length; - if (numUrls > 0) { - const strPrefix = config.demoLungsPrefix; - const arrFileNames = []; - for (let i = 0; i < numUrls; i++) { - const strFn = config.demoLungsUrls[i]; - const url = `${strPrefix}${strFn}`; - arrFileNames.push(url); - } - const store = this.props; - const loader = new LoaderUrlDicom(store); - const GOOGLE_HEADER = false; - loader.loadFromUrlArray(arrFileNames, GOOGLE_HEADER); - return; - } - } - if (fileName.length > 0) { - console.log(`onDemoSelected. enc = ${fileName}`); - this.loadFromUrl(fileName); - } - } - - // - shouldComponentUpdate() { - return true; - } - - onModalDicomSeriesHide() { - const arrEmpty = []; - const store = this.props; - store.dispatch({ type: StoreActionType.SET_DICOM_SERIES, dicomSeries: arrEmpty }); - } - - onDicomSerieSelected(indexSelected) { - const store = this.props; - const series = store.dicomSeries; - const serieSelected = series[indexSelected]; - const hash = serieSelected.m_hash; - this.m_loader.createVolumeFromSlices(this.m_volumeSet, indexSelected, hash); - this.finalizeSuccessLoadedVolume(this.m_volumeSet, this.m_fileName); - console.log(`onFileContentReadMultipleDicom read all ${this.m_numFiles} files`); - - // clear modal - store.dispatch({ type: StoreActionType.SET_DICOM_SERIES, dicomSeries: [] }); - } - - // - onModalWindowCWHide(needShow) { - this.setState({ showModalWindowCW: false }); - if (needShow) { - this.finalizeSuccessLoadedVolume(this.m_volumeSet, this.m_fileName); - // setup dicom series (volumes info) for global store: select volume later - const store = this.props; - let series = null; - if (this.m_loader !== undefined) { - series = this.m_loader.m_slicesVolume.getSeries(); - store.dispatch({ type: StoreActionType.SET_DICOM_SERIES, dicomSeries: series }); - } - // update graphics 2d window - const gra = store.graphics2d; - if (gra !== null) { - gra.forceUpdate(); - } - } - } - - saveFileNameToLocalStorage(fileName) { - const RECENT_FILES_KEY = 'recentFiles'; - const arrRecentFiles = JSON.parse(localStorage.getItem(RECENT_FILES_KEY)) || []; - - if (!arrRecentFiles.find((recentFile) => recentFile.fileName === fileName)) { - // Set only unique file name - const limitedRecentFiles = arrRecentFiles.slice(0, 2); - localStorage.setItem(RECENT_FILES_KEY, JSON.stringify([{ fileName: fileName, timestamp: Date.now() }, ...limitedRecentFiles])); - } - } - - // - // invoked after render - // - componentDidMount() { - this.m_fileSelector = this.buildFileSelector(); - const fileNameOnLoad = this.m_fileNameOnLoad; - // console.log(`UiOpenMenu. componentDidMount. fnonl = ${fileNameOnLoad}`); - if (fileNameOnLoad.length > 0 && this.state.onLoadCounter > 0) { - this.setState({ onLoadCounter: 0 }); - const TIMEOUT_MS = 50; - // debugger; - setTimeout(this.loadFromUrl(fileNameOnLoad), TIMEOUT_MS); - } - } -} - -export default FileReader; diff --git a/src/engine/loaders/FileTools.js b/src/engine/loaders/FileTools.js deleted file mode 100644 index cfb34d2a..00000000 --- a/src/engine/loaders/FileTools.js +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) - * SPDX-License-Identifier: Apache-2.0 - */ - -class FileTools { - static isValidUrl(string) { - let url; - - try { - url = new URL(string); - } catch (_) { - return false; - } - - return url.protocol === 'http:' || url.protocol === 'https:'; - } - - static getFileNameFromUrl(strUrl) { - let idx = strUrl.lastIndexOf('/'); - if (idx < 0) { - idx = strUrl.lastIndexOf('\\'); - } - if (idx < 0) { - console.log('getFileNameFromUrl: wrong URL!'); - return ''; - } - let strFileName = strUrl.substring(idx + 1); - const MAX_LEN = 40; - strFileName = strFileName.length <= MAX_LEN ? strFileName : strFileName.substring(0, MAX_LEN); - return strFileName; - } - - static getFolderNameFromUrl(strUrl) { - let idx = strUrl.lastIndexOf('/'); - if (idx < 0) { - idx = strUrl.lastIndexOf('\\'); - } - if (idx < 0) { - console.log('getFolderNameFromUrl: wrong URL!'); - return ''; - } - return strUrl.substring(0, idx); - } -} -export default FileTools; diff --git a/src/engine/loaders/LoadDcmUrlDiakon.js b/src/engine/loaders/LoadDcmUrlDiakon.js deleted file mode 100644 index 78259f85..00000000 --- a/src/engine/loaders/LoadDcmUrlDiakon.js +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) - * SPDX-License-Identifier: Apache-2.0 - */ - -// -// -// - -// ********************************************** -// Import -// ********************************************** - -import VolumeSet from '../VolumeSet'; -import LoadResult from '../LoadResult'; -import FileTools from './FileTools'; -import FileLoader from './FileLoader'; -import LoaderDcmDaikon from './LoaderDcmDaikon'; -import LoaderDicom from './LoaderDicom'; -// import DicomSlicesVolume from './dicomslicesvolume'; - -// ********************************************** -// Const -// ********************************************** - -const DEBUG_PRINT_TAGS_INFO = false; - -// ********************************************** -// Class -// ********************************************** - -class LoaderDcmUrlDaikon { - constructor() { - this.m_loaderDaikon = new LoaderDcmDaikon(); - this.readReadyFileList = this.readReadyFileList.bind(this); - } - - readFromUrl(volSet, strUrl, callbackComplete, callbackProgress) { - // check arguments - console.assert(volSet != null, 'Null volume'); - console.assert(volSet instanceof VolumeSet, 'Should be volume set'); - console.assert(strUrl != null, 'Null string url'); - console.assert(typeof strUrl === 'string', 'Should be string in url'); - - if (!FileTools.isValidUrl(strUrl)) { - console.log(`readFromUrl: not vaild URL = = ${strUrl} `); - return false; - } - this.m_folder = FileTools.getFolderNameFromUrl(strUrl); - const urlFileList = this.m_folder + '/file_list.txt'; - console.log(`readFromUrl: load file = ${urlFileList} `); - - callbackProgress(0.0); - - const fileLoader = new FileLoader(urlFileList); - this.m_fileListCounter = 0; - fileLoader.readFile( - (arrBuf) => { - this.m_fileListCounter += 1; - if (this.m_fileListCounter === 1) { - const okRead = this.readReadyFileList(volSet, arrBuf, callbackComplete, callbackProgress); - return okRead; - } - return true; - }, - (errMsg) => { - console.log(`Error read file: ${errMsg}`); - // callbackComplete(LoadResult.ERROR_CANT_OPEN_URL, null, 0, null); - return false; - } - ); // get file from server - return true; - } // end read from url - - // - readReadyFileList(volSet, arrBuf, callbackComplete, callbackProgress) { - const uint8Arr = new Uint8Array(arrBuf); - const strFileContent = String.fromCharCode.apply(null, uint8Arr); - - const LEN_LOG = 64; - const strLog = strFileContent.substr(0, LEN_LOG); - console.log(`Loaded file list. Started with: ${strLog} ...`); - - const arrFileNames = strFileContent.split('\n'); - - let numFiles = arrFileNames.length; - // check last empty elements - const MIN_FILE_NAME_SIZE = 4; - for (let i = numFiles - 1; i >= 0; i--) { - if (arrFileNames[i].endsWith('\r')) { - arrFileNames[i] = arrFileNames[i].substring(0, arrFileNames[i].length - 1); - } - if (arrFileNames[i].length < MIN_FILE_NAME_SIZE) { - arrFileNames.pop(); - } - } - numFiles = arrFileNames.length; - this.m_loaders = []; - this.m_errors = []; - // declare slices array - for (let i = 0; i < numFiles; i++) { - // this.m_slices[i] = null; - this.m_errors[i] = -1; - this.m_loaders[i] = null; - } - - const zDim = numFiles; - console.log(`Loaded file list. ${numFiles} files will be loaded. 1st file in list is = ${arrFileNames[0]}`); - console.log(`Loaded file list. Last file in list is = ${arrFileNames[numFiles - 1]}`); - - this.m_loaderDaikon.m_loaderDicom = new LoaderDicom(numFiles); - - // physical dimension - this.m_loaderDaikon.m_loaderDicom.m_pixelSpacing = { - x: 0.0, - y: 0.0, - z: 0.0, - }; - this.m_boxSize = { - x: 1.0, - y: 1.0, - z: 1.0, - }; - this.m_filesLoadedCounter = 0; - this.m_numFailsLoad = 0; - this.m_numLoadedFiles = numFiles; - - this.m_loaderDaikon.m_loaderDicom.m_imagePosMin = { - // eslint-disable-next-line - x: +1.0e12, - // eslint-disable-next-line - y: +1.0e12, - // eslint-disable-next-line - z: +1.0e12, - }; - this.m_loaderDaikon.m_loaderDicom.m_imagePosMax = { - // eslint-disable-next-line - x: -1.0e12, - // eslint-disable-next-line - y: -1.0e12, - // eslint-disable-next-line - z: -1.0e12, - }; - - // eslint-disable-next-line - this.m_loaderDaikon.m_sliceLocMin = +1.0e12; - // eslint-disable-next-line - this.m_loaderDaikon.m_sliceLocMax = -1.0e12; - - for (let i = 0; i < this.m_numLoadedFiles && this.m_numFailsLoad < 1; i++) { - const urlFile = `${this.m_folder}/${arrFileNames[i]}`; - // console.log(`trying read file ${urlFile} from web`); - - this.m_loaders[i] = new FileLoader(urlFile); - const loader = this.m_loaders[i]; - loader.readFile((fileArrBu) => { - const ratioLoaded = this.m_filesLoadedCounter / this.m_numLoadedFiles; - const VAL_MASK = 7; - if (callbackProgress !== undefined && (this.m_filesLoadedCounter & VAL_MASK) === 0) { - //console.log(`LoadDcmUrlDaikon. Progress = ${ratioLoaded}`); - callbackProgress(ratioLoaded); - } - //if ((callbackProgress !== undefined) && - // (this.m_filesLoadedCounter + 1 === this.m_numLoadedFiles)) { - // callbackProgress(1.0); - //} - const ret = this.m_loaderDaikon.loadSingleSlice(i, urlFile, fileArrBu); - if (ret !== LoadResult.SUCCESS) { - return ret; - } - // console.log(`LoadDcmUrlDaikon. Loaded/All = ${this.m_filesLoadedCounter} / ${this.m_numLoadedFiles}`); - this.m_filesLoadedCounter += 1; - if (this.m_filesLoadedCounter === this.m_numLoadedFiles) { - // Finalize physic dimension - if (DEBUG_PRINT_TAGS_INFO) { - console.log(`slice location (min, max) = ${this.m_sliceLocMin}, ${this.m_sliceLocMax}`); - } - const imagePosBox = { - x: this.m_loaderDaikon.m_loaderDicom.m_imagePosMax.x - this.m_loaderDaikon.m_loaderDicom.m_imagePosMin.x, - y: this.m_loaderDaikon.m_loaderDicom.y - this.m_loaderDaikon.m_loaderDicom.m_imagePosMin.y, - z: this.m_loaderDaikon.m_loaderDicom.m_imagePosMax.z - this.m_loaderDaikon.m_loaderDicom.m_imagePosMin.z, - }; - const TOO_MIN = 0.00001; - let zBox; - if (Math.abs(this.m_loaderDaikon.m_loaderDicom.m_pixelSpacing.z) > TOO_MIN) { - zBox = this.m_loaderDaikon.m_loaderDicom.m_pixelSpacing.z * zDim; - } else { - zBox = imagePosBox.z; - if (Math.abs(zBox) < TOO_MIN) { - zBox = imagePosBox.x; - if (Math.abs(zBox) < TOO_MIN) { - zBox = imagePosBox.y; - } - } - } // if pixel spacing 0 - if (zBox < TOO_MIN) { - zBox = 1.0; - } - const xDim = this.m_loaderDaikon.m_loaderDicom.m_xDim; - const yDim = this.m_loaderDaikon.m_loaderDicom.m_yDim; - - this.m_loaderDaikon.m_loaderDicom.m_pixelSpacing.z = zBox / zDim; - this.m_boxSize.z = zDim * this.m_loaderDaikon.m_loaderDicom.m_pixelSpacing.z; - this.m_boxSize.x = xDim * this.m_loaderDaikon.m_loaderDicom.m_pixelSpacing.x; - this.m_boxSize.y = yDim * this.m_loaderDaikon.m_loaderDicom.m_pixelSpacing.y; - console.log(`LoadDcmUrlDaikon. Volume local phys dim: ${this.m_boxSize.x} * ${this.m_boxSize.y} * ${this.m_boxSize.z}`); - - // TODO: add hash - let series = this.m_loaderDaikon.m_loaderDicom.m_slicesVolume.getSeries(); - if (series.length === 0) { - this.m_loaderDaikon.m_loaderDicom.m_slicesVolume.buildSeriesInfo(); - series = this.m_loaderDaikon.m_loaderDicom.m_slicesVolume.getSeries(); - } - const indexSerie = 0; - const hash = series[indexSerie].m_hash; - const errStatus = this.m_loaderDaikon.m_loaderDicom.createVolumeFromSlices(volSet, indexSerie, hash); - if (callbackProgress !== null) { - callbackProgress(1.0); - } - - if (callbackComplete !== null) { - callbackComplete(errStatus); - return true; - } - } // if last file - }); // file buffer is ready to parse - } // for i all files - - return LoadResult.SUCCESS; - } // end readReadyFileList -} // end class LoaderDcmUrlDaikon - -export default LoaderDcmUrlDaikon; diff --git a/src/engine/loaders/LoadPromise.js b/src/engine/loaders/LoadPromise.js deleted file mode 100644 index 0226bc01..00000000 --- a/src/engine/loaders/LoadPromise.js +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) - * SPDX-License-Identifier: Apache-2.0 - */ - -/** -/** -* File load from local disk or URL with promise to complete -* @module demo/engine.loaders/loadpromise -*/ - -// ****************************************************************** -// class LoadFilePromise -// ****************************************************************** - -/** Class LoadFilePromise implements local and remote (via URL) file reading functionality via Promises */ -export default class LoadFilePromise { - constructor() { - this.m_file = null; - this.m_reader = null; - this.m_request = null; - } - - /** - * Read local file. If success, invoke resolve callback for created promise - * - * @param {object} file - file to read - * @return {object} Promise, working after file will be read - */ - readLocal(file) { - return new Promise((resolve) => { - this.m_file = file; - this.m_reader = new FileReader(); - this.m_reader.addEventListener('load', (evt) => { - const arrBuf = evt.target.result; - if (resolve) { - resolve(arrBuf); - } - }); - this.m_reader.readAsArrayBuffer(this.m_file); - }); - } - - /** - * Read remote file (via promise). If success, invoke resolve callback for created promise - * - * @param {string} url - file to read - * @return {object} Promise, working after file will be read - */ - readFromUrl(url) { - return new Promise((resolve, reject) => { - this.m_url = url; - this.m_request = null; - const METHOD = 'GET'; - this.m_request = new XMLHttpRequest(); - if ('withCredentials' in this.m_request) { - // this.m_request.withCredentials = true; - const NEED_ASYNC = true; - this.m_request.open(METHOD, this.m_url, NEED_ASYNC); - // } else if (typeof XDomainRequest !== 'undefined') { - // console.log('HttpRequest: XDomainRequest will be used'); - // this.m_request = new XDomainRequest(); - // this.m_request.open(METHOD, this.m_url); - } else { - this.m_request = null; - console.log('This browser cant support CORS requests'); - return; - } - this.m_request.responseType = 'arraybuffer'; // "blob" - this.m_request.addEventListener( - 'load', - (event) => { - const arrBuf = event.target.response; - if (arrBuf === null) { - console.log('Bad response type. Expect object type in response.'); - } else { - resolve(arrBuf); - } - }, - false - ); - - this.m_request.addEventListener( - 'error', - (event) => { - const strError = `Error event happend for XMLHttpRequest: loaded = ${event.loaded}, total = ${event.total}`; - console.log(strError); - reject(strError); - }, - false - ); - this.m_request.send(); - }); - } -} diff --git a/src/engine/loaders/LoaderDcmDaikon.js b/src/engine/loaders/LoaderDcmDaikon.js index c9265217..172512d0 100644 --- a/src/engine/loaders/LoaderDcmDaikon.js +++ b/src/engine/loaders/LoaderDcmDaikon.js @@ -374,7 +374,7 @@ class LoaderDcmDaikon { const tagSLT = image.tags[ind]; if (tagSLT !== undefined) { let arrThick = tagSLT.value; - if (arrThick.length === 1) { + if (arrThick && arrThick.length === 1) { this.m_loaderDicom.m_pixelSpacing.z = parseFloat(arrThick[0]); } // console.log('val pad = ' + valPad); diff --git a/src/engine/loaders/LoaderDicom.js b/src/engine/loaders/LoaderDicom.js index e3ea110d..1cd66c1d 100644 --- a/src/engine/loaders/LoaderDicom.js +++ b/src/engine/loaders/LoaderDicom.js @@ -26,8 +26,6 @@ import DicomSlice from './dicomslice'; import DicomSlicesVolume from './dicomslicesvolume'; import DicomSliceInfo from './dicomsliceinfo'; import DicomTagInfo from './dicomtaginfo'; -import FileTools from './FileTools'; -import FileLoader from './FileLoader'; // import Volume from '../Volume'; import VolumeSet from '../VolumeSet'; @@ -38,7 +36,6 @@ import Volume from '../Volume'; // ******************************************************** const DEBUG_PRINT_TAGS_INFO = false; -const DEBUG_PRINT_INDI_SLICE_INFO = false; const NEED_SCAN_EMPTY_BORDER = false; const NEED_APPLY_GAUSS_SMOOTHING = false; @@ -235,8 +232,6 @@ class LoaderDicom { this.m_sliceLocMin = +1.0e12; // eslint-disable-next-line this.m_sliceLocMax = -1.0e12; - - this.runLoader = this.runLoader.bind(this); } getBoxSize() { return this.m_boxSize; @@ -1865,238 +1860,6 @@ class LoaderDicom { } return LoadResult.SUCCESS; } // end readFromBuffer - - readFromUrl(volSet, strUrl, callbackProgress, callbackComplete) { - // check arguments - console.assert(volSet != null, 'Null volume'); - console.assert(volSet instanceof VolumeSet, 'Should be volume set'); - console.assert(strUrl != null, 'Null string url'); - - // console.log(`typeof(strUrl) - ${typeof(strUrl)}`); - console.assert(typeof strUrl === 'string', 'Should be string in url'); - - if (!FileTools.isValidUrl(strUrl)) { - console.log(`readFromUrl: not vaild URL = = ${strUrl} `); - return false; - } - this.m_folder = FileTools.getFolderNameFromUrl(strUrl); - const urlFileList = this.m_folder + '/file_list.txt'; - console.log(`readFromUrl: load file = ${urlFileList} `); - - const fileLoader = new FileLoader(urlFileList); - this.m_callbackComplete = callbackComplete; - this.m_callbackProgress = callbackProgress; - this.m_fileListCounter = 0; - fileLoader.readFile( - (arrBuf) => { - this.m_fileListCounter += 1; - if (this.m_fileListCounter === 1) { - const okRead = this.readReadyFileList(volSet, arrBuf, callbackProgress, callbackComplete); - return okRead; - } - return true; - }, - (errMsg) => { - console.log(`Error read file: ${errMsg}`); - callbackComplete(LoadResult.ERROR_CANT_OPEN_URL, null, 0, null); - return false; - } - ); // get file from server - return true; - } - readReadyFileList(volSet, arrBuf, callbackProgress, callbackComplete) { - // check arguments - console.assert(volSet != null, 'Null volume'); - console.assert(volSet instanceof VolumeSet, 'Should be volume set'); - console.assert(arrBuf != null, 'Null array'); - console.assert(arrBuf.constructor.name === 'ArrayBuffer', 'Should be ArrayBuf in arrBuf'); - - const uint8Arr = new Uint8Array(arrBuf); - // const strFileContent = new TextDecoder('utf-8').decode(uint8Arr); - const strFileContent = String.fromCharCode.apply(null, uint8Arr); - - const LEN_LOG = 64; - const strLog = strFileContent.substr(0, LEN_LOG); - console.log(`Loaded file list. Started with: ${strLog} ...`); - - const arrFileNames = strFileContent.split('\n'); - - let numFiles = arrFileNames.length; - // check last empty elements - const MIN_FILE_NAME_SIZE = 4; - for (let i = numFiles - 1; i >= 0; i--) { - if (arrFileNames[i].endsWith('\r')) { - arrFileNames[i] = arrFileNames[i].substring(0, arrFileNames[i].length - 1); - } - if (arrFileNames[i].length < MIN_FILE_NAME_SIZE) { - arrFileNames.pop(); - } - } - numFiles = arrFileNames.length; - - this.m_zDim = numFiles; - console.log(`Loaded file list. ${numFiles} files will be loaded. 1st file in list is = ${arrFileNames[0]}`); - console.log(`Loaded file list. Last file in list is = ${arrFileNames[numFiles - 1]}`); - - // declare slices array - for (let i = 0; i < numFiles; i++) { - // this.m_slices[i] = null; - this.m_errors[i] = -1; - this.m_loaders[i] = null; - } - - // physical dimension - this.m_pixelSpacing = { - x: 0.0, - y: 0.0, - z: 0.0, - }; - this.m_filesLoadedCounter = 0; - this.m_numFailsLoad = 0; - this.m_numLoadedFiles = numFiles; - - this.m_imagePosMin = { - // eslint-disable-next-line - x: +1.0e12, - // eslint-disable-next-line - y: +1.0e12, - // eslint-disable-next-line - z: +1.0e12, - }; - this.m_imagePosMax = { - // eslint-disable-next-line - x: -1.0e12, - // eslint-disable-next-line - y: -1.0e12, - // eslint-disable-next-line - z: -1.0e12, - }; - - // eslint-disable-next-line - this.m_sliceLocMin = +1.0e12; - // eslint-disable-next-line - this.m_sliceLocMax = -1.0e12; - - for (let i = 0; i < this.m_numLoadedFiles && this.m_numFailsLoad < 1; i++) { - const urlFile = `${this.m_folder}/${arrFileNames[i]}`; - // console.log(`Loading (${i})-th url: ${urlFile}`); - this.m_loaders[i] = new FileLoader(urlFile); - const loader = this.m_loaders[i]; - const NOT_FROM_GOOGLE = false; - // let volDst = volSet.getVolume(0); - //if (volDst === null) { - // volDst = new Volume(); - // volSet.addVolume(volDst); - // } - const okLoader = this.runLoader(volSet, arrFileNames[i], loader, i, callbackProgress, callbackComplete, NOT_FROM_GOOGLE); - if (!okLoader) { - return false; - } - } // for i all files-slices in folder - return true; - } // end readReadyFileList(arrBuf) - /** - * Run loader to read dicom file - * @param {object} volSet - destination volum set - * @param {string} fileName - File to read - * @param {object} loader - loader object with file inside - * @param {number} i - index of file in files array - * @param {func} callbackProgress - callback for continiuos load reporting - * @param {func} callbackComplete - callback after load finish - * @param {bool} fromGoogle - true, if from google store - * - */ - runLoader(volSet, fileName, loader, i, callbackProgress, callbackComplete, fromGoogle) { - this.m_fromGoogle = fromGoogle; - // console.log(`Loading url: ${fileName}`); - loader.readFile( - (fileArrBu) => { - const ratioLoaded = this.m_filesLoadedCounter / this.m_numLoadedFiles; - const VAL_MASK = 7; - if (callbackProgress !== undefined && (this.m_filesLoadedCounter & VAL_MASK) === 0) { - callbackProgress(ratioLoaded); - } - if (callbackProgress !== undefined && this.m_filesLoadedCounter + 1 === this.m_numLoadedFiles) { - callbackProgress(1.0); - } - this.m_newTagEvent.detail.fileName = fileName; - - let status; - if (this.m_fromGoogle) { - status = this.readFromGoogleBuffer(i, fileName, ratioLoaded, fileArrBu, callbackProgress, callbackComplete); - } else { - status = this.readFromBuffer(i, fileName, ratioLoaded, fileArrBu, callbackProgress, callbackComplete); - } - - if (status !== LoadResult.SUCCESS && this.m_numFailsLoad === 0) { - this.m_numFailsLoad += 1; - if (callbackComplete !== null) { - callbackComplete(status, null, 0, null, fileName); - return false; - } - } - // update total files counter - this.m_filesLoadedCounter += 1; - if (DEBUG_PRINT_INDI_SLICE_INFO) { - console.log(`Loaded local indi slice: ${fileName}. Total loaded slices: ${this.m_filesLoadedCounter}`); - } - // console.log(`!!!!!!!!! m_filesLoadedCounter = ${this.m_filesLoadedCounter} / ${this.m_numLoadedFiles}`); - - if (this.m_filesLoadedCounter === this.m_numLoadedFiles) { - // Finalize physic dimension - if (DEBUG_PRINT_TAGS_INFO) { - console.log(`slice location (min, max) = ${this.m_sliceLocMin}, ${this.m_sliceLocMax}`); - } - const imagePosBox = { - x: this.m_imagePosMax.x - this.m_imagePosMin.x, - y: this.m_imagePosMax.y - this.m_imagePosMin.y, - z: this.m_imagePosMax.z - this.m_imagePosMin.z, - }; - const TOO_MIN = 0.00001; - let zBox; - if (Math.abs(this.m_pixelSpacing.z) > TOO_MIN) { - zBox = this.m_pixelSpacing.z * this.m_zDim; - } else { - zBox = imagePosBox.z; - if (Math.abs(zBox) < TOO_MIN) { - zBox = imagePosBox.x; - if (Math.abs(zBox) < TOO_MIN) { - zBox = imagePosBox.y; - } - } - } // if pixel spacing 0 - if (zBox < TOO_MIN) { - zBox = 1.0; - } - - this.m_pixelSpacing.z = zBox / this.m_zDim; - this.m_boxSize.z = this.m_zDim * this.m_pixelSpacing.z; - this.m_boxSize.x = this.m_xDim * this.m_pixelSpacing.x; - this.m_boxSize.y = this.m_yDim * this.m_pixelSpacing.y; - console.log(`Volume local phys dim: ${this.m_boxSize.x} * ${this.m_boxSize.y} * ${this.m_boxSize.z}`); - // TODO: add hash - let series = this.m_slicesVolume.getSeries(); - if (series.length === 0) { - this.m_slicesVolume.buildSeriesInfo(); - series = this.m_slicesVolume.getSeries(); - } - const indexSerie = 0; - const hash = series[indexSerie].m_hash; - const errStatus = this.createVolumeFromSlices(volSet, indexSerie, hash); - if (callbackComplete !== null) { - callbackComplete(errStatus); - return true; - } - } // if last file was loaded - return true; - }, - (errMsg) => { - console.log(`Error read file: ${errMsg}`); - return false; - } - ); // end of readfile - return true; - } // end runLoader } // end class LoaderDicom export default LoaderDicom; diff --git a/src/engine/loaders/LoaderHdr.js b/src/engine/loaders/LoaderHdr.js index 5afb751e..9bd99595 100644 --- a/src/engine/loaders/LoaderHdr.js +++ b/src/engine/loaders/LoaderHdr.js @@ -14,25 +14,12 @@ // ******************************************************** import LoadResult from '../LoadResult'; -import FileTools from './FileTools'; -import LoadFilePromise from './LoadPromise'; import Volume from '../Volume'; -import VolumeSet from '../VolumeSet'; - -// ******************************************************** -// Const -// ******************************************************** - -// const NEED_EVEN_TEXTURE_SIZE = false; const HDR_DT_NONE = 0; const HDR_DT_UNSIGNED_CHAR = 2; const HDR_DT_SIGNED_SHORT = 4; -// ******************************************************** -// Class -// ******************************************************** - /** * Class LoaderHdr some text later... */ @@ -126,7 +113,8 @@ class LoaderHdr { const bufBytes = new Uint8Array(arrBuf); const bufLen = bufBytes.length; const HDR_HEADER_SIZE = 348; - // console.log(`Header buf size === ${bufLen}`); + console.log(`Header buf size === ${bufLen}`); + if (bufLen !== HDR_HEADER_SIZE) { if (callbackComplete) { callbackComplete(LoadResult.WRONG_HEADER_DATA_SIZE, null, 0, null); @@ -437,164 +425,7 @@ class LoaderHdr { volDst.m_bytesPerVoxel = FOUR; console.log('createRoiVolumeFromHeaderAndImage: success'); return true; - } // - - /** - * Read hdr (h + img) files from URL - * - * @param {object} volSet - volume set - * @param {string} strUrl - url string - * @param {func} callbackProgress - callback during read progress - * @param {func} callbackComplete - callback after complete (good or bad) - * @return true, if success - */ - readFromUrl(volSet, strUrl, callbackProgress, callbackComplete) { - console.log(`readFromUrl. going to read from ${strUrl} ...`); - - if (!FileTools.isValidUrl(strUrl)) { - console.log(`readFromUrl: not vaild URL = = ${strUrl} `); - return false; - } - this.m_folder = FileTools.getFolderNameFromUrl(strUrl); - const fileName = FileTools.getFileNameFromUrl(strUrl); - // console.log(`readFromUrl: folder = ${this.m_folder} filename = ${fileName}`); - - const regExp = /(\w+)_intn.(h|hdr)/; - const arrGrp = regExp.exec(fileName); - if (arrGrp.length !== 3) { - console.log(`LoaderHdr.readFromUrl: bad URL name = ${strUrl}. Should be in template NNN_intn.h `); - return false; - } - const namePrefix = arrGrp[1]; - //console.log(`readFromUrl: name prefix = ${namePrefix}, grpLen = ${arrGrp.length}`); - - const fileNameIntensityHeader = this.m_folder + '/' + namePrefix + '_intn.hdr'; - const fileNameIntensityImage = this.m_folder + '/' + namePrefix + '_intn.img'; - const fileNameMaskHeader = this.m_folder + '/' + namePrefix + '_mask.hdr'; - const fileNameMaskImage = this.m_folder + '/' + namePrefix + '_mask.img'; - - const arrUrls = []; - arrUrls.push(fileNameIntensityHeader); - arrUrls.push(fileNameIntensityImage); - arrUrls.push(fileNameMaskHeader); - arrUrls.push(fileNameMaskImage); - const ok = this.readFromUrls(arrUrls, volSet, callbackProgress, callbackComplete); - - return ok; - } // end of readFromUrl - - /** - * - * @param {object} arrUrls - array of strings urls - * @param {*} volSet - dest volume set - * @param {*} callbackProgress - callback during read - * @param {*} callbackComplete - callback after end fo read - */ - readFromUrls(arrUrls, volSet, callbackProgress, callbackComplete) { - // check arguments - console.assert(volSet != null, 'Null volume set'); - console.assert(volSet instanceof VolumeSet, 'Should be volume set'); - - const numUrls = arrUrls.length; - const NUM_URLS_IN_SET = 2; - const NUM_FILES_VOL_INT_ROI = 4; - if (numUrls === NUM_URLS_IN_SET) { - let urlHdr = arrUrls[0]; - let urlImg = arrUrls[1]; - const loaderHdr = new LoadFilePromise(); - const loaderImg = new LoadFilePromise(); - if (urlHdr.indexOf('.hdr') === -1) { - const strCopy = urlHdr; - urlHdr = urlImg; - urlImg = strCopy; - } - - // this.m_volIntensity = new HdrVolume(this.m_needScaleDownTexture); - - const volDst = volSet.getVolume(0); - loaderHdr.readFromUrl(urlHdr).then( - (arrBufHdr) => { - this.readFromBufferHeader(volDst, arrBufHdr, callbackComplete, callbackProgress); - console.log(`Load success HDR file: ${urlHdr}`); - loaderImg.readFromUrl(urlImg).then((arrBufImg) => { - this.readFromBufferImage(volDst, arrBufImg, callbackComplete, callbackProgress); - console.log(`Load success IMG file: ${urlImg}`); - - // complete 2 images - this.createVolumeFromHeaderAndImage(volDst); - - // invoke callback for good loading end - callbackComplete(LoadResult.SUCCESS); - }); - }, - (error) => { - console.log('HDR File read error', error); - callbackComplete(LoadResult.ERROR_CANT_OPEN_URL, null, 0, null); - return false; - } - ); - } else if (numUrls === NUM_FILES_VOL_INT_ROI) { - // read 4 files - const urlHdrInt = arrUrls[0]; - const urlImgInt = arrUrls[1]; - const urlHdrRoi = arrUrls[2]; - const urlImgRoi = arrUrls[3]; - - const loaderHdrInt = new LoadFilePromise(); - const loaderImgInt = new LoadFilePromise(); - const loaderHdrRoi = new LoadFilePromise(); - const loaderImgRoi = new LoadFilePromise(); - - // this.m_volIntensity = new HdrVolume(this.m_needScaleDownTexture); - // this.m_volRoi = new HdrVolume(this.m_needScaleDownTexture); - - const volRoi = new Volume(); - const volDst = volSet.getVolume(0); - - loaderHdrInt.readFromUrl(urlHdrInt).then( - (arrBufHdr) => { - // this.m_volIntensity.readBufferHead(arrBufHdr, callbackComplete, callbackProgress); - // this.readBufferHead(arrBufHdr, callbackComplete, callbackProgress); - this.readFromBufferHeader(volDst, arrBufHdr, callbackComplete, callbackProgress); - - console.log(`Load success HDR file: ${urlHdrInt}`); - loaderImgInt.readFromUrl(urlImgInt).then((arrBufImg) => { - // this.m_volIntensity.readBufferImg(arrBufImg, callbackComplete, callbackProgress); - // this.readBufferImg(arrBufImg, callbackComplete, callbackProgress); - this.readFromBufferImage(volDst, arrBufImg, callbackComplete, callbackProgress); - console.log(`Load success IMG file: ${urlImgInt}`); - - loaderHdrRoi.readFromUrl(urlHdrRoi).then((arrBufferHdr) => { - //this.m_volRoi.readBufferHead(arrBufferHdr, callbackComplete, callbackProgress); - this.readFromBufferHeader(volRoi, arrBufferHdr, callbackComplete, callbackProgress); - - loaderImgRoi.readFromUrl(urlImgRoi).then((arrBufferImg) => { - // this.m_volRoi.readBufferImg(arrBufferImg, callbackComplete, callbackProgress); - this.readFromBufferImage(volRoi, arrBufferImg, callbackComplete, callbackProgress); - - // transform intensity data from 16 bpp -> 8 bpp - this.createVolumeFromHeaderAndImage(volDst); - - // mix intensity + roi - this.createRoiVolumeFromHeaderAndImage(volDst, volRoi); - - // invoke callback for good loading end - callbackComplete(LoadResult.SUCCESS); - }); // loaderImgRoi - }); // loaderHdrRoi - }); // loaderImgInt - }, - (error) => { - console.log('HDR File read error', error); - return false; - } - ); // loaderHdrInt - } else { - console.log(`Error read hdr files. Should be ${NUM_URLS_IN_SET} files`); - return false; - } // if number of files equal to 2 - return true; - } // end of readFromUrls -} // end class LoaderHdr + } +} export default LoaderHdr; diff --git a/src/engine/loaders/LoaderKtx.js b/src/engine/loaders/LoaderKtx.js index a67bb7ca..4ecf3e82 100644 --- a/src/engine/loaders/LoaderKtx.js +++ b/src/engine/loaders/LoaderKtx.js @@ -14,7 +14,6 @@ // ******************************************************** import LoadResult from '../LoadResult'; -import FileLoader from './FileLoader'; // ******************************************************** // Const @@ -341,28 +340,4 @@ export default class LoaderKtx { } return LoadResult.SUCCESS; } // end readFromBuffer - - /** - * - * Read Ktx file from URL - * @param {object} volDst volume to read - * @param {string} strUrl from where - * @param {Function} callbackProgress invoke during loading - * @param {Function} callbackComplete invoke at the end with final success code - */ - readFromUrl(volDst, strUrl, callbackProgress, callbackComplete) { - console.log(`LoadedKtx. staring read ${strUrl}`); - this.m_fileLoader = new FileLoader(strUrl); - this.m_fileLoader.readFile( - (arrBuf) => { - this.readFromBuffer(volDst, arrBuf, callbackProgress, callbackComplete); - return; - }, - (errMsg) => { - console.log(`LoaderKtx. Error read file: ${errMsg}`); - callbackComplete(LoadResult.ERROR_CANT_OPEN_URL, null, 0, null); - return; - } - ); - } // end of readFromUrl } // end class diff --git a/src/engine/loaders/LoaderNifti.js b/src/engine/loaders/LoaderNifti.js index 11f5fb2e..61222af4 100644 --- a/src/engine/loaders/LoaderNifti.js +++ b/src/engine/loaders/LoaderNifti.js @@ -15,7 +15,6 @@ import LoadResult from '../LoadResult'; import HistogramUtils from '../../ui/Histogram/HistogramUtils'; -import FileLoader from './FileLoader'; // ******************************************************** // Const @@ -660,30 +659,6 @@ class LoaderNifti { return true; } // end of readFromBuffer - - /** - * - * Read Nifti file from URL - * @param {object} volDst volume to read - * @param {string} strUrl from where - * @param {Function} callbackProgress invoke during loading - * @param {Function} callbackComplete invoke at the end with final success code - */ - readFromUrl(volDst, strUrl, callbackProgress, callbackComplete) { - console.log(`LoadedNifti. staring read ${strUrl}`); - this.m_fileLoader = new FileLoader(strUrl); - this.m_fileLoader.readFile( - (arrBuf) => { - const okRead = this.readFromBuffer(volDst, arrBuf, callbackProgress, callbackComplete); - return okRead; - }, - (errMsg) => { - console.log(`LoadedNifti. Error read file: ${errMsg}`); - callbackComplete(LoadResult.ERROR_CANT_OPEN_URL, null, 0, null); - } - ); - return true; - } // end of readFromUrl } // end class LoaderNifti export default LoaderNifti; diff --git a/src/engine/loaders/LoaderUrlDicom.js b/src/engine/loaders/LoaderUrlDicom.js deleted file mode 100644 index ef9aa0eb..00000000 --- a/src/engine/loaders/LoaderUrlDicom.js +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) - * SPDX-License-Identifier: Apache-2.0 - */ - -import StoreActionType from '../../store/ActionTypes'; -import ViewMode from '../../store/ViewMode'; -import Modes3d from '../../store/Modes3d'; - -const NEED_TEXTURE_SIZE_4X = true; - -class LoaderUrlDicom { - constructor(store) { - this.m_store = store; - this.m_errors = []; - this.m_loaders = []; - - this.callbackReadProgress = this.callbackReadProgress.bind(this); - this.m_fileName = '???'; - } - - /** - * Progress read callback - * - * @param ratio01 - */ - callbackReadProgress(ratio01) { - const ratioPrc = Math.floor(ratio01); - const store = this.m_store; - if (ratioPrc >= 0.99) { - // console.log(`callbackReadProgress. hide on = ${ratio01}`); - store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: 0 }); - } else { - store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: ratioPrc }); - } - } // callback progress - - /** - * On the end of success loading dicom folder - * - * @param {object} volume - destination volume - * @param {string} fileNameIn - short file name for readed - */ - finalizeSuccessLoadedVolume(volume, fileNameIn) { - if (volume.m_dataArray !== null) { - if (NEED_TEXTURE_SIZE_4X) { - volume.makeDimensions4x(); - } - // invoke notification - const store = this.m_store; - store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volume }); - store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: true }); - store.dispatch({ type: StoreActionType.SET_FILENAME, fileName: fileNameIn }); - store.dispatch({ type: StoreActionType.SET_ERR_ARRAY, arrErrors: [] }); - store.dispatch({ type: StoreActionType.SET_MODE_VIEW, viewMode: ViewMode.VIEW_2D }); - store.dispatch({ type: StoreActionType.SET_MODE_3D, mode3d: Modes3d.RAYCAST }); - } - } -} // end class LoaderUrlDicom - -export default LoaderUrlDicom; diff --git a/src/index.js b/src/index.js index 14389d05..82237b64 100644 --- a/src/index.js +++ b/src/index.js @@ -3,24 +3,17 @@ * SPDX-License-Identifier: Apache-2.0 */ -import React from 'react'; +import 'regenerator-runtime/runtime'; import ReactDOM from 'react-dom'; - import { Provider } from 'react-redux'; - -import { createStore } from 'redux'; - -import rootReducer from './store/Store'; - import App from './App'; +import { store } from './store'; import './index.css'; import './nouislider-custom.css'; const rootElement = document.getElementById('root'); -const store = createStore(rootReducer); - ReactDOM.render( diff --git a/src/react-app-env.d.ts b/src/react-app-env.d.ts new file mode 100644 index 00000000..6431bc5f --- /dev/null +++ b/src/react-app-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/store/ActionTypes.js b/src/store/ActionTypes.js index 6f61efa1..41b02599 100644 --- a/src/store/ActionTypes.js +++ b/src/store/ActionTypes.js @@ -46,5 +46,7 @@ const StoreActionType = { SET_MODAL_ALERT: 34, SET_SPINNER: 35, SET_PROGRESS_INFO: 36, + SET_SPINNER_TITLE: 37, + SET_SPINNER_PROGRESS: 38, }; export default StoreActionType; diff --git a/src/store/Store.js b/src/store/Store.js index 8f390ea3..040f051d 100644 --- a/src/store/Store.js +++ b/src/store/Store.js @@ -125,6 +125,10 @@ const medReducer = (state = initialState, action) => { return Object.assign({}, state, { showModalAlert: action.showModalAlert }); case StoreActionType.SET_SPINNER: return Object.assign({}, state, { spinner: action.spinner }); + case StoreActionType.SET_SPINNER_TITLE: + return Object.assign({}, state, { spinnerTitle: action.spinnerTitle }); + case StoreActionType.SET_SPINNER_PROGRESS: + return Object.assign({}, state, { spinnerProgress: action.spinnerProgress }); default: return state; } diff --git a/src/store/index.js b/src/store/index.js new file mode 100644 index 00000000..3f42cdc9 --- /dev/null +++ b/src/store/index.js @@ -0,0 +1,4 @@ +import { createStore } from 'redux'; +import rootReducer from './Store'; + +export const store = createStore(rootReducer); diff --git a/src/ui/Button/Button.module.css b/src/ui/Button/Button.module.css index 910ddc33..1ff3473e 100644 --- a/src/ui/Button/Button.module.css +++ b/src/ui/Button/Button.module.css @@ -48,14 +48,11 @@ button:hover, background-color: var(--red); } - - @media screen and (min-width: 768px) { .reset { display: flex; justify-content: flex-end; } - } .reset { display: inline-block; @@ -66,8 +63,6 @@ button:hover, padding: 0; cursor: pointer; transition: all 250ms ease-in-out, transform 150ms ease; - -webkit-appearance: none; - -moz-appearance: none; } .reset:focus { @@ -108,7 +103,31 @@ button:hover, } .button:not(.reset) { - display: block; + display: block; +} +.button:hover, +.button:focus { + background-color: var(--light-orange); +} + +.button.active { + color: var(--red); +} + +.button.accent:hover, +.button.accent:focus { + background-color: var(--red); + filter: brightness(85%); +} + +.button.light.active { + color: var(--red); +} + +.button.light:hover, +.button.light:focus { + background-color: var(--light); + filter: brightness(80%); } @media screen and (min-width: 1024px) { @@ -121,8 +140,6 @@ button:hover, padding: 0; cursor: pointer; transition: all 250ms ease-in-out, transform 150ms ease; - -webkit-appearance: none; - -moz-appearance: none; } .reset:focus { @@ -162,15 +179,6 @@ button:hover, fill: var(--white); } - .button:hover, - .button:focus { - background-color: var(--light-orange); - } - - .button.active { - color: var(--red); - } - .apply { background-color: var(--red); border-radius: 4px; @@ -189,16 +197,6 @@ button:hover, fill: var(--black); } - .button.light.active { - color: var(--red); - } - - .button.light:hover, - .button.light:focus { - background-color: var(--light); - filter: brightness(80%); - } - .button.accent { color: var(--white); background-color: var(--red); @@ -208,13 +206,28 @@ button:hover, fill: var(--white); } - .button.accent:hover, - .button.accent:focus { - background-color: var(--red); - filter: brightness(85%); - } - .button.accent.active svg { fill: var(--black); } } + +.button_start_screen { + display: flex; + flex-direction: column; + align-items: center; + z-index: 10; + flex-basis: 33%; +} + +.button_select_file { + display: flex; + flex-direction: row; + align-items: center; + z-index: 10; + width: 240px; + justify-content: center; +} + +.button_select_file svg { + margin-right: 10px; +} diff --git a/src/ui/FileReaders/DragAndDrop.module.css b/src/ui/FileReaders/DragAndDrop.module.css new file mode 100644 index 00000000..5c60c08d --- /dev/null +++ b/src/ui/FileReaders/DragAndDrop.module.css @@ -0,0 +1,13 @@ +.dropzone { + position: absolute; + height: 100%; + width: 100%; + top: 0; + left: 0; + border-radius: 8px; +} + +.dropzone_active { + border: 2px dashed var(--red); + z-index: 100; +} diff --git a/src/ui/FileReaders/DragAndDropComponent.jsx b/src/ui/FileReaders/DragAndDropComponent.jsx new file mode 100644 index 00000000..32fed4e4 --- /dev/null +++ b/src/ui/FileReaders/DragAndDropComponent.jsx @@ -0,0 +1,40 @@ +import { useState } from 'react'; +import css from './DragAndDrop.module.css'; +import { SVG } from '../Button/SVG'; +import UiModalWindowCenterWidth from '../Modals/UiModalWinCW'; +import MriViwer from '../../engine/lib/MRIViewer'; +import { useOnEvent } from '../hooks/useOnEvent'; +import { MriEvents } from '../../engine/lib/enums'; + +const IMG_DROPZONE_SIZE = 49; + +export const DragAndDropComponent = () => { + const [isActiveDnd, setIsActiveDnd] = useState(false); + const [showModalWindowCW, setShowModalWindowCW] = useState(false); + + useOnEvent(MriEvents.FILE_READ_SUCCESS, () => { + setShowModalWindowCW(true); + }); + + const handleDrop = (e) => { + e.preventDefault(); + setIsActiveDnd(false); + + const files = e.dataTransfer.files; + MriViwer.read(files); + }; + + return ( + <> + +
e.preventDefault()} + onDragEnter={() => setIsActiveDnd(true)} + onDragLeave={() => setIsActiveDnd(false)} + onDrop={handleDrop} + >
+ {showModalWindowCW && setShowModalWindowCW(false)} />} + + ); +}; diff --git a/src/ui/FileReaders/OpenDemoComponent.jsx b/src/ui/FileReaders/OpenDemoComponent.jsx new file mode 100644 index 00000000..bf1a06f1 --- /dev/null +++ b/src/ui/FileReaders/OpenDemoComponent.jsx @@ -0,0 +1,29 @@ +import { useState } from 'react'; +import { UIButton } from '../Button/Button'; +import UiModalDemo from '../Modals/ModalDemo'; +import config from '../../config/config'; +import MriViwer from '../../engine/lib/MRIViewer'; + +export const OpenDemoComponent = ({ cx }) => { + const [showModalDemo, setShowModalDemo] = useState(false); + + const onModalDemoOpenShow = () => { + setShowModalDemo(true); + }; + + const onModalDemoOpenHide = () => { + setShowModalDemo(false); + }; + + const onDemoSelected = (index) => { + const fileUrl = config.demoUrls[index]; + MriViwer.read(fileUrl); + }; + + return ( + <> + + {showModalDemo && } + + ); +}; diff --git a/src/ui/FileReaders/OpenFromDeviceButton.jsx b/src/ui/FileReaders/OpenFromDeviceButton.jsx new file mode 100644 index 00000000..d3c4d19f --- /dev/null +++ b/src/ui/FileReaders/OpenFromDeviceButton.jsx @@ -0,0 +1,26 @@ +import { useState } from 'react'; +import { UIButton } from '../Button/Button'; +import ModalSelectFile from '../Modals/ModalSelectFile'; +import { useOnEvent } from '../hooks/useOnEvent'; +import { MriEvents } from '../../engine/lib/enums'; + +export const OpenFromDeviceButtonComponent = ({ cx }) => { + const [showOpenFromDeviceModal, setShowOpenFromDeviceModal] = useState(false); + + const onHide = () => { + setShowOpenFromDeviceModal(false); + }; + + useOnEvent(MriEvents.FILE_READ_SUCCESS, onHide); + + const onButtonOpenLocalFileClick = () => { + setShowOpenFromDeviceModal(true); + }; + + return ( + <> + + {showOpenFromDeviceModal && } + + ); +}; diff --git a/src/ui/FileReaders/OpenFromDeviceComponent.jsx b/src/ui/FileReaders/OpenFromDeviceComponent.jsx new file mode 100644 index 00000000..8ef16b17 --- /dev/null +++ b/src/ui/FileReaders/OpenFromDeviceComponent.jsx @@ -0,0 +1,45 @@ +import { useState } from 'react'; +import { UIButton } from '../Button/Button'; +import { useOnEvent } from '../hooks/useOnEvent'; +import UiModalWindowCenterWidth from '../Modals/UiModalWinCW'; +import MriViwer from '../../engine/lib/MRIViewer'; +import { MriEvents } from '../../engine/lib/enums'; + +export const OpenFromDeviceComponent = ({ cx, text, type }) => { + const [showModalWindowCW, setShowModalWindowCW] = useState(false); + + const onHide = () => { + setShowModalWindowCW(false); + }; + + useOnEvent(MriEvents.FILE_READ_SUCCESS, onHide); + + const onFileSelect = (evt) => { + MriViwer.read(evt.target.files); + }; + + const onButtonOpenLocalFileClick = (e) => { + e.preventDefault(); + const fileSelector = document.createElement('input'); + fileSelector.setAttribute('type', 'file'); + fileSelector.setAttribute('hidden', 'true'); + fileSelector.setAttribute('accept', '*'); + fileSelector.setAttribute('multiple', 'true'); + + if (type === 'folder') { + fileSelector.setAttribute('webkitdirectory', 'true'); + } + + document.body.appendChild(fileSelector); + + fileSelector.onchange = onFileSelect; + fileSelector.click(); + }; + + return ( + <> + + {showModalWindowCW && } + + ); +}; diff --git a/src/ui/FileReaders/OpenFromURLComponent.jsx b/src/ui/FileReaders/OpenFromURLComponent.jsx new file mode 100644 index 00000000..9120952e --- /dev/null +++ b/src/ui/FileReaders/OpenFromURLComponent.jsx @@ -0,0 +1,28 @@ +import { useState } from 'react'; +import { UIButton } from '../Button/Button'; +import UIModalUrl from '../Modals/ModalUrl'; +import MriViwer from '../../engine/lib/MRIViewer'; + +export const OpenFromURLComponent = ({ cx }) => { + const [showModalUrl, setShowModalUrl] = useState(false); + + const onModalUrlShow = () => { + setShowModalUrl(true); + }; + + const onModalUrlHide = () => { + setShowModalUrl(false); + }; + + const onClickLoadUrl = (url) => { + setShowModalUrl(false); + MriViwer.read(url); + }; + + return ( + <> + + {showModalUrl && } + + ); +}; diff --git a/src/ui/FileReaders/index.js b/src/ui/FileReaders/index.js new file mode 100644 index 00000000..dbb3e7a7 --- /dev/null +++ b/src/ui/FileReaders/index.js @@ -0,0 +1,5 @@ +export * from './OpenFromDeviceComponent'; +export * from './OpenFromDeviceButton'; +export * from './DragAndDropComponent'; +export * from './OpenFromURLComponent'; +export * from './OpenDemoComponent'; diff --git a/src/ui/Header/Header.jsx b/src/ui/Header/Header.jsx index c0d0fff8..aad2684f 100644 --- a/src/ui/Header/Header.jsx +++ b/src/ui/Header/Header.jsx @@ -2,10 +2,46 @@ * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) * SPDX-License-Identifier: Apache-2.0 */ -import React from 'react'; +import { useState } from 'react'; +import { UIButton } from '../Button/Button'; +import { useOnEvent } from '../hooks/useOnEvent'; +import { ModalSelectFile } from '../Modals/ModalSelectFile'; +import { OpenFromURLComponent, OpenDemoComponent } from '../FileReaders'; +import { Tooltip } from '../Tooltip/Tooltip'; +import { UiSaveMenu } from '../OpenFile/UiSaveMenu'; +import { UiReportMenu } from '../OpenFile/UiReportMenu'; -import UiOpenMenu from '../OpenFile/UiOpenMenu'; +import { MriEvents } from '../../engine/lib/enums'; -export function Header({ fileNameOnLoad }) { - return ; +import css from './Header.module.css'; + +export function Header() { + const [showOpenFromDeviceModal, setShowOpenFromDeviceModal] = useState(false); + + const onButtonOpenLocalFileClick = () => { + setShowOpenFromDeviceModal(true); + }; + + const onHide = () => { + setShowOpenFromDeviceModal(false); + }; + + useOnEvent(MriEvents.VOLUME_LOAD_SUCCESS, onHide); + + return ( +
+ + + + + + + + + + + + {showOpenFromDeviceModal && } +
+ ); } diff --git a/src/ui/Header/Header.module.css b/src/ui/Header/Header.module.css new file mode 100644 index 00000000..420d1b8a --- /dev/null +++ b/src/ui/Header/Header.module.css @@ -0,0 +1,9 @@ +.header { + display: flex; + gap: 5px; +} + +.header_button { + font-size: 0; + background-color: white; +} diff --git a/src/ui/Header/UiAbout.js b/src/ui/Header/UiAbout.js index 37b23aee..3b71f89e 100644 --- a/src/ui/Header/UiAbout.js +++ b/src/ui/Header/UiAbout.js @@ -24,7 +24,7 @@ export const UiAbout = () => { const { graphics2d } = useSelector((state) => state); const onShow = () => { - graphics2d?.clear(); + graphics2d.clear(); setModalShow(true); }; diff --git a/src/ui/Main.jsx b/src/ui/Main.jsx index 196474e0..1c2c21ac 100644 --- a/src/ui/Main.jsx +++ b/src/ui/Main.jsx @@ -180,7 +180,7 @@ export const Main = () => { )} {!isFullMode && (
-
+
)}
diff --git a/src/ui/Modals/ModalInfo.jsx b/src/ui/Modals/ModalInfo.jsx index 2535641f..9f52cd1d 100644 --- a/src/ui/Modals/ModalInfo.jsx +++ b/src/ui/Modals/ModalInfo.jsx @@ -125,8 +125,8 @@ const ModalInfo = (props) => { return getVolInfo(volumeSet, volume); }, [volumeSet, volumeIndex]); - const slicesInfo = dicomInfo?.m_sliceInfo || []; - const tagsList = slicesInfo[currentSlice]?.m_tags || []; + const slicesInfo = dicomInfo.m_sliceInfo || []; + const tagsList = slicesInfo[currentSlice].m_tags || []; return ( diff --git a/src/ui/Modals/ModalSelectFile.jsx b/src/ui/Modals/ModalSelectFile.jsx new file mode 100644 index 00000000..ace1db20 --- /dev/null +++ b/src/ui/Modals/ModalSelectFile.jsx @@ -0,0 +1,26 @@ +import { Modal, ModalBody, ModalHeader } from './ModalBase'; +import { OpenFromDeviceComponent, DragAndDropComponent } from '../FileReaders'; +import css from './Modals.module.css'; +import buttonCss from '../Button/Button.module.css'; + +export const ModalSelectFile = (props) => { + const { stateVis, onHide } = props; + + return ( + + + +
+ + +
+ + +
+
+
+
+ ); +}; + +export default ModalSelectFile; diff --git a/src/ui/Modals/ModalUrl.jsx b/src/ui/Modals/ModalUrl.jsx index 5a0d63c7..5fc9def0 100644 --- a/src/ui/Modals/ModalUrl.jsx +++ b/src/ui/Modals/ModalUrl.jsx @@ -1,9 +1,4 @@ -/* - * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) - * SPDX-License-Identifier: Apache-2.0 - */ - -import React, { useRef } from 'react'; +import React, { useRef, useState } from 'react'; import { Modal, ModalBody, ModalFooter, ModalHeader } from './ModalBase'; import { UIButton } from '../Button/Button'; @@ -14,23 +9,52 @@ export const ModalUrl = (props) => { const { stateVis, onHide, loadUrl } = props; const inputRef = useRef(); + const [isValid, setIsValid] = useState(true); + const [errorMessage, setErrorMessage] = useState(''); + + const validateUrl = (url) => { + const pattern = new RegExp( + '^(https?:\\/\\/)?' + // protocol + '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // domain name and extension + '((\\d{1,3}\\.){3}\\d{1,3}))' + // OR ip (v4) address + '(\\:\\d+)?' + // port + '(\\/[-a-z\\d%_.~+]*)*' + // path + '(\\?[;&a-z\\d%_.~+=-]*)?' + // query string + '(\\#[-a-z\\d_]*)?$', + 'i' + ); // fragment locator + + return !!pattern.test(url); + }; + + const handleSubmit = () => { + const url = inputRef.current.value; + + if (validateUrl(url)) { + setIsValid(true); + setErrorMessage(''); + loadUrl(url); + } else { + setIsValid(false); + setErrorMessage('Invalid URL. Please enter a valid URL.'); + } + }; + return ( - + -
+
- - {/* TODO: add validation for Url */} + + {!isValid &&

{errorMessage}

}
- loadUrl(inputRef.current.value)} /> + ); diff --git a/src/ui/Modals/Modals.module.css b/src/ui/Modals/Modals.module.css index b5e2dab3..47f6329d 100644 --- a/src/ui/Modals/Modals.module.css +++ b/src/ui/Modals/Modals.module.css @@ -49,7 +49,7 @@ } .footer { - justify-content: flex-end; + justify-content: center; border-top: 1px solid var(--gray); } @@ -107,7 +107,7 @@ margin: 0; padding: 0; display: flex; - align-items: center; + flex-direction: column; } .input { @@ -173,3 +173,38 @@ font-size: 16px; } } +.body_wrapper { + display: flex; + flex-direction: column; + gap: 20px; +} + +.label_text { + margin: 5px 0; +} + +.invalid { + border-color: red; + box-shadow: 0 0 5px red; +} + +.error { + color: red; + font-size: 14px; + margin-top: 5px; +} + +.select_file_wrapper { + display: flex; + flex-direction: column; + align-items: center; + gap: 20xp; + padding: 30px; +} + +.select_file_row { + display: flex; + flex-direction: row; + gap: 15px; + margin-top: 30px; +} diff --git a/src/ui/Modals/UiModalWinCW.jsx b/src/ui/Modals/UiModalWinCW.jsx index 189387eb..d3e9d4d3 100644 --- a/src/ui/Modals/UiModalWinCW.jsx +++ b/src/ui/Modals/UiModalWinCW.jsx @@ -10,6 +10,8 @@ import { Nouislider } from '../Nouislider/Nouislider'; import { Modal, ModalBody, ModalFooter, ModalHeader } from './ModalBase'; import { UIButton } from '../Button/Button'; import buttonCss from '../Button/Button.module.css'; +import MriViwer from '../../engine/lib/MRIViewer'; +import { MriEvents } from '../../engine/lib/enums'; const LARGE_NUMBER = 0x3fffffff; const DEFAULT_WIN_MIN = 650 - 2000 / 2; @@ -76,6 +78,9 @@ class UiModalWindowCenterWidth extends React.Component { const hashCode = series[i].m_hash; loaderDicom.createVolumeFromSlices(volSet, i, hashCode); } + + MriViwer.events.emit(MriEvents.VOLUME_PARAMETERS_SET_SUCCESS); + this.props.onHide && this.props.onHide(true); } diff --git a/src/ui/OpenFile/UiOpenMenu.jsx b/src/ui/OpenFile/UiOpenMenu.jsx deleted file mode 100644 index 5586f1fd..00000000 --- a/src/ui/OpenFile/UiOpenMenu.jsx +++ /dev/null @@ -1,981 +0,0 @@ -/* - * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) - * SPDX-License-Identifier: Apache-2.0 - */ - -// import { gzip, ungzip } from 'node-gzip'; -// import UiModalDicomSeries from './UiModalDicomSeries'; - -import React from 'react'; -import { connect } from 'react-redux'; -import UiModalDemo from '../Modals/ModalDemo'; -import UIModalUrl from '../Modals/ModalUrl'; -import UiModalWindowCenterWidth from '../Modals/UiModalWinCW'; -import { UIButton } from '../Button/Button'; -import css from './UiOpenMenu.module.css'; -import { UiSaveMenu } from './UiSaveMenu'; -import { UiReportMenu } from './UiReportMenu'; -import { Tooltip } from '../Tooltip/Tooltip'; -import { Container } from '../Layout/Container'; -import FileReader from '../../engine/loaders/FileReader'; -import StoreActionType from '../../store/ActionTypes'; - -/** Need to have demo menu */ -const NEED_DEMO_MENU = true; - -/** deep artificially fix volume texture size to 4 * N */ -const NEED_TEXTURE_SIZE_4X = true; - -// use daikon parser for Dicom (*dcm) file loading -const READ_DICOM_VIA_DAIKON = true; - -class UiOpenMenu extends FileReader { - constructor(props) { - super(props); - this.onButtonOpenLocalFileClick = this.onButtonOpenLocalFileClick.bind(this); - this.handleFileSelected = this.handleFileSelected.bind(this); - this.onFileContentReadSingleFile = this.onFileContentReadSingleFile.bind(this); - this.onFileContentReadMultipleDicom = this.onFileContentReadMultipleDicom.bind(this); - this.onFileContentReadMultipleHdr = this.onFileContentReadMultipleHdr.bind(this); - this.setErrorString = this.setErrorString.bind(this); - - this.onModalUrlShow = this.onModalUrlShow.bind(this); - this.onModalUrlHide = this.onModalUrlHide.bind(this); - this.onClickLoadUrl = this.onClickLoadUrl.bind(this); - this.callbackReadCompleteUrlKtxNii = this.callbackReadCompleteUrlKtxNii.bind(this); - - this.onModalDemoOpenShow = this.onModalDemoOpenShow.bind(this); - this.onModalDemoOpenHide = this.onModalDemoOpenHide.bind(this); - this.onDemoSelected = this.onDemoSelected.bind(this); - - this.onModalWindowCWHide = this.onModalWindowCWHide.bind(this); - - this.onModalGoogleShow = this.onModalGoogleShow.bind(this); - this.onModalGoogleHide = this.onModalGoogleHide.bind(this); - this.onGoogleSelected = this.onGoogleSelected.bind(this); - - this.onModalDicomSeriesHide = this.onModalDicomSeriesHide.bind(this); - this.onDicomSerieSelected = this.onDicomSerieSelected.bind(this); - - this.callbackReadProgress = this.callbackReadProgress.bind(this); - this.callbackReadComplete = this.callbackReadComplete.bind(this); - this.callbackReadSingleDicomComplete = this.callbackReadSingleDicomComplete.bind(this); - this.callbackReadMultipleComplete = this.callbackReadMultipleComplete.bind(this); - this.callbackCompleteMultipleDicom = this.callbackCompleteMultipleDicom.bind(this); - - this.m_fileNameOnLoad = ''; - this.m_fileName = ''; - this.m_fileIndex = 0; - this.m_fileReader = null; - this.m_fileSize = null; - this.state = { - showModalUrl: false, - showModalDemo: false, - showModalGoogle: false, - showModalWindowCW: false, - onLoadCounter: 1, - }; - this.m_volumeSet = null; - this.m_volumeRoi = null; - this.m_updateEnable = true; - this.roiMode = false; - } - - finalizeSuccessLoadedVolume(volSet, fileNameIn) { - const store = this.props; - - console.assert(volSet instanceof VolumeSet, 'finalizeSuccessLoadedVolume: should be VolumeSet'); - console.assert(volSet.getNumVolumes() >= 1, 'finalizeSuccessLoadedVolume: should be more or 1 volume'); - const indexVol = 0; - - const vol = volSet.getVolume(indexVol); - console.assert(vol !== null, 'finalizeSuccessLoadedVolume: should be non zero volume'); - - if (vol.m_dataArray !== null) { - console.log(`success loaded volume from ${fileNameIn}`); - if (NEED_TEXTURE_SIZE_4X) { - vol.makeDimensions4x(); - } - // invoke notification - - // send update (repaint) if was loaded prev model - if (store.isLoaded) { - store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: false }); - } - - store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volumeSet: volSet }); - store.dispatch({ type: StoreActionType.SET_VOLUME_INDEX, volumeIndex: 0 }); - store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: true }); - store.dispatch({ type: StoreActionType.SET_FILENAME, fileName: fileNameIn }); - store.dispatch({ type: StoreActionType.SET_ERR_ARRAY, arrErrors: [] }); - store.dispatch({ type: StoreActionType.SET_MODE_VIEW, viewMode: ViewMode.VIEW_2D }); - store.dispatch({ type: StoreActionType.SET_MODE_3D, mode3d: Modes3d.RAYCAST }); - store.dispatch({ type: StoreActionType.SET_SPINNER, spinner: false }); - } - } - - setErrorString(strErr) { - const store = this.props; - const arrErrors = []; - arrErrors.push(strErr); - store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: false }); - store.dispatch({ type: StoreActionType.SET_ERR_ARRAY, arrErrors: arrErrors }); - store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volume: null }); - } - - finalizeFailedLoadedVolume(volSet, fileNameIn, arrErrors) { - console.assert(arrErrors !== undefined); - // invoke notification - const store = this.props; - store.dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: false }); - store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volume: null }); - store.dispatch({ type: StoreActionType.SET_ERR_ARRAY, arrErrors: arrErrors }); - store.dispatch({ type: StoreActionType.SET_FILENAME, fileName: fileNameIn }); - store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: 0 }); - } - - callbackReadProgress(ratio01) { - // console.log(`callbackReadProgress = ${ratio01}`); - const ratioPrc = Math.floor(ratio01 * 100); - const store = this.props; - console.log('ratioPrc ===================> ' + ratioPrc); - console.log('ratio01 ===================> ' + ratio01); - store.dispatch({ - type: StoreActionType.SET_PROGRESS, - progress: ratioPrc, - }); - store.dispatch({ - type: StoreActionType.SET_PROGRESS_INFO, - titleProgressBar: 'Loading file...', - }); - if (ratioPrc >= 99) { - // console.log(`callbackReadProgress. hide on = ${ratio01}`); - store.dispatch({ - type: StoreActionType.SET_PROGRESS, - progress: 0, - }); - store.dispatch({ - type: StoreActionType.SET_PROGRESS_INFO, - titleProgressBar: 'Loading file...', - }); - } else { - store.dispatch({ - type: StoreActionType.SET_PROGRESS, - progress: ratioPrc, - }); - store.dispatch({ - type: StoreActionType.SET_PROGRESS_INFO, - titleProgressBar: 'Loading file...', - }); - } - } // callback progress - - callbackReadComplete(errCode) { - if (errCode === undefined) { - console.log('callbackReadComplete. should be errCode'); - } else { - if (errCode !== LoadResult.SUCCESS) { - const strErr = LoadResult.getResultString(errCode); - this.setErrorString(strErr); - } - } - const store = this.props; - store.dispatch({ - type: StoreActionType.SET_PROGRESS, - progress: 0, - }); - store.dispatch({ - type: StoreActionType.SET_PROGRESS_INFO, - titleProgressBar: 'The file has been uploaded', - }); - if (errCode === LoadResult.SUCCESS) { - // console.log('callbackReadComplete finished OK'); - this.finalizeSuccessLoadedVolume(this.m_volumeSet, this.m_fileName); - } else { - console.log(`callbackReadComplete failed! reading ${this.m_fileName} file`); - const arrErr = []; - const strErr = LoadResult.getResultString(errCode); - arrErr.push(strErr); - this.finalizeFailedLoadedVolume(this.m_volumeSet, this.m_fileName, arrErr); - } - } - - callbackReadSingleDicomComplete(errCode) { - if (errCode === LoadResult.SUCCESS) { - const store = this.props; - store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volumeSet: this.m_volumeSet }); - store.dispatch({ type: StoreActionType.SET_VOLUME_INDEX, volumeIndex: 0 }); - // save dicom loader to store - store.dispatch({ type: StoreActionType.SET_LOADER_DICOM, loaderDicom: this.m_loader }); - - // show modal: select window center, width - this.setState({ showModalWindowCW: true }); - return; // do nothing immediately after: wait for dialog - } - this.callbackReadComplete(errCode); - } - - callbackReadMultipleComplete(errCode) { - if (errCode !== LoadResult.SUCCESS) { - const strErr = LoadResult.getResultString(errCode); - this.setErrorString(strErr); - } - } - - onFileContentReadSingleFile() { - let strContent = this.m_fileReader.result; - this.onFileReadSingleBuffer(strContent); - console.log(this.onFileReadSingleBuffer(strContent)); - } - - // - // daikon read individual slice from file buffer (one from multiple files) - // strContent is ArrayBuffer - readSliceDicomViaDaikon(fileIndex, fileName, ratioLoad, strContent) { - const loaderDaikon = new LoaderDcmDaikon(); - return loaderDaikon.readSlice(this.m_loader, fileIndex, fileName, strContent); - } // end read single slice via daikon - - // - // based on local file read - // read from string content in this.m_fileReader.result - // - onFileReadSingleBuffer(strContent) { - // daikon read - // strContent is ArrayBuffer - if ((this.m_fileName.endsWith('.dcm') || this.m_fileName.endsWith('.DCM')) && READ_DICOM_VIA_DAIKON) { - const loaderDcm = new LoaderDcmDaikon(); - const store = this.props; - const fileIndex = this.m_fileIndex; - const fileName = this.m_fileName; - this.m_loader = new LoaderDicom(1); - const ret = loaderDcm.readSingleSlice(store, this.m_loader, fileIndex, fileName, strContent); - this.callbackReadSingleDicomComplete(ret); - return ret; - } - - console.log('UiOpenMenu. onFileReadSingleBuffer ...'); - // console.log(`file content = ${strContent.substring(0, 64)}`); - // console.log(`onFileContentRead. type = ${typeof strContent}`); - this.m_volumeSet = new VolumeSet(); - // add empty [0]-th volume in set to read single file - this.m_volumeSet.addVolume(new Volume()); - const callbackProgress = this.callbackReadProgress; - const callbackComplete = this.callbackReadComplete; - const callbackCompleteSingleDicom = this.callbackReadSingleDicomComplete; - - if (this.m_fileName.endsWith('.ktx') || this.m_fileName.endsWith('.KTX')) { - // if read ktx - // debugger; - this.m_volumeSet.readFromKtx(strContent, callbackProgress, callbackComplete); - } else if (this.m_fileName.endsWith('.nii') || this.m_fileName.endsWith('.NII')) { - this.m_volumeSet.readFromNifti(strContent, callbackProgress, callbackComplete); - } else if (this.m_fileName.endsWith('.dcm') || this.m_fileName.endsWith('.DCM')) { - this.m_loader = new LoaderDicom(); - this.m_loader.m_zDim = 1; - this.m_loader.m_numFiles = 1; - this.m_volumeSet.readFromDicom(this.m_loader, strContent, callbackProgress, callbackCompleteSingleDicom); - // save dicomInfo to store - const dicomInfo = this.m_loader.m_dicomInfo; - const sliceInfo = dicomInfo.m_sliceInfo[0]; - sliceInfo.m_fileName = this.m_fileName; - sliceInfo.m_sliceName = 'Slice 0'; - const store = this.props; - store.dispatch({ type: StoreActionType.SET_DICOM_INFO, dicomInfo: dicomInfo }); - } else if (this.m_fileName.endsWith('.hdr') || this.m_fileName.endsWith('.HDR')) { - // readOk = vol.readFromHdrHeader(strContent, callbackProgress, callbackComplete); - console.log(`cant read single hdr file: ${this.m_fileName}`); - // readStatus = LoadResult.BAD_HEADER; - } else if (this.m_fileName.endsWith('.img') || this.m_fileName.endsWith('.IMG')) { - // readOk = vol.readFromHdrImage(strContent, callbackProgress, callbackComplete); - console.log(`cant read single img file: ${this.m_fileName}`); - // readStatus = LoadResult.BAD_HEADER; - } else { - console.log(`onFileContentReadSingleFile: unknown file type: ${this.m_fileName}`); - } - } - - // - // read hdr/img. content is in this.m_fileReader.result - // - onFileContentReadMultipleHdr() { - const VALID_NUM_FILES_2 = 2; - const VALID_NUM_FILES_4 = 4; - if (this.m_numFiles !== VALID_NUM_FILES_2 && this.m_numFiles !== VALID_NUM_FILES_4) { - console.log(`onFileContentReadMultipleHdr: can read ${VALID_NUM_FILES_2} or ${VALID_NUM_FILES_4} files for multiple hdr loader`); - return; - } - - const isHdr = this.m_fileName.endsWith('hdr') || this.m_fileName.endsWith('HDR'); - console.log(`onFileContentReadMultipleHdr: read file ${this.m_fileName}. Ratio=${this.m_fileIndex} / ${this.m_numFiles}`); - this.m_fileIndex++; - const ratioLoad = this.m_fileIndex / this.m_numFiles; - const strContent = this.m_fileReader.result; - // const lenContent = strContent.length; - - if (this.m_fileIndex <= 1) { - // add single volume to set - if (this.m_volumeSet.getNumVolumes() === 0) { - this.m_volumeSet.addVolume(new Volume()); - } - this.callbackReadProgress(0.0); - } - - if (this.m_numFiles === VALID_NUM_FILES_4 && this.m_volumeRoi === null) { - this.m_volumeRoi = new Volume(); - } - - const callbackProgress = null; - const callbackComplete = null; - - const regExpFileName = /([\S]+)\.[\S]+/; - const fnameArr = regExpFileName.exec(this.m_fileName); - const numFN = fnameArr.length; - let detectedMask = false; - let detectedIntensity = false; - if (numFN === 2) { - const fname = fnameArr[1]; - if (fname.endsWith('_mask')) { - detectedMask = true; - } - if (fname.endsWith('_intn')) { - detectedIntensity = true; - } - } - let volDst = this.m_volumeSet.getVolume(0); - if (this.m_fileIndex > VALID_NUM_FILES_2) { - volDst = this.m_volumeRoi; - } - if (detectedIntensity) { - volDst = this.m_volumeSet.getVolume(0); - } - if (detectedMask) { - volDst = this.m_volumeRoi; - this.roiMode = true; - // console.log('mask vol by name'); - if (this.m_numFiles !== VALID_NUM_FILES_4) { - console.log('You need to load 4 files, if one of them has _mask in name'); - return; - } - } - - // read header or image from src files - let readOk; - if (isHdr) { - readOk = this.m_loader.readFromBufferHeader(volDst, strContent, callbackProgress, callbackComplete); - } else { - readOk = this.m_loader.readFromBufferImage(volDst, strContent, callbackProgress, callbackComplete); - } - - // create final volume from readed data - volDst = this.m_volumeSet.getVolume(0); - if (readOk && this.m_fileIndex === this.m_numFiles) { - let ok = false; - if (this.m_numFiles === VALID_NUM_FILES_2) { - ok = this.m_loader.createVolumeFromHeaderAndImage(volDst); - } else if (this.m_numFiles === VALID_NUM_FILES_4) { - // intensity data 16 -> 8 bpp - ok = this.m_loader.createVolumeFromHeaderAndImage(volDst); - if (ok) { - // mix 8 bpp intensity and roi pixels - ok = this.m_loader.createRoiVolumeFromHeaderAndImage(volDst, this.m_volumeRoi); - } - } - this.callbackReadProgress(1.0); - if (!ok) { - this.callbackReadComplete(LoadResult.FAIL); - } else { - this.callbackReadComplete(LoadResult.SUCCESS); - } - } - - // read again new file - if (this.m_fileIndex < this.m_numFiles) { - this.callbackReadProgress(ratioLoad); - this.m_fileReader.onloadend = this.onFileContentReadMultipleHdr; - const file = this.m_files[this.m_fileIndex]; - this.m_fileName = file.name; - this.m_fileReader.readAsArrayBuffer(file); - } - } // on multuple hdr - - // on complete read multuple dicom - callbackCompleteMultipleDicom(errCode) { - if (errCode !== LoadResult.SUCCESS) { - const strErr = LoadResult.getResultString(errCode); - this.setErrorString(strErr); - } - } - - // - // read from string content in this.m_fileReader.result - // - onFileContentReadMultipleDicom() { - // console.log('UiOpenMenu. onFileContentReadMultipleDicom ...'); - const strContent = this.m_fileReader.result; - this.m_fileIndex++; - const ratioLoad = this.m_fileIndex / this.m_numFiles; - // console.log(`onFileContentReadMultipleDicom. r = ${ratioLoad}`); - const callbackProgress = null; - // const callbackComplete = this.callbackReadMultipleComplete; - - if (this.m_fileIndex <= 1) { - // add new volume to volume set on the first slice - const vol = new Volume(); - this.m_volumeSet.addVolume(vol); - // init progress on the first file loading - this.callbackReadProgress(0.0); - } - - // FIX 05/06/2020: read multiple dicom callback complete - // can be invoked with error code - const callbackColmpleteVoid = this.callbackCompleteMultipleDicom; - - let readStatus; - - if (READ_DICOM_VIA_DAIKON) { - readStatus = this.readSliceDicomViaDaikon(this.m_fileIndex - 1, this.m_fileName, ratioLoad, strContent); - } else { - readStatus = this.m_volumeSet.readSingleSliceFromDicom( - this.m_loader, - this.m_fileIndex - 1, - this.m_fileName, - ratioLoad, - strContent, - callbackProgress, - callbackColmpleteVoid - ); - } - - if (readStatus !== LoadResult.SUCCESS) { - console.log('onFileContentReadMultipleDicom. Error read individual file'); - } - if (readStatus === LoadResult.SUCCESS && this.m_fileIndex === this.m_numFiles) { - // setup global vars - const store = this.props; - store.dispatch({ type: StoreActionType.SET_VOLUME_INDEX, volumeIndex: 0 }); - store.dispatch({ type: StoreActionType.SET_VOLUME_SET, volumeSet: this.m_volumeSet }); - - // save dicom loader to store - store.dispatch({ type: StoreActionType.SET_LOADER_DICOM, loaderDicom: this.m_loader }); - // stop show loading progress bar - this.callbackReadProgress(1.0); - this.callbackReadComplete(LoadResult.SUCCESS); - - // show modal: select window center, width - this.setState({ showModalWindowCW: true }); - return; // do nothing immediately after: wait for dialog - /* - const numSeries = this.m_loader.m_slicesVolume.m_series.length; - console.log(`num series = ${numSeries}`); - const series = this.m_loader.m_slicesVolume.getSeries(); - // save loaded series description to store - if (numSeries === 1) { - const indexSerie = 0; - const hash = series[indexSerie].m_hash; - this.m_loader.createVolumeFromSlices(this.m_volumeSet, indexSerie, hash); - this.finalizeSuccessLoadedVolume(this.m_volumeSet, this.m_fileName); - console.log(`onFileContentReadMultipleDicom read all ${this.m_numFiles} files`); - } else { - // now we have loaded more then 1 series from dicon files set - for (let i = 0; i < numSeries; i++) { - const hashCode = series[i].m_hash; - this.m_loader.createVolumeFromSlices(this.m_volumeSet, i, hashCode); - } - this.finalizeSuccessLoadedVolume(this.m_volumeSet, this.m_fileName); - console.log(`onFileContentReadMultipleDicom create ${numSeries} volumes for ${this.m_numFiles} files`); - // setup dicom series (volumes info) for global store: select volume later - const store = this.props; - store.dispatch({ type: StoreActionType.SET_DICOM_SERIES, dicomSeries: series }); - } - this.callbackReadProgress(1.0); - this.callbackReadComplete(LoadResult.SUCCESS); - */ - } // end if successfully read all files (multiple dicom read) - // read again new file - if (readStatus === LoadResult.SUCCESS) { - if (this.m_fileIndex < this.m_numFiles) { - // print console loading progress - const NUM_PARTS_REPORT = 16; - const STEP_PROGRESS = Math.floor(this.m_numFiles / NUM_PARTS_REPORT); - if (this.m_fileIndex % STEP_PROGRESS === 0) { - // console.log(`onFileContentReadMultipleDicom. Loading completed = ${ratioLoad}`); - this.callbackReadProgress(ratioLoad); - } - - this.m_fileReader.onloadend = this.onFileContentReadMultipleDicom; - const file = this.m_files[this.m_fileIndex]; - this.m_fileName = file.name; - this.m_fileReader.readAsArrayBuffer(file); - } // if still need files - } else { - const arrErr = []; - const strErr = this.props.arrErrors[0]; - arrErr.push(strErr); - this.finalizeFailedLoadedVolume(this.m_volumeSet, this.m_fileName, arrErr); - } // if result is not success - } - - // - // Perform open file after it selected in dialog - handleFileSelected(evt) { - if (evt.target.files !== undefined) { - let numFiles = evt.target.files.length; - console.log(`UiOpenMenu. Trying to open ${numFiles} files`); - if (numFiles <= 0) { - return; - } - console.log(`UiOpenMenu. handleFileSelected. file[0] = ${evt.target.files[0].name}`); - // debugger; - console.log('evt = ' + evt.target.files); - this.m_volumeSet = new VolumeSet(); - if (numFiles === 1) { - const file = evt.target.files[0]; - this.m_fileName = file.name; - this.m_fileSize = file.size; - console.log('this.m_fileSize ->>>>>>>>>>>>>> ' + this.m_fileSize); - console.log('evt.loaded ->>>>>>>>>>>>>> ' + evt.loaded); - console.log('evt.total ->>>>>>>>>>>>>> ' + evt.total); - - // read gzip - if (this.m_fileName.endsWith('.gz')) { - // here will be result raw buffer - this.m_unzippedBuffer = null; - - // remove last 3 chars form file name string - this.m_fileName = this.m_fileName.slice(0, -3); - - const store = this.props; - - const gunzip = zlib.createGunzip(); - createReadStream(file).pipe(gunzip); - gunzip.on('data', (data) => { - if (this.m_unzippedBuffer == null) { - store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: 0 }); - } else { - const readSize = this.m_unzippedBuffer.length; - const allSize = file.size; - const KOEF_DEFLATE = 0.28; - const ratio100 = Math.floor((readSize * 100.0 * KOEF_DEFLATE) / allSize); - store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: ratio100 }); - } - - // read the data chunk-by-chunk - // data is Uint8Array - const dataSize = data.length; - if (this.m_unzippedBuffer == null) { - // create buffer from first ungzipped data chunk - this.m_unzippedBuffer = new Uint8Array(dataSize); - this.m_unzippedBuffer.set(data, 0); - } else { - // append buffer from 2,3,... ungzipped data chunks - const dataCollectedSize = this.m_unzippedBuffer.length; - const arrNew = new Uint8Array(dataCollectedSize + dataSize); - arrNew.set(this.m_unzippedBuffer, 0); - arrNew.set(data, dataCollectedSize); - this.m_unzippedBuffer = arrNew; - } - }); - gunzip.on('close', () => { - console.log('gzip on close'); - }); - - gunzip.on('end', () => { - store.dispatch({ type: StoreActionType.SET_PROGRESS, progress: 0 }); - // now all chunks are read. Need to check raw ungzipped buffer - const sizeBuffer = this.m_unzippedBuffer.length; - if (sizeBuffer < 128) { - console.log('Too small ungzipped data: ' + sizeBuffer.toString() + " bytes. can't read volume data"); - return; - } - // check correct nifti header after extract raw bytes from gzip - const headTemplate = [0x00, 0x00, 0x01, 0x5c]; - let correctHead0 = true; - for (let i = 0; i < 4; i++) { - if (this.m_unzippedBuffer[i] !== headTemplate[i]) { - correctHead0 = false; - } - } - let correctHead1 = true; - for (let i = 0; i < 4; i++) { - if (this.m_unzippedBuffer[i] !== headTemplate[3 - i]) { - correctHead1 = false; - } - } - if (!correctHead0 && !correctHead1) { - console.log('Wrong nifi header, cant read gzipped file'); - return; - } - console.log('ungzip done with ' + sizeBuffer.toString() + ' bytes. Correct nifti header detected'); - // process raw data buffer - this.onFileReadSingleBuffer(this.m_unzippedBuffer); - }); - return; - } // if gzipped file - this.m_fileReader = new FileReader(); - const progressHandler = ({ loaded, total }) => { - // debugger; - this.callbackReadProgress(loaded / total); - }; - this.m_fileReader.addEventListener('progress', progressHandler); - this.m_fileReader.onloadend = this.onFileContentReadSingleFile; - this.m_fileReader.readAsArrayBuffer(file); - } else { - // not single file was open - this.m_files = Array.from(evt.target.files); // FileList -> Array - this.m_fileIndex = 0; - this.m_numFiles = numFiles; - this.m_fileReader = new FileReader(); - // if multiple files, create Dicom loader - this.m_loader = null; - if (evt.target.files[0].name.endsWith('.dcm')) { - // remove non-dcm files - let numFilesNew = 0; - for (let i = numFiles - 1; i >= 0; i--) { - if (this.m_files[i].name.endsWith('.dcm')) { - numFilesNew++; - } else { - this.m_files.splice(i, 1); - } - } - numFiles = numFilesNew; - this.m_numFiles = numFilesNew; - - this.m_loader = new LoaderDicom(numFiles); - const dicomInfo = this.m_loader.m_dicomInfo; - - // save dicomInfo to store - const store = this.props; - store.dispatch({ type: StoreActionType.SET_DICOM_INFO, dicomInfo: dicomInfo }); - - // save dicom loader to store - store.dispatch({ type: StoreActionType.SET_LOADER_DICOM, loaderDicom: this.m_loader }); - - this.m_fileReader.onloadend = this.onFileContentReadMultipleDicom; - } else if (evt.target.files[0].name.endsWith('.hdr') || evt.target.files[0].name.endsWith('.img')) { - this.m_loader = new LoaderHdr(numFiles); - this.m_fileReader.onloadend = this.onFileContentReadMultipleHdr; - } - - //const vol = new Volume(); - //this.m_volume = vol; - this.m_volumeRoi = null; - - const file = evt.target.files[0]; - this.m_fileName = file.name; - this.m_fileReader.readAsArrayBuffer(file); - } // if num files > 1 - } // if event is not empty - } - - buildFileSelector() { - const fileSelector = document.createElement('input'); - fileSelector.setAttribute('type', 'file'); - fileSelector.setAttribute('hidden', 'true'); - fileSelector.setAttribute('accept', '.txt,.ktx,.dcm,.nii,.hdr,.h,.img,.gz'); - fileSelector.setAttribute('multiple', 'true'); - document.body.appendChild(fileSelector); - fileSelector.onchange = this.handleFileSelected; - return fileSelector; - } - - onButtonOpenLocalFileClick(evt) { - // console.log('onButtonLocalFile started'); - // debugger; - evt.preventDefault(); - this.m_fileSelector.click(); - } - - // - onModalUrlShow() { - this.setState({ showModalUrl: true }); - } - - onModalUrlHide() { - console.log(`onModalUrlHide`); - this.setState({ showModalUrl: false }); - } - - callbackReadCompleteUrlKtxNii(codeResult) { - if (codeResult !== LoadResult.SUCCESS) { - console.log(`onCompleteFromUrlKtx. Bad result: ${codeResult}`); - - const arrErrors = []; - const strErr = LoadResult.getResultString(codeResult); - arrErrors.push(strErr); - this.finalizeFailedLoadedVolume(this.m_volumeSet, this.m_fileName, arrErrors); - } else { - this.finalizeSuccessLoadedVolume(this.m_volumeSet, this.m_fileName); - this.callbackReadComplete(LoadResult.SUCCESS, null, 0, null); - } - } - - loadFromUrl(strUrl) { - if (FileTools.isValidUrl(strUrl)) { - this.m_url = strUrl; - - this.m_fileName = FileTools.getFileNameFromUrl(strUrl); - this.m_volumeSet = new VolumeSet(); - this.m_volumeSet.addVolume(new Volume()); - - if (strUrl.endsWith('.ktx')) { - // debugger; - const callbackProgress = this.callbackReadProgress; - const callbackComplete = this.callbackReadCompleteUrlKtxNii; - this.callbackReadProgress(0.0); - // debugger; - this.m_volumeSet.readFromKtxUrl(strUrl, callbackProgress, callbackComplete); - // if KTX - } else if (strUrl.endsWith('.nii')) { - const callbackProgress = this.callbackReadProgress; - const callbackComplete = this.callbackReadCompleteUrlKtxNii; - this.callbackReadProgress(0.0); - this.m_volumeSet.readFromNiiUrl(strUrl, callbackProgress, callbackComplete); - // if NII (Nifti format) - } else if (strUrl.endsWith('.dcm')) { - if (READ_DICOM_VIA_DAIKON) { - const loaderUrlDcm = new LoaderDcmUrlDaikon(); - return loaderUrlDcm.readFromUrl(this.m_volumeSet, strUrl, this.callbackReadCompleteUrlKtxNii, this.callbackReadProgress); - } - - const callbackProgress = this.callbackReadProgress; - const callbackComplete = this.callbackReadCompleteUrlKtxNii; - this.callbackReadProgress(0.0); - this.m_volumeSet.readFromDicomUrl(strUrl, callbackProgress, callbackComplete); - // if Dicom - } else if (strUrl.endsWith('.hdr')) { - const callbackProgress = this.callbackReadProgress; - const callbackComplete = this.callbackReadCompleteUrlKtxNii; - this.callbackReadProgress(0.0); - this.m_volumeSet.readFromHdrUrl(strUrl, callbackProgress, callbackComplete); - // if Hdr - } else { - console.log(`UiOpenMenu. Unknown file type from URL = ${strUrl}`); - } - } else { - const strErr = `UiOpenMenu. Bad URL = ${strUrl}`; - console.log(strErr); - this.setErrorString(strErr); - } - } - - onClickLoadUrl(strUrl) { - this.setState({ showModalUrl: false }); - console.log(`onClickLoadUrl with strUrl = ${strUrl}`); - this.loadFromUrl(strUrl); - } - - // - onModalDemoOpenShow() { - this.setState({ showModalDemo: true }); - } - - onModalDemoOpenHide() { - this.setState({ showModalDemo: false }); - } - - // - arrNumToStr(arrNums) { - const numLet = arrNums.length; - let str = ''; - for (let i = 0; i < numLet; i++) { - const n = arrNums[i]; - str = str.concat(String.fromCharCode(n)); - } - return str; - } - - onModalGoogleShow() { - this.setState({ showModalGoogle: true }); - } - - onModalGoogleHide() { - this.setState({ showModalGoogle: false }); - } - - onGoogleSelected(index) { - // perform action on click i-th item in Google cloud menu . Or remove this menu completely - console.log(`onGoogleSelected(${index}) ... `); - } - - onDemoSelected(index) { - const store = this.props; - store.dispatch({ - type: StoreActionType.SET_PROGRESS, - progress: 0, - }); - store.dispatch({ - type: StoreActionType.SET_PROGRESS_INFO, - titleProgressBar: 'Loading demo file, please, wait...', - }); - store.dispatch({ type: StoreActionType.SET_SPINNER, spinner: true }); - const arr = config.demoUrls; - if (arr.length >= 8) { - const fileName = arr[index]; - console.log(`onDemoSelected: load file ${fileName}, config[ ${index} ]`); - this.loadFromUrl(fileName); - return; - } - - const DEMO_URL = 'https://daentjnvnffrh.cloudfront.net/demo/'; - - let fileName = - DEMO_URL + - [ - '01_lungs/20101108.ktx', - '02_brain_set/brain256.ktx', - '03_grandmother_gm3/gm3_512_512_165.nii', - '04_woman_pelvis/file_list.txt', - '05_lungs_00cba/file_list.txt', - '06_ct_256/ct_256_256_256.ktx', - '07_lungs_256/lungs_256_256_256.ktx', - '08_brain_with_roi/set_intn.hdr', - ][index] || console.log(`onDemoSelected. not implemented for index = ${index}`); - - if (fileName === '04_woman_pelvis/file_list.txt') { - const numUrls = config.demoWomanPelvisUrls.length; - if (numUrls > 0) { - const strPrefix = config.demoWomanPelvisPrefix; - // console.log(`config. prefix = ${strPrefix}`); - const arrFileNames = []; - for (let i = 0; i < numUrls; i++) { - const strFn = config.demoWomanPelvisUrls[i]; - const url = `${strPrefix}${strFn}`; - arrFileNames.push(url); - } - const store = this.props; - const loader = new LoaderUrlDicom(store); - const GOOGLE_HEADER = false; - loader.loadFromUrlArray(arrFileNames, GOOGLE_HEADER); - return; - } - } - if (fileName === '05_lungs_00cba/file_list.txt') { - const numUrls = config.demoLungsUrls.length; - if (numUrls > 0) { - const strPrefix = config.demoLungsPrefix; - const arrFileNames = []; - for (let i = 0; i < numUrls; i++) { - const strFn = config.demoLungsUrls[i]; - const url = `${strPrefix}${strFn}`; - arrFileNames.push(url); - } - const store = this.props; - const loader = new LoaderUrlDicom(store); - const GOOGLE_HEADER = false; - loader.loadFromUrlArray(arrFileNames, GOOGLE_HEADER); - return; - } - } - if (fileName.length > 0) { - console.log(`onDemoSelected. enc = ${fileName}`); - this.loadFromUrl(fileName); - } - } - - // - shouldComponentUpdate() { - return true; - } - - onModalDicomSeriesHide() { - const arrEmpty = []; - const store = this.props; - store.dispatch({ type: StoreActionType.SET_DICOM_SERIES, dicomSeries: arrEmpty }); - } - - onDicomSerieSelected(indexSelected) { - const store = this.props; - const series = store.dicomSeries; - const serieSelected = series[indexSelected]; - const hash = serieSelected.m_hash; - this.m_loader.createVolumeFromSlices(this.m_volumeSet, indexSelected, hash); - this.finalizeSuccessLoadedVolume(this.m_volumeSet, this.m_fileName); - console.log(`onFileContentReadMultipleDicom read all ${this.m_numFiles} files`); - - // clear modal - store.dispatch({ type: StoreActionType.SET_DICOM_SERIES, dicomSeries: [] }); - } - - // - onModalWindowCWHide(needShow) { - this.setState({ showModalWindowCW: false }); - if (needShow) { - this.finalizeSuccessLoadedVolume(this.m_volumeSet, this.m_fileName); - // setup dicom series (volumes info) for global store: select volume later - const store = this.props; - let series = null; - if (this.m_loader !== undefined) { - series = this.m_loader.m_slicesVolume.getSeries(); - store.dispatch({ type: StoreActionType.SET_DICOM_SERIES, dicomSeries: series }); - } - // update graphics 2d window - const gra = store.graphics2d; - if (gra !== null) { - gra.forceUpdate(); - } - } - } - - // - // invoked after render - // - componentDidMount() { - this.m_fileSelector = this.buildFileSelector(); - const fileNameOnLoad = this.m_fileNameOnLoad; - // console.log(`UiOpenMenu. componentDidMount. fnonl = ${fileNameOnLoad}`); - if (fileNameOnLoad.length > 0 && this.state.onLoadCounter > 0) { - this.setState({ onLoadCounter: 0 }); - const TIMEOUT_MS = 50; - // debugger; - setTimeout(this.loadFromUrl(fileNameOnLoad), TIMEOUT_MS); - } - } - - // render - render() { - this.m_fileNameOnLoad = this.props.fileNameOnLoad; - - return ( - <> - - - this.onButtonOpenLocalFileClick(evt)} /> - - - - - {NEED_DEMO_MENU && ( - - - - )} - - - {this.props.isLoaded && ( -
- - -
- )} - - {this.state.showModalUrl && ( - - )} - - {this.state.showModalDemo && ( - - )} - {this.state.showModalWindowCW && ( - - )} - - {/**/} - - ); - } -} - -export default connect((store) => store)(UiOpenMenu); diff --git a/src/ui/OpenFile/UiOpenMenu.module.css b/src/ui/OpenFile/UiOpenMenu.module.css deleted file mode 100644 index be2bd0a1..00000000 --- a/src/ui/OpenFile/UiOpenMenu.module.css +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) - * SPDX-License-Identifier: Apache-2.0 - */ - -.save-file__area { - height: 40px; - display: flex; - align-content: center; - align-items: center; - justify-content: space-between; - color: #18191b; - padding-left: 1rem; -} - -.save-file__area div { - margin-right: 10px; -} - -.save-file__area div { - background: inherit; - color: var(--black); -} - -.filename { - gap: 8px; -} - -.open-folder__link, -.button.report-menu__report, -.button.report-menu__camera { - background: inherit; - display: flex; - flex-direction: column; - align-items: center; - color: #18191b; -} -.open-folder__link:hover, -.button.report-menu__report:hover, -.button.report-menu__camera:hover { - background-color: var(--light-orange); -} - -.open-folder__link:focus, -.button.report-menu__report:focus, -.button.report-menu__camera:focus { - background-color: var(--light-orange); -} - - -.open-file__link, -.open-demo__link { - display: none; -} - - @media screen and (min-width: 768px) { - .open-folder__link, - .button.report-menu__report, - .button.report-menu__camera { - background-color: var(--beige); - } - - .open-folder__link > span, - .button.report-menu__report > span, - .button.report-menu__camera > span { - display: none; - } - - } -@media screen and (min-width: 1024px) { - .open-file__link, - .open-demo__link { - background-color: var(--beige); - } - .save-file__area { - align-items: normal; - } -} \ No newline at end of file diff --git a/src/ui/OpenFile/UiReportMenu.js b/src/ui/OpenFile/UiReportMenu.js index 9a6fe862..5ccbbd87 100644 --- a/src/ui/OpenFile/UiReportMenu.js +++ b/src/ui/OpenFile/UiReportMenu.js @@ -3,9 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -import React, { useState } from 'react'; +import { useState } from 'react'; import cx from 'classnames'; -import css from './UiOpenMenu.module.css'; +import css from './UiReportMenu.module.css'; import Screenshot from '../../engine/utils/Screenshot'; import ViewMode from '../../store/ViewMode'; diff --git a/src/ui/OpenFile/UiReportMenu.module.css b/src/ui/OpenFile/UiReportMenu.module.css new file mode 100644 index 00000000..2cc23878 --- /dev/null +++ b/src/ui/OpenFile/UiReportMenu.module.css @@ -0,0 +1,39 @@ +.save-file__area { + height: 40px; + display: flex; + align-content: center; + align-items: center; + justify-content: space-between; + color: #18191b; + padding-left: 1rem; +} + +.button.report-menu__report, +.button.report-menu__camera { + background: inherit; + display: flex; + flex-direction: column; + align-items: center; + color: #18191b; +} +.button.report-menu__report:hover, +.button.report-menu__camera:hover { + background-color: var(--light-orange); +} + +.button.report-menu__report:focus, +.button.report-menu__camera:focus { + background-color: var(--light-orange); +} + +@media screen and (min-width: 768px) { + .button.report-menu__report, + .button.report-menu__camera { + background-color: var(--beige); + } + + .button.report-menu__report > span, + .button.report-menu__camera > span { + display: none; + } +} diff --git a/src/ui/Panels/Properties2d/SelectVolumeProperty.js b/src/ui/Panels/Properties2d/SelectVolumeProperty.js index daa87a7d..faf771c7 100644 --- a/src/ui/Panels/Properties2d/SelectVolumeProperty.js +++ b/src/ui/Panels/Properties2d/SelectVolumeProperty.js @@ -82,18 +82,7 @@ class SelectVolumeProperty extends React.Component { onClick={() => { this.onClickRow(i); }} - active - > - {strVo} {' '} -

- ); - } else { - jsxListItem = ( -

{ - this.onClickRow(i); - }} + data-active="true" // use a data attribute instead > {strVo} {' '}

diff --git a/src/ui/Panels/Properties2d/UiVolIcon.js b/src/ui/Panels/Properties2d/UiVolIcon.js index 562b2c22..034d7879 100644 --- a/src/ui/Panels/Properties2d/UiVolIcon.js +++ b/src/ui/Panels/Properties2d/UiVolIcon.js @@ -1,23 +1,18 @@ -/* - * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) - * SPDX-License-Identifier: Apache-2.0 - */ - import React, { useRef, useEffect } from 'react'; - import { useSelector } from 'react-redux'; import { VOLUME_ICON_SIDE } from '../../../engine/Volume'; export const UiVolIcon = (props) => { - let m_volIndex = -1; + const { index } = props; + const objCanvas = useRef(null); + + // Use the useSelector hook here + const volSet = useSelector((state) => state.volumeSet); + useEffect(() => { - // console.log("UiVlIcon.componentDidMount"); - const store = useSelector((state) => state); - const volSet = store.volumeSet; - const vol = volSet.getVolume(m_volIndex); - // console.log(`vol icon = ${vol.m_xIcon} * ${vol.m_yIcon}`); - const objCanvas = useRef(null); - if (objCanvas === null) { + const vol = volSet.getVolume(index); + + if (!objCanvas.current) { return; } const ctx = objCanvas.current.getContext('2d'); @@ -26,11 +21,9 @@ export const UiVolIcon = (props) => { if (w * h === 0) { return; } - // clear dest image ctx.fillStyle = 'rgb(64, 64, 64)'; ctx.fillRect(0, 0, w, h); if (vol.m_xIcon <= 0) { - // draw cross on whole image ctx.beginPath(); ctx.moveTo(0, 0); ctx.lineTo(w - 1, h - 1); @@ -55,8 +48,8 @@ export const UiVolIcon = (props) => { j += 4; } ctx.putImageData(imgData, 0, 0); - }, []); + }, [index, volSet]); // Add both index and volSet as dependencies. + const side = VOLUME_ICON_SIDE; - m_volIndex = props.index; return ; }; diff --git a/src/ui/ProgressBar/UISpinner.jsx b/src/ui/ProgressBar/UISpinner.jsx index 9a14fb75..87d1de56 100644 --- a/src/ui/ProgressBar/UISpinner.jsx +++ b/src/ui/ProgressBar/UISpinner.jsx @@ -1,11 +1,16 @@ -import React from 'react'; +import { useSelector } from 'react-redux'; import css from './UISpinner.module.css'; const Spinner = () => { + const { spinnerProgress, spinnerTitle } = useSelector((state) => state); + return (
+
-
Loading...
+
+
{spinnerProgress}
+
{spinnerTitle}
); }; diff --git a/src/ui/ProgressBar/UISpinner.module.css b/src/ui/ProgressBar/UISpinner.module.css index 5ff49874..17a08a1e 100644 --- a/src/ui/ProgressBar/UISpinner.module.css +++ b/src/ui/ProgressBar/UISpinner.module.css @@ -3,6 +3,7 @@ height: 100vh; width: 100%; display: flex; + flex-direction: column; align-items: center; justify-content: center; } @@ -28,7 +29,33 @@ transform: translateZ(0); -webkit-animation: load8 1.1s infinite linear; animation: load8 1.1s infinite linear; - z-index: 11; + z-index: 2001; +} +.progress { + z-index: 2001; + color: white; + font-size: 26px; + margin-top: -57px; +} +.text { + z-index: 2001; + color: white; + font-size: 22px; + margin-top: 40px; +} + +.progress_overlay { + content: ''; + width: 200px; + height: 200px; + z-index: 2000; + background-color: black; + border-radius: 20px; + position: absolute; + top: 50%; + left: 50%; + opacity: 0.85; + transform: translate(-50%, -50%); } @-webkit-keyframes load8 { 0% { diff --git a/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.jsx b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.jsx index 6f2d7849..0de6e2c3 100644 --- a/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.jsx +++ b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.jsx @@ -38,7 +38,7 @@ const RecentlyFiles = () => { return files.length ? (
-
Recently opened file:
+
Recently opened files:
{timestamps.map((timestamp, idx) => ( diff --git a/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css index 706af2a9..227e3ddd 100644 --- a/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css +++ b/src/ui/StartScreen/RecentlyFiles/RecentlyFiles.module.css @@ -1,4 +1,6 @@ .files_container { + display: flex; + flex-direction: column; margin: 10px 0 0 0; background-color: var(--extreme-black); font-size: 14px; @@ -12,6 +14,7 @@ display: flex; margin-bottom: 10px; padding-right: 0.5rem; + flex-basis: 100%; } .files { @@ -21,19 +24,15 @@ .left { color: var(--dark-gray4); margin-right: 20px; -} - -.element:not(:first-child) { - display: none; + flex-basis: 50%; } @media screen and (min-width: 768px) { - .files_container { display: flex; align-items: normal; justify-content: flex-start; - margin:10px 0 1.1rem 0; + margin: 10px 0 1.1rem 0; background-color: var(--extreme-black); font-size: 14px; width: 100%; @@ -48,10 +47,9 @@ } @media screen and (min-width: 1024px) { -.files_container { - margin: 0 0 1rem 0; - display: flex; - justify-content: normal; + .files_container { + margin: 0 0 1rem 0; + display: flex; + justify-content: normal; } } - diff --git a/src/ui/StartScreen/SmartContainer/SmartContainer.jsx b/src/ui/StartScreen/SmartContainer/SmartContainer.jsx index 423a0787..bafba893 100644 --- a/src/ui/StartScreen/SmartContainer/SmartContainer.jsx +++ b/src/ui/StartScreen/SmartContainer/SmartContainer.jsx @@ -1,113 +1,24 @@ -import React from 'react'; +import { connect } from 'react-redux'; +import { OpenFromDeviceButtonComponent, DragAndDropComponent, OpenFromURLComponent, OpenDemoComponent } from '../../FileReaders'; import RecentlyFiles from '../RecentlyFiles/RecentlyFiles'; -import { UIButton } from '../../Button/Button'; -import { connect } from 'react-redux'; import css from './SmartContainer.module.css'; -import { SVG } from '../../Button/SVG'; -import UiModalDemo from '../../Modals/ModalDemo'; -import UiModalWindowCenterWidth from '../../Modals/UiModalWinCW'; -import FileReader from '../../../engine/loaders/FileReader'; -import { UiSaveMenu } from '../../OpenFile/UiSaveMenu'; -import { UiReportMenu } from '../../OpenFile/UiReportMenu'; -import UIModalUrl from '../../Modals/ModalUrl'; - -const IMG_DROPZONE_SIZE = 49; - -// This component cannot be refactor to FC yet, as we need to extend it from FileReader for now -class SmartContainer extends FileReader { - constructor(props) { - super(props); - this.state = { - isMobile: false, - isActiveDnd: false, - }; - } - - componentDidMount() { - const isMobile = window.innerWidth < 768; - //const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent); - //console.log(navigator.userAgent); - window.addEventListener('resize', this.handleWindowResize); - this.setState({ isMobile }); - console.log(isMobile); - } - - handleDrag(e) { - e.preventDefault(); - e.dataTransfer.dropEffect = 'copy'; - if ((e.type === 'dragenter' || e.type === 'dragover') && this.state.isActiveDnd !== true) { - this.setState({ isActiveDnd: true }); - } else if (e.type === 'dragleave' && this.state.isActiveDnd === true) { - this.setState({ isActiveDnd: false }); - } - } - - handleDrop(e) { - e.preventDefault(); - this.setState({ isActiveDnd: false }); - this.handleFileSelected(e); - } - - handleWindowResize = () => { - const isMobile = window.innerWidth < 768; - this.setState({ isMobile }); - }; - - componentWillUnmount() { - window.removeEventListener('resize', this.handleWindowResize); - } - - render() { - const { isMobile } = this.state; - console.log(isMobile); - - return ( -
this.handleDrag(e)} - onDragLeave={(e) => this.handleDrag(e)} - onDragOver={(e) => this.handleDrag(e)} - onDrop={(e) => this.handleDrop(e)} - className={this.state.isActiveDnd && !isMobile ? `${css.smart_container} ${css.smart_container__active}` : css.smart_container} - > - {!isMobile && ( - <> - -

Drag and drop files here

-

OR

- - )} -
- this.onButtonOpenLocalFileClick(evt)} - cx={css.button_start_screen} - /> - - -
- - {this.props.isLoaded && ( -
- - -
- )} - - {this.state.showModalUrl && ( - - )} - - {this.state.showModalDemo && ( - - )} - {this.state.showModalWindowCW && ( - - )} +import buttonCss from '../../Button/Button.module.css'; + +const SmartContainer = () => { + return ( +
+ +

Drag and drop files here

+

OR

+
+ + +
- ); - } -} + +
+ ); +}; export default connect((store) => store)(SmartContainer); diff --git a/src/ui/StartScreen/SmartContainer/SmartContainer.module.css b/src/ui/StartScreen/SmartContainer/SmartContainer.module.css index 0a2f451a..3256f15f 100644 --- a/src/ui/StartScreen/SmartContainer/SmartContainer.module.css +++ b/src/ui/StartScreen/SmartContainer/SmartContainer.module.css @@ -15,9 +15,10 @@ } .buttons_toolbar { - display: flex; - flex-direction: column; - justify-content: space-between; + display: flex; + flex-direction: column; + justify-content: space-between; + margin-bottom: 10px; } .buttons_toolbar button { @@ -64,4 +65,3 @@ background-position: 100% 0, 0 100%, 0 0, 100% 100%; } } - diff --git a/src/ui/StartScreen/StartScreen.module.css b/src/ui/StartScreen/StartScreen.module.css index c12d2e2b..88ccdffb 100644 --- a/src/ui/StartScreen/StartScreen.module.css +++ b/src/ui/StartScreen/StartScreen.module.css @@ -21,7 +21,6 @@ display: none; } - @media screen and (min-width: 768px) { .subheader { margin: 0; @@ -51,9 +50,7 @@ } .container { + width: 600px; margin-top: 30px; } - - } - diff --git a/src/ui/TopToolbar/Filter/LungsTool.test.jsx b/src/ui/TopToolbar/Filter/LungsTool.test.jsx deleted file mode 100644 index 12fab735..00000000 --- a/src/ui/TopToolbar/Filter/LungsTool.test.jsx +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2022 EPAM Systems, Inc. (https://www.epam.com/) - * SPDX-License-Identifier: Apache-2.0 - */ - -import React from 'react'; -import { renderWithState } from '../../../utils/configureTest'; -import { AppContextProvider } from '../../App/AppContext'; -import { LungsTool } from './LungsTool'; -import VolumeSet from '../../../engine/VolumeSet'; -import Volume from '../../../engine/Volume'; -import { fireEvent, screen } from '@testing-library/react'; -import { ToolbarContextProvider } from '../ToolbarContext'; - -jest.mock('./Jobs/lungsFillJob', () => ({ lungsFillJob: jest.fn(() => ({ run: () => true, getProgress: () => 0 })) })); -jest.useFakeTimers(); -jest.spyOn(global, 'setInterval'); - -describe('Test LungsTool', () => { - it('should render', async () => { - const forceUpdate = jest.fn(); - const volumeSet = new VolumeSet(); - const volume = new Volume(); - volume.createEmptyBytesVolume(16, 16, 16); - volumeSet.addVolume(volume); - - renderWithState( - - - - - , - { volumeSet: volumeSet, volumeIndex: 0, graphics2d: { forceUpdate: forceUpdate } } - ); - - expect(forceUpdate).toBeCalledTimes(0); - fireEvent.click(screen.getByRole('button')); - - await expect(setInterval).toHaveBeenCalledTimes(1); - - jest.runOnlyPendingTimers(); - - expect(forceUpdate).toBeCalledTimes(1); - }); -}); diff --git a/src/ui/hooks/useOnEvent.js b/src/ui/hooks/useOnEvent.js new file mode 100644 index 00000000..89add33c --- /dev/null +++ b/src/ui/hooks/useOnEvent.js @@ -0,0 +1,14 @@ +import { useEffect, useRef } from 'react'; +import MriViwer from '../../engine/lib/MRIViewer'; + +export function useOnEvent(event, callback) { + const mriViwer = useRef(MriViwer).current; + + useEffect(() => { + mriViwer.events.on(event, callback); + + return () => { + mriViwer.events.off(event, callback); + }; + }, [callback]); +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..f006efab --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "outDir": "./dist/", + "sourceMap": true, + "noImplicitAny": true, + "module": "esnext", + "target": "es6", + "jsx": "react-jsx", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true + }, + "include": [ + "./src/**/*" + ] +} From 46a91cc806c18e25a0051d2ad500360b865a6ff8 Mon Sep 17 00:00:00 2001 From: Oleksandr Iefymchuk Date: Mon, 13 Nov 2023 18:50:12 +0200 Subject: [PATCH 55/57] EPMUII-8073-Zoom-in/out-improvements --- public/sprite.svg | 10 +- src/engine/Graphics2d.js | 152 ++++++++++++++++------------- src/engine/tools2d/ToolDistance.js | 12 ++- src/engine/tools2d/ToolPick.js | 6 +- src/engine/tools2d/ToolTypes.js | 9 +- src/ui/Main.module.css | 38 +++----- src/ui/UiZoomTools.jsx | 66 +++++++++++-- 7 files changed, 182 insertions(+), 111 deletions(-) diff --git a/public/sprite.svg b/public/sprite.svg index c01baef0..93f56aec 100644 --- a/public/sprite.svg +++ b/public/sprite.svg @@ -197,8 +197,14 @@ - - + + + + + + + + diff --git a/src/engine/Graphics2d.js b/src/engine/Graphics2d.js index a46d90cb..ae7d04b6 100644 --- a/src/engine/Graphics2d.js +++ b/src/engine/Graphics2d.js @@ -166,10 +166,6 @@ class Graphics2d extends React.Component { let wScreen = 0, hScreen = 0; - const xPos = store.render2dxPos; - const yPos = store.render2dyPos; - const zoom = store.render2dZoom; - if (mode2d === Modes2d.TRANSVERSE) { // calc screen rect based on physics volume slice size (z slice) const xyRratio = pbox.x / pbox.y; @@ -218,17 +214,15 @@ class Graphics2d extends React.Component { let zSlice = Math.floor(zDim * sliceRatio); zSlice = zSlice < zDim ? zSlice : zDim - 1; const zOff = zSlice * xyDim; - const xStep = (zoom * xDim) / wScreen; - const yStep = (zoom * yDim) / hScreen; + const xStep = xDim / wScreen; + const yStep = yDim / hScreen; let j = 0; - let ay = yPos * yDim; if (vol.m_bytesPerVoxel === ONE) { - for (let y = 0; y < hScreen; y++, ay += yStep) { - const ySrc = Math.floor(ay); + for (let y = 0; y < hScreen; y++) { + const ySrc = Math.floor(y * yStep); const yOff = ySrc * xDim; - let ax = xPos * xDim; - for (let x = 0; x < wScreen; x++, ax += xStep) { - const xSrc = Math.floor(ax); + for (let x = 0; x < wScreen; x++) { + const xSrc = Math.floor(x * xStep); const val = dataSrc[zOff + yOff + xSrc]; dataDst[j + 0] = val; dataDst[j + 1] = val; @@ -238,12 +232,11 @@ class Graphics2d extends React.Component { } // for (x) } // for (y) } else if (vol.m_bytesPerVoxel === FOUR) { - for (let y = 0; y < hScreen; y++, ay += yStep) { - const ySrc = Math.floor(ay); + for (let y = 0; y < hScreen; y++) { + const ySrc = Math.floor(y * yStep); const yOff = ySrc * xDim; - let ax = xPos * xDim; - for (let x = 0; x < wScreen; x++, ax += xStep) { - const xSrc = Math.floor(ax); + for (let x = 0; x < wScreen; x++) { + const xSrc = Math.floor(x * xStep); const val = dataSrc[(zOff + yOff + xSrc) * FOUR + OFF_3]; const val4 = val * FOUR; const rCol = roiPal256[val4 + 0]; @@ -305,17 +298,15 @@ class Graphics2d extends React.Component { let xSlice = Math.floor(xDim * sliceRatio); xSlice = xSlice < xDim ? xSlice : xDim - 1; - const yStep = (zoom * yDim) / wScreen; - const zStep = (zoom * zDim) / hScreen; + const yStep = yDim / wScreen; + const zStep = zDim / hScreen; let j = 0; - let az = yPos * zDim; if (vol.m_bytesPerVoxel === ONE) { - for (let y = 0; y < hScreen; y++, az += zStep) { - const zSrc = Math.floor(az); + for (let y = 0; y < hScreen; y++) { + const zSrc = Math.floor(y * zStep); const zOff = zSrc * xDim * yDim; - let ay = xPos * yDim; - for (let x = 0; x < wScreen; x++, ay += yStep) { - const ySrc = Math.floor(ay); + for (let x = 0; x < wScreen; x++) { + const ySrc = Math.floor(x * yStep); const yOff = ySrc * xDim; const val = dataSrc[zOff + yOff + xSlice]; @@ -328,12 +319,11 @@ class Graphics2d extends React.Component { } // for (x) } // for (y) } else if (vol.m_bytesPerVoxel === FOUR) { - for (let y = 0; y < hScreen; y++, az += zStep) { - const zSrc = Math.floor(az); + for (let y = 0; y < hScreen; y++) { + const zSrc = Math.floor(y * zStep); const zOff = zSrc * xDim * yDim; - let ay = xPos * yDim; - for (let x = 0; x < wScreen; x++, ay += yStep) { - const ySrc = Math.floor(ay); + for (let x = 0; x < wScreen; x++) { + const ySrc = Math.floor(x * yStep); const yOff = ySrc * xDim; const val = dataSrc[(zOff + yOff + xSlice) * FOUR + OFF_3]; const val4 = val * FOUR; @@ -398,17 +388,15 @@ class Graphics2d extends React.Component { ySlice = ySlice < yDim ? ySlice : yDim - 1; const yOff = ySlice * xDim; - const xStep = (zoom * xDim) / wScreen; - const zStep = (zoom * zDim) / hScreen; + const xStep = xDim / wScreen; + const zStep = zDim / hScreen; let j = 0; - let az = yPos * zDim; if (vol.m_bytesPerVoxel === ONE) { - for (let y = 0; y < hScreen; y++, az += zStep) { - const zSrc = Math.floor(az); + for (let y = 0; y < hScreen; y++) { + const zSrc = Math.floor(y * zStep); const zOff = zSrc * xDim * yDim; - let ax = xPos * xDim; - for (let x = 0; x < wScreen; x++, ax += xStep) { - const xSrc = Math.floor(ax); + for (let x = 0; x < wScreen; x++) { + const xSrc = Math.floor(x * xStep); const val = dataSrc[zOff + yOff + xSrc]; dataDst[j + 0] = val; @@ -420,12 +408,11 @@ class Graphics2d extends React.Component { } // for (x) } // for (y) } else if (vol.m_bytesPerVoxel === FOUR) { - for (let y = 0; y < hScreen; y++, az += zStep) { - const zSrc = Math.floor(az); + for (let y = 0; y < hScreen; y++) { + const zSrc = Math.floor(y * zStep); const zOff = zSrc * xDim * yDim; - let ax = xPos * xDim; - for (let x = 0; x < wScreen; x++, ax += xStep) { - const xSrc = Math.floor(ax); + for (let x = 0; x < wScreen; x++) { + const xSrc = Math.floor(x * xStep); const val = dataSrc[(zOff + yOff + xSrc) * FOUR + OFF_3]; const val4 = val * FOUR; const rCol = roiPal256[val4 + 0]; @@ -461,20 +448,26 @@ class Graphics2d extends React.Component { } renderReadyImage() { + const objCanvas = this.m_mount.current; + const ctx = objCanvas.getContext('2d'); + const store = this.props; + const zoom = store.render2dZoom; + const xPos = store.render2dxPos; + const yPos = store.render2dyPos; + const canvasWidth = objCanvas.width; + const canvasHeight = objCanvas.height; + const newImgWidth = canvasWidth / zoom; + const newImgHeight = canvasHeight / zoom; + if (!this.m_isMounted) { return; } - - const objCanvas = this.m_mount.current; if (objCanvas === null) { return; } - const ctx = objCanvas.getContext('2d'); // prepare canvas this.fillBackground(ctx); - const store = this.props; - const volSet = store.volumeSet; if (volSet.getNumVolumes() === 0) { return; @@ -491,35 +484,60 @@ class Graphics2d extends React.Component { const h = this.m_toolPick.m_hScreen; this.segm2d.render(ctx, w, h, this.imgData); } else { - ctx.putImageData(this.imgData, 0, 0); + createImageBitmap(this.imgData) + .then((imageBitmap) => { + ctx.drawImage(imageBitmap, xPos, yPos, canvasWidth, canvasHeight, 0, 0, newImgWidth, newImgHeight); + }) + .then(() => { + this.m_toolPick.render(ctx); + this.m_toolDistance.render(ctx, store); + this.m_toolAngle.render(ctx, store); + this.m_toolArea.render(ctx, store); + this.m_toolRect.render(ctx, store); + this.m_toolText.render(ctx, store); + this.m_toolEdit.render(ctx, store); + this.m_toolDelete.render(ctx, store); + }); } - - // render all tools - this.m_toolPick.render(ctx); - this.m_toolDistance.render(ctx, store); - this.m_toolAngle.render(ctx, store); - this.m_toolArea.render(ctx, store); - this.m_toolRect.render(ctx, store); - this.m_toolText.render(ctx, store); - this.m_toolEdit.render(ctx, store); - this.m_toolDelete.render(ctx, store); } onMouseWheel(evt) { + const objCanvas = this.m_mount.current; + const canvasRect = objCanvas.getBoundingClientRect(); + let xPosNew; + let yPosNew; const store = this.props; + const zoom = store.render2dZoom; const step = evt.deltaY * 2 ** -10; + let newZoom = zoom + step; - const zoom = store.render2dZoom; - let zoomNew = zoom + step; - let xPosNew = store.render2dxPos - ((step / 4) * evt.clientX) / evt.clientY; - let yPosNew = store.render2dyPos - ((step / 4) * evt.clientY) / evt.clientX; + if (step < 0) { + const mouseX = (evt.clientX - canvasRect.left) * zoom + store.render2dxPos; + const mouseY = (evt.clientY - canvasRect.top) * zoom + store.render2dyPos; + xPosNew = mouseX - (mouseX - store.render2dxPos) * (newZoom / zoom); + yPosNew = mouseY - (mouseY - store.render2dyPos) * (newZoom / zoom); + } else { + const initialX = canvasRect.width * zoom + store.render2dxPos; + const initialY = canvasRect.height * zoom + store.render2dyPos; + xPosNew = initialX - (initialX - store.render2dxPos) * (newZoom / zoom); + yPosNew = initialY - (initialY - store.render2dyPos) * (newZoom / zoom); + } - console.log(`onMouseWheel.evt = ${xPosNew}, ${yPosNew}`); - // console.log(`onMouseWheel. zoom.puml = ${zoom.puml} zoomNew = ${zoomNew}, xyPos = ${xPosNew},${yPosNew}`); - if (Math.abs(zoomNew) > 1 || Math.abs(zoomNew) < 0.02 || xPosNew < 0 || yPosNew < 0 || xPosNew > 1 || yPosNew > 1) { + if (xPosNew < 0) { + xPosNew = 0; + } + if (yPosNew < 0) { + yPosNew = 0; + } + if (newZoom > 1) { + newZoom = 1; + xPosNew = 0; + yPosNew = 0; + } + if (newZoom < 0.1) { return; } - store.dispatch({ type: StoreActionType.SET_2D_ZOOM, render2dZoom: zoomNew }); + store.dispatch({ type: StoreActionType.SET_2D_ZOOM, render2dZoom: newZoom }); store.dispatch({ type: StoreActionType.SET_2D_X_POS, render2dxPos: xPosNew }); store.dispatch({ type: StoreActionType.SET_2D_Y_POS, render2dyPos: yPosNew }); diff --git a/src/engine/tools2d/ToolDistance.js b/src/engine/tools2d/ToolDistance.js index 254832b5..a77bc873 100644 --- a/src/engine/tools2d/ToolDistance.js +++ b/src/engine/tools2d/ToolDistance.js @@ -111,9 +111,11 @@ class ToolDistance { const xDim = vol.m_xDim; const yDim = vol.m_yDim; const zDim = vol.m_zDim; + const objCanvas = store.graphics2d.m_mount.current; + const canvasRect = objCanvas.getBoundingClientRect(); const zoom = store.render2dZoom; - const xPos = store.render2dxPos; - const yPos = store.render2dyPos; + const xPos = store.render2dxPos / canvasRect.width; + const yPos = store.render2dyPos / canvasRect.height; const vTex = { x: 0.0, @@ -148,9 +150,11 @@ class ToolDistance { const xDim = vol.m_xDim; const yDim = vol.m_yDim; const zDim = vol.m_zDim; + const objCanvas = store.graphics2d.m_mount.current; + const canvasRect = objCanvas.getBoundingClientRect(); const zoom = store.render2dZoom; - const xPos = store.render2dxPos; - const yPos = store.render2dyPos; + const xPos = store.render2dxPos / canvasRect.width; + const yPos = store.render2dyPos / canvasRect.height; if (mode2d === Modes2d.TRANSVERSE) { // z const vScr.x = (xTex / xDim - xPos) / zoom; diff --git a/src/engine/tools2d/ToolPick.js b/src/engine/tools2d/ToolPick.js index 0bc5ffe5..1de1152d 100644 --- a/src/engine/tools2d/ToolPick.js +++ b/src/engine/tools2d/ToolPick.js @@ -58,9 +58,11 @@ class ToolPick { const xDim = vol.m_xDim; const yDim = vol.m_yDim; const zDim = vol.m_zDim; + const objCanvas = store.graphics2d.m_mount.current; + const canvasRect = objCanvas.getBoundingClientRect(); const zoom = store.render2dZoom; - const xPos = store.render2dxPos; - const yPos = store.render2dyPos; + const xPos = store.render2dxPos / canvasRect.width; + const yPos = store.render2dyPos / canvasRect.height; if (mode2d === Modes2d.TRANSVERSE) { // z: const vTex.x = Math.floor((xPos + xScr * zoom) * xDim); diff --git a/src/engine/tools2d/ToolTypes.js b/src/engine/tools2d/ToolTypes.js index f4450d20..590aad0f 100644 --- a/src/engine/tools2d/ToolTypes.js +++ b/src/engine/tools2d/ToolTypes.js @@ -19,9 +19,10 @@ const Tools2dType = { EDIT: 6, DELETE: 7, CLEAR: 8, - ZOOM: 9, - ZOOM_100: 10, - FILTER: 11, - NONE: 12, + ZOOM_IN: 9, + ZOOM_OUT: 10, + ZOOM_100: 11, + FILTER: 12, + NONE: 13, }; export default Tools2dType; diff --git a/src/ui/Main.module.css b/src/ui/Main.module.css index 5c2cbbd3..b5f8a3fe 100644 --- a/src/ui/Main.module.css +++ b/src/ui/Main.module.css @@ -67,7 +67,7 @@ height: 50px; position: absolute; right: 0; - top:50%; + top: 50%; z-index: 10; } .left { @@ -75,13 +75,13 @@ } .center div { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - z-index: 1; - user-select: none; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 1; + user-select: none; } .settings { @@ -89,7 +89,6 @@ } @media screen and (min-width: 768px) { - .header { display: flex; position: relative; @@ -103,7 +102,7 @@ margin-top: 1rem; } - .header__panels { + .header__panels { display: flex; flex-direction: column; width: 25rem; @@ -156,20 +155,21 @@ } @media screen and (min-width: 1024px) { - .header { align-items: flex-start; } - .header div { - margin-bottom: 1rem; + .header div { + height: auto; + padding-bottom: 0; + margin-bottom: 0; } .header__right { align-items: stretch; } - .header__panels { + .header__panels { width: 100%; display: flex; flex-direction: row; @@ -203,11 +203,9 @@ .left { top: 8%; } - } @media screen and (min-width: 1024px) and (orientation: landscape) { - .header__panels { margin-right: 3rem; } @@ -218,13 +216,11 @@ } .left { - top:10%; + top: 10%; } - } @media screen and (min-width: 1024px) and (orientation: portrait) { - .header__panels { flex-wrap: wrap; } @@ -232,19 +228,15 @@ .settings { top: 4rem; } - } @media screen and (min-width: 1440px) { .header__panels { flex-wrap: nowrap; } - } - @media screen and (min-width: 2560px) and (orientation: landscape) { - .left { top: 5%; } diff --git a/src/ui/UiZoomTools.jsx b/src/ui/UiZoomTools.jsx index 17fcc57d..e9be4ffe 100644 --- a/src/ui/UiZoomTools.jsx +++ b/src/ui/UiZoomTools.jsx @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import React, { useState } from 'react'; +import React, { useState, useEffect } from 'react'; import { connect } from 'react-redux'; import Tools2dType from '../engine/tools2d/ToolTypes'; @@ -12,28 +12,76 @@ import { buttonsBuilder } from './Button/Button'; import { Container } from './Layout/Container'; const UiZoomTools = (props) => { + const MIN_ZOOM_THRESHOLD = 0.8; const [activeButton, setActiveButton] = useState(Tools2dType.NONE); + const zoomImage = (step, buttonId) => { + const currentZoom = props.render2dZoom; + let newZoom = Math.round((currentZoom + step) * 10) / 10; + const objCanvas = props.graphics2d.m_mount.current; + const canvasRect = objCanvas.getBoundingClientRect(); + let xPosNew; + let yPosNew; + + if (buttonId === Tools2dType.ZOOM_IN && newZoom > 0) { + xPosNew = props.render2dxPos + (canvasRect.width / 2) * Math.abs(step); + yPosNew = props.render2dyPos + (canvasRect.height / 2) * Math.abs(step); + } else if (buttonId === Tools2dType.ZOOM_OUT && newZoom < 1) { + const initialX = canvasRect.width * currentZoom + props.render2dxPos; + const initialY = canvasRect.height * currentZoom + props.render2dyPos; + xPosNew = initialX - (initialX - props.render2dxPos) * (newZoom / currentZoom); + yPosNew = initialY - (initialY - props.render2dyPos) * (newZoom / currentZoom); + } + + if (xPosNew < 0) { + xPosNew = 0; + } + if (yPosNew < 0) { + yPosNew = 0; + } + if (newZoom > 1) { + newZoom = 1; + xPosNew = 0; + yPosNew = 0; + } + if (newZoom < 0.1) { + return; + } + props.dispatch({ type: StoreActionType.SET_2D_ZOOM, render2dZoom: newZoom }); + props.dispatch({ type: StoreActionType.SET_2D_X_POS, render2dxPos: xPosNew }); + props.dispatch({ type: StoreActionType.SET_2D_Y_POS, render2dyPos: yPosNew }); + }; + const mediator = (buttonId) => { setActiveButton(buttonId); props.dispatch({ type: StoreActionType.SET_2D_TOOLS_INDEX, indexTools2d: buttonId }); - if (buttonId === Tools2dType.ZOOM_100) { + if (buttonId === Tools2dType.ZOOM_100 || (buttonId === Tools2dType.ZOOM_OUT && props.render2dZoom > MIN_ZOOM_THRESHOLD)) { props.dispatch({ type: StoreActionType.SET_2D_ZOOM, render2dZoom: 1.0 }); props.dispatch({ type: StoreActionType.SET_2D_X_POS, render2dxPos: 0.0 }); props.dispatch({ type: StoreActionType.SET_2D_Y_POS, render2dyPos: 0.0 }); - - props.graphics2d.forceUpdate(); - props.graphics2d.forceRender(); + } else { + zoomImage(buttonId === Tools2dType.ZOOM_IN ? -0.1 : 0.1, buttonId); } }; + useEffect(() => { + props.graphics2d.forceUpdate(); + props.graphics2d.forceRender(); + }, [props.render2dZoom]); + const buttons = [ { - icon: 'zoom', - caption: 'Zoom in/out', - handler: mediator.bind(null, Tools2dType.ZOOM), - id: Tools2dType.ZOOM, + icon: 'zoom_in', + caption: 'Zoom in', + handler: mediator.bind(null, Tools2dType.ZOOM_IN), + id: Tools2dType.ZOOM_IN, + }, + { + icon: 'zoom_out', + caption: 'Zoom out', + handler: mediator.bind(null, Tools2dType.ZOOM_OUT), + id: Tools2dType.ZOOM_OUT, }, { icon: 'zoom_100', From 98db2196a526b37a68006c1bb15fb6cb9782c94d Mon Sep 17 00:00:00 2001 From: Oleksandr Iefymchuk Date: Mon, 13 Nov 2023 21:25:56 +0200 Subject: [PATCH 56/57] EPMUII-8666-Implement-2D-navigation --- public/sprite.svg | 20 ++++++------ src/engine/Graphics2d.js | 48 +++++++++++++++++++++++++++- src/engine/tools2d/ToolTypes.js | 2 +- src/index.css | 8 +++++ src/ui/LeftToolbar/Mode2dToolbar.jsx | 2 ++ src/ui/TopToolbar/ExploreTools.jsx | 6 ++-- src/ui/UiZoomTools.jsx | 2 +- 7 files changed, 73 insertions(+), 15 deletions(-) diff --git a/public/sprite.svg b/public/sprite.svg index 93f56aec..6e102f7c 100644 --- a/public/sprite.svg +++ b/public/sprite.svg @@ -46,15 +46,17 @@ - - - - - - - - - + + + + diff --git a/src/engine/Graphics2d.js b/src/engine/Graphics2d.js index ae7d04b6..eb517808 100644 --- a/src/engine/Graphics2d.js +++ b/src/engine/Graphics2d.js @@ -56,6 +56,8 @@ class Graphics2d extends React.Component { stateMouseDown: false, xMouse: -1, yMouse: -1, + startX: 0, + startY: 0, }; // segm 2d @@ -458,6 +460,13 @@ class Graphics2d extends React.Component { const canvasHeight = objCanvas.height; const newImgWidth = canvasWidth / zoom; const newImgHeight = canvasHeight / zoom; + const indexTools2d = store.indexTools2d; + + if (indexTools2d === Tools2dType.HAND && !this.state.stateMouseDown) { + objCanvas.classList.add('cursor-hand'); + } else { + objCanvas.classList.remove('cursor-hand'); + } if (!this.m_isMounted) { return; @@ -545,8 +554,12 @@ class Graphics2d extends React.Component { } onMouseUp(evt) { + const objCanvas = this.m_mount.current; const store = this.props; const indexTools2d = store.indexTools2d; + + this.setState({ stateMouseDown: false }); + if (indexTools2d === Tools2dType.DISTANCE) { const store = this.props; const box = this.m_mount.current.getBoundingClientRect(); @@ -589,10 +602,17 @@ class Graphics2d extends React.Component { const yScr = evt.clientY - box.top; this.m_toolDelete.onMouseUp(xScr, yScr, store); } + if (store.indexTools2d === Tools2dType.HAND) { + objCanvas.classList.remove('cursor-grab'); + objCanvas.classList.add('cursor-hand'); + } } onMouseMove(evt) { const store = this.props; + let xPos = store.render2dxPos; + let yPos = store.render2dyPos; + const zoom = store.render2dZoom; const indexTools2d = store.indexTools2d; const box = this.m_mount.current.getBoundingClientRect(); const xContainer = evt.clientX - box.left; @@ -618,10 +638,26 @@ class Graphics2d extends React.Component { if (indexTools2d === Tools2dType.DELETE) { this.m_toolDelete.onMouseMove(xScr, yScr, store); } + if (indexTools2d === Tools2dType.HAND && this.state.stateMouseDown) { + const deltaX = evt.clientX - this.state.startX; + const deltaY = evt.clientY - this.state.startY; + const newXPos = xPos - deltaX * zoom; + const newYPos = yPos - deltaY * zoom; + + this.props.dispatch({ type: StoreActionType.SET_2D_X_POS, render2dxPos: newXPos }); + this.props.dispatch({ type: StoreActionType.SET_2D_Y_POS, render2dyPos: newYPos }); + + this.setState({ + startX: evt.clientX, + startY: evt.clientY, + }); + } + store.graphics2d.forceUpdate(); } onMouseDown(evt) { - const box = this.m_mount.current.getBoundingClientRect(); + const objCanvas = this.m_mount.current; + const box = objCanvas.getBoundingClientRect(); const xContainer = evt.clientX - box.left; const yContainer = evt.clientY - box.top; const xScr = xContainer; @@ -632,6 +668,12 @@ class Graphics2d extends React.Component { const indexTools2d = store.indexTools2d; // console.log(`onMouseDown. tool index = ${indexTools2d}`); + this.setState({ + stateMouseDown: true, + startX: evt.clientX, + startY: evt.clientY, + }); + switch (indexTools2d) { case Tools2dType.INTENSITY: this.m_toolPick.onMouseDown(xScr, yScr, store); @@ -657,6 +699,10 @@ class Graphics2d extends React.Component { case Tools2dType.DELETE: this.m_toolDelete.onMouseDown(xScr, yScr, store); break; + case Tools2dType.HAND: + objCanvas.classList.remove('cursor-hand'); + objCanvas.classList.add('cursor-grab'); + break; default: // not defined } // switch diff --git a/src/engine/tools2d/ToolTypes.js b/src/engine/tools2d/ToolTypes.js index 590aad0f..4087ad85 100644 --- a/src/engine/tools2d/ToolTypes.js +++ b/src/engine/tools2d/ToolTypes.js @@ -23,6 +23,6 @@ const Tools2dType = { ZOOM_OUT: 10, ZOOM_100: 11, FILTER: 12, - NONE: 13, + HAND: 13, }; export default Tools2dType; diff --git a/src/index.css b/src/index.css index 1c325689..0f731037 100644 --- a/src/index.css +++ b/src/index.css @@ -59,3 +59,11 @@ svg { vertical-align: middle; color: var(--white); } + +.cursor-grab { + cursor: grabbing; +} + +.cursor-hand { + cursor: grab; +} diff --git a/src/ui/LeftToolbar/Mode2dToolbar.jsx b/src/ui/LeftToolbar/Mode2dToolbar.jsx index 7af523e2..679200e1 100644 --- a/src/ui/LeftToolbar/Mode2dToolbar.jsx +++ b/src/ui/LeftToolbar/Mode2dToolbar.jsx @@ -22,6 +22,8 @@ export const Mode2dToolbar = () => { graphics2d.clear(); dispatch({ type: StoreActionType.SET_2D_ZOOM, render2dZoom: 1.0 }); + dispatch({ type: StoreActionType.SET_2D_X_POS, render2dxPos: 0.0 }); + dispatch({ type: StoreActionType.SET_2D_Y_POS, render2dyPos: 0.0 }); // build render image graphics2d.forceUpdate(); diff --git a/src/ui/TopToolbar/ExploreTools.jsx b/src/ui/TopToolbar/ExploreTools.jsx index 69a3f609..48cca240 100644 --- a/src/ui/TopToolbar/ExploreTools.jsx +++ b/src/ui/TopToolbar/ExploreTools.jsx @@ -36,10 +36,10 @@ const ExploreTools = (props) => { const buttons = [ { - id: Tools2dType.NONE, - icon: 'cursor', + id: Tools2dType.HAND, + icon: 'hand', caption: 'Explore model', - handler: mediator.bind(null, Tools2dType.NONE), + handler: mediator.bind(null, Tools2dType.HAND), }, { icon: 'target', diff --git a/src/ui/UiZoomTools.jsx b/src/ui/UiZoomTools.jsx index e9be4ffe..ca187212 100644 --- a/src/ui/UiZoomTools.jsx +++ b/src/ui/UiZoomTools.jsx @@ -13,7 +13,7 @@ import { Container } from './Layout/Container'; const UiZoomTools = (props) => { const MIN_ZOOM_THRESHOLD = 0.8; - const [activeButton, setActiveButton] = useState(Tools2dType.NONE); + const [activeButton, setActiveButton] = useState(Tools2dType.HAND); const zoomImage = (step, buttonId) => { const currentZoom = props.render2dZoom; From 9feeaa8e3bceee302af53995e19bf2b0e9dda9a9 Mon Sep 17 00:00:00 2001 From: Oleksandr Zhynzher Date: Thu, 16 Nov 2023 10:25:19 +0200 Subject: [PATCH 57/57] 16 bit rendering --- src/engine/Graphics2d.js | 67 ++++-- src/engine/Volume.js | 1 + src/engine/lib/services/StoreService.ts | 2 + src/engine/loaders/LoaderDicom.js | 31 +++ src/engine/utils/SettingsGraphics2d.js | 23 ++ src/store/ActionTypes.js | 5 + src/store/Store.js | 15 ++ src/ui/Constants/WindowSet.constants.js | 7 + src/ui/FileReaders/DragAndDropComponent.jsx | 9 - src/ui/FileReaders/OpenFromDeviceButton.jsx | 7 +- .../FileReaders/OpenFromDeviceComponent.jsx | 15 +- src/ui/Form/Slider.module.css | 3 +- src/ui/Header/Header.jsx | 9 +- src/ui/Layout/Container.module.css | 10 +- src/ui/Main.jsx | 15 +- .../MobileSettings/MobileSettings.module.css | 215 +++++++++--------- src/ui/Modals/ModalBase.jsx | 4 +- src/ui/Modals/Modals.module.css | 31 ++- src/ui/Modals/UiModalConfirmation.jsx | 54 +++++ ...WinCW.jsx => UiModalWindowCenterWidth.jsx} | 74 ++---- src/ui/Modals/UiModalWindowRange.jsx | 42 ++++ src/ui/OpenFile/UISaveMenu.module.css | 30 ++- src/ui/Panels/RightPanel.jsx | 31 ++- src/ui/Tooltip/Tooltip.module.css | 19 +- src/ui/TopToolbar/ToolButton.jsx | 4 +- tsconfig.json | 3 +- 26 files changed, 476 insertions(+), 250 deletions(-) create mode 100644 src/engine/utils/SettingsGraphics2d.js create mode 100644 src/ui/Constants/WindowSet.constants.js create mode 100644 src/ui/Modals/UiModalConfirmation.jsx rename src/ui/Modals/{UiModalWinCW.jsx => UiModalWindowCenterWidth.jsx} (84%) create mode 100644 src/ui/Modals/UiModalWindowRange.jsx diff --git a/src/engine/Graphics2d.js b/src/engine/Graphics2d.js index eb517808..94668922 100644 --- a/src/engine/Graphics2d.js +++ b/src/engine/Graphics2d.js @@ -33,6 +33,7 @@ class Graphics2d extends React.Component { this.onMouseUp = this.onMouseUp.bind(this); this.onMouseMove = this.onMouseMove.bind(this); this.onMouseWheel = this.onMouseWheel.bind(this); + this.setDataWindow = this.setDataWindow.bind(this); this.m_sliceRatio = 0.5; this.m_mode2d = Modes2d.TRANSVERSE; @@ -63,6 +64,10 @@ class Graphics2d extends React.Component { // segm 2d this.segm2d = new Segm2d(this); this.m_isSegmented = false; + // data window + this.m_winRight = 1; + this.m_winLeft = 0; + this.m_newWin = false; // tools2d this.m_toolPick = new ToolPick(this); @@ -105,6 +110,13 @@ class Graphics2d extends React.Component { return this.m_mount.current.toDataURL(); } + setDataWindow(value) { + const [min, max] = value; + this.m_winLeft = min; + this.m_winRight = max; + this.forceUpdate(); + } + prepareImageForRender(volIndexArg) { //TODO: center the image by click const objCanvas = this.m_mount.current; // Canvas HTML element reference @@ -125,6 +137,11 @@ class Graphics2d extends React.Component { const store = this.props; const volSet = store.volumeSet; + const dicom = store.loaderDicom; + if (dicom != null && !this.props.is16bit) { + this.m_winRight = dicom.m_winRight; + this.m_winLeft = dicom.m_winLeft; + } // const volIndex = this.m_volumeIndex; const volIndex = volIndexArg !== undefined ? volIndexArg : store.volumeIndex; @@ -142,7 +159,10 @@ class Graphics2d extends React.Component { const yDim = vol.m_yDim; const zDim = vol.m_zDim; const xyDim = xDim * yDim; - const dataSrc = vol.m_dataArray; // 1 or 4 bytes array of pixels + let dataSrc = vol.m_dataArray; // 1 or 4 bytes array of pixels + if (dicom != null && this.props.is16bit) { + dataSrc = vol.m_dataArray16; // 2 bytes array of pixels + } if (dataSrc.length !== xDim * yDim * zDim * vol.m_bytesPerVoxel) { console.log(`Bad src data len = ${dataSrc.length}, but expect ${xDim}*${yDim}*${zDim}`); } @@ -226,9 +246,16 @@ class Graphics2d extends React.Component { for (let x = 0; x < wScreen; x++) { const xSrc = Math.floor(x * xStep); const val = dataSrc[zOff + yOff + xSrc]; - dataDst[j + 0] = val; - dataDst[j + 1] = val; - dataDst[j + 2] = val; + let newVal = val; + if (dicom != null && this.props.is16bit) { + const scale = 255 / ((this.m_winRight - this.m_winLeft) * (dicom.m_maxVal - dicom.m_minVal)); + newVal = Math.floor((val - this.m_winLeft * (dicom.m_maxVal - dicom.m_minVal)) * scale); + } + if (newVal < 0) newVal = 0; + if (newVal > 255) newVal = 255; + dataDst[j + 0] = newVal; + dataDst[j + 1] = newVal; + dataDst[j + 2] = newVal; dataDst[j + 3] = 255; // opacity j += 4; } // for (x) @@ -311,12 +338,17 @@ class Graphics2d extends React.Component { const ySrc = Math.floor(x * yStep); const yOff = ySrc * xDim; const val = dataSrc[zOff + yOff + xSlice]; - - dataDst[j + 0] = val; - dataDst[j + 1] = val; - dataDst[j + 2] = val; + let newVal = val; + if (dicom != null) { + const scale = 255 / ((this.m_winRight - this.m_winLeft) * (dicom.m_maxVal - dicom.m_minVal)); + newVal = Math.floor((val - this.m_winLeft * (dicom.m_maxVal - dicom.m_minVal)) * scale); + } + if (newVal < 0) newVal = 0; + if (newVal > 255) newVal = 255; + dataDst[j + 0] = newVal; + dataDst[j + 1] = newVal; + dataDst[j + 2] = newVal; dataDst[j + 3] = 255; // opacity - j += 4; } // for (x) } // for (y) @@ -400,12 +432,17 @@ class Graphics2d extends React.Component { for (let x = 0; x < wScreen; x++) { const xSrc = Math.floor(x * xStep); const val = dataSrc[zOff + yOff + xSrc]; - - dataDst[j + 0] = val; - dataDst[j + 1] = val; - dataDst[j + 2] = val; + let newVal = val; + if (dicom != null) { + const scale = 255 / ((this.m_winRight - this.m_winLeft) * (dicom.m_maxVal - dicom.m_minVal)); + newVal = Math.floor((val - this.m_winLeft * (dicom.m_maxVal - dicom.m_minVal)) * scale); + } + if (newVal < 0) newVal = 0; + if (newVal > 255) newVal = 255; + dataDst[j + 0] = newVal; + dataDst[j + 1] = newVal; + dataDst[j + 2] = newVal; dataDst[j + 3] = 255; // opacity - j += 4; } // for (x) } // for (y) @@ -752,8 +789,6 @@ class Graphics2d extends React.Component { * Main component render func callback */ render() { - // const store = this.props; - // const volSet = store.volumeSet; this.m_sliceRatio = this.props.sliderValue; this.m_mode2d = this.props.mode2d; return ( diff --git a/src/engine/Volume.js b/src/engine/Volume.js index 3758ea46..42a38977 100644 --- a/src/engine/Volume.js +++ b/src/engine/Volume.js @@ -19,6 +19,7 @@ class Volume extends React.Component { this.m_zDim = 0; this.m_bytesPerVoxel = 0; this.m_dataArray = null; + this.m_dataArray16 = null; this.m_dataSize = 0; this.m_boxSize = { x: 0.0, diff --git a/src/engine/lib/services/StoreService.ts b/src/engine/lib/services/StoreService.ts index e0b1a876..e58797ab 100644 --- a/src/engine/lib/services/StoreService.ts +++ b/src/engine/lib/services/StoreService.ts @@ -66,6 +66,8 @@ export class MRIStoreService { { type: StoreActionType.SET_LOADER_DICOM, loaderDicom }, { type: StoreActionType.SET_VOLUME_INDEX, volumeIndex }, { type: StoreActionType.SET_SPINNER, spinner: false }, + { type: StoreActionType.SET_IS_16_BIT, is16bit: true }, + { type: StoreActionType.SET_SHOW_MODAL_CONFIRMATION, showModalConfirmation: true }, ]; this.dispatchActions(actions); diff --git a/src/engine/loaders/LoaderDicom.js b/src/engine/loaders/LoaderDicom.js index 1cd66c1d..abfaa7c0 100644 --- a/src/engine/loaders/LoaderDicom.js +++ b/src/engine/loaders/LoaderDicom.js @@ -154,6 +154,10 @@ class LoaderDicom { this.m_padValue = -LARGE_NUMBER; this.m_windowCenter = LARGE_NUMBER; // TAG_WINDOW_CENTER this.m_windowWidth = LARGE_NUMBER; // TAG_WINDOW_WIDTH + this.m_winMin = 0; + this.m_winMax = 1; + this.m_minVal = 0; + this.m_maxVal = 0; this.m_rescaleIntercept = 0; // TAG_RESCALE_INTERCEPT, used as v` = v * rescaleSlope + rescaleIntercept this.m_rescaleSlope = 1; // TAG_RESCALE_SLOPE this.m_rescaleHounsfield = false; @@ -263,6 +267,7 @@ class LoaderDicom { console.assert(volSet instanceof VolumeSet, 'Should be volume set'); console.assert(typeof indexSelected === 'number', 'index should be number'); console.assert(typeof hashSelected === 'number', 'index should be number'); + const is16bit = true; let volDst = null; if (indexSelected < volSet.getNumVolumes()) { @@ -327,6 +332,7 @@ class LoaderDicom { let i; let dataSize = 0; let dataArray = null; + let dataArray16 = null; // convert big endian in slices if (!this.m_littleEndian) { @@ -395,6 +401,8 @@ class LoaderDicom { } // for (i) all slice pixels } // for sl } // for ser + this.m_minVal = minVal; + this.m_maxVal = maxVal; console.log(`Build Volume. min/max value=${minVal}/${maxVal}. Volume dim = ${this.m_xDim}*${this.m_yDim}*${this.m_zDim}`); console.log(`Min slice number = ${serie.m_minSlice}`); @@ -452,6 +460,7 @@ class LoaderDicom { dataSize = this.m_xDim * this.m_yDim * this.m_zDim; dataArray = new Uint8Array(dataSize); + if (is16bit) dataArray16 = new Uint16Array(dataSize); if (dataArray === null) { console.log('no memory'); return LoadResult.ERROR_NO_MEMORY; @@ -459,6 +468,11 @@ class LoaderDicom { for (i = 0; i < dataSize; i++) { dataArray[i] = 0; } + if (is16bit) { + for (i = 0; i < dataSize; i++) { + dataArray16[i] = 0; + } + } // convert slices data into volume set data (16 bpp -> 8 bpp, etc) const MAX_BYTE = 255; @@ -480,6 +494,17 @@ class LoaderDicom { if (dataSrc16 !== null) { const offZ = z * xyDim; + const BITS_16 = 16; + const max16 = 1 << BITS_16; + if (is16bit) { + for (i = 0; i < xyDim; i++) { + let val_16 = dataSrc16[i] * this.m_rescaleSlope + this.m_rescaleIntercept; + //let val = (val_16 - minVal) * max16 / (maxVal - minVal); + let val = val_16 - minVal; + val = Math.floor(val); + dataArray16[offZ + i] = val; + } // for i + } if (this.m_windowCenter !== LARGE_NUMBER && this.m_windowWidth !== LARGE_NUMBER) { const winMin = this.m_windowCenter - this.m_windowWidth * 0.5; @@ -508,6 +533,11 @@ class LoaderDicom { dataArray[offZ + i] = val; } // for i } // no defined window center, width + + if (this.m_windowCenter !== LARGE_NUMBER && this.m_windowWidth !== LARGE_NUMBER && !this.m_rescaleHounsfield) { + this.m_winRight = (-this.m_minVal + this.m_windowCenter + this.m_windowWidth / 2) / (this.m_maxVal - this.m_minVal); + this.m_winLeft = (-this.m_minVal + this.m_windowCenter - this.m_windowWidth / 2) / (this.m_maxVal - this.m_minVal); + } } // if has slice data } // for(s) all slices @@ -739,6 +769,7 @@ class LoaderDicom { volDst.m_yDim = this.m_yDim; volDst.m_zDim = this.m_zDim; volDst.m_dataArray = dataArray; + volDst.m_dataArray16 = dataArray16; volDst.m_dataSize = dataSize; volDst.m_bytesPerVoxel = ONE; volDst.m_boxSize.x = this.m_boxSize.x; diff --git a/src/engine/utils/SettingsGraphics2d.js b/src/engine/utils/SettingsGraphics2d.js new file mode 100644 index 00000000..c1c5a3c2 --- /dev/null +++ b/src/engine/utils/SettingsGraphics2d.js @@ -0,0 +1,23 @@ +/* + * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +import { DEFAULT_WIN_MAX, DEFAULT_WIN_MIN } from '../../ui/Constants/WindowSet.constants'; +/** + * Apply window range data (min,max) + */ +export const applyWindowRangeData = (store, windowMin = DEFAULT_WIN_MIN, windowMax = DEFAULT_WIN_MAX) => { + const loaderDicom = store.loaderDicom; + const volSet = store.volumeSet; + // set loader features according current modal properties (window min, max) + loaderDicom.m_windowCenter = (windowMin + windowMax) * 0.5; + loaderDicom.m_windowWidth = windowMax - windowMin; + // apply for single slice dicom read + // select 1st slice and hash + const series = loaderDicom.m_slicesVolume.getSeries(); + const numSeries = series.length; + for (let i = 0; i < numSeries; i++) { + const hashCode = series[i].m_hash; + loaderDicom.createVolumeFromSlices(volSet, i, hashCode); + } +}; diff --git a/src/store/ActionTypes.js b/src/store/ActionTypes.js index 41b02599..350ecd8a 100644 --- a/src/store/ActionTypes.js +++ b/src/store/ActionTypes.js @@ -48,5 +48,10 @@ const StoreActionType = { SET_PROGRESS_INFO: 36, SET_SPINNER_TITLE: 37, SET_SPINNER_PROGRESS: 38, + SET_IS_16_BIT: 39, + SET_SHOW_WINDOW_RANGE: 40, + SET_SHOW_MODAL_CONFIRMATION: 41, + SET_SHOW_MODAL_WINDOW_WC: 42, + SET_SHOW_MODAL_SELECT_FILES: 43, }; export default StoreActionType; diff --git a/src/store/Store.js b/src/store/Store.js index 040f051d..bdd5fcf0 100644 --- a/src/store/Store.js +++ b/src/store/Store.js @@ -47,6 +47,11 @@ export const initialState = { dicomSeries: [], loaderDicom: null, spinner: false, //true when mock data is loading + is16bit: false, //true when dicom files are loaded + showWindowRangeSlider: false, + showModalConfirmation: false, + showModalWindowCW: false, + showModalSelectFiles: false, }; // // App reducer @@ -125,6 +130,16 @@ const medReducer = (state = initialState, action) => { return Object.assign({}, state, { showModalAlert: action.showModalAlert }); case StoreActionType.SET_SPINNER: return Object.assign({}, state, { spinner: action.spinner }); + case StoreActionType.SET_IS_16_BIT: + return Object.assign({}, state, { is16bit: action.is16bit }); + case StoreActionType.SET_SHOW_WINDOW_RANGE: + return Object.assign({}, state, { showWindowRangeSlider: action.showWindowRangeSlider }); + case StoreActionType.SET_SHOW_MODAL_CONFIRMATION: + return Object.assign({}, state, { showModalConfirmation: action.showModalConfirmation }); + case StoreActionType.SET_SHOW_MODAL_WINDOW_WC: + return Object.assign({}, state, { showModalWindowCW: action.showModalWindowCW }); + case StoreActionType.SET_SHOW_MODAL_SELECT_FILES: + return Object.assign({}, state, { showModalSelectFiles: action.showModalSelectFiles }); case StoreActionType.SET_SPINNER_TITLE: return Object.assign({}, state, { spinnerTitle: action.spinnerTitle }); case StoreActionType.SET_SPINNER_PROGRESS: diff --git a/src/ui/Constants/WindowSet.constants.js b/src/ui/Constants/WindowSet.constants.js new file mode 100644 index 00000000..445ae12c --- /dev/null +++ b/src/ui/Constants/WindowSet.constants.js @@ -0,0 +1,7 @@ +/* + * Copyright 2023 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ +export const LARGE_NUMBER = 0x3fffffff; +export const DEFAULT_WIN_MIN = 650 - 2000 / 2; +export const DEFAULT_WIN_MAX = 650 + 2000 / 2; diff --git a/src/ui/FileReaders/DragAndDropComponent.jsx b/src/ui/FileReaders/DragAndDropComponent.jsx index 32fed4e4..101e3a77 100644 --- a/src/ui/FileReaders/DragAndDropComponent.jsx +++ b/src/ui/FileReaders/DragAndDropComponent.jsx @@ -1,20 +1,12 @@ import { useState } from 'react'; import css from './DragAndDrop.module.css'; import { SVG } from '../Button/SVG'; -import UiModalWindowCenterWidth from '../Modals/UiModalWinCW'; import MriViwer from '../../engine/lib/MRIViewer'; -import { useOnEvent } from '../hooks/useOnEvent'; -import { MriEvents } from '../../engine/lib/enums'; const IMG_DROPZONE_SIZE = 49; export const DragAndDropComponent = () => { const [isActiveDnd, setIsActiveDnd] = useState(false); - const [showModalWindowCW, setShowModalWindowCW] = useState(false); - - useOnEvent(MriEvents.FILE_READ_SUCCESS, () => { - setShowModalWindowCW(true); - }); const handleDrop = (e) => { e.preventDefault(); @@ -34,7 +26,6 @@ export const DragAndDropComponent = () => { onDragLeave={() => setIsActiveDnd(false)} onDrop={handleDrop} >
- {showModalWindowCW && setShowModalWindowCW(false)} />} ); }; diff --git a/src/ui/FileReaders/OpenFromDeviceButton.jsx b/src/ui/FileReaders/OpenFromDeviceButton.jsx index d3c4d19f..a19c1d20 100644 --- a/src/ui/FileReaders/OpenFromDeviceButton.jsx +++ b/src/ui/FileReaders/OpenFromDeviceButton.jsx @@ -1,11 +1,15 @@ import { useState } from 'react'; +import { useSelector, useDispatch } from 'react-redux'; import { UIButton } from '../Button/Button'; import ModalSelectFile from '../Modals/ModalSelectFile'; import { useOnEvent } from '../hooks/useOnEvent'; import { MriEvents } from '../../engine/lib/enums'; +import StoreActionType from '../../store/ActionTypes'; export const OpenFromDeviceButtonComponent = ({ cx }) => { const [showOpenFromDeviceModal, setShowOpenFromDeviceModal] = useState(false); + const dispatch = useDispatch(); + const { showModalSelectFiles } = useSelector((state) => state); const onHide = () => { setShowOpenFromDeviceModal(false); @@ -15,12 +19,13 @@ export const OpenFromDeviceButtonComponent = ({ cx }) => { const onButtonOpenLocalFileClick = () => { setShowOpenFromDeviceModal(true); + dispatch({ type: StoreActionType.SET_SHOW_MODAL_SELECT_FILES, showModalSelectFiles: true }); }; return ( <> - {showOpenFromDeviceModal && } + {showOpenFromDeviceModal && } ); }; diff --git a/src/ui/FileReaders/OpenFromDeviceComponent.jsx b/src/ui/FileReaders/OpenFromDeviceComponent.jsx index 8ef16b17..81174503 100644 --- a/src/ui/FileReaders/OpenFromDeviceComponent.jsx +++ b/src/ui/FileReaders/OpenFromDeviceComponent.jsx @@ -1,19 +1,9 @@ -import { useState } from 'react'; import { UIButton } from '../Button/Button'; -import { useOnEvent } from '../hooks/useOnEvent'; -import UiModalWindowCenterWidth from '../Modals/UiModalWinCW'; +// import { useOnEvent } from '../hooks/useOnEvent'; import MriViwer from '../../engine/lib/MRIViewer'; -import { MriEvents } from '../../engine/lib/enums'; +// import { MriEvents } from '../../engine/lib/enums'; export const OpenFromDeviceComponent = ({ cx, text, type }) => { - const [showModalWindowCW, setShowModalWindowCW] = useState(false); - - const onHide = () => { - setShowModalWindowCW(false); - }; - - useOnEvent(MriEvents.FILE_READ_SUCCESS, onHide); - const onFileSelect = (evt) => { MriViwer.read(evt.target.files); }; @@ -39,7 +29,6 @@ export const OpenFromDeviceComponent = ({ cx, text, type }) => { return ( <> - {showModalWindowCW && } ); }; diff --git a/src/ui/Form/Slider.module.css b/src/ui/Form/Slider.module.css index 5620ebe3..0883bf08 100644 --- a/src/ui/Form/Slider.module.css +++ b/src/ui/Form/Slider.module.css @@ -8,7 +8,7 @@ } .slider { - flex: 1; + flex: 1; } .caption { @@ -19,5 +19,4 @@ } @media screen and(min-width: 768px) { - } diff --git a/src/ui/Header/Header.jsx b/src/ui/Header/Header.jsx index aad2684f..3ddeb2dc 100644 --- a/src/ui/Header/Header.jsx +++ b/src/ui/Header/Header.jsx @@ -3,6 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ import { useState } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; import { UIButton } from '../Button/Button'; import { useOnEvent } from '../hooks/useOnEvent'; import { ModalSelectFile } from '../Modals/ModalSelectFile'; @@ -14,12 +15,18 @@ import { UiReportMenu } from '../OpenFile/UiReportMenu'; import { MriEvents } from '../../engine/lib/enums'; import css from './Header.module.css'; +import StoreActionType from '../../store/ActionTypes'; export function Header() { const [showOpenFromDeviceModal, setShowOpenFromDeviceModal] = useState(false); + const { showModalSelectFiles } = useSelector((state) => state); + const dispatch = useDispatch(); const onButtonOpenLocalFileClick = () => { setShowOpenFromDeviceModal(true); + dispatch({ type: StoreActionType.SET_SHOW_MODAL_SELECT_FILES, showModalSelectFiles: true }); + dispatch({ type: StoreActionType.SET_SHOW_WINDOW_RANGE, showWindowRangeSlider: false }); + dispatch({ type: StoreActionType.SET_SHOW_WINDOW_RANGE, showWindowRangeSlider: false }); }; const onHide = () => { @@ -41,7 +48,7 @@ export function Header() { - {showOpenFromDeviceModal && } + {showOpenFromDeviceModal && } ); } diff --git a/src/ui/Layout/Container.module.css b/src/ui/Layout/Container.module.css index ce709415..cf9934b2 100644 --- a/src/ui/Layout/Container.module.css +++ b/src/ui/Layout/Container.module.css @@ -22,12 +22,11 @@ overflow: hidden; } -.horizontal button > svg > use[xlinkHref$="#folder"] { +.horizontal button > svg > use[xlinkHref$='#folder'] { display: none; } @media screen and (min-width: 768px) { - .container { display: inline-flex; flex-wrap: wrap; @@ -38,7 +37,6 @@ .vertical { flex-direction: column; - } .vertical:not(:first-child) { @@ -52,8 +50,6 @@ .horizontal { display: none; } - - } @media screen and (min-width: 1024px) { @@ -71,8 +67,4 @@ color: #18191b; background: red; } - } - - - diff --git a/src/ui/Main.jsx b/src/ui/Main.jsx index 1c2c21ac..00f8774d 100644 --- a/src/ui/Main.jsx +++ b/src/ui/Main.jsx @@ -31,10 +31,15 @@ import StartScreen from './StartScreen/StartScreen'; import css from './Main.module.css'; import cx from 'classnames'; import '../nouislider-custom.css'; +import UiModalWindowCenterWidth from './Modals/UiModalWindowCenterWidth'; +import { useOnEvent } from './hooks/useOnEvent'; +import { mriEventsService } from '../engine/lib/services'; +import UiModalConfirmation from './Modals/UiModalConfirmation'; export const Main = () => { const dispatch = useDispatch(); - const { arrErrors, isLoaded, progress, spinner, viewMode, showModalText, showModalAlert } = useSelector((state) => state); + const { arrErrors, isLoaded, progress, spinner, viewMode, showModalText, showModalAlert, showModalWindowCW, showModalConfirmation } = + useSelector((state) => state); const [m_fileNameOnLoad, setM_fileNameOnLoad] = useState(false); const [isWebGl20supported, setIsWebGl20supported] = useState(true); @@ -155,6 +160,12 @@ export const Main = () => { }; }, [isFullMode, isMobile]); + const onHide = () => { + dispatch({ type: StoreActionType.SET_SHOW_MODAL_WINDOW_WC, showModalWindowCW: false }); + }; + + useOnEvent(mriEventsService.FILE_READ_SUCCESS, onHide); + return (
@@ -217,6 +228,8 @@ export const Main = () => { text={strAlertText} /> )} + {showModalWindowCW && } + {showModalConfirmation && }
diff --git a/src/ui/MobileSettings/MobileSettings.module.css b/src/ui/MobileSettings/MobileSettings.module.css index 8fd52d2f..d333f8a4 100644 --- a/src/ui/MobileSettings/MobileSettings.module.css +++ b/src/ui/MobileSettings/MobileSettings.module.css @@ -4,149 +4,144 @@ */ .buttons__container { - display: flex; - flex-direction: column; - width: 6rem; - z-index: 2; - position: absolute; - top: 50%; - right: 0; - opacity: 1; - border: 1px solid var(--dark-gray); - border-radius: 0.5rem; - animation: onHide .6s ease-in-out; - animation-fill-mode: forwards; + display: flex; + flex-direction: column; + width: 6rem; + z-index: 2; + position: absolute; + top: 50%; + right: 0; + opacity: 1; + border: 1px solid var(--dark-gray); + border-radius: 0.5rem; + animation: onHide 0.6s ease-in-out; + animation-fill-mode: forwards; } .buttons__container button { - background: rgba(0,0,0, 0.5); - border: none; - margin: 0; - border-radius: initial; - padding-right: 0; - padding-left: 1rem; + background: rgba(0, 0, 0, 0.5); + border: none; + margin: 0; + border-radius: initial; + padding-right: 0; + padding-left: 1rem; } .settings__menu { - display: block; - background: inherit; - opacity: 1; + display: block; + background: inherit; + opacity: 1; } .hidden { - display: none; - opacity: 0; - animation: onHide .6s ease-in-out; - animation-fill-mode: forwards; + display: none; + opacity: 0; + animation: onHide 0.6s ease-in-out; + animation-fill-mode: forwards; } .settings__menu__button:after { - display: block; - content: ''; - background-image: url("data:image/svg+xml;charset=utf-8,"); - position: absolute; - width: 24px; - height: 24px; - background-size: cover; - transform: translate(-6px, -22px); + display: block; + content: ''; + background-image: url("data:image/svg+xml;charset=utf-8,"); + position: absolute; + width: 24px; + height: 24px; + background-size: cover; + transform: translate(-6px, -22px); } .settings__menu_block { - display: flex; - justify-content: space-around; - position: absolute; - top: 0; - left: 0; - right: 0; - padding: 10px; - z-index: 20000; - animation: onHide .6s ease-in-out; - animation-fill-mode: forwards; + display: flex; + justify-content: space-around; + position: absolute; + top: 0; + left: 0; + right: 0; + padding: 10px; + z-index: 20000; + animation: onHide 0.6s ease-in-out; + animation-fill-mode: forwards; } .flex { - flex-direction: column; + flex-direction: column; } -@media screen and (max-width: 1024px){ - - @keyframes onHide { - 0% { - opacity: 0; - } - 50% { - opacity: 0.9; - } - 100% { - opacity: 1; - } +@media screen and (max-width: 1024px) { + @keyframes onHide { + 0% { + opacity: 0; } -} - -@media screen and (min-width: 768px){ - - .buttons__container { - z-index: 20; + 50% { + opacity: 0.9; } - - .settings__menu_block { - display: block; - top: 6rem; - width: 5rem; - padding-left: 1.2rem; - z-index: 10; + 100% { + opacity: 1; } + } +} - .hide { - display: none; - } +@media screen and (min-width: 768px) { + .buttons__container { + z-index: 20; + } - .buttons__container { - top: 15%; - right: 8%; - } + .settings__menu_block { + display: block; + top: 6rem; + width: 5rem; + padding-left: 1.2rem; + z-index: 10; + } - .settings__menu_block div { - display: flex; - position: relative; - } + .hide { + display: none; + } - .flex { - position: absolute; - width: 300px; - top: 13%; - left: 12%; - z-index: 10; - } + .buttons__container { + top: 15%; + right: 8%; + } - .horizontal { - width: 10rem; - position: absolute; - top: 13%; - left: 10%; - } + .settings__menu_block div { + display: flex; + position: relative; + } - .horizontal > div { - display: flex; - width: 100%; - } + .flex { + position: absolute; + width: 300px; + top: 13%; + left: 12%; + z-index: 10; + } + + .horizontal { + width: 10rem; + position: absolute; + top: 13%; + left: 10%; + } + .horizontal > div { + display: flex; + width: 100%; + } } @media screen and (orientation: portrait) and (min-width: 768px) { + .buttons__container { + top: 12%; + } - .buttons__container { - top: 12%; - } - - .horizontal { - top: 12%; - } + .horizontal { + top: 12%; + } } -@media screen and (min-width: 768px) and (orientation: landscape){ - - .settings__menu_block { - top: 12%; - } -} \ No newline at end of file +@media screen and (min-width: 768px) and (orientation: landscape) { + .settings__menu_block { + top: 12%; + } +} diff --git a/src/ui/Modals/ModalBase.jsx b/src/ui/Modals/ModalBase.jsx index d96ca27b..0b2e5961 100644 --- a/src/ui/Modals/ModalBase.jsx +++ b/src/ui/Modals/ModalBase.jsx @@ -12,13 +12,13 @@ import css from './Modals.module.css'; ReactModal.setAppElement('#root'); -export const Modal = ({ isOpen, close, children, customStyles = {} }) => { +export const Modal = ({ isOpen, close, children, customStyles = {}, cx = { className: css.modal } }) => { return ( document.querySelector('#root')} style={customStyles} - className={css.modal} + className={cx.className} overlayClassName={css.overlay} onRequestClose={close} > diff --git a/src/ui/Modals/Modals.module.css b/src/ui/Modals/Modals.module.css index 47f6329d..007e2aff 100644 --- a/src/ui/Modals/Modals.module.css +++ b/src/ui/Modals/Modals.module.css @@ -2,6 +2,25 @@ * Copyright 2021 EPAM Systems, Inc. (https://www.epam.com/) * SPDX-License-Identifier: Apache-2.0 */ +.confirmation { + top: 58%; + position: absolute; + width: 28rem; + left: 50%; + line-height: 1.5; + transform: translate(-50%, -50%); + color: var(--white); + border-radius: 15px; + background-color: var(--dark-gray); + transition: 1s ease-out; + display: flex; + flex-direction: column; + padding: 0.5rem; +} + +.close_body { + display: flex-block; +} .overlay { position: fixed; @@ -29,6 +48,10 @@ flex-direction: column; } +.modalWindowRange { + margin-top: 2rem; +} + .header, .body, .footer { @@ -49,7 +72,7 @@ } .footer { - justify-content: center; + justify-content: right; border-top: 1px solid var(--gray); } @@ -152,13 +175,15 @@ color: var(--white); } +.text_center { + text-align: center; +} + .helperText { font-size: 14px; margin-top: 8px; } - - @media screen and (min-width: 768px) { .modal { width: 600px; diff --git a/src/ui/Modals/UiModalConfirmation.jsx b/src/ui/Modals/UiModalConfirmation.jsx new file mode 100644 index 00000000..4b7d11b6 --- /dev/null +++ b/src/ui/Modals/UiModalConfirmation.jsx @@ -0,0 +1,54 @@ +/* + * Copyright 2023 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { useDispatch, useSelector } from 'react-redux'; + +import { Modal, ModalBody, ModalFooter } from './ModalBase'; +import { UIButton } from '../Button/Button'; + +import { applyWindowRangeData } from '../../engine/utils/SettingsGraphics2d'; +import StoreActionType from '../../store/ActionTypes'; +import css from './Modals.module.css'; +import { MriEvents } from '../../engine/lib/enums'; +import MriViwer from '../../engine/lib/MRIViewer'; + +const UiModalConfirmation = () => { + const dispatch = useDispatch(); + const store = useSelector((state) => state); + + const onButtonClickYes = (e) => { + e.preventDefault(); + dispatch({ type: StoreActionType.SET_SHOW_MODAL_CONFIRMATION, showModalConfirmation: false }); + dispatch({ type: StoreActionType.SET_SHOW_WINDOW_RANGE, showWindowRangeSlider: true }); + dispatch({ type: StoreActionType.SET_IS_LOADED, isLoaded: true }); + dispatch({ type: StoreActionType.SET_SHOW_MODAL_SELECT_FILES, showModalSelectFiles: false }); + applyWindowRangeData(store, 0, 1); + MriViwer.events.emit(MriEvents.VOLUME_PARAMETERS_SET_SUCCESS); + }; + + const onButtonClickNo = (e) => { + e.preventDefault(); + dispatch({ type: StoreActionType.SET_IS_16_BIT, is16bit: false }); + dispatch({ type: StoreActionType.SET_SHOW_MODAL_WINDOW_WC, showModalWindowCW: true }); + dispatch({ type: StoreActionType.SET_SHOW_MODAL_CONFIRMATION, showModalConfirmation: false }); + }; + + return ( + + +

16-bit images can hold more colors per channel than 8-bit, which gives better image quality.

+

At the same time it uses more computer resources.

+

Do you want to activate 16-bit rendering for uploaded files?

+
+ + + + +
+ ); +}; + +export default UiModalConfirmation; diff --git a/src/ui/Modals/UiModalWinCW.jsx b/src/ui/Modals/UiModalWindowCenterWidth.jsx similarity index 84% rename from src/ui/Modals/UiModalWinCW.jsx rename to src/ui/Modals/UiModalWindowCenterWidth.jsx index d3e9d4d3..7fd054a8 100644 --- a/src/ui/Modals/UiModalWinCW.jsx +++ b/src/ui/Modals/UiModalWindowCenterWidth.jsx @@ -6,16 +6,17 @@ import React from 'react'; import { connect } from 'react-redux'; -import { Nouislider } from '../Nouislider/Nouislider'; -import { Modal, ModalBody, ModalFooter, ModalHeader } from './ModalBase'; +import { Modal, ModalFooter } from './ModalBase'; import { UIButton } from '../Button/Button'; +import { applyWindowRangeData } from '../../engine/utils/SettingsGraphics2d'; +import UiModalWindowRange from './UiModalWindowRange'; +import StoreActionType from '../../store/ActionTypes'; + import buttonCss from '../Button/Button.module.css'; import MriViwer from '../../engine/lib/MRIViewer'; import { MriEvents } from '../../engine/lib/enums'; - -const LARGE_NUMBER = 0x3fffffff; -const DEFAULT_WIN_MIN = 650 - 2000 / 2; -const DEFAULT_WIN_MAX = 650 + 2000 / 2; +import modalCss from './Modals.module.css'; +import { DEFAULT_WIN_MAX, DEFAULT_WIN_MIN, LARGE_NUMBER } from '../Constants/WindowSet.constants'; class UiModalWindowCenterWidth extends React.Component { constructor(props) { @@ -52,6 +53,7 @@ class UiModalWindowCenterWidth extends React.Component { // onButtonCancel() { // console.log('TODO: on Cancel ...'); + this.props.dispatch({ type: StoreActionType.SET_IS_16_BIT, is16bit: true }); this.reset(); this.props.onHide && this.props.onHide(false); } @@ -59,25 +61,8 @@ class UiModalWindowCenterWidth extends React.Component { // onButtonApply() { // console.log('TODO: on Apply ...'); - this.reset(); - - const store = this.props; - const loaderDicom = store.loaderDicom; - const volSet = store.volumeSet; - - // set loader features according current modal properties (window min, max) - loaderDicom.m_windowCenter = (this.state.windowMin + this.state.windowMax) * 0.5; - loaderDicom.m_windowWidth = this.state.windowMax - this.state.windowMin; - - // apply for single slice dicom read - // select 1st slice and hash - const series = loaderDicom.m_slicesVolume.getSeries(); - const numSeries = series.length; - for (let i = 0; i < numSeries; i++) { - const hashCode = series[i].m_hash; - loaderDicom.createVolumeFromSlices(volSet, i, hashCode); - } + applyWindowRangeData(this.props, this.state.windowMin, this.state.windowMax); MriViwer.events.emit(MriEvents.VOLUME_PARAMETERS_SET_SUCCESS); @@ -339,7 +324,6 @@ class UiModalWindowCenterWidth extends React.Component { // render render() { - //const stateVis = true; const stateVis = this.props.stateVis; const stylePreview = { @@ -355,35 +339,21 @@ class UiModalWindowCenterWidth extends React.Component { }, }; - let valMin = 0; - let valMax = 5000; - let valDelta = valMax - valMin; - let valStep = 50; - if (this.m_dataMin !== LARGE_NUMBER) { - valMin = this.m_dataMin; - valMax = this.m_dataMax; - valDelta = valMax - valMin; - valStep = Math.floor(valDelta / 32); - } - - const rangeTwo = { - min: Math.floor(valMin - valDelta / 4), - max: Math.floor(valMax + valDelta / 4), - }; - const wMin = Math.floor(this.state.windowMin); - const wMax = Math.floor(this.state.windowMax); - const wArr = [wMin, wMax]; - return ( - - - Window range - -

- -

-
+ +

+ +

diff --git a/src/ui/Modals/UiModalWindowRange.jsx b/src/ui/Modals/UiModalWindowRange.jsx new file mode 100644 index 00000000..ec3c10b9 --- /dev/null +++ b/src/ui/Modals/UiModalWindowRange.jsx @@ -0,0 +1,42 @@ +/* + * Copyright 2023 EPAM Systems, Inc. (https://www.epam.com/) + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { ModalHeader, ModalBody } from './ModalBase'; +import { Nouislider } from '../Nouislider/Nouislider'; +import { LARGE_NUMBER } from '../Constants/WindowSet.constants'; + +const UiModalWindowRange = ({ close, onChange, connect, title, m_dataMin, m_dataMax, windowMin, windowMax, className, step }) => { + let valMin = 0; + let valMax = 5000; + let valDelta = valMax - valMin; + let valStep = 50; + if (m_dataMin !== LARGE_NUMBER) { + valMin = m_dataMin; + valMax = m_dataMax; + valDelta = valMax - valMin; + valStep = step ? step : Math.floor(valDelta / 32); + } + + const rangeTwo = { + min: step ? 0 : Math.floor(valMin - valDelta / 4), + max: step ? 1 : Math.floor(valMax + valDelta / 4), + }; + const wMin = step ? windowMin : Math.floor(windowMin); + const wMax = step ? windowMax : Math.floor(windowMax); + const wArr = [wMin, wMax]; + + return ( +
+ + + Window range + + +
+ ); +}; + +export default UiModalWindowRange; diff --git a/src/ui/OpenFile/UISaveMenu.module.css b/src/ui/OpenFile/UISaveMenu.module.css index 40aa9bd8..42bcb6eb 100644 --- a/src/ui/OpenFile/UISaveMenu.module.css +++ b/src/ui/OpenFile/UISaveMenu.module.css @@ -1,27 +1,25 @@ .button.download__link { - color: #18191b; - background: inherit; - display: flex; - flex-direction: column; - align-items: center; + color: #18191b; + background: inherit; + display: flex; + flex-direction: column; + align-items: center; } .button.download__link:hover, .button.download__link:focus { - background-color: var(--light-orange); + background-color: var(--light-orange); } .button.download__link svg { - fill: #18191b; + fill: #18191b; } @media screen and (min-width: 768px) { - .button.download__link { - background-color: var(--beige); - } - .download__link > span { - display: none; - } - - -} \ No newline at end of file + .button.download__link { + background-color: var(--beige); + } + .download__link > span { + display: none; + } +} diff --git a/src/ui/Panels/RightPanel.jsx b/src/ui/Panels/RightPanel.jsx index db8ce28b..570460ef 100644 --- a/src/ui/Panels/RightPanel.jsx +++ b/src/ui/Panels/RightPanel.jsx @@ -5,20 +5,49 @@ import React from 'react'; import { useSelector } from 'react-redux'; +import { useState } from 'react'; import { Mode2dSettingsPanel } from './Mode2dSettingsPanel'; import { Mode3dSettingsPanel } from './Mode3dSettingsPanel'; import ViewMode from '../../store/ViewMode'; import { DragAndDropContainer } from '../DragAndDrop/DragAndDropContainer'; import { ModeFast3dSettingsPanel } from './ModeFast3dSettingsPanel'; +import UiModalWindowRange from '../Modals/UiModalWindowRange'; + +import modalCss from '../Modals/Modals.module.css'; export const RightPanel = () => { - const { viewMode } = useSelector((state) => state); + const { viewMode, showWindowRangeSlider, graphics2d } = useSelector((state) => state); + const [winMin, setWinMin] = useState(0); + const [winMax, setWinMax] = useState(1); + + const handlerWindowRange = (value) => { + const [min, max] = value; + setWinMin(min); + setWinMax(max); + graphics2d.setDataWindow(value); + }; + return ( {viewMode === ViewMode.VIEW_2D && } {viewMode === ViewMode.VIEW_3D_LIGHT && } {viewMode === ViewMode.VIEW_3D && } + {showWindowRangeSlider && ( +
+ +
+ )}
); }; diff --git a/src/ui/Tooltip/Tooltip.module.css b/src/ui/Tooltip/Tooltip.module.css index 38c7ab98..76c20104 100644 --- a/src/ui/Tooltip/Tooltip.module.css +++ b/src/ui/Tooltip/Tooltip.module.css @@ -43,51 +43,48 @@ transform: rotate(45deg); } -.tooltip[data-popper-placement^='top']>.arrow { +.tooltip[data-popper-placement^='top'] > .arrow { bottom: -6px; display: none; } -.tooltip[data-popper-placement^='bottom']>.arrow { +.tooltip[data-popper-placement^='bottom'] > .arrow { top: -6px; display: none; } -.tooltip[data-popper-placement^='left']>.arrow { +.tooltip[data-popper-placement^='left'] > .arrow { right: -6px; display: none; } -.tooltip[data-popper-placement^='right']>.arrow { +.tooltip[data-popper-placement^='right'] > .arrow { left: -6px; display: none; } - @media screen and (min-width: 768px) { .demo__link { display: block; } - .tooltip[data-popper-placement^='top']>.arrow { + .tooltip[data-popper-placement^='top'] > .arrow { bottom: -6px; display: none; } - .tooltip[data-popper-placement^='bottom']>.arrow { + .tooltip[data-popper-placement^='bottom'] > .arrow { top: -6px; display: none; } - .tooltip[data-popper-placement^='left']>.arrow { + .tooltip[data-popper-placement^='left'] > .arrow { right: -6px; display: none; } - .tooltip[data-popper-placement^='right']>.arrow { + .tooltip[data-popper-placement^='right'] > .arrow { left: -6px; display: none; } - - } diff --git a/src/ui/TopToolbar/ToolButton.jsx b/src/ui/TopToolbar/ToolButton.jsx index d1f65ca7..af346504 100644 --- a/src/ui/TopToolbar/ToolButton.jsx +++ b/src/ui/TopToolbar/ToolButton.jsx @@ -9,7 +9,7 @@ import { Tooltip } from '../Tooltip/Tooltip'; import { useToolbarContext } from './ToolbarContext'; export const ToolButton = (props) => { - const { onChange, content, icon } = props; + const { onChange, content, icon, text } = props; const { activeTool, setActiveTool } = useToolbarContext(); const handleChange = () => { @@ -20,7 +20,7 @@ export const ToolButton = (props) => { return ( <> - + ); diff --git a/tsconfig.json b/tsconfig.json index f006efab..0a9e0f9a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,7 +21,8 @@ "moduleResolution": "node", "resolveJsonModule": true, "isolatedModules": true, - "noEmit": true + "noEmit": true, + "types": ["jest"], }, "include": [ "./src/**/*"