From 40ff8d60ee4298481e6b1dab8b335a6ce38f01f0 Mon Sep 17 00:00:00 2001 From: ci Date: Wed, 18 Oct 2023 17:19:50 +0200 Subject: [PATCH] copy examples, dist and docs --- .eslintrc.cjs | 38 - .gitignore | 9 - .nojekyll | 1 + .prettierrc.json | 7 - .vscode/launch.json | 17 - CHANGELOG.md | 4 - CONTRIBUTING.md | 9 - LICENSE | 10 - README.md | 178 - SETUP.md | 15 - commit.txt | 1 + config/rollup.config.build.js | 3 - config/rollup.config.dev.js | 29 - config/rollup.config.js | 49 - dist/iink.d.ts | 1511 ++ dist/iink.d.ts.map | 1 + dist/iink.esm.js | 2 + dist/iink.esm.js.map | 1 + dist/iink.min.js | 2 + dist/iink.min.js.map | 1 + docs/.nojekyll | 1 + typedoc.css => docs/assets/custom.css | 0 docs/assets/highlight.css | 113 + docs/assets/main.js | 59 + docs/assets/navigation.js | 1 + docs/assets/search.js | 1 + docs/assets/style.css | 1383 + docs/classes/Editor.html | 657 + docs/classes/behaviors.RestBehaviors.html | 533 + docs/classes/behaviors.WSBehaviors.html | 584 + docs/classes/configuration.Configuration.html | 191 + docs/classes/event.InternalEvent.html | 601 + docs/classes/event.PublicEvent.html | 270 + docs/classes/grabber.PointerEventGrabber.html | 329 + docs/classes/logger.Logger.html | 185 + docs/classes/logger.LoggerManager.html | 139 + docs/classes/model.Model.html | 520 + docs/classes/model.Stroke.html | 183 + docs/classes/recognizer.RestRecognizer.html | 278 + docs/classes/recognizer.WSRecognizer.html | 786 + docs/classes/renderer.CanvasRenderer.html | 262 + docs/classes/renderer.CanvasStroker.html | 198 + docs/classes/renderer.SVGStroker.html | 207 + docs/classes/renderer.WSSVGRenderer.html | 392 + docs/classes/smartguide.SmartGuide.html | 616 + docs/classes/style.StyleManager.html | 236 + docs/classes/undoredo.UndoRedoContext.html | 156 + docs/classes/undoredo.UndoRedoManager.html | 232 + docs/classes/utils.DeferredPromise.html | 170 + docs/enums/constants.ExportType.html | 126 + docs/enums/constants.Intention.html | 98 + docs/enums/constants.LoggerClass.html | 171 + docs/enums/constants.LoggerLevel.html | 108 + docs/functions/model.convertStrokeToJSON.html | 76 + ...renderer.canvasRendererShape.drawLine.html | 93 + ...r.canvasRendererShape.drawShapeSymbol.html | 88 + ...derer.canvasRendererStroke.drawStroke.html | 81 + ...rer.canvasRendererText.drawTextSymbol.html | 85 + ...derer.quadradicsUtils.computeAxeAngle.html | 79 + ...er.quadradicsUtils.computeLinksPoints.html | 81 + ...er.quadradicsUtils.computeMiddlePoint.html | 79 + docs/functions/utils.crypto.computeHmac.html | 81 + .../utils.geometric.computeDistance.html | 79 + .../functions/utils.getAvailableFontList.html | 76 + .../utils.getAvailableLanguageList.html | 76 + ...tils.version.isVersionSuperiorOrEqual.html | 79 + docs/index.html | 182 + docs/interfaces/_internal_.IBehaviors.html | 414 + docs/interfaces/_internal_.IGrabber.html | 169 + docs/interfaces/_internal_.IModel.html | 410 + docs/interfaces/_internal_.IRecognizer.html | 140 + docs/modules.html | 87 + docs/modules/_internal_.html | 151 + docs/modules/behaviors.html | 73 + docs/modules/configuration.html | 84 + docs/modules/constants.html | 90 + docs/modules/event.html | 73 + docs/modules/grabber.html | 72 + docs/modules/logger.html | 73 + docs/modules/model.html | 77 + docs/modules/recognizer.html | 73 + .../modules/renderer.canvasRendererShape.html | 78 + .../renderer.canvasRendererStroke.html | 73 + docs/modules/renderer.canvasRendererText.html | 77 + docs/modules/renderer.html | 82 + docs/modules/renderer.quadradicsUtils.html | 75 + docs/modules/smartguide.html | 72 + docs/modules/style.html | 78 + docs/modules/undoredo.html | 73 + docs/modules/utils.crypto.html | 73 + docs/modules/utils.geometric.html | 73 + docs/modules/utils.html | 83 + docs/modules/utils.version.html | 73 + docs/types/_internal_.HTMLEditorElement.html | 72 + docs/types/_internal_.TAngleUnit.html | 67 + docs/types/_internal_.TBehaviorOptions.html | 85 + docs/types/_internal_.TConfiguration.html | 84 + .../_internal_.TConfigurationClient.html | 84 + docs/types/_internal_.TConverstionState.html | 67 + .../_internal_.TConvertConfiguration.html | 72 + .../types/_internal_.TDebugConfiguration.html | 74 + .../_internal_.TDiagramConfiguration.html | 82 + ...nternal_.TDiagramConvertConfiguration.html | 78 + .../_internal_.TEraserConfiguration.html | 72 + .../types/_internal_.TEventConfiguration.html | 72 + docs/types/_internal_.TExport.html | 112 + .../_internal_.TExportConfiguration.html | 78 + .../_internal_.TGrabberConfiguration.html | 76 + .../_internal_.TGuidesConfiguration.html | 74 + .../types/_internal_.TImageConfiguration.html | 74 + ...internal_.TImageViewportConfiguration.html | 78 + docs/types/_internal_.TJIIXExport.html | 80 + docs/types/_internal_.TJiixConfiguration.html | 83 + .../_internal_.TListenerConfiguration.html | 74 + .../_internal_.TLoggerConfiguration.html | 67 + .../_internal_.TMarginConfiguration.html | 78 + docs/types/_internal_.TMathConfiguration.html | 90 + docs/types/_internal_.TMathMLExport.html | 72 + docs/types/_internal_.TMathMLFlavor.html | 72 + docs/types/_internal_.TMathSolvedTheme.html | 74 + docs/types/_internal_.TMathTheme.html | 72 + ..._internal_.TMathUndoRedoConfiguration.html | 72 + docs/types/_internal_.TPenStyle.html | 81 + docs/types/_internal_.TPoint.html | 74 + docs/types/_internal_.TPointer.html | 74 + docs/types/_internal_.TProtocol.html | 67 + .../_internal_.TRawContentConfiguration.html | 78 + .../_internal_.TRecognitionConfiguration.html | 95 + ...rnal_.TRecognitionConfigurationClient.html | 95 + .../_internal_.TRecognitionPositions.html | 74 + ...al_.TRecognitionRendererConfiguration.html | 72 + docs/types/_internal_.TRecognitionType.html | 67 + .../_internal_.TRenderingConfiguration.html | 78 + .../_internal_.TRestPostConfiguration.html | 82 + docs/types/_internal_.TRestPostData.html | 86 + docs/types/_internal_.TRoundingMode.html | 67 + docs/types/_internal_.TSchene.html | 67 + .../_internal_.TServerConfiguration.html | 99 + ..._internal_.TServerConfigurationClient.html | 99 + .../_internal_.TSmartGuidesConfiguration.html | 79 + .../_internal_.TSolverConfiguration.html | 82 + docs/types/_internal_.TSolverOptions.html | 67 + docs/types/_internal_.TStroke.html | 80 + docs/types/_internal_.TStrokeGroupJSON.html | 74 + docs/types/_internal_.TStrokeJSON.html | 82 + docs/types/_internal_.TSymbol.html | 76 + .../_internal_.TTextConfConfiguration.html | 76 + docs/types/_internal_.TTextConfiguration.html | 82 + .../_internal_.TTextGuidesConfiguration.html | 72 + docs/types/_internal_.TTextTheme.html | 74 + docs/types/_internal_.TTheme.html | 80 + .../_internal_.TTriggerConfiguration.html | 85 + .../_internal_.TUndoRedoConfiguration.html | 72 + docs/types/_internal_.TUndoRedoContext.html | 82 + docs/types/_internal_.TUndoRedoMode.html | 67 + docs/types/_internal_.TUpdatePatch.html | 72 + .../_internal_.TUpdatePatchAppendChild.html | 74 + .../_internal_.TUpdatePatchInsertBefore.html | 74 + ..._internal_.TUpdatePatchRemoveAttribut.html | 74 + .../_internal_.TUpdatePatchRemoveChild.html | 74 + .../_internal_.TUpdatePatchRemoveElement.html | 72 + .../_internal_.TUpdatePatchReplaceAll.html | 72 + ..._internal_.TUpdatePatchReplaceELement.html | 74 + .../_internal_.TUpdatePatchSetAttribut.html | 76 + docs/types/_internal_.TUpdatePatchType.html | 67 + docs/types/_internal_.TWebSocketEvent.html | 74 + .../_internal_.TWebSocketSVGPatchEvent.html | 74 + docs/types/_internal_.TWordExport.html | 76 + .../configuration.DefaultConfiguration.html | 75 + ...figuration.DefaultEventsConfiguration.html | 69 + ...iguration.DefaultGrabberConfiguration.html | 74 + ...figuration.DefaultLoggerConfiguration.html | 81 + ...ation.DefaultRecognitionConfiguration.html | 146 + ...uration.DefaultRenderingConfiguration.html | 81 + ...figuration.DefaultServerConfiguration.html | 83 + ...iguration.DefaultTriggerConfiguration.html | 71 + ...guration.DefaultUndoRedoConfiguration.html | 69 + docs/variables/constants.Error.html | 107 + docs/variables/constants.EventType.html | 118 + .../constants.InternalEventType.html | 95 + ...erer.canvasRendererShape.ShapeSymbols.html | 87 + ...nderer.canvasRendererText.TextSymbols.html | 84 + docs/variables/style.DefaultPenStyle.html | 67 + docs/variables/style.DefaultTheme.html | 86 + docs/variables/style.StyleHelper.html | 196 + examples/server-configuration.json | 8 +- favicon.ico | Bin 318 -> 0 bytes index.html | 1 + jest.integration.config.js | 65 - jest.unit.config.js | 42 - package-lock.json | 21241 ---------------- package.json | 81 - plugins/typdoc-default-object.ts | 42 - preview.gif | Bin 190750 -> 0 bytes src/@types/Behaviors.d.ts | 65 - src/@types/configuration/Configuration.d.ts | 27 - .../configuration/EventConfiguration.d.ts | 4 - .../configuration/GrabberConfiguration.d.ts | 11 - .../configuration/LoggerConfiguration.ts | 33 - .../RecognitionConfiguration.d.ts | 47 - .../configuration/RenderingConfiguration.d.ts | 20 - .../configuration/ServerConfiguration.d.ts | 39 - .../configuration/TriggerConfiguration.d.ts | 14 - .../configuration/UndoRedoConfiguration.d.ts | 4 - src/@types/configuration/index.d.ts | 10 - .../recognition/ConvertConfiguration.d.ts | 4 - .../recognition/DiagramConfiguration.d.ts | 19 - .../recognition/EraserConfiguration.d.ts | 4 - .../recognition/ExportConfiguration.d.ts | 37 - .../recognition/MarginConfiguration.d.ts | 7 - .../recognition/MathConfiguration.d.ts | 36 - .../recognition/RawContentConfiguration.d.ts | 15 - .../recognition/TextConfiguration.d.ts | 21 - .../configuration/recognition/index.d.ts | 8 - src/@types/geometry.ts | 14 - src/@types/grabber/Grabber.d.ts | 13 - src/@types/index.d.ts | 9 - src/@types/model/Model.d.ts | 94 - src/@types/model/RecognitionPositions.d.ts | 5 - src/@types/model/Stroke.d.ts | 30 - src/@types/model/index.d.ts | 3 - src/@types/modules.d.ts | 22 - src/@types/recognizer/Recognizer.d.ts | 7 - src/@types/recognizer/RestRecognizer.d.ts | 26 - src/@types/recognizer/WSRecognizer.d.ts | 96 - src/@types/recognizer/index.d.ts | 3 - src/@types/renderer/Symbol.d.ts | 67 - src/@types/style/PenStyle.d.ts | 14 - src/@types/style/Theme.d.ts | 23 - src/@types/style/index.d.ts | 2 - src/@types/undo-redo/UndoRedoContext.d.ts | 10 - src/Constants.ts | 123 - src/Editor.ts | 483 - src/behaviors/RestBehaviors.ts | 319 - src/behaviors/WSBehaviors.ts | 325 - src/behaviors/index.ts | 2 - src/configuration/Configuration.ts | 85 - src/configuration/DefaultConfiguration.ts | 173 - src/configuration/index.ts | 3 - src/event/InternalEvent.ts | 164 - src/event/PublicEvent.ts | 84 - src/event/index.ts | 2 - src/grabber/PointerEventGrabber.ts | 131 - src/grabber/index.ts | 2 - src/iink.css | 328 - src/iink.ts | 28 - src/logger/index.ts | 2 - src/logger/logger.ts | 56 - src/logger/loggerManager.ts | 23 - src/model/Model.ts | 267 - src/model/Stroke.ts | 49 - src/model/index.ts | 2 - src/recognizer/RestRecognizer.ts | 278 - src/recognizer/WSRecognizer.ts | 734 - src/recognizer/index.ts | 2 - src/renderer/QuadraticUtils.ts | 31 - src/renderer/canvas/CanvasRenderer.ts | 123 - .../canvas/CanvasRendererShapeSymbol.ts | 190 - .../canvas/CanvasRendererStrokeSymbol.ts | 8 - .../canvas/CanvasRendererTextSymbol.ts | 74 - src/renderer/canvas/CanvasStroker.ts | 95 - src/renderer/canvas/index.ts | 5 - src/renderer/index.ts | 3 - src/renderer/svg/SVGStroker.ts | 103 - src/renderer/svg/WSSVGRenderer.ts | 212 - src/renderer/svg/index.ts | 2 - src/smartguide/SmartGuide.ts | 417 - src/style/DefaultPenStyle.ts | 3 - src/style/DefaultTheme.ts | 22 - src/style/StyleHelper.ts | 51 - src/style/StyleManager.ts | 67 - src/style/index.ts | 4 - src/undo-redo/UndoRedoContext.ts | 22 - src/undo-redo/UndoRedoManager.ts | 106 - src/undo-redo/index.ts | 2 - src/utils/CryptoHelper.ts | 7 - src/utils/DeferredPromise.ts | 32 - src/utils/MergeHelper.ts | 26 - src/utils/font.ts | 15 - src/utils/geometric.ts | 7 - src/utils/index.ts | 6 - src/utils/language.ts | 12 - src/utils/version.ts | 14 - test/.eslintrc.js | 14 - test/integration/01-home/home.test.js | 90 - test/integration/02-rest/rest-diagram.test.js | 166 - test/integration/02-rest/rest-math.test.js | 149 - test/integration/02-rest/rest-text.test.js | 173 - .../websocket-export-on-demand.test.js | 31 - .../websocket-handle_errors.test.js | 17 - .../websocket-math-custom-resources.test.js | 54 - .../websocket-math-eraser.test.js | 20 - .../websocket-math-import-jiix.test.js | 25 - .../websocket-math-inside-page.test.js | 111 - .../03-websocket/websocket-math.test.js | 195 - .../websocket-text-custom-lexicon.test.js | 41 - .../websocket-text-custom-resources.test.js | 30 - ...ebsocket-text-customize-editor-css.test.js | 19 - ...socket-text-customize-stroke-style.test.js | 113 - .../03-websocket/websocket-text-erase.test.js | 75 - .../websocket-text-file-export.test.js | 72 - .../websocket-text-highlight-words.test.js | 140 - .../websocket-text-iink-no-guides.test.js | 39 - .../websocket-text-iink-search.test.js | 47 - .../websocket-text-import-content.test.js | 54 - .../websocket-text-interact.test.js | 89 - .../websocket-text-local-storage.test.js | 41 - .../websocket-text-multiple-inputs.test.js | 111 - .../websocket-text-pointer-events.test.js | 38 - .../03-websocket/websocket-text.test.js | 200 - .../math/nav-actions-math-clear-test.js | 20 - .../math/nav-actions-math-undo-redo-test.js | 99 - .../text/nav-actions-text-clear-test.js | 20 - .../text/nav-actions-text-language-test.js | 28 - .../text/nav-actions-text-undo-redo-test.js | 36 - test/integration/helper.js | 246 - test/integration/jest.setup.js | 6 - test/integration/strokes/abrausorus.json | 69 - test/integration/strokes/covfefe.json | 782 - test/integration/strokes/equation1.json | 402 - test/integration/strokes/equation2.json | 67 - test/integration/strokes/fence.json | 466 - test/integration/strokes/h.json | 12 - test/integration/strokes/hello.json | 264 - test/integration/strokes/helloHowAreYou.json | 762 - test/integration/strokes/helloOneStroke.json | 442 - .../strokes/helloOneStrokeSurrounded.json | 70 - test/integration/strokes/helloStrike.json | 410 - .../strokes/interact/buenosAires.json | 1082 - test/integration/strokes/interact/madrid.json | 560 - test/integration/strokes/interact/paris.json | 500 - test/integration/strokes/interact/rome.json | 434 - test/integration/strokes/interact/tokyo.json | 578 - test/integration/strokes/line.json | 56 - .../strokes/multiple-inputs/1943.json | 688 - .../strokes/multiple-inputs/1993.json | 722 - .../centralProcessingUnit.json | 1820 -- test/integration/strokes/one.json | 128 - test/integration/strokes/ponyErase.json | 434 - test/integration/strokes/rectangle.json | 338 - test/integration/strokes/sum.json | 330 - test/integration/strokes/sumSimple.json | 101 - test/integration/strokesDatas.js | 523 - .../00-DefaultConfiguration.test.ts | 146 - .../00-configuration/01-Configuration.test.ts | 190 - .../01-grabber/00-PointerEventGrabber.test.ts | 283 - test/unit/02-model/00-Stroke.test.ts | 48 - test/unit/02-model/01-Model.test.ts | 592 - .../03-renderer/00-QuadraticUtils.test.ts | 46 - .../03-renderer/01-CanvasRenderer.test.ts | 51 - .../unit/03-renderer/02-CanvasStroker.test.ts | 37 - .../03-CanvasRendererShapeSymbol.test.ts | 66 - .../04-CanvasRendererStrokeSymbol.test.ts | 58 - .../unit/03-renderer/05-WSSVGRenderer.test.ts | 567 - test/unit/03-renderer/06-SVGStroker.test.ts | 54 - test/unit/04-style/00-StyleHelper.test.ts | 121 - test/unit/04-style/01-StyleManager.test.ts | 112 - .../05-recognizer/01-RestRecognizer.test.ts | 118 - .../05-recognizer/02-WSRecognizer.test.ts | 1046 - .../06-undo-redo/00-UndoRedoContext.test.ts | 29 - .../06-undo-redo/01-UndoRedoManager.test.ts | 249 - .../07-behaviors/00-RestBehaviors.test.ts | 213 - test/unit/07-behaviors/01-WSBehaviors.test.ts | 805 - .../unit/08-smart-guide/00-SmartGuide.test.ts | 242 - test/unit/09-event/00-PublicEvent.test.ts | 136 - test/unit/09-event/01-InternalEvent.test.ts | 98 - test/unit/99-iink/00-Editor.test.ts | 701 - test/unit/99-iink/01-utils.test.ts | 200 - test/unit/_dataset/configuration.dataset.ts | 209 - test/unit/jest.setup.js | 4 - test/unit/utils/PointerEventFake.ts | 84 - test/unit/utils/helpers.ts | 4 - tsconfig.json | 47 - typedoc.json | 45 - yarn.lock | 5749 ----- 375 files changed, 22804 insertions(+), 55029 deletions(-) delete mode 100644 .eslintrc.cjs delete mode 100644 .gitignore create mode 100644 .nojekyll delete mode 100644 .prettierrc.json delete mode 100644 .vscode/launch.json delete mode 100644 CHANGELOG.md delete mode 100644 CONTRIBUTING.md delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 SETUP.md create mode 100644 commit.txt delete mode 100644 config/rollup.config.build.js delete mode 100644 config/rollup.config.dev.js delete mode 100644 config/rollup.config.js create mode 100644 dist/iink.d.ts create mode 100644 dist/iink.d.ts.map create mode 100644 dist/iink.esm.js create mode 100644 dist/iink.esm.js.map create mode 100644 dist/iink.min.js create mode 100644 dist/iink.min.js.map create mode 100644 docs/.nojekyll rename typedoc.css => docs/assets/custom.css (100%) create mode 100644 docs/assets/highlight.css create mode 100644 docs/assets/main.js create mode 100644 docs/assets/navigation.js create mode 100644 docs/assets/search.js create mode 100644 docs/assets/style.css create mode 100644 docs/classes/Editor.html create mode 100644 docs/classes/behaviors.RestBehaviors.html create mode 100644 docs/classes/behaviors.WSBehaviors.html create mode 100644 docs/classes/configuration.Configuration.html create mode 100644 docs/classes/event.InternalEvent.html create mode 100644 docs/classes/event.PublicEvent.html create mode 100644 docs/classes/grabber.PointerEventGrabber.html create mode 100644 docs/classes/logger.Logger.html create mode 100644 docs/classes/logger.LoggerManager.html create mode 100644 docs/classes/model.Model.html create mode 100644 docs/classes/model.Stroke.html create mode 100644 docs/classes/recognizer.RestRecognizer.html create mode 100644 docs/classes/recognizer.WSRecognizer.html create mode 100644 docs/classes/renderer.CanvasRenderer.html create mode 100644 docs/classes/renderer.CanvasStroker.html create mode 100644 docs/classes/renderer.SVGStroker.html create mode 100644 docs/classes/renderer.WSSVGRenderer.html create mode 100644 docs/classes/smartguide.SmartGuide.html create mode 100644 docs/classes/style.StyleManager.html create mode 100644 docs/classes/undoredo.UndoRedoContext.html create mode 100644 docs/classes/undoredo.UndoRedoManager.html create mode 100644 docs/classes/utils.DeferredPromise.html create mode 100644 docs/enums/constants.ExportType.html create mode 100644 docs/enums/constants.Intention.html create mode 100644 docs/enums/constants.LoggerClass.html create mode 100644 docs/enums/constants.LoggerLevel.html create mode 100644 docs/functions/model.convertStrokeToJSON.html create mode 100644 docs/functions/renderer.canvasRendererShape.drawLine.html create mode 100644 docs/functions/renderer.canvasRendererShape.drawShapeSymbol.html create mode 100644 docs/functions/renderer.canvasRendererStroke.drawStroke.html create mode 100644 docs/functions/renderer.canvasRendererText.drawTextSymbol.html create mode 100644 docs/functions/renderer.quadradicsUtils.computeAxeAngle.html create mode 100644 docs/functions/renderer.quadradicsUtils.computeLinksPoints.html create mode 100644 docs/functions/renderer.quadradicsUtils.computeMiddlePoint.html create mode 100644 docs/functions/utils.crypto.computeHmac.html create mode 100644 docs/functions/utils.geometric.computeDistance.html create mode 100644 docs/functions/utils.getAvailableFontList.html create mode 100644 docs/functions/utils.getAvailableLanguageList.html create mode 100644 docs/functions/utils.version.isVersionSuperiorOrEqual.html create mode 100644 docs/index.html create mode 100644 docs/interfaces/_internal_.IBehaviors.html create mode 100644 docs/interfaces/_internal_.IGrabber.html create mode 100644 docs/interfaces/_internal_.IModel.html create mode 100644 docs/interfaces/_internal_.IRecognizer.html create mode 100644 docs/modules.html create mode 100644 docs/modules/_internal_.html create mode 100644 docs/modules/behaviors.html create mode 100644 docs/modules/configuration.html create mode 100644 docs/modules/constants.html create mode 100644 docs/modules/event.html create mode 100644 docs/modules/grabber.html create mode 100644 docs/modules/logger.html create mode 100644 docs/modules/model.html create mode 100644 docs/modules/recognizer.html create mode 100644 docs/modules/renderer.canvasRendererShape.html create mode 100644 docs/modules/renderer.canvasRendererStroke.html create mode 100644 docs/modules/renderer.canvasRendererText.html create mode 100644 docs/modules/renderer.html create mode 100644 docs/modules/renderer.quadradicsUtils.html create mode 100644 docs/modules/smartguide.html create mode 100644 docs/modules/style.html create mode 100644 docs/modules/undoredo.html create mode 100644 docs/modules/utils.crypto.html create mode 100644 docs/modules/utils.geometric.html create mode 100644 docs/modules/utils.html create mode 100644 docs/modules/utils.version.html create mode 100644 docs/types/_internal_.HTMLEditorElement.html create mode 100644 docs/types/_internal_.TAngleUnit.html create mode 100644 docs/types/_internal_.TBehaviorOptions.html create mode 100644 docs/types/_internal_.TConfiguration.html create mode 100644 docs/types/_internal_.TConfigurationClient.html create mode 100644 docs/types/_internal_.TConverstionState.html create mode 100644 docs/types/_internal_.TConvertConfiguration.html create mode 100644 docs/types/_internal_.TDebugConfiguration.html create mode 100644 docs/types/_internal_.TDiagramConfiguration.html create mode 100644 docs/types/_internal_.TDiagramConvertConfiguration.html create mode 100644 docs/types/_internal_.TEraserConfiguration.html create mode 100644 docs/types/_internal_.TEventConfiguration.html create mode 100644 docs/types/_internal_.TExport.html create mode 100644 docs/types/_internal_.TExportConfiguration.html create mode 100644 docs/types/_internal_.TGrabberConfiguration.html create mode 100644 docs/types/_internal_.TGuidesConfiguration.html create mode 100644 docs/types/_internal_.TImageConfiguration.html create mode 100644 docs/types/_internal_.TImageViewportConfiguration.html create mode 100644 docs/types/_internal_.TJIIXExport.html create mode 100644 docs/types/_internal_.TJiixConfiguration.html create mode 100644 docs/types/_internal_.TListenerConfiguration.html create mode 100644 docs/types/_internal_.TLoggerConfiguration.html create mode 100644 docs/types/_internal_.TMarginConfiguration.html create mode 100644 docs/types/_internal_.TMathConfiguration.html create mode 100644 docs/types/_internal_.TMathMLExport.html create mode 100644 docs/types/_internal_.TMathMLFlavor.html create mode 100644 docs/types/_internal_.TMathSolvedTheme.html create mode 100644 docs/types/_internal_.TMathTheme.html create mode 100644 docs/types/_internal_.TMathUndoRedoConfiguration.html create mode 100644 docs/types/_internal_.TPenStyle.html create mode 100644 docs/types/_internal_.TPoint.html create mode 100644 docs/types/_internal_.TPointer.html create mode 100644 docs/types/_internal_.TProtocol.html create mode 100644 docs/types/_internal_.TRawContentConfiguration.html create mode 100644 docs/types/_internal_.TRecognitionConfiguration.html create mode 100644 docs/types/_internal_.TRecognitionConfigurationClient.html create mode 100644 docs/types/_internal_.TRecognitionPositions.html create mode 100644 docs/types/_internal_.TRecognitionRendererConfiguration.html create mode 100644 docs/types/_internal_.TRecognitionType.html create mode 100644 docs/types/_internal_.TRenderingConfiguration.html create mode 100644 docs/types/_internal_.TRestPostConfiguration.html create mode 100644 docs/types/_internal_.TRestPostData.html create mode 100644 docs/types/_internal_.TRoundingMode.html create mode 100644 docs/types/_internal_.TSchene.html create mode 100644 docs/types/_internal_.TServerConfiguration.html create mode 100644 docs/types/_internal_.TServerConfigurationClient.html create mode 100644 docs/types/_internal_.TSmartGuidesConfiguration.html create mode 100644 docs/types/_internal_.TSolverConfiguration.html create mode 100644 docs/types/_internal_.TSolverOptions.html create mode 100644 docs/types/_internal_.TStroke.html create mode 100644 docs/types/_internal_.TStrokeGroupJSON.html create mode 100644 docs/types/_internal_.TStrokeJSON.html create mode 100644 docs/types/_internal_.TSymbol.html create mode 100644 docs/types/_internal_.TTextConfConfiguration.html create mode 100644 docs/types/_internal_.TTextConfiguration.html create mode 100644 docs/types/_internal_.TTextGuidesConfiguration.html create mode 100644 docs/types/_internal_.TTextTheme.html create mode 100644 docs/types/_internal_.TTheme.html create mode 100644 docs/types/_internal_.TTriggerConfiguration.html create mode 100644 docs/types/_internal_.TUndoRedoConfiguration.html create mode 100644 docs/types/_internal_.TUndoRedoContext.html create mode 100644 docs/types/_internal_.TUndoRedoMode.html create mode 100644 docs/types/_internal_.TUpdatePatch.html create mode 100644 docs/types/_internal_.TUpdatePatchAppendChild.html create mode 100644 docs/types/_internal_.TUpdatePatchInsertBefore.html create mode 100644 docs/types/_internal_.TUpdatePatchRemoveAttribut.html create mode 100644 docs/types/_internal_.TUpdatePatchRemoveChild.html create mode 100644 docs/types/_internal_.TUpdatePatchRemoveElement.html create mode 100644 docs/types/_internal_.TUpdatePatchReplaceAll.html create mode 100644 docs/types/_internal_.TUpdatePatchReplaceELement.html create mode 100644 docs/types/_internal_.TUpdatePatchSetAttribut.html create mode 100644 docs/types/_internal_.TUpdatePatchType.html create mode 100644 docs/types/_internal_.TWebSocketEvent.html create mode 100644 docs/types/_internal_.TWebSocketSVGPatchEvent.html create mode 100644 docs/types/_internal_.TWordExport.html create mode 100644 docs/variables/configuration.DefaultConfiguration.html create mode 100644 docs/variables/configuration.DefaultEventsConfiguration.html create mode 100644 docs/variables/configuration.DefaultGrabberConfiguration.html create mode 100644 docs/variables/configuration.DefaultLoggerConfiguration.html create mode 100644 docs/variables/configuration.DefaultRecognitionConfiguration.html create mode 100644 docs/variables/configuration.DefaultRenderingConfiguration.html create mode 100644 docs/variables/configuration.DefaultServerConfiguration.html create mode 100644 docs/variables/configuration.DefaultTriggerConfiguration.html create mode 100644 docs/variables/configuration.DefaultUndoRedoConfiguration.html create mode 100644 docs/variables/constants.Error.html create mode 100644 docs/variables/constants.EventType.html create mode 100644 docs/variables/constants.InternalEventType.html create mode 100644 docs/variables/renderer.canvasRendererShape.ShapeSymbols.html create mode 100644 docs/variables/renderer.canvasRendererText.TextSymbols.html create mode 100644 docs/variables/style.DefaultPenStyle.html create mode 100644 docs/variables/style.DefaultTheme.html create mode 100644 docs/variables/style.StyleHelper.html delete mode 100644 favicon.ico create mode 100644 index.html delete mode 100644 jest.integration.config.js delete mode 100644 jest.unit.config.js delete mode 100644 package-lock.json delete mode 100644 package.json delete mode 100644 plugins/typdoc-default-object.ts delete mode 100644 preview.gif delete mode 100644 src/@types/Behaviors.d.ts delete mode 100644 src/@types/configuration/Configuration.d.ts delete mode 100644 src/@types/configuration/EventConfiguration.d.ts delete mode 100644 src/@types/configuration/GrabberConfiguration.d.ts delete mode 100644 src/@types/configuration/LoggerConfiguration.ts delete mode 100644 src/@types/configuration/RecognitionConfiguration.d.ts delete mode 100644 src/@types/configuration/RenderingConfiguration.d.ts delete mode 100644 src/@types/configuration/ServerConfiguration.d.ts delete mode 100644 src/@types/configuration/TriggerConfiguration.d.ts delete mode 100644 src/@types/configuration/UndoRedoConfiguration.d.ts delete mode 100644 src/@types/configuration/index.d.ts delete mode 100644 src/@types/configuration/recognition/ConvertConfiguration.d.ts delete mode 100644 src/@types/configuration/recognition/DiagramConfiguration.d.ts delete mode 100644 src/@types/configuration/recognition/EraserConfiguration.d.ts delete mode 100644 src/@types/configuration/recognition/ExportConfiguration.d.ts delete mode 100644 src/@types/configuration/recognition/MarginConfiguration.d.ts delete mode 100644 src/@types/configuration/recognition/MathConfiguration.d.ts delete mode 100644 src/@types/configuration/recognition/RawContentConfiguration.d.ts delete mode 100644 src/@types/configuration/recognition/TextConfiguration.d.ts delete mode 100644 src/@types/configuration/recognition/index.d.ts delete mode 100644 src/@types/geometry.ts delete mode 100644 src/@types/grabber/Grabber.d.ts delete mode 100644 src/@types/index.d.ts delete mode 100644 src/@types/model/Model.d.ts delete mode 100644 src/@types/model/RecognitionPositions.d.ts delete mode 100644 src/@types/model/Stroke.d.ts delete mode 100644 src/@types/model/index.d.ts delete mode 100644 src/@types/modules.d.ts delete mode 100644 src/@types/recognizer/Recognizer.d.ts delete mode 100644 src/@types/recognizer/RestRecognizer.d.ts delete mode 100644 src/@types/recognizer/WSRecognizer.d.ts delete mode 100644 src/@types/recognizer/index.d.ts delete mode 100644 src/@types/renderer/Symbol.d.ts delete mode 100644 src/@types/style/PenStyle.d.ts delete mode 100644 src/@types/style/Theme.d.ts delete mode 100644 src/@types/style/index.d.ts delete mode 100644 src/@types/undo-redo/UndoRedoContext.d.ts delete mode 100644 src/Constants.ts delete mode 100644 src/Editor.ts delete mode 100644 src/behaviors/RestBehaviors.ts delete mode 100644 src/behaviors/WSBehaviors.ts delete mode 100644 src/behaviors/index.ts delete mode 100644 src/configuration/Configuration.ts delete mode 100644 src/configuration/DefaultConfiguration.ts delete mode 100644 src/configuration/index.ts delete mode 100644 src/event/InternalEvent.ts delete mode 100644 src/event/PublicEvent.ts delete mode 100644 src/event/index.ts delete mode 100644 src/grabber/PointerEventGrabber.ts delete mode 100644 src/grabber/index.ts delete mode 100644 src/iink.css delete mode 100644 src/iink.ts delete mode 100644 src/logger/index.ts delete mode 100644 src/logger/logger.ts delete mode 100644 src/logger/loggerManager.ts delete mode 100644 src/model/Model.ts delete mode 100644 src/model/Stroke.ts delete mode 100644 src/model/index.ts delete mode 100644 src/recognizer/RestRecognizer.ts delete mode 100644 src/recognizer/WSRecognizer.ts delete mode 100644 src/recognizer/index.ts delete mode 100644 src/renderer/QuadraticUtils.ts delete mode 100644 src/renderer/canvas/CanvasRenderer.ts delete mode 100644 src/renderer/canvas/CanvasRendererShapeSymbol.ts delete mode 100644 src/renderer/canvas/CanvasRendererStrokeSymbol.ts delete mode 100644 src/renderer/canvas/CanvasRendererTextSymbol.ts delete mode 100644 src/renderer/canvas/CanvasStroker.ts delete mode 100644 src/renderer/canvas/index.ts delete mode 100644 src/renderer/index.ts delete mode 100644 src/renderer/svg/SVGStroker.ts delete mode 100644 src/renderer/svg/WSSVGRenderer.ts delete mode 100644 src/renderer/svg/index.ts delete mode 100644 src/smartguide/SmartGuide.ts delete mode 100644 src/style/DefaultPenStyle.ts delete mode 100644 src/style/DefaultTheme.ts delete mode 100644 src/style/StyleHelper.ts delete mode 100644 src/style/StyleManager.ts delete mode 100644 src/style/index.ts delete mode 100644 src/undo-redo/UndoRedoContext.ts delete mode 100644 src/undo-redo/UndoRedoManager.ts delete mode 100644 src/undo-redo/index.ts delete mode 100644 src/utils/CryptoHelper.ts delete mode 100644 src/utils/DeferredPromise.ts delete mode 100644 src/utils/MergeHelper.ts delete mode 100644 src/utils/font.ts delete mode 100644 src/utils/geometric.ts delete mode 100644 src/utils/index.ts delete mode 100644 src/utils/language.ts delete mode 100644 src/utils/version.ts delete mode 100644 test/.eslintrc.js delete mode 100644 test/integration/01-home/home.test.js delete mode 100644 test/integration/02-rest/rest-diagram.test.js delete mode 100644 test/integration/02-rest/rest-math.test.js delete mode 100644 test/integration/02-rest/rest-text.test.js delete mode 100644 test/integration/03-websocket/websocket-export-on-demand.test.js delete mode 100644 test/integration/03-websocket/websocket-handle_errors.test.js delete mode 100644 test/integration/03-websocket/websocket-math-custom-resources.test.js delete mode 100644 test/integration/03-websocket/websocket-math-eraser.test.js delete mode 100644 test/integration/03-websocket/websocket-math-import-jiix.test.js delete mode 100644 test/integration/03-websocket/websocket-math-inside-page.test.js delete mode 100644 test/integration/03-websocket/websocket-math.test.js delete mode 100644 test/integration/03-websocket/websocket-text-custom-lexicon.test.js delete mode 100644 test/integration/03-websocket/websocket-text-custom-resources.test.js delete mode 100644 test/integration/03-websocket/websocket-text-customize-editor-css.test.js delete mode 100644 test/integration/03-websocket/websocket-text-customize-stroke-style.test.js delete mode 100644 test/integration/03-websocket/websocket-text-erase.test.js delete mode 100644 test/integration/03-websocket/websocket-text-file-export.test.js delete mode 100644 test/integration/03-websocket/websocket-text-highlight-words.test.js delete mode 100644 test/integration/03-websocket/websocket-text-iink-no-guides.test.js delete mode 100644 test/integration/03-websocket/websocket-text-iink-search.test.js delete mode 100644 test/integration/03-websocket/websocket-text-import-content.test.js delete mode 100644 test/integration/03-websocket/websocket-text-interact.test.js delete mode 100644 test/integration/03-websocket/websocket-text-local-storage.test.js delete mode 100644 test/integration/03-websocket/websocket-text-multiple-inputs.test.js delete mode 100644 test/integration/03-websocket/websocket-text-pointer-events.test.js delete mode 100644 test/integration/03-websocket/websocket-text.test.js delete mode 100644 test/integration/_partials/math/nav-actions-math-clear-test.js delete mode 100644 test/integration/_partials/math/nav-actions-math-undo-redo-test.js delete mode 100644 test/integration/_partials/text/nav-actions-text-clear-test.js delete mode 100644 test/integration/_partials/text/nav-actions-text-language-test.js delete mode 100644 test/integration/_partials/text/nav-actions-text-undo-redo-test.js delete mode 100644 test/integration/helper.js delete mode 100644 test/integration/jest.setup.js delete mode 100644 test/integration/strokes/abrausorus.json delete mode 100644 test/integration/strokes/covfefe.json delete mode 100644 test/integration/strokes/equation1.json delete mode 100644 test/integration/strokes/equation2.json delete mode 100644 test/integration/strokes/fence.json delete mode 100644 test/integration/strokes/h.json delete mode 100644 test/integration/strokes/hello.json delete mode 100644 test/integration/strokes/helloHowAreYou.json delete mode 100644 test/integration/strokes/helloOneStroke.json delete mode 100644 test/integration/strokes/helloOneStrokeSurrounded.json delete mode 100644 test/integration/strokes/helloStrike.json delete mode 100644 test/integration/strokes/interact/buenosAires.json delete mode 100644 test/integration/strokes/interact/madrid.json delete mode 100644 test/integration/strokes/interact/paris.json delete mode 100644 test/integration/strokes/interact/rome.json delete mode 100644 test/integration/strokes/interact/tokyo.json delete mode 100644 test/integration/strokes/line.json delete mode 100644 test/integration/strokes/multiple-inputs/1943.json delete mode 100644 test/integration/strokes/multiple-inputs/1993.json delete mode 100644 test/integration/strokes/multiple-inputs/centralProcessingUnit.json delete mode 100644 test/integration/strokes/one.json delete mode 100644 test/integration/strokes/ponyErase.json delete mode 100644 test/integration/strokes/rectangle.json delete mode 100644 test/integration/strokes/sum.json delete mode 100644 test/integration/strokes/sumSimple.json delete mode 100644 test/integration/strokesDatas.js delete mode 100644 test/unit/00-configuration/00-DefaultConfiguration.test.ts delete mode 100644 test/unit/00-configuration/01-Configuration.test.ts delete mode 100644 test/unit/01-grabber/00-PointerEventGrabber.test.ts delete mode 100644 test/unit/02-model/00-Stroke.test.ts delete mode 100644 test/unit/02-model/01-Model.test.ts delete mode 100644 test/unit/03-renderer/00-QuadraticUtils.test.ts delete mode 100644 test/unit/03-renderer/01-CanvasRenderer.test.ts delete mode 100644 test/unit/03-renderer/02-CanvasStroker.test.ts delete mode 100644 test/unit/03-renderer/03-CanvasRendererShapeSymbol.test.ts delete mode 100644 test/unit/03-renderer/04-CanvasRendererStrokeSymbol.test.ts delete mode 100644 test/unit/03-renderer/05-WSSVGRenderer.test.ts delete mode 100644 test/unit/03-renderer/06-SVGStroker.test.ts delete mode 100644 test/unit/04-style/00-StyleHelper.test.ts delete mode 100644 test/unit/04-style/01-StyleManager.test.ts delete mode 100644 test/unit/05-recognizer/01-RestRecognizer.test.ts delete mode 100644 test/unit/05-recognizer/02-WSRecognizer.test.ts delete mode 100644 test/unit/06-undo-redo/00-UndoRedoContext.test.ts delete mode 100644 test/unit/06-undo-redo/01-UndoRedoManager.test.ts delete mode 100644 test/unit/07-behaviors/00-RestBehaviors.test.ts delete mode 100644 test/unit/07-behaviors/01-WSBehaviors.test.ts delete mode 100644 test/unit/08-smart-guide/00-SmartGuide.test.ts delete mode 100644 test/unit/09-event/00-PublicEvent.test.ts delete mode 100644 test/unit/09-event/01-InternalEvent.test.ts delete mode 100644 test/unit/99-iink/00-Editor.test.ts delete mode 100644 test/unit/99-iink/01-utils.test.ts delete mode 100644 test/unit/_dataset/configuration.dataset.ts delete mode 100644 test/unit/jest.setup.js delete mode 100644 test/unit/utils/PointerEventFake.ts delete mode 100644 test/unit/utils/helpers.ts delete mode 100644 tsconfig.json delete mode 100644 typedoc.json delete mode 100644 yarn.lock diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index 0cb901f88..000000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,38 +0,0 @@ -module.exports = { - root: true, - env: { - browser: true, - node: true, - es6: true, - }, - parser: "@typescript-eslint/parser", - parserOptions: { - project: "./tsconfig.json" - }, - plugins: [ - "@typescript-eslint" - ], - extends: [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - ], - rules: { - "@typescript-eslint/no-explicit-any": "error", - "@typescript-eslint/no-var-requires": "error", - "quotes": "off", - "@typescript-eslint/quotes": [ - "error", - "double", - { - "avoidEscape": true, - "allowTemplateLiterals": true - } - ], - "max-statements-per-line": [ - "error", - { - "max": 1 - } - ] - }, -} diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 4621c33e5..000000000 --- a/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -node_modules -coverage -.vscode/* -!.vscode/launch.json - -docker/examples/delivery -test/integration/screenshots -docs -dist diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 000000000..283b150d6 --- /dev/null +++ b/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the option to false. diff --git a/.prettierrc.json b/.prettierrc.json deleted file mode 100644 index b1836bb00..000000000 --- a/.prettierrc.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "trailingComma":"none", - "tabWidth": 2, - "semi": true, - "singleQuote": false, - "printWidth": 150 -} diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index c683588f3..000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "chrome", - "request": "launch", - "name": "Launch Chrome against localhost", - "url": "http://localhost:8000/examples/index.html", - "webRoot": "${workspaceFolder}", - "preLaunchTask": "tsc: build - tsconfig.json", - "outFiles": ["${workspaceFolder}/dist/**/*.js"] - } - ] -} diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 0c4ec63ba..000000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,4 +0,0 @@ -# [v1.0.0](https://github.com/MyScript/iinkTS/tree/v1.0.0) - -## Features -- migration javascript to typescript [link](https://github.com/MyScript/iinkTS) \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index a20eaf718..000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,9 +0,0 @@ -# Contributing - -We gladly welcome pull requests to iinkTS. If you have any questions, or need help to solve a problem, feel free to stop by the [MyScript forum](https://developer-support.myscript.com/support/discussions/forums/16000096021). - -## CLA - -In order to contribute, you must first agree to the **Contributor License Agreement** available [here](http://goo.gl/forms/YyzZ9VSvYG). - -Make sure you read the article "[Contributing to Open Source on GitHub](https://guides.github.com/activities/contributing-to-open-source/)" to understand the contributing process. \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 18453c66f..000000000 --- a/LICENSE +++ /dev/null @@ -1,10 +0,0 @@ -Copyright MyScript. - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/README.md b/README.md deleted file mode 100644 index b9757156f..000000000 --- a/README.md +++ /dev/null @@ -1,178 +0,0 @@ -# iinkTS - -[![npm version](https://badge.fury.io/js/iink-ts.svg)](https://badge.fury.io/js/iink-ts) -[![Examples](https://img.shields.io/badge/Link%20to-examples-blue.svg)](https://myscript.github.io/iinkTS/examples/) -[![Documentation](https://img.shields.io/badge/Link%20to-documentation-green.svg)](https://developer.myscript.com/docs/interactive-ink/latest/web/iinkts/) - -> The fastest way to integrate rich **handwriting** features in your webapp. - -
- -
- -iinkTS is a JavaScript library that can be used in every web application to bring handwriting recognition. - -It integrates all you need: - -* Signal capture for all devices, -* Digital ink rendering, -* Link to MyScript Cloud to bring handwriting recognition. - -## Table of contents - -* [Features](https://github.com/MyScript/iinkTS#features) -* [Requirements](https://github.com/MyScript/iinkTS#requirements) -* [Installation](https://github.com/MyScript/iinkTS#installation) -* [Usage](https://github.com/MyScript/iinkTS#usage) -* [Documentation](https://github.com/MyScript/iinkTS#documentation) -* [Development](https://github.com/MyScript/iinkTS#development) -* [Support](https://github.com/MyScript/iinkTS#getting-support ) -* [Feedback](https://github.com/MyScript/iinkTS#sharing-your-feedback) -* [Contributing](https://github.com/MyScript/iinkTS#contributing) - -## Features - -* Text and Math support, -* Easy to integrate, -* Digital ink capture and rendering, -* Rich editing gestures, -* Import and export content, -* Styling, -* Typeset support, -* More than 200 mathematical symbols supported, -* 72 supported languages. - -You can discover all the features on our Developer website for [Text](https://developer.myscript.com/features/text) and [Math](https://developer.myscript.com/features/math). - -## Requirements - -1. Have [npm](https://www.npmjs.com/get-npm), [yarn](https://yarnpkg.com/en/docs/install). -2. Have a MyScript developer account. You can create one [here](https://developer.myscript.com/support/account/registering-myscript-cloud/). -3. Get your keys and the free monthly quota to access MyScript Cloud at [developer.myscript.com](https://developer.myscript.com/getting-started/web) - -## Installation - -iinkTS can be installed with the well known package managers `npm`, `yarn`. - -If you want to use `npm` or `yarn` you first have to init a project (or use an existing one). - -```shell -npm init -OR -yarn init -``` - -You can then install iinkTS and use it as showed in the [Usage](https://github.com/MyScript/iinkTS#usage) section. - -```shell -npm install iink-ts -OR -yarn add iink-ts -``` - -## Usage - -1. Create an `index.html` file in the same directory. - -2. Add the following lines in the `head` section of your file to use iinkTS and the css : -```html - -``` - -3. Still in the `head` section, add a `style` and specify the height and the width of your editor: -```html - -``` - -4. In the `body` tag, create a `div` tag that will contain the editing area: -```html -
-``` - -5. In JavaScript and within a ` - - - -
- - - -``` - -7. Open `index.html` in your browser or serve your folder content using any web server. - -You can find this guide, and a more complete example on the [MyScript Developer website](https://developer.myscript.com/docs/interactive-ink/latest/web/iinkts/). - -## Documentation - -You can find a complete documentation with the following sections on our Developer website: - -* **Get Started**: [how to use iinkTS with a full example](https://developer.myscript.com/docs/interactive-ink/latest/web/iinkts/get-started/), -* **Editing**: [how to interact with content](https://developer.myscript.com/docs/interactive-ink/latest/web/iinkts/editing/), -* **Conversion**: [how to convert your handwritten content](https://developer.myscript.com/docs/interactive-ink/latest/web/iinkts/conversion/), -* **Import and Export**: [how to import and export your content](https://developer.myscript.com/docs/interactive-ink/latest/web/iinkts/import-and-export/), -* **Styling**: [how to style content](https://developer.myscript.com/docs/interactive-ink/latest/web/iinkts/styling/). - -As well as a global [Configuration page](https://developer.myscript.com/docs/interactive-ink/latest/reference/web/configuration/). - -We also provide a complete [API Reference](https://myscript.github.io/iinkTS/docs/). - -## Development - -Instructions to help you build the project and develop are available in the [SETUP.md](https://github.com/MyScript/iinkTS/blob/master/SETUP.md) file. - - -## Getting support - -You can get support and ask your questions on the [dedicated section](https://developer-support.myscript.com/support/discussions/forums/16000096760) of MyScript Developer website. - -## Sharing your feedback ? - -Made a cool app with iinkTS? We would love to hear about you! -We’re planning to showcase apps using it so let us know by sending a quick mail to [myapp@myscript.com](mailto://myapp@myscript.com). - -## Contributing - -We welcome your contributions: if you would like to extend iinkTS for your needs, feel free to fork it! - -Please take a look at our [contributing](https://github.com/MyScript/iinkTS/blob/master/CONTRIBUTING.md) guidelines before submitting your pull request. - -## License -This library is licensed under the [Apache 2.0](http://opensource.org/licenses/Apache-2.0). diff --git a/SETUP.md b/SETUP.md deleted file mode 100644 index 9dfe90c8d..000000000 --- a/SETUP.md +++ /dev/null @@ -1,15 +0,0 @@ -# Environment setup - -## Configure project - -1. Download sources -2. Install dependencies. - * `npm install` -3. Build the project using our npm script. - * `npm run build` -4. Run the server and the live reload using our npm script. - * `npm run dev`. Examples will be available on `http://localhost:8000/examples/index.html` - -**Start coding** - -5. Debug using your favorite browser dev tools. The sources will be available under the webpack source folder (for chrome dev tools). Every change in sources will trigger a rebuild with linter and basic tests. \ No newline at end of file diff --git a/commit.txt b/commit.txt new file mode 100644 index 000000000..bf8e50da7 --- /dev/null +++ b/commit.txt @@ -0,0 +1 @@ +c87b8c725d0de7d57e03871c8d3fb8cca0af70b8 diff --git a/config/rollup.config.build.js b/config/rollup.config.build.js deleted file mode 100644 index cf8179e87..000000000 --- a/config/rollup.config.build.js +++ /dev/null @@ -1,3 +0,0 @@ -import config from "./rollup.config" - -export default config diff --git a/config/rollup.config.dev.js b/config/rollup.config.dev.js deleted file mode 100644 index b75e24fae..000000000 --- a/config/rollup.config.dev.js +++ /dev/null @@ -1,29 +0,0 @@ -import serve from "rollup-plugin-serve" -import livereload from "rollup-plugin-livereload" -import config from "./rollup.config" - -config[0].plugins.push( - serve({ - open: true, - openPage: "/examples/index.html", - verbose: true, - contentBase: "", - host: "localhost", - port: 8000, - headers: { - "Access-Control-Allow-Origin": "*" - } - }), - livereload({ - watch: [ - "dist", - "examples" - ] - }) -) - -config.watch = { - include: "src/**" -} - -export default config diff --git a/config/rollup.config.js b/config/rollup.config.js deleted file mode 100644 index ad4db9ea4..000000000 --- a/config/rollup.config.js +++ /dev/null @@ -1,49 +0,0 @@ -import typescript from "rollup-plugin-typescript2" -import { terser } from "rollup-plugin-terser" -import resolve from "@rollup/plugin-node-resolve" -import postcss from "rollup-plugin-postcss" -import dts from "rollup-plugin-dts" -import commonjs from "rollup-plugin-commonjs" - -export default [ - { - input: "src/iink.ts", - output: [ - { - name: "iink", - file: "dist/iink.min.js", - format: "umd", - exports: "named", - }, - { - file: "./dist/iink.esm.js", - format: "esm", - }, - ], - plugins: [ - commonjs({ - include: ["node_modules/json-css/**", "node_modules/crypto-js/**"], - }), - resolve(), - typescript(), - terser({ - keep_fnames: true, - compress: true, - }), - postcss(), - ], - }, - { - input: "src/iink.ts", - plugins: [ - dts(), - postcss({ - inject: false - }), - ], - output: { - file: `dist/iink.d.ts`, - format: "es", - } - } -] diff --git a/dist/iink.d.ts b/dist/iink.d.ts new file mode 100644 index 000000000..8cd0d2cde --- /dev/null +++ b/dist/iink.d.ts @@ -0,0 +1,1511 @@ +type TConvertConfiguration = { + convertOnDoubleTap: boolean +} + +type TEraserConfiguration = { + "erase-precisely": boolean +} + +type TMarginConfiguration = { + bottom: number + left: number + right: number + top: number +} + +type TTextGuidesConfiguration = { + enable: boolean +} + +type TTextConfConfiguration = { + customResources?: string[] + customLexicon?: string[] + addLKText?: boolean +} + +type TTextConfiguration = { + text?: boolean + mimeTypes: ("text/plain" | "application/vnd.myscript.jiix")[] + margin: TMarginConfiguration + guides?: TTextGuidesConfiguration + configuration?: TTextConfConfiguration + eraser?: TEraserConfiguration +} + +type TDiagramConvertConfiguration = { + edge?: boolean + node?: boolean + text?: boolean + "match-text-size"?: boolean +} + +type TDiagramConfiguration = { + mimeTypes: ("application/vnd.myscript.jiix" | "application/vnd.openxmlformats-officedocument.presentationml.presentation" | "image/svg+xml")[] + "enable-sub-blocks"?: boolean + text?: TTextConfConfiguration + convert?: TDiagramConvertConfiguration + "session-time"?: number + eraser?: TEraserConfiguration +} + +type TImageViewportConfiguration = { + x: number + y: number + width: number + height: number +} + +type TImageConfiguration = { + guides: boolean + viewport: TImageViewportConfiguration +} + +type TJiixConfiguration = { + "bounding-box"?: boolean + strokes: boolean + text?: { + chars: boolean + words: boolean + } + style?: boolean +} + +type TMathMLFlavor = { + name: string +} + +type TMathMLExport = { + flavor: TMathMLFlavor +} + +type TExportConfiguration$1 = { + "image-resolution"?: number + image?: TImageConfiguration + jiix?: TJiixConfiguration + mathml?: TMathMLExport +} + +type TRoundingMode = "half up" | "truncate" + +type TAngleUnit = "deg" | "rad" + +type TSolverOptions = "algebraic" | "numeric" + +type TSolverConfiguration = { + enable?: boolean + "fractional-part-digits"?: number + "decimal-separator"?: string + "rounding-mode"?: TRoundingMode + "angle-unit"?: TAngleUnit + options?: TSolverOptions +} + +type TUndoRedoMode = "stroke" | "session" + +type TMathUndoRedoConfiguration = { + mode: TUndoRedoMode +} + +type TMathConfiguration = { + mimeTypes: ("application/x-latex" | "application/mathml+xml" | "application/vnd.myscript.jiix")[] + solver?: TSolverConfiguration + margin: TMarginConfiguration + "undo-redo"?: TMathUndoRedoConfiguration + customGrammar?: string + customGrammarId?: string + customGrammarContent?: string + eraser?: TEraserConfiguration + "session-time"?: number + "recognition-timeout"?: number +} + +type TRawContentConfiguration = { + text?: TTextConfConfiguration + "session-time"?: number + recognition?: TRecognitionConfiguration + eraser?: TEraserConfiguration +} + +type TEventConfiguration = { + processDelay: number +} + +type TListenerConfiguration = { + capture: boolean + passive: boolean +} + +type TGrabberConfiguration = { + listenerOptions: TListenerConfiguration + xyFloatPrecision: number + timestampFloatPrecision: number +} + +type TDebugConfiguration = { + "draw-text-boxes": boolean + "draw-image-boxes": boolean +} + +type TRecognitionRendererConfiguration = { + debug: TDebugConfiguration +} + +type TRecognitionType = "TEXT" | "MATH" | "DIAGRAM" | "Raw Content" + +type TConverstionState = "DIGITAL_EDIT" | "HANDWRITING" + +type TRecognitionConfiguration$1 = { + convert?: TConvertConfiguration + type: TRecognitionType + alwaysConnected: boolean + lang: string + math: TMathConfiguration + text: TTextConfiguration + diagram: TDiagramConfiguration + renderer: TRecognitionRendererConfiguration + export: TExportConfiguration$1 + "raw-content": TRawContentConfiguration + gesture: { enable: boolean } +} + +type TRecognitionConfigurationClient = { + convert?: TConvertConfiguration + type?: TRecognitionType + alwaysConnected?: boolean + lang?: string + math?: TMathConfiguration + text?: TTextConfiguration + diagram?: TDiagramConfiguration + renderer?: TRecognitionRendererConfiguration + export?: TExportConfiguration$1 + "raw-content"?: TRawContentConfiguration + gesture?: { enable: boolean } +} + +type TGuidesConfiguration = { + enable: boolean + gap: numnber +} + +type TSmartGuidesConfiguration = { + enable: boolean + fadeOut: { + enable: boolean + duration: number + } +} + +type TRenderingConfiguration = { + minHeight: number + minWidth: number + smartGuide: TSmartGuidesConfiguration + guides: TGuidesConfiguration +} + +type TProtocol = "WEBSOCKET" | "REST" + +type TSchene = "https" | "http" + +type TServerConfiguration = { + protocol: TProtocol, + scheme: TSchene, + host: string + applicationKey: string + hmacKey: string + version: string + useWindowLocation?: boolean + websocket: { + pingEnabled: boolean + pingDelay: number + maxPingLostCount: number + autoReconnect: boolean + maxRetryCount: number + fileChunkSize: number + } +} + +type TServerConfigurationClient = { + protocol?: TProtocol, + scheme?: TSchene, + host?: string + applicationKey?: string + hmacKey?: string + version?: string + useWindowLocation?: boolean + websocket?: { + pingEnabled?: boolean + pingDelay?: number + maxPingLostCount?: number + autoReconnect?: boolean + maxRetryCount?: number + fileChunkSize?: number + } +} + +/** + * Configure when the action is triggered. + * POINTER_UP : Action is triggered on every PenUP. + * This is the recommended mode for CDK V3 WebSocket recognitions. + * QUIET_PERIOD : Action is triggered after a quiet period in milli-seconds on every pointer up. + * The value is set to 1000 for example recognition will be triggered when the user stops writing for 1 seconds. + * This is the recommended mode for all REST discoveries. + * DEMAND : Action is triggered on external demande + */ + type TTriggerConfiguration = { + exportContent: "QUIET_PERIOD" | "POINTER_UP" | "DEMAND" + exportContentDelay: number + resizeTriggerDelay: number +} + +type TUndoRedoConfiguration = { + maxStackSize: number +} + +type TConfiguration = { + server: TServerConfiguration + recognition: TRecognitionConfiguration$1 + grabber: TGrabberConfiguration + rendering: TRenderingConfiguration + triggers: TTriggerConfiguration + events: TEventConfiguration + "undo-redo": TUndoRedoConfiguration +} + +type TConfigurationClient = { + server?: TServerConfigurationClient + recognition?: TRecognitionConfigurationClient + grabber?: TGrabberConfiguration + rendering?: TRenderingConfiguration + triggers?: TTriggerConfiguration + events?: TEventConfiguration + "undo-redo"?: TUndoRedoConfiguration +} + +/** + * @group Logger + */ +declare const enum LoggerLevel { + DEBUG = "1", + INFO = "2", + WARN = "3", + ERROR = "4" +} +/** + * @group Logger + */ +declare const enum LoggerClass { + EDITOR = "EDITOR", + RECOGNIZER = "RECOGNIZER", + GRABBER = "GRABBER", + BEHAVIORS = "BEHAVIORS", + CONFIGURATION = "CONFIGURATION", + PUBLIC_EVENT = "PUBLIC_EVENT", + MODEL = "MODEL", + RENDERER = "RENDERER", + SMARTGUIDE = "SMARTGUIDE", + STYLEMANAGER = "STYLEMANAGER", + UNDOREDO_MANAGER = "UNDOREDO_MANAGER", + STROKE = "STROKE", + INTERNALEVENT = "INTERNALEVENT" +} +type TLoggerConfiguration = { + [key in keyof typeof LoggerClass]: LoggerLevel; +}; + +type TPoint = { + x: number; + y: number; +}; +type TPointer = TPoint & { + t: number; + p: number; +}; + +interface IGrabber { + attach(domElement?: HTMLElement): void + + detach(domElement?: HTMLElement): void + + onPointerDown(evt: PointerEvent, point: TPointer): void + + onPointerMove(evt: PointerEvent, point: TPointer): void + + onPointerUp(evt: PointerEvent, point: TPointer): void +} + +/** + * @typedef {Object} PenStyle + * @property {String} color=#000000 Color (supported formats rgb() rgba() hsl() hsla() #rgb #rgba #rrggbb #rrggbbaa) + * @property {String} -myscript-pen-width=1 Width of strokes and primitives in mm (no other unit is supported yet) + * @property {String} -myscript-pen-fill-style=none + * @property {String} -myscript-pen-fill-color=#FFFFFF00 Color filled inside the area delimited by strokes and primitives + */ +type TPenStyle = { + color?: string + width?: number + "-myscript-pen-width"?: number + "-myscript-pen-fill-style"?: string + "-myscript-pen-fill-color"?: string +} + +type TSymbol = { + elementType?: string + type: string + style: TPenStyle +} + +type TStrokeJSON = { + id: string + pointerType: string + x: number[] + y: number[] + t: number[] + p: number[] +} + +type TStroke = TSymbol & { + id: string + pointerId: number + pointerType: string + pointers: TPointer[] + length: number +} + +type TRecognitionPositions = { + lastSentPosition: number + lastReceivedPosition: number +} + +type TWordExport = { + id?: string + label: string, + candidates?: string[] +} + +type TJIIXExport = { + type: string, + id: string, + label: string, + version: string, + words: TWordExport[] +} + +/** + * List all supported MIME types for export. + * Attention, the MIME types supported depend on the {@link TRecognitionType | type of recognition} + */ +type TExport = { + /** @hidden */ + [key: string]: TJIIXExport | string | Blob + /** + * vnd.myscript.jiix is used for text and raw-content exports + */ + "application/vnd.myscript.jiix"?: TJIIXExport + /** + * text/plain is only use for text export + */ + "text/plain"? : string + /** + * x-latex is only use for math export + * @see {@link https://katex.org/docs/browser.html | katex} to render + */ + "application/x-latex"?: string + /** + * mathml+xml is only use for math export + * @see {@link https://www.w3.org/Math/whatIsMathML.html | Mathematical Markup Language} + */ + "application/mathml+xml"?: string + /** + * svg+xml is only use for diagram export + */ + "image/svg+xml"?: string + /** + * vnd.openxmlformats-officedocument.presentationml.presentation is only use for diagram export + * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Blob | Blob} + */ + "application/vnd.openxmlformats-officedocument.presentationml.presentation"?: Blob +} + +interface IModel +{ + readonly creationTime: number + modificationDate: number + currentStroke?: TStroke + positions: TRecognitionPositions + rawStrokes: TStroke[] + selectedStrokes: TStroke[] + converts?: TExport + exports?: TExport + width: number + height: number + idle: boolean + + mergeExport(exports: TExport) + mergeConvert(converts: TExport) + + addPoint(stroke: TStroke, point: TPointer): void + addStroke(stroke: TStroke): void + extractUnsentStrokes(): TStroke[] + + initCurrentStroke(point: TPointer, pointerId: number, pointerType: string, style: TPenStyle, dpi: number = 96): void + appendToCurrentStroke(point: TPointer): void + endCurrentStroke(point: TPointer): void + + resetSelectedStrokes(): void + appendSelectedStrokesFromPoint(point: TPoint): void + + removeStroke(id: string): void + updateStroke(updatedStroke: TStroke): void + removeStrokesFromPoint(point: TPoint): string[] + + updatePositionSent(position: number = this.model.rawStrokes.length - 1): void + updatePositionReceived(): void + + getClone(): IModel + + clear(): void +} + +type TMathTheme = { + "font-family": string +} + +type TMathSolvedTheme = { + "font-family": string + color: string +} + +type TTextTheme = { + "font-family": string, + "font-size": number +} + +type TTheme = { + ink: TPenStyle + ".math": TMathTheme + ".math-solved": TMathSolvedTheme + ".text": TTextTheme + [key: string]: unknown +} + +interface IRecognizer { + export(model: IModel, mimeTypes?: string[]): Promise + resize(model: IModel): Promise + import?(model: IModel, data: Blob, mimeType?: string): Promise +} + +type TUndoRedoContext = { + canUndo: boolean + canRedo: boolean + empty: boolean + stackIndex: number + possibleUndoCount: number + stack: IModel[] +} + +declare class StyleManager { + #private; + constructor(penStyle?: TPenStyle, theme?: TTheme); + get currentPenStyle(): TPenStyle; + get penStyle(): TPenStyle; + setPenStyle(style?: TPenStyle): void; + get theme(): TTheme; + setTheme(theme?: TTheme): void; + get penStyleClasses(): string; + setPenStyleClasses(penStyleClass?: string): void; +} + +type TBehaviorOptions = { + configuration: TConfiguration + behaviors?: { + grabber?: IGrabber + recognizer?: IRecognizer + } + penStyle?: TPenStyle + theme?: TTheme + logger?: TLoggerConfiguration +} + +interface IBehaviors +{ + name: string + grabber: IGrabber + recognizer: IRecognizer + context: TUndoRedoContext + options: TBehaviorOptions + styleManager: StyleManager + intention: Intention + #configuration: TConfiguration + + get currentPenStyle(): TPenStyle + + get model(): IModel + + get penStyle(): TPenStyle + setPenStyle(penStyle?: TPenStyle) + + get penStyleClasses(): string + setPenStyleClasses(penStyleClasses?: string) + + get theme(): TTheme + setTheme(theme?: TTheme) + + get configuration(): TConfiguration + set configuration(conf: TConfiguration) + + async init: (element: HTMLElement) => Promise + async export(mimeTypes?: string[]): Promise + async convert(conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise + async resize(height: number, width: number): Promise + async undo(): Promise + async redo(): Promise + + async waitForIdle?(): Promise + async importPointEvents?(strokes: TStroke[]): Promise + async import?(data: Blob, mimeType?: string): Promise + + async clear(): Promise + + async destroy(): Promise +} + +/** + * @group Error + * @remarks List all errors generated by the backend with their descriptions + */ +declare const Error$1: { + readonly NO_ACTIVITY: "Session closed due to no activity."; + readonly WRONG_CREDENTIALS: "Application credentials are invalid. Please check or regenerate your application key and hmackey."; + readonly TOO_OLD: "Session is too old. Max Session Duration Reached."; + readonly UNKNOW: "An unknown error has occurred."; + readonly ABNORMAL_CLOSURE: "MyScript recognition server is not reachable."; + readonly CANT_ESTABLISH: "Unable to establish a connection to MyScript recognition server. Check the host and your connectivity."; + readonly GOING_AWAY: "MyScript recognition server is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection."; + readonly PROTOCOL_ERROR: "MyScript recognition server terminated the connection due to a protocol error."; + readonly UNSUPPORTED_DATA: "MyScript recognition server terminated the connection because the endpoint received data of a type it cannot accept. (For example, a text-only endpoint received binary data.)"; + readonly INVALID_FRAME_PAULOAD: "MyScript recognition server terminated the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message)."; + readonly POLICY_VIOLATION: "MyScript recognition server terminated the connection because it received a message that violates its policy."; + readonly MESSAGE_TOO_BIG: "MyScript recognition server terminated the connection because a data frame was received that is too large."; + readonly INTERNAL_ERROR: "MyScript recognition server terminated the connection because it encountered an unexpected condition that prevented it from fulfilling the request."; + readonly SERVICE_RESTART: "MyScript recognition server terminated the connection because it is restarting."; + readonly TRY_AGAIN: "MyScript recognition server terminated the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients."; + readonly BAD_GATEWAY: "MyScript recognition server was acting as a gateway or proxy and received an invalid response from the upstream server."; + readonly TLS_HANDSHAKE: "MyScript recognition server connection was closed due to a failure to perform a TLS handshake"; +}; +/** + * @event + * @remarks Lists all events that can be listened to on the editor or DOM element + */ +declare const EventType: { + /** + * @event + * event emitted when history has changed i.e. the context of undo-redo + */ + readonly CHANGED: "changed"; + /** + * @event + * event emitted when clearing is complete + */ + readonly CLEARED: "cleared"; + /** + * @event + * event emitted after the conversion is complete + */ + readonly CONVERTED: "converted"; + /** + * @event + * event emitted when the editor encounters an error + */ + readonly ERROR: "error"; + /** + * @event + * event emitted on click on pointer events + */ + readonly POINTEREVENTS: "pointer_events"; + /** + * @event + * event emitted after the end of the export + */ + readonly EXPORTED: "exported"; + /** + * @event + * event emitted after the end of the import + */ + readonly IMPORTED: "imported"; + /** + * @event + * event emitted when the server is idle after a job + */ + readonly IDLE: "idle"; + /** + * @event + * event emitted after full editor initialization + */ + readonly LOADED: "loaded"; +}; +/** + * @event + * @internal + * @remarks Lists all internal library events + */ +declare const InternalEventType: { + readonly SVG_PATCH: "internal_svg_patch"; + readonly EXPORTED: "internal_exported"; + readonly CLEAR_MESSAGE: "internal_clear_message"; + readonly ERROR: "internal_error"; + readonly NOTIF: "internal_notif"; + readonly IMPORT_JIIX: "internal_import_jiix"; + readonly CONVERT: "internal_convert"; + readonly CLEAR: "internal_clear"; + readonly CONTEXT_CHANGE: "internal_context_change"; + readonly IDLE: "internal_idle"; + readonly WS_CLOSED: "internal_websocket_closed"; +}; +/** + * @group Export + * @remarks List all supported MIME types for export. Attention, the MIME types supported depend on the {@link TRecognitionType | type of recognition} + */ +declare const enum ExportType { + JIIX = "application/vnd.myscript.jiix", + TEXT = "text/plain", + LATEX = "application/x-latex", + MATHML = "application/mathml+xml", + SVG = "image/svg+xml", + OFFICE_DOCUMENT = "application/vnd.openxmlformats-officedocument.presentationml.presentation" +} +/** + * @group Editor + * @remarks List the possibilities of interactions + */ +declare const enum Intention$1 { + Write = "write", + Erase = "erase" +} + +declare const Constants_EventType: typeof EventType; +declare const Constants_InternalEventType: typeof InternalEventType; +type Constants_ExportType = ExportType; +declare const Constants_ExportType: typeof ExportType; +type Constants_LoggerClass = LoggerClass; +declare const Constants_LoggerClass: typeof LoggerClass; +type Constants_LoggerLevel = LoggerLevel; +declare const Constants_LoggerLevel: typeof LoggerLevel; +declare namespace Constants { + export { + Error$1 as Error, + Constants_EventType as EventType, + Constants_InternalEventType as InternalEventType, + Constants_ExportType as ExportType, + Intention$1 as Intention, + Constants_LoggerClass as LoggerClass, + Constants_LoggerLevel as LoggerLevel, + }; +} + +declare class PublicEvent extends EventTarget { + #private; + private constructor(); + static getInstance(): PublicEvent; + setElement(el: HTMLElement): void; + emitLoaded(): void; + emitExported(exports: TExport): void; + emitChanged(undoRedoContext: TUndoRedoContext): void; + emitIdle(idle: boolean): void; + emitCleared(model?: IModel): void; + emitConverted(exports: TExport): void; + emitImported(exports: TExport): void; +} + +type TRestPostConfiguration = { + lang: string, + diagram?: TDiagramConfiguration, + math?: TMathConfiguration, + "raw-content"?: TRawContentConfiguration, + text?: TTextConfiguration, + export: TExportConfiguration +} + +type TWebSocketEvent = { + type: string + [key: string]: unknown +} + +type TUpdatePatchType = "REPLACE_ALL" | "REMOVE_ELEMENT" | "REPLACE_ELEMENT" | "REMOVE_CHILD" | "APPEND_CHILD" | "INSERT_BEFORE" | "REMOVE_ATTRIBUTE" | "SET_ATTRIBUTE" + +type TUpdatePatch = { + type: TUpdatePatchType +} + +type TWebSocketSVGPatchEvent = TWebSocketEvent & { + updates: TUpdatePatch[] + layer: ("MODEL" | "CAPTURE") +} + +declare class Logger { + instanceName: LoggerClass; + level: LoggerLevel; + constructor(instanceName: LoggerClass, level: LoggerLevel); + debug(...data: any): void; + info(...data: any): void; + warn(...data: any): void; + error(...error: any): void; +} + +declare class LoggerManager { + #private; + static getLogger(name: LoggerClass): Logger; + static setLoggerLevel(config: TLoggerConfiguration): void; +} + +type index$a_LoggerManager = LoggerManager; +declare const index$a_LoggerManager: typeof LoggerManager; +type index$a_Logger = Logger; +declare const index$a_Logger: typeof Logger; +declare namespace index$a { + export { + index$a_LoggerManager as LoggerManager, + index$a_Logger as Logger, + }; +} + +type HTMLEditorElement = HTMLElement & { + editor: Editor; +}; +declare class Editor { + #private; + wrapperHTML: HTMLEditorElement; + logger: Logger; + showStrokesPan: boolean; + constructor(wrapperHTML: HTMLElement, options: TBehaviorOptions, globalClassCss?: string); + get loggerConfiguration(): TLoggerConfiguration; + set loggerConfiguration(loggerConfig: TLoggerConfiguration); + get initializationPromise(): Promise; + get model(): IModel; + get behaviors(): IBehaviors; + get configuration(): TConfiguration; + set configuration(configuration: TConfiguration); + get intention(): Intention$1; + set intention(m: Intention$1); + get events(): PublicEvent; + get context(): TUndoRedoContext; + get grabber(): IGrabber; + get currentPenStyle(): TPenStyle; + get penStyle(): TPenStyle; + set penStyle(ps: TPenStyle); + get theme(): TTheme; + set theme(t: TTheme); + get penStyleClasses(): string; + set penStyleClasses(psc: string); + initialize(): Promise; + waitForIdle(): Promise; + undo(): Promise; + redo(): Promise; + clear(): Promise; + resize(): Promise; + export(mimeTypes?: string[]): Promise; + convert(params?: { + conversionState?: TConverstionState; + mimeTypes?: string[]; + }): Promise; + import(data: Blob | string | TJIIXExport, mimeType?: string): Promise; + importPointEvents(strokes: TStroke[]): Promise; +} + +declare class DeferredPromise { + promise: Promise; + resolve: (value: T) => void; + reject: (value: Error) => void; + isFullFilled: boolean; + isPending: boolean; + constructor(); +} + +declare function computeDistance(p1: TPoint, p2: TPoint): number; + +declare const geometric_computeDistance: typeof computeDistance; +declare namespace geometric { + export { + geometric_computeDistance as computeDistance, + }; +} + +declare const isVersionSuperiorOrEqual: (source: string, target: string) => boolean; + +declare const version_isVersionSuperiorOrEqual: typeof isVersionSuperiorOrEqual; +declare namespace version { + export { + version_isVersionSuperiorOrEqual as isVersionSuperiorOrEqual, + }; +} + +declare function computeHmac(message: string, applicationKey: string, hmacKey: string): string; + +declare const CryptoHelper_computeHmac: typeof computeHmac; +declare namespace CryptoHelper { + export { + CryptoHelper_computeHmac as computeHmac, + }; +} + +declare function getAvailableFontList(configuration: TConfigurationClient): Promise>; + +declare function getAvailableLanguageList(configuration: TConfigurationClient): Promise>>; + +type index$9_DeferredPromise = DeferredPromise; +declare const index$9_DeferredPromise: typeof DeferredPromise; +declare const index$9_geometric: typeof geometric; +declare const index$9_version: typeof version; +declare const index$9_getAvailableFontList: typeof getAvailableFontList; +declare const index$9_getAvailableLanguageList: typeof getAvailableLanguageList; +declare namespace index$9 { + export { + index$9_DeferredPromise as DeferredPromise, + index$9_geometric as geometric, + index$9_version as version, + CryptoHelper as crypto, + index$9_getAvailableFontList as getAvailableFontList, + index$9_getAvailableLanguageList as getAvailableLanguageList, + }; +} + +declare class Configuration implements TConfiguration { + #private; + events: TEventConfiguration; + grabber: TGrabberConfiguration; + recognition: TRecognitionConfiguration$1; + rendering: TRenderingConfiguration; + server: TServerConfiguration; + triggers: TTriggerConfiguration; + "undo-redo": TUndoRedoConfiguration; + constructor(configuration?: TConfigurationClient); + overrideDefaultConfiguration(configuration?: TConfigurationClient): void; +} + +declare const DefaultServerConfiguration: TServerConfiguration; +declare const DefaultRecognitionConfiguration: TRecognitionConfiguration$1; +declare const DefaultGrabberConfiguration: TGrabberConfiguration; +declare const DefaultRenderingConfiguration: TRenderingConfiguration; +declare const DefaultTriggerConfiguration: TTriggerConfiguration; +declare const DefaultEventsConfiguration: TEventConfiguration; +declare const DefaultUndoRedoConfiguration: TUndoRedoConfiguration; +declare const DefaultConfiguration: TConfiguration; +declare const DefaultLoggerConfiguration: TLoggerConfiguration; + +type index$8_Configuration = Configuration; +declare const index$8_Configuration: typeof Configuration; +declare const index$8_DefaultServerConfiguration: typeof DefaultServerConfiguration; +declare const index$8_DefaultRecognitionConfiguration: typeof DefaultRecognitionConfiguration; +declare const index$8_DefaultGrabberConfiguration: typeof DefaultGrabberConfiguration; +declare const index$8_DefaultRenderingConfiguration: typeof DefaultRenderingConfiguration; +declare const index$8_DefaultTriggerConfiguration: typeof DefaultTriggerConfiguration; +declare const index$8_DefaultEventsConfiguration: typeof DefaultEventsConfiguration; +declare const index$8_DefaultUndoRedoConfiguration: typeof DefaultUndoRedoConfiguration; +declare const index$8_DefaultConfiguration: typeof DefaultConfiguration; +declare const index$8_DefaultLoggerConfiguration: typeof DefaultLoggerConfiguration; +declare namespace index$8 { + export { + index$8_Configuration as Configuration, + index$8_DefaultServerConfiguration as DefaultServerConfiguration, + index$8_DefaultRecognitionConfiguration as DefaultRecognitionConfiguration, + index$8_DefaultGrabberConfiguration as DefaultGrabberConfiguration, + index$8_DefaultRenderingConfiguration as DefaultRenderingConfiguration, + index$8_DefaultTriggerConfiguration as DefaultTriggerConfiguration, + index$8_DefaultEventsConfiguration as DefaultEventsConfiguration, + index$8_DefaultUndoRedoConfiguration as DefaultUndoRedoConfiguration, + index$8_DefaultConfiguration as DefaultConfiguration, + index$8_DefaultLoggerConfiguration as DefaultLoggerConfiguration, + }; +} + +declare class PointerEventGrabber implements IGrabber { + #private; + private configuration; + private domElement; + private activePointerId?; + private prevent; + onPointerDown: (evt: PointerEvent, point: TPointer) => void; + onPointerMove: (evt: PointerEvent, point: TPointer) => void; + onPointerUp: (evt: PointerEvent, point: TPointer) => void; + constructor(configuration: TGrabberConfiguration); + private roundFloat; + private extractPoint; + private pointerDownHandler; + private pointerMoveHandler; + private pointerUpHandler; + attach(domElement: HTMLElement): void; + detach(): void; +} + +declare class CanvasStroker { + private renderArc; + private renderLine; + private renderFinal; + private renderQuadratic; + drawStroke(context2d: CanvasRenderingContext2D, stroke: TStroke): void; +} + +declare class CanvasRenderer { + #private; + config: TRenderingConfiguration; + stroker: CanvasStroker; + context: { + parent: HTMLElement; + renderingCanvas: HTMLCanvasElement; + renderingCanvasContext: CanvasRenderingContext2D; + capturingCanvas: HTMLCanvasElement; + capturingCanvasContext: CanvasRenderingContext2D; + }; + constructor(config: TRenderingConfiguration); + private createCanvas; + private resizeContent; + private drawSymbol; + init(element: HTMLElement): void; + drawModel(model: IModel): void; + drawPendingStroke(stroke: TStroke | undefined): void; + resize(model: IModel): void; + destroy(): void; +} + +declare class RestRecognizer implements IRecognizer { + #private; + protected serverConfiguration: TServerConfiguration; + protected recognitionConfiguration: TRecognitionConfiguration$1; + constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration$1); + get url(): string; + get postConfig(): TRestPostConfiguration; + private buildData; + private post; + private tryFetch; + private getMimeTypes; + convert(model: IModel, conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise; + export(model: IModel, requestedMimeTypes?: string[]): Promise; + resize(model: IModel): Promise; +} + +declare class InternalEvent extends EventTarget { + #private; + private constructor(); + static getInstance(): InternalEvent; + removeAllListeners(): void; + emitSVGPatch(patchChange: TWebSocketSVGPatchEvent): void; + addSVGPatchListener(callback: (contentChange: TWebSocketSVGPatchEvent) => void): void; + emitExported(exports: TExport): void; + addExportedListener(callback: (exports: TExport) => void): void; + emitClearMessage(): void; + addClearMessageListener(callback: () => void): void; + emitError(err: Error): void; + addErrorListener(callback: (err: Error) => void): void; + emitWSClosed(): void; + addWSClosedListener(callback: () => void): void; + emitNotif(notif: { + message: string; + timeout?: number; + }): void; + addNotifListener(callback: (notif: { + message: string; + timeout?: number; + }) => void): void; + emitImportJIIX(jiix: TJIIXExport): void; + addImportJIIXListener(callback: (jiix: TJIIXExport) => void): void; + emitConvert(conversionState?: TConverstionState): void; + addConvertListener(callback: (params?: { + conversionState?: TConverstionState; + mimeTypes?: string[]; + }) => void): void; + emitClear(): void; + addClearListener(callback: () => void): void; + emitContextChange(context: TUndoRedoContext): void; + addContextChangeListener(callback: (context: TUndoRedoContext) => void): void; + emitIdle(idle: boolean): void; + addIdleListener(callback: (idle: boolean) => void): void; +} + +declare class UndoRedoContext implements TUndoRedoContext { + canUndo: boolean; + canRedo: boolean; + empty: boolean; + stackIndex: number; + possibleUndoCount: number; + stack: IModel[]; + constructor(model: IModel); +} + +declare class UndoRedoManager { + #private; + context: UndoRedoContext; + configuration: TUndoRedoConfiguration; + constructor(configuration: TUndoRedoConfiguration, model: IModel); + get internalEvent(): InternalEvent; + private updateCanUndoRedo; + addModelToStack(model: IModel): void; + removeLastModelInStack(): void; + updateModelInStack(model: IModel): void; + undo(): IModel; + redo(): IModel; + reset(model: IModel): void; +} + +declare class RestBehaviors implements IBehaviors { + #private; + name: string; + options: TBehaviorOptions; + grabber: PointerEventGrabber; + renderer: CanvasRenderer; + recognizer: RestRecognizer; + undoRedoManager: UndoRedoManager; + styleManager: StyleManager; + intention: Intention$1; + constructor(options: TBehaviorOptions); + get internalEvent(): InternalEvent; + get model(): IModel; + get context(): TUndoRedoContext; + get currentPenStyle(): TPenStyle; + get penStyle(): TPenStyle; + setPenStyle(style?: TPenStyle): void; + get penStyleClasses(): string; + setPenStyleClasses(penClass?: string): void; + get theme(): TTheme; + setTheme(theme?: TTheme): void; + get configuration(): TConfiguration; + init(domElement: HTMLElement): Promise; + private onPointerDown; + private onPointerMove; + private onPointerUp; + drawCurrentStroke(): void; + updateModelRendering(): Promise; + export(mimeTypes?: string[]): Promise; + convert(conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise; + resize(height: number, width: number): Promise; + undo(): Promise; + redo(): Promise; + clear(): Promise; + destroy(): Promise; +} + +/** + * A websocket dialog have this sequence : + * --------------------------- Client --------------------------------------------------- Server ---------------------------------- + * init: send newContentPackage or restoreIInkSession ==================> + * <================== hmacChallenge + * answer hmacChallenge: send the hmac ==================> + * <================== contentPackageDescription + * answer contentPackageDescription: + * send the configuration ==================> + * send newContentPart or openContentPart ==================> + * <================== partChanged + * <================== contentChanged + * <================== newPart + * <================== svgPatch + * + * setPenStyle (send the parameters) ==================> + * setTheme (send the parameters) ==================> + * setPenStyleClasses (send the parameters) ==================> + * <================== svgPatch + * addStrokes (send the strokes ) ============> + * <================== update + */ +declare class WSRecognizer implements IRecognizer { + #private; + protected serverConfiguration: TServerConfiguration; + protected recognitionConfiguration: TRecognitionConfiguration$1; + protected socket: WebSocket; + protected pingCount: number; + protected reconnectionCount: number; + protected viewSizeHeight: number; + protected viewSizeWidth: number; + protected sessionId?: string; + protected currentPartId?: string; + protected currentErrorCode?: string | number; + protected penStyle?: TPenStyle; + protected penStyleClasses?: string; + protected theme?: TTheme; + protected connected?: DeferredPromise; + protected initialized?: DeferredPromise; + protected addStrokeDeferred?: DeferredPromise; + protected exportDeferred?: DeferredPromise; + protected convertDeferred?: DeferredPromise; + protected importDeferred?: DeferredPromise; + protected resizeDeferred?: DeferredPromise; + protected undoDeferred?: DeferredPromise; + protected redoDeferred?: DeferredPromise; + protected clearDeferred?: DeferredPromise; + protected importPointEventsDeferred?: DeferredPromise; + protected waitForIdleDeferred?: DeferredPromise; + url: string; + constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration$1); + get mimeTypes(): string[]; + get internalEvent(): InternalEvent; + protected infinitePing(): void; + protected openCallback(): void; + protected rejectDeferredPending(error: Error): void; + protected closeCallback(evt: CloseEvent): void; + protected manageHMACChallengeMessage(websocketMessage: TWebSocketEvent): void; + protected manageContentPackageDescriptionMessage(): void; + protected managePartChangeMessage(websocketMessage: TWebSocketEvent): void; + protected manageExportMessage(websocketMessage: TWebSocketEvent): void; + protected manageWaitForIdle(): Promise; + protected manageErrorMessage(websocketMessage: TWebSocketEvent): void; + protected manageContentChangeMessage(websocketMessage: TWebSocketEvent): void; + protected manageSVGPatchMessage(websocketMessage: TWebSocketEvent): void; + protected messageCallback(message: MessageEvent): void; + init(height: number, width: number): Promise; + send(message: TWebSocketEvent): Promise; + addStrokes(strokes: TStroke[]): Promise; + setPenStyle(penStyle: TPenStyle): Promise; + setPenStyleClasses(penStyleClasses: string): Promise; + setTheme(theme: TTheme): Promise; + export(model: IModel, requestedMimeTypes?: string[]): Promise; + import(model: IModel, data: Blob, mimeType?: string): Promise; + resize(model: IModel): Promise; + importPointEvents(strokes: TStroke[]): Promise; + convert(model: IModel, conversionState?: TConverstionState): Promise; + waitForIdle(): Promise; + undo(model: IModel): Promise; + redo(model: IModel): Promise; + clear(model: IModel): Promise; + close(code: number, reason: string): void; + destroy(): void; +} + +declare class SVGStroker { + private getArcPath; + private getLinePath; + private getFinalPath; + private getQuadraticPath; + private buildSVGPath; + drawStroke(svgElement: SVGElement, stroke: TStroke, attrs?: { + name: string; + value: string; + }[]): void; +} + +declare class WSSVGRenderer { + #private; + config: TRenderingConfiguration; + stroker: SVGStroker; + context: { + parent: HTMLElement; + }; + constructor(config: TRenderingConfiguration); + init(element: HTMLElement): void; + updateLayer(layerName: string, update: TUpdatePatch): void; + updatesLayer(layerName: string, updates: TUpdatePatch[]): void; + clearPendingStroke(): void; + drawPendingStroke(stroke: TStroke): void; + clearErasingStrokes(): void; + resize(model: IModel): void; + destroy(): void; +} + +type index$7_UndoRedoContext = UndoRedoContext; +declare const index$7_UndoRedoContext: typeof UndoRedoContext; +type index$7_UndoRedoManager = UndoRedoManager; +declare const index$7_UndoRedoManager: typeof UndoRedoManager; +declare namespace index$7 { + export { + index$7_UndoRedoContext as UndoRedoContext, + index$7_UndoRedoManager as UndoRedoManager, + }; +} + +declare class WSBehaviors implements IBehaviors { + #private; + name: string; + options: TBehaviorOptions; + grabber: PointerEventGrabber; + renderer: WSSVGRenderer; + recognizer: WSRecognizer; + undoRedoManager: UndoRedoManager; + styleManager: StyleManager; + intention: Intention$1; + constructor(options: TBehaviorOptions); + get internalEvent(): InternalEvent; + get model(): IModel; + get context(): TUndoRedoContext; + get configuration(): TConfiguration; + get currentPenStyle(): TPenStyle; + get penStyle(): TPenStyle; + setPenStyle(penStyle?: TPenStyle): Promise; + get penStyleClasses(): string; + setPenStyleClasses(penClass?: string): Promise; + get theme(): TTheme; + setTheme(theme: TTheme): Promise; + init(domElement: HTMLElement): Promise; + private onPointerDown; + private onPointerMove; + private onPointerUp; + private onSVGPatch; + drawCurrentStroke(): void; + updateModelRendering(): Promise; + waitForIdle(): Promise; + importPointEvents(strokes: TStroke[]): Promise; + export(mimeTypes?: string[]): Promise; + convert(conversionState?: TConverstionState): Promise; + import(data: Blob, mimeType?: string): Promise; + resize(height: number, width: number): Promise; + undo(): Promise; + redo(): Promise; + clear(): Promise; + destroy(): Promise; +} + +type index$6_RestBehaviors = RestBehaviors; +declare const index$6_RestBehaviors: typeof RestBehaviors; +type index$6_WSBehaviors = WSBehaviors; +declare const index$6_WSBehaviors: typeof WSBehaviors; +declare namespace index$6 { + export { + index$6_RestBehaviors as RestBehaviors, + index$6_WSBehaviors as WSBehaviors, + }; +} + +type index$5_RestRecognizer = RestRecognizer; +declare const index$5_RestRecognizer: typeof RestRecognizer; +type index$5_WSRecognizer = WSRecognizer; +declare const index$5_WSRecognizer: typeof WSRecognizer; +declare namespace index$5 { + export { + index$5_RestRecognizer as RestRecognizer, + index$5_WSRecognizer as WSRecognizer, + }; +} + +declare const ShapeSymbols: { + table: string; + shape: string; + recognizedShape: string; + ellipse: string; + line: string; +}; +/** + * Draw a line + * @param {Object} context2D Current rendering context2D + * @param {{x: Number, y: Number}} p1 Origin point + * @param {{x: Number, y: Number}} p2 Destination point + */ +declare function drawLine(context2D: CanvasRenderingContext2D, p1: TPoint, p2: TPoint): void; +/** + * Draw a shape symbol + * @param {Object} context2D Current rendering context2D + * @param {Object} symbol Symbol to draw + */ +declare function drawShapeSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol): void; + +declare const CanvasRendererShapeSymbol_ShapeSymbols: typeof ShapeSymbols; +declare const CanvasRendererShapeSymbol_drawLine: typeof drawLine; +declare const CanvasRendererShapeSymbol_drawShapeSymbol: typeof drawShapeSymbol; +declare namespace CanvasRendererShapeSymbol { + export { + CanvasRendererShapeSymbol_ShapeSymbols as ShapeSymbols, + CanvasRendererShapeSymbol_drawLine as drawLine, + CanvasRendererShapeSymbol_drawShapeSymbol as drawShapeSymbol, + }; +} + +declare function drawStroke(context2D: CanvasRenderingContext2D, stroke: TStroke, stroker: CanvasStroker): void; + +declare const CanvasRendererStrokeSymbol_drawStroke: typeof drawStroke; +declare namespace CanvasRendererStrokeSymbol { + export { + CanvasRendererStrokeSymbol_drawStroke as drawStroke, + }; +} + +declare const TextSymbols: { + inputCharacter: string; + char: string; + string: string; + textLine: string; +}; +/** + * Draw a text symbol + * @param {Object} context Current rendering context + * @param {Object} symbol Symbol to draw + */ +declare function drawTextSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol): void; + +declare const CanvasRendererTextSymbol_TextSymbols: typeof TextSymbols; +declare const CanvasRendererTextSymbol_drawTextSymbol: typeof drawTextSymbol; +declare namespace CanvasRendererTextSymbol { + export { + CanvasRendererTextSymbol_TextSymbols as TextSymbols, + CanvasRendererTextSymbol_drawTextSymbol as drawTextSymbol, + }; +} + +declare function computeLinksPoints(point: TPointer, angle: number, width: number): TPoint[]; +declare function computeMiddlePoint(point1: TPointer, point2: TPointer): TPointer; +declare function computeAxeAngle(begin: TPointer, end: TPointer): number; + +declare const QuadraticUtils_computeLinksPoints: typeof computeLinksPoints; +declare const QuadraticUtils_computeMiddlePoint: typeof computeMiddlePoint; +declare const QuadraticUtils_computeAxeAngle: typeof computeAxeAngle; +declare namespace QuadraticUtils { + export { + QuadraticUtils_computeLinksPoints as computeLinksPoints, + QuadraticUtils_computeMiddlePoint as computeMiddlePoint, + QuadraticUtils_computeAxeAngle as computeAxeAngle, + }; +} + +type index$4_CanvasRenderer = CanvasRenderer; +declare const index$4_CanvasRenderer: typeof CanvasRenderer; +type index$4_CanvasStroker = CanvasStroker; +declare const index$4_CanvasStroker: typeof CanvasStroker; +type index$4_SVGStroker = SVGStroker; +declare const index$4_SVGStroker: typeof SVGStroker; +type index$4_WSSVGRenderer = WSSVGRenderer; +declare const index$4_WSSVGRenderer: typeof WSSVGRenderer; +declare namespace index$4 { + export { + QuadraticUtils as quadradicsUtils, + index$4_CanvasRenderer as CanvasRenderer, + CanvasRendererShapeSymbol as canvasRendererShape, + CanvasRendererStrokeSymbol as canvasRendererStroke, + CanvasRendererTextSymbol as canvasRendererText, + index$4_CanvasStroker as CanvasStroker, + index$4_SVGStroker as SVGStroker, + index$4_WSSVGRenderer as WSSVGRenderer, + }; +} + +type index$3_PointerEventGrabber = PointerEventGrabber; +declare const index$3_PointerEventGrabber: typeof PointerEventGrabber; +declare namespace index$3 { + export { + index$3_PointerEventGrabber as PointerEventGrabber, + }; +} + +declare const DefaultPenStyle: TPenStyle; + +declare const DefaultTheme: TTheme; + +declare const StyleHelper: { + themeToCSS(json: TTheme): string; + themeToJSON(style: string): TTheme; + penStyleToCSS(penStyle: TPenStyle): string; + penStyleToJSON(penStyleString: string): TPenStyle; + stringToJSON(style: string): { + [key: string]: string; + }; + JSONToString(style: { + [key: string]: string; + }): string; +}; + +declare const index$2_DefaultPenStyle: typeof DefaultPenStyle; +declare const index$2_DefaultTheme: typeof DefaultTheme; +declare const index$2_StyleHelper: typeof StyleHelper; +type index$2_StyleManager = StyleManager; +declare const index$2_StyleManager: typeof StyleManager; +declare namespace index$2 { + export { + index$2_DefaultPenStyle as DefaultPenStyle, + index$2_DefaultTheme as DefaultTheme, + index$2_StyleHelper as StyleHelper, + index$2_StyleManager as StyleManager, + }; +} + +declare class Model implements IModel { + #private; + readonly creationTime: number; + modificationDate: number; + currentStroke?: TStroke; + positions: TRecognitionPositions; + rawStrokes: TStroke[]; + selectedStrokes: TStroke[]; + exports?: TExport; + converts?: TExport; + width: number; + height: number; + idle: boolean; + constructor(width?: number, height?: number, creationDate?: number); + mergeExport(exports: TExport): void; + mergeConvert(converts: TExport): void; + private computePressure; + private filterPointByAcquisitionDelta; + addPoint(stroke: TStroke, pointer: TPointer): void; + addStroke(stroke: TStroke): void; + extractUnsentStrokes(): TStroke[]; + initCurrentStroke(point: TPointer, pointerId: number, pointerType: string, style: TPenStyle, dpi?: number): void; + appendToCurrentStroke(point: TPointer): void; + endCurrentStroke(point: TPointer): void; + resetSelectedStrokes(): void; + appendSelectedStrokesFromPoint(point: TPoint): void; + updateStroke(updatedStroke: TStroke): void; + removeStroke(id: string): void; + removeStrokesFromPoint(point: TPoint): string[]; + updatePositionSent(position?: number): void; + updatePositionReceived(): void; + getClone(): IModel; + clear(): void; +} + +declare class Stroke implements TStroke { + #private; + id: string; + type: string; + pointerId: number; + pointerType: string; + elementType?: string; + pointers: TPointer[]; + length: number; + style: TPenStyle; + constructor(style: TPenStyle, pointerId: number, pointerType?: string); +} +declare function convertStrokeToJSON(stroke: TStroke): TStrokeJSON; + +type index$1_Model = Model; +declare const index$1_Model: typeof Model; +type index$1_Stroke = Stroke; +declare const index$1_Stroke: typeof Stroke; +declare const index$1_convertStrokeToJSON: typeof convertStrokeToJSON; +declare namespace index$1 { + export { + index$1_Model as Model, + index$1_Stroke as Stroke, + index$1_convertStrokeToJSON as convertStrokeToJSON, + }; +} + +type index_InternalEvent = InternalEvent; +declare const index_InternalEvent: typeof InternalEvent; +type index_PublicEvent = PublicEvent; +declare const index_PublicEvent: typeof PublicEvent; +declare namespace index { + export { + index_InternalEvent as InternalEvent, + index_PublicEvent as PublicEvent, + }; +} + +declare class SmartGuide { + #private; + uuid: string; + margin: TMarginConfiguration; + renderingConfiguration: TRenderingConfiguration; + jiix?: TJIIXExport; + lastWord?: TWordExport; + wordToChange?: TWordExport; + constructor(); + get internalEvent(): InternalEvent; + init(domElement: HTMLElement, margin: TMarginConfiguration, renderingConfiguration: TRenderingConfiguration): void; + resize(): void; + update(exports: TJIIXExport): void; + clear(): void; + destroy(): void; +} + +type SmartGuide$1_SmartGuide = SmartGuide; +declare const SmartGuide$1_SmartGuide: typeof SmartGuide; +declare namespace SmartGuide$1 { + export { + SmartGuide$1_SmartGuide as SmartGuide, + }; +} + +export { Editor, index$6 as behaviors, index$8 as configuration, Constants as constants, index as event, index$3 as grabber, index$a as logger, index$1 as model, index$5 as recognizer, index$4 as renderer, SmartGuide$1 as smartguide, index$2 as style, index$7 as undoredo, index$9 as utils }; +//# sourceMappingURL=iink.d.ts.map diff --git a/dist/iink.d.ts.map b/dist/iink.d.ts.map new file mode 100644 index 000000000..b80bbe589 --- /dev/null +++ b/dist/iink.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"iink.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/iink.esm.js b/dist/iink.esm.js new file mode 100644 index 000000000..9b763de20 --- /dev/null +++ b/dist/iink.esm.js @@ -0,0 +1,2 @@ +function __awaiter(i,s,n,a){return new(n||(n=Promise))((function(l,d){function fulfilled(i){try{step(a.next(i))}catch(i){d(i)}}function rejected(i){try{step(a.throw(i))}catch(i){d(i)}}function step(i){i.done?l(i.value):function adopt(i){return i instanceof n?i:new n((function(s){s(i)}))}(i.value).then(fulfilled,rejected)}step((a=a.apply(i,s||[])).next())}))}function __classPrivateFieldGet(i,s,n,a){if("a"===n&&!a)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof s?i!==s||!a:!s.has(i))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?a:"a"===n?a.call(i):a?a.value:s.get(i)}function __classPrivateFieldSet(i,s,n,a,l){if("m"===a)throw new TypeError("Private method is not writable");if("a"===a&&!l)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof s?i!==s||!l:!s.has(i))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===a?l.call(i,n):l?l.value=n:s.set(i,n),n}const i={protocol:"WEBSOCKET",scheme:"https",host:"cloud.myscript.com",applicationKey:"",hmacKey:"",version:"2.1.0",useWindowLocation:!1,websocket:{pingEnabled:!0,pingDelay:3e4,maxPingLostCount:10,autoReconnect:!0,maxRetryCount:2,fileChunkSize:3e5}},s={type:"TEXT",alwaysConnected:!0,lang:"en_US",gesture:{enable:!0},export:{"image-resolution":300,jiix:{"bounding-box":!1,strokes:!1,text:{chars:!1,words:!0}}},renderer:{debug:{"draw-text-boxes":!1,"draw-image-boxes":!1}},math:{mimeTypes:["application/vnd.myscript.jiix"],solver:{enable:!0,"fractional-part-digits":3,"decimal-separator":".","rounding-mode":"half up","angle-unit":"deg"},margin:{bottom:10,left:15,right:15,top:10},eraser:{"erase-precisely":!1},"undo-redo":{mode:"stroke"}},text:{guides:{enable:!0},mimeTypes:["application/vnd.myscript.jiix"],margin:{top:20,left:10,right:10,bottom:10},eraser:{"erase-precisely":!1}},diagram:{mimeTypes:["application/vnd.myscript.jiix"],eraser:{"erase-precisely":!1},convert:{"match-text-size":!0}},"raw-content":{recognition:{text:!0,shape:!0},eraser:{"erase-precisely":!1}}},n={listenerOptions:{capture:!1,passive:!0},xyFloatPrecision:0,timestampFloatPrecision:0},a={minHeight:100,minWidth:100,smartGuide:{enable:!0,fadeOut:{enable:!1,duration:5e3}},guides:{enable:!0,gap:50}},l={exportContent:"POINTER_UP",exportContentDelay:1e3,resizeTriggerDelay:100},d={processDelay:10},c={maxStackSize:100},h={server:i,recognition:s,grabber:n,rendering:a,triggers:l,events:d,"undo-redo":c},v={EDITOR:"4",BEHAVIORS:"4",RECOGNIZER:"4",GRABBER:"4",RENDERER:"4",CONFIGURATION:"4",PUBLIC_EVENT:"4",INTERNALEVENT:"4",MODEL:"4",STROKE:"4",SMARTGUIDE:"4",STYLEMANAGER:"4",UNDOREDO_MANAGER:"4"},mergeDeep=(i,...s)=>{const isObject=i=>i&&"object"==typeof i&&!Array.isArray(i);if(!s.length)return i;const n=s.shift();if(isObject(i)&&isObject(n))for(const s in n)isObject(n[s])?(i[s]||Object.assign(i,{[s]:{}}),mergeDeep(i[s],n[s])):Object.assign(i,{[s]:n[s]});return mergeDeep(i,...s)};class Logger{constructor(i,s){this.instanceName=i,this.level=s}debug(...i){if("1">=this.level){const s={from:this.instanceName,message:i};console.debug(s)}}info(...i){if("2">=this.level){const s={from:this.instanceName,message:i};console.info(s)}}warn(...i){if("3">=this.level){const s={from:this.instanceName,message:i};console.warn(s)}}error(...i){const s={from:this.instanceName,error:i};console.error(s)}}var u,p;class LoggerManager{static getLogger(i){return __classPrivateFieldGet(this,u,"f",p).has(i)||__classPrivateFieldGet(this,u,"f",p).set(i,new Logger(i,"4")),__classPrivateFieldGet(this,u,"f",p).get(i)}static setLoggerLevel(i){Object.keys(i).forEach((s=>{LoggerManager.getLogger(s).level=i[s]}))}}u=LoggerManager,p={value:new Map};var _,g=Object.freeze({__proto__:null,LoggerManager:LoggerManager,Logger:Logger});class Configuration{constructor(i){_.set(this,LoggerManager.getLogger("CONFIGURATION")),__classPrivateFieldGet(this,_,"f").info("constructor",{configuration:i}),this.events=JSON.parse(JSON.stringify(h.events)),this.grabber=JSON.parse(JSON.stringify(h.grabber)),this.recognition=JSON.parse(JSON.stringify(h.recognition)),this.rendering=JSON.parse(JSON.stringify(h.rendering)),this.server=JSON.parse(JSON.stringify(h.server)),this.triggers=JSON.parse(JSON.stringify(h.triggers)),this.overrideDefaultConfiguration(i)}overrideDefaultConfiguration(i){var s,n,a,l,d,c,v;__classPrivateFieldGet(this,_,"f").info("overrideDefaultConfiguration",{configuration:i});const u=JSON.parse(JSON.stringify(h));this.events=mergeDeep({},u.events,null==i?void 0:i.events),this.grabber=mergeDeep({},u.grabber,null==i?void 0:i.grabber),this.recognition=mergeDeep({},u.recognition,null==i?void 0:i.recognition),this.rendering=mergeDeep({},u.rendering,null==i?void 0:i.rendering),this.server=mergeDeep({},u.server,null==i?void 0:i.server),this.triggers=mergeDeep({},u.triggers,null==i?void 0:i.triggers),this["undo-redo"]=mergeDeep({},u["undo-redo"],null==i?void 0:i["undo-redo"]),this.recognition.text.mimeTypes=(null===(n=null===(s=null==i?void 0:i.recognition)||void 0===s?void 0:s.text)||void 0===n?void 0:n.mimeTypes)||u.recognition.text.mimeTypes,this.recognition.math.mimeTypes=(null===(l=null===(a=null==i?void 0:i.recognition)||void 0===a?void 0:a.math)||void 0===l?void 0:l.mimeTypes)||u.recognition.math.mimeTypes,this.recognition.diagram.mimeTypes=(null===(c=null===(d=null==i?void 0:i.recognition)||void 0===d?void 0:d.diagram)||void 0===c?void 0:c.mimeTypes)||u.recognition.diagram.mimeTypes,(null===(v=this.server)||void 0===v?void 0:v.useWindowLocation)&&(this.server.scheme=window.location.protocol.indexOf("s")>-1?"https":"http",this.server.host=window.location.host),"REST"===this.server.protocol&&"POINTER_UP"===this.triggers.exportContent&&(this.triggers.exportContent="QUIET_PERIOD",this.triggers.exportContentDelay=Math.max(this.triggers.exportContentDelay,50)),"WEBSOCKET"===this.server.protocol&&"TEXT"===this.recognition.type?this.rendering.smartGuide.enable&&!this.recognition.text.mimeTypes.includes("application/vnd.myscript.jiix")&&this.recognition.text.mimeTypes.push("application/vnd.myscript.jiix"):this.rendering.smartGuide.enable=!1,__classPrivateFieldGet(this,_,"f").debug("overrideDefaultConfiguration",{configuration:this})}}_=new WeakMap;var f,m,P=Object.freeze({__proto__:null,Configuration:Configuration,DefaultServerConfiguration:i,DefaultRecognitionConfiguration:s,DefaultGrabberConfiguration:n,DefaultRenderingConfiguration:a,DefaultTriggerConfiguration:l,DefaultEventsConfiguration:d,DefaultUndoRedoConfiguration:c,DefaultConfiguration:h,DefaultLoggerConfiguration:v});!function(i){i.DEBUG="1",i.INFO="2",i.WARN="3",i.ERROR="4"}(f||(f={})),function(i){i.EDITOR="EDITOR",i.RECOGNIZER="RECOGNIZER",i.GRABBER="GRABBER",i.BEHAVIORS="BEHAVIORS",i.CONFIGURATION="CONFIGURATION",i.PUBLIC_EVENT="PUBLIC_EVENT",i.MODEL="MODEL",i.RENDERER="RENDERER",i.SMARTGUIDE="SMARTGUIDE",i.STYLEMANAGER="STYLEMANAGER",i.UNDOREDO_MANAGER="UNDOREDO_MANAGER",i.STROKE="STROKE",i.INTERNALEVENT="INTERNALEVENT"}(m||(m={}));const y={NO_ACTIVITY:"Session closed due to no activity.",WRONG_CREDENTIALS:"Application credentials are invalid. Please check or regenerate your application key and hmackey.",TOO_OLD:"Session is too old. Max Session Duration Reached.",UNKNOW:"An unknown error has occurred.",ABNORMAL_CLOSURE:"MyScript recognition server is not reachable.",CANT_ESTABLISH:"Unable to establish a connection to MyScript recognition server. Check the host and your connectivity.",GOING_AWAY:"MyScript recognition server is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection.",PROTOCOL_ERROR:"MyScript recognition server terminated the connection due to a protocol error.",UNSUPPORTED_DATA:"MyScript recognition server terminated the connection because the endpoint received data of a type it cannot accept. (For example, a text-only endpoint received binary data.)",INVALID_FRAME_PAULOAD:"MyScript recognition server terminated the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message).",POLICY_VIOLATION:"MyScript recognition server terminated the connection because it received a message that violates its policy.",MESSAGE_TOO_BIG:"MyScript recognition server terminated the connection because a data frame was received that is too large.",INTERNAL_ERROR:"MyScript recognition server terminated the connection because it encountered an unexpected condition that prevented it from fulfilling the request.",SERVICE_RESTART:"MyScript recognition server terminated the connection because it is restarting.",TRY_AGAIN:"MyScript recognition server terminated the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients.",BAD_GATEWAY:"MyScript recognition server was acting as a gateway or proxy and received an invalid response from the upstream server.",TLS_HANDSHAKE:"MyScript recognition server connection was closed due to a failure to perform a TLS handshake"},S={CHANGED:"changed",CLEARED:"cleared",CONVERTED:"converted",ERROR:"error",POINTEREVENTS:"pointer_events",EXPORTED:"exported",IMPORTED:"imported",IDLE:"idle",LOADED:"loaded"},w={SVG_PATCH:"internal_svg_patch",EXPORTED:"internal_exported",CLEAR_MESSAGE:"internal_clear_message",ERROR:"internal_error",NOTIF:"internal_notif",IMPORT_JIIX:"internal_import_jiix",CONVERT:"internal_convert",CLEAR:"internal_clear",CONTEXT_CHANGE:"internal_context_change",IDLE:"internal_idle",WS_CLOSED:"internal_websocket_closed"};var G,x;!function(i){i.JIIX="application/vnd.myscript.jiix",i.TEXT="text/plain",i.LATEX="application/x-latex",i.MATHML="application/mathml+xml",i.SVG="image/svg+xml",i.OFFICE_DOCUMENT="application/vnd.openxmlformats-officedocument.presentationml.presentation"}(G||(G={})),function(i){i.Write="write",i.Erase="erase"}(x||(x={}));var b,E,C,k,M,T,L,I,D,A,R,N,O,W,z,j,H,B,X,U,$,V,J,q,Y,Z,K,Q,ee,te,ie,se,ne,re,oe,ae,le,de,ce,he,ve,ue,pe,_e,ge,fe,me,Pe,ye,Se,we,Fe,Ge=Object.freeze({__proto__:null,Error:y,EventType:S,InternalEventType:w,get ExportType(){return G},get Intention(){return x},get LoggerClass(){return m},get LoggerLevel(){return f}});class PublicEvent extends EventTarget{constructor(){super(),b.add(this),k.set(this,void 0),M.set(this,LoggerManager.getLogger("PUBLIC_EVENT"))}static getInstance(){return __classPrivateFieldGet(PublicEvent,E,"f",C)||__classPrivateFieldSet(PublicEvent,E,new PublicEvent,"f",C),__classPrivateFieldGet(PublicEvent,E,"f",C)}setElement(i){__classPrivateFieldGet(this,M,"f").info("setElement",{el:i}),__classPrivateFieldSet(this,k,i,"f")}emitLoaded(){__classPrivateFieldGet(this,M,"f").info("emitLoaded"),__classPrivateFieldGet(this,b,"m",T).call(this,S.LOADED)}emitExported(i){__classPrivateFieldGet(this,M,"f").info("emitExported",{exports:i}),__classPrivateFieldGet(this,b,"m",T).call(this,S.EXPORTED,i)}emitChanged(i){__classPrivateFieldGet(this,M,"f").info("emitChanged",{undoRedoContext:i}),__classPrivateFieldGet(this,b,"m",T).call(this,S.CHANGED,Object.assign(Object.assign({},i),{canClear:!i.empty}))}emitIdle(i){__classPrivateFieldGet(this,M,"f").info("emitIdle",{idle:i}),__classPrivateFieldGet(this,b,"m",T).call(this,S.IDLE,i)}emitCleared(i){__classPrivateFieldGet(this,M,"f").info("emitCleared",{model:i}),__classPrivateFieldGet(this,b,"m",T).call(this,S.CLEARED,i)}emitConverted(i){__classPrivateFieldGet(this,M,"f").info("emitConverted",{exports:i}),__classPrivateFieldGet(this,b,"m",T).call(this,S.CONVERTED,i)}emitImported(i){__classPrivateFieldGet(this,M,"f").info("emitImported",{exports:i}),__classPrivateFieldGet(this,b,"m",T).call(this,S.IMPORTED,i)}}E=PublicEvent,k=new WeakMap,M=new WeakMap,b=new WeakSet,T=function _PublicEvent_emit(i,s){var n;const a=new CustomEvent(i,Object.assign({bubbles:!0,composed:!0},s?{detail:s}:void 0));this.dispatchEvent(a),null===(n=__classPrivateFieldGet(this,k,"f"))||void 0===n||n.dispatchEvent(a)},C={value:void 0};class InternalEvent extends EventTarget{constructor(){super(),L.add(this),A.set(this,void 0),R.set(this,LoggerManager.getLogger("INTERNALEVENT")),__classPrivateFieldGet(this,R,"f").info("constructor"),__classPrivateFieldSet(this,A,new AbortController,"f")}static getInstance(){return __classPrivateFieldGet(InternalEvent,I,"f",D)||__classPrivateFieldSet(InternalEvent,I,new InternalEvent,"f",D),__classPrivateFieldGet(InternalEvent,I,"f",D)}removeAllListeners(){__classPrivateFieldGet(this,R,"f").info("removeAllListeners"),__classPrivateFieldGet(this,A,"f").abort(),__classPrivateFieldSet(this,A,new AbortController,"f")}emitSVGPatch(i){__classPrivateFieldGet(this,R,"f").info("emitSVGPatch",{patchChange:i}),__classPrivateFieldGet(this,L,"m",N).call(this,w.SVG_PATCH,i)}addSVGPatchListener(i){__classPrivateFieldGet(this,R,"f").info("addSVGPatchListener",{callback:i}),this.addEventListener(w.SVG_PATCH,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,A,"f").signal})}emitExported(i){__classPrivateFieldGet(this,R,"f").info("emitExported",{exports:i}),__classPrivateFieldGet(this,L,"m",N).call(this,w.EXPORTED,i)}addExportedListener(i){__classPrivateFieldGet(this,R,"f").info("addExportedListener",{callback:i}),this.addEventListener(w.EXPORTED,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,A,"f").signal})}emitClearMessage(){__classPrivateFieldGet(this,R,"f").info("emitClearMessage",{}),__classPrivateFieldGet(this,L,"m",N).call(this,w.CLEAR_MESSAGE)}addClearMessageListener(i){__classPrivateFieldGet(this,R,"f").info("addClearMessageListener",{callback:i}),this.addEventListener(w.CLEAR_MESSAGE,(()=>i()),{signal:__classPrivateFieldGet(this,A,"f").signal})}emitError(i){__classPrivateFieldGet(this,R,"f").info("emitError",{err:i}),__classPrivateFieldGet(this,L,"m",N).call(this,w.ERROR,i)}addErrorListener(i){__classPrivateFieldGet(this,R,"f").info("addErrorListener",{callback:i}),this.addEventListener(w.ERROR,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,A,"f").signal})}emitWSClosed(){__classPrivateFieldGet(this,R,"f").info("emitWSClosed",{}),__classPrivateFieldGet(this,L,"m",N).call(this,w.WS_CLOSED)}addWSClosedListener(i){__classPrivateFieldGet(this,R,"f").info("addWSClosedListener",{callback:i}),this.addEventListener(w.WS_CLOSED,(()=>i()),{signal:__classPrivateFieldGet(this,A,"f").signal})}emitNotif(i){__classPrivateFieldGet(this,R,"f").info("emitWNotif",{notif:i}),__classPrivateFieldGet(this,L,"m",N).call(this,w.NOTIF,i)}addNotifListener(i){__classPrivateFieldGet(this,R,"f").info("addNotifListener",{callback:i}),this.addEventListener(w.NOTIF,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,A,"f").signal})}emitImportJIIX(i){__classPrivateFieldGet(this,R,"f").info("emitImportJIIX",{jiix:i}),__classPrivateFieldGet(this,L,"m",N).call(this,w.IMPORT_JIIX,i)}addImportJIIXListener(i){__classPrivateFieldGet(this,R,"f").info("addImportJIIXListener",{callback:i}),this.addEventListener(w.IMPORT_JIIX,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,A,"f").signal})}emitConvert(i="DIGITAL_EDIT"){__classPrivateFieldGet(this,R,"f").info("emitConvert",{conversionState:i}),__classPrivateFieldGet(this,L,"m",N).call(this,w.CONVERT,i)}addConvertListener(i){__classPrivateFieldGet(this,R,"f").info("addConvertListener",{callback:i}),this.addEventListener(w.CONVERT,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,A,"f").signal})}emitClear(){__classPrivateFieldGet(this,R,"f").info("emitClear"),__classPrivateFieldGet(this,L,"m",N).call(this,w.CLEAR)}addClearListener(i){__classPrivateFieldGet(this,R,"f").info("addClearListener",{callback:i}),this.addEventListener(w.CLEAR,(()=>i()),{signal:__classPrivateFieldGet(this,A,"f").signal})}emitContextChange(i){__classPrivateFieldGet(this,R,"f").info("emitContextChange",{context:i}),__classPrivateFieldGet(this,L,"m",N).call(this,w.CONTEXT_CHANGE,i)}addContextChangeListener(i){__classPrivateFieldGet(this,R,"f").info("addContextChangeListener",{callback:i}),this.addEventListener(w.CONTEXT_CHANGE,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,A,"f").signal})}emitIdle(i){__classPrivateFieldGet(this,R,"f").info("emitIdle",{idle:i}),__classPrivateFieldGet(this,L,"m",N).call(this,w.IDLE,i)}addIdleListener(i){__classPrivateFieldGet(this,R,"f").info("addIdleListener",{callback:i}),this.addEventListener(w.IDLE,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,A,"f").signal})}}I=InternalEvent,A=new WeakMap,R=new WeakMap,L=new WeakSet,N=function _InternalEvent_emit(i,s){this.dispatchEvent(new CustomEvent(i,Object.assign({bubbles:!0,composed:!0},s?{detail:s}:void 0)))},D={value:void 0};class SmartGuide{constructor(){O.add(this),W.set(this,void 0),z.set(this,void 0),j.set(this,void 0),H.set(this,void 0),B.set(this,void 0),X.set(this,void 0),U.set(this,void 0),$.set(this,void 0),V.set(this,void 0),J.set(this,void 0),q.set(this,void 0),Y.set(this,void 0),Z.set(this,LoggerManager.getLogger("SMARTGUIDE")),he.set(this,(i=>{var s,n,a,l,d;__classPrivateFieldGet(this,Z,"f").info("showCandidates",{target:i});const c=parseInt(i.id.replace("word-","").replace(this.uuid,"")),h=null===(s=this.jiix)||void 0===s?void 0:s.words;if(this.wordToChange=h[c],this.wordToChange&&(this.wordToChange.id=c.toString(),__classPrivateFieldGet(this,X,"f").innerHTML="",null===(n=this.wordToChange)||void 0===n?void 0:n.candidates)){__classPrivateFieldGet(this,X,"f").style.display="flex",this.wordToChange.candidates.forEach(((i,s)=>{var n;(null===(n=this.wordToChange)||void 0===n?void 0:n.label)===i?__classPrivateFieldGet(this,X,"f").innerHTML+=`${i}`:__classPrivateFieldGet(this,X,"f").innerHTML+=`${i}`}));const s=48,n=i.getBoundingClientRect().left-60;__classPrivateFieldGet(this,X,"f").style.top=`${s}px`,__classPrivateFieldGet(this,X,"f").style.left=`${n}px`;const c=null===(l=null===(a=i.parentNode)||void 0===a?void 0:a.parentNode)||void 0===l?void 0:l.parentNode;c&&c.insertBefore(__classPrivateFieldGet(this,X,"f"),null===(d=i.parentNode)||void 0===d?void 0:d.parentNode)}})),_e.set(this,(i=>{__classPrivateFieldGet(this,Z,"f").info("onClickEllipsis",{evt:i}),i.preventDefault(),i.stopPropagation(),__classPrivateFieldGet(this,Y,"f")?__classPrivateFieldGet(this,O,"m",pe).call(this):__classPrivateFieldGet(this,O,"m",ue).call(this),__classPrivateFieldGet(this,O,"m",ve).call(this)})),ge.set(this,(i=>{__classPrivateFieldGet(this,Z,"f").info("onClickConvert",{evt:i}),i.preventDefault(),i.stopPropagation(),this.internalEvent.emitConvert(),__classPrivateFieldGet(this,O,"m",pe).call(this)})),fe.set(this,(i=>__awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Z,"f").info("onClickCopy",{evt:i}),i.preventDefault(),i.stopPropagation();try{__classPrivateFieldGet(this,O,"m",pe).call(this);let i="Nothing to copy";if(__classPrivateFieldGet(this,j,"f").innerText)if(i=`"${__classPrivateFieldGet(this,j,"f").innerText}" copied to clipboard`,/iPad|iPhone|iPod/.test(navigator.userAgent)){const i="clipboard-write";"granted"===(yield navigator.permissions.query({name:i})).state&&(yield navigator.clipboard.writeText(__classPrivateFieldGet(this,j,"f").innerText))}else yield navigator.clipboard.writeText(__classPrivateFieldGet(this,j,"f").innerText);this.internalEvent.emitNotif({message:i,timeout:1500})}catch(i){__classPrivateFieldGet(this,Z,"f").error("onClickCopy",{err:i}),this.internalEvent.emitError(i)}})))),me.set(this,(i=>{__classPrivateFieldGet(this,Z,"f").info("onClickDelete",{evt:i}),i.preventDefault(),i.stopPropagation(),this.internalEvent.emitClear(),__classPrivateFieldGet(this,O,"m",pe).call(this)})),Pe.set(this,(i=>{var s,n,a,l;__classPrivateFieldGet(this,Z,"f").info("onClickCandidate",{evt:i}),i.preventDefault(),i.stopPropagation();const d=i.target.innerText;this.jiix&&d!==(null===(s=this.wordToChange)||void 0===s?void 0:s.label)&&(null===(a=null===(n=this.wordToChange)||void 0===n?void 0:n.candidates)||void 0===a?void 0:a.includes(d))&&(this.jiix.words[parseInt(null===(l=this.wordToChange)||void 0===l?void 0:l.id)].label=d,this.internalEvent.emitImportJIIX(this.jiix)),__classPrivateFieldGet(this,X,"f").style.display="none"})),ye.set(this,(i=>{__classPrivateFieldGet(this,Z,"f").info("onClickPrompter",{evt:i}),i.preventDefault(),i.stopPropagation(),__classPrivateFieldGet(this,O,"m",pe).call(this);const s=i.target;s.id!==__classPrivateFieldGet(this,j,"f").id?__classPrivateFieldGet(this,he,"f").call(this,s):__classPrivateFieldGet(this,O,"m",ve).call(this)})),Se.set(this,(()=>{__classPrivateFieldGet(this,O,"m",ve).call(this),__classPrivateFieldGet(this,O,"m",pe).call(this)})),__classPrivateFieldGet(this,Z,"f").info("constructor",{}),this.uuid=Math.random().toString(10).substring(2,12),this.margin={bottom:0,left:0,right:0,top:0},__classPrivateFieldGet(this,O,"m",K).call(this),__classPrivateFieldGet(this,O,"m",Q).call(this),__classPrivateFieldGet(this,O,"m",ee).call(this),__classPrivateFieldGet(this,O,"m",te).call(this),__classPrivateFieldGet(this,O,"m",ie).call(this),__classPrivateFieldGet(this,O,"m",se).call(this),__classPrivateFieldGet(this,O,"m",ne).call(this),__classPrivateFieldGet(this,O,"m",re).call(this),__classPrivateFieldGet(this,O,"m",oe).call(this),__classPrivateFieldGet(this,O,"m",ae).call(this)}get internalEvent(){return InternalEvent.getInstance()}init(i,s,n){__classPrivateFieldGet(this,Z,"f").info("init",{domElement:i,margin:s,renderingConfiguration:n}),i.appendChild(__classPrivateFieldGet(this,W,"f")),__classPrivateFieldGet(this,W,"f").appendChild(__classPrivateFieldGet(this,B,"f")),__classPrivateFieldGet(this,z,"f").appendChild(__classPrivateFieldGet(this,j,"f")),__classPrivateFieldGet(this,W,"f").appendChild(__classPrivateFieldGet(this,z,"f")),__classPrivateFieldGet(this,W,"f").appendChild(__classPrivateFieldGet(this,H,"f")),__classPrivateFieldGet(this,U,"f").appendChild(__classPrivateFieldGet(this,$,"f")),__classPrivateFieldGet(this,U,"f").appendChild(__classPrivateFieldGet(this,V,"f")),__classPrivateFieldGet(this,U,"f").appendChild(__classPrivateFieldGet(this,J,"f")),__classPrivateFieldGet(this,W,"f").appendChild(__classPrivateFieldGet(this,U,"f")),__classPrivateFieldGet(this,U,"f").classList.add("close"),__classPrivateFieldSet(this,Y,!1,"f"),__classPrivateFieldGet(this,W,"f").appendChild(__classPrivateFieldGet(this,X,"f")),__classPrivateFieldGet(this,X,"f").style.display="none",this.margin=s,this.renderingConfiguration=n,__classPrivateFieldGet(this,O,"m",we).call(this),__classPrivateFieldGet(this,O,"m",de).call(this),this.renderingConfiguration.smartGuide.fadeOut.enable&&__classPrivateFieldGet(this,O,"m",le).call(this,this.renderingConfiguration.smartGuide.fadeOut.duration),this.resize()}resize(){__classPrivateFieldGet(this,Z,"f").info("resize");const i=3.779527559,s=this.margin.top*i,n=this.margin.left*i,a=this.margin.right*i,l=s-45.354330708;__classPrivateFieldGet(this,W,"f").style.top=`${l}px`,__classPrivateFieldGet(this,W,"f").style.left=`${n}px`,__classPrivateFieldGet(this,W,"f").style.right=`${a}px`;let d=__classPrivateFieldGet(this,B,"f").offsetWidth;__classPrivateFieldGet(this,z,"f").style.marginLeft=`${d}px`,__classPrivateFieldGet(this,z,"f").style.width=__classPrivateFieldGet(this,W,"f").clientWidth-__classPrivateFieldGet(this,B,"f").offsetWidth-__classPrivateFieldGet(this,H,"f").offsetHeight+"px",d+=__classPrivateFieldGet(this,z,"f").offsetWidth,__classPrivateFieldGet(this,U,"f").style.left=`${d-__classPrivateFieldGet(this,U,"f").offsetWidth+__classPrivateFieldGet(this,H,"f").offsetWidth}px`,__classPrivateFieldGet(this,U,"f").style.top=`${__classPrivateFieldGet(this,H,"f").offsetHeight}px`,__classPrivateFieldGet(this,H,"f").style.left=`${d}px`}update(i){var s,n;__classPrivateFieldGet(this,Z,"f").info("update",{exports:i}),this.jiix=i;const createWordSpan=(i,s)=>{const n=document.createElement("span");return n.id=`word-${i}${this.uuid}`,s?n.textContent=s.label:n.innerHTML=" ",__classPrivateFieldGet(this,Z,"f").debug("update",{span:n}),n};(()=>{var i;if(__classPrivateFieldGet(this,Z,"f").info("populatePrompter",{}),__classPrivateFieldGet(this,j,"f").innerHTML="",null===(i=this.jiix)||void 0===i?void 0:i.words){const i=this.jiix.words,s=document.createDocumentFragment();i.forEach(((n,a)=>{var l,d,c;if(" "===n.label||n.label.includes("\n"))s.appendChild(createWordSpan(a));else if(a!==i.length-1)s.appendChild(createWordSpan(a,n));else{__classPrivateFieldGet(this,j,"f").appendChild(s),this.lastWord&&(this.lastWord=n);const i=createWordSpan(a,n);(null===(l=this.lastWord)||void 0===l?void 0:l.candidates)!==n.candidates&&(null===(d=this.lastWord)||void 0===d?void 0:d.label)!==n.label&&(this.lastWord=n),(null===(c=this.wordToChange)||void 0===c?void 0:c.id)===a.toString()?(i.classList.add("modified-word"),this.wordToChange=void 0):i.classList.add("added-word"),__classPrivateFieldGet(this,j,"f").appendChild(i),__classPrivateFieldGet(this,z,"f").scrollLeft=i.offsetLeft,__classPrivateFieldGet(this,Z,"f").debug("update => populatePrompter",{span:i}),__classPrivateFieldGet(this,Z,"f").debug("update => populatePrompter",this.lastWord)}}))}})(),(null===(n=null===(s=this.jiix)||void 0===s?void 0:s.words)||void 0===n?void 0:n.length)&&__classPrivateFieldGet(this,O,"m",de).call(this)}clear(){__classPrivateFieldGet(this,Z,"f").info("clear"),__classPrivateFieldGet(this,j,"f").innerHTML="",__classPrivateFieldGet(this,X,"f").innerHTML="",__classPrivateFieldGet(this,O,"m",ce).call(this)}destroy(){__classPrivateFieldGet(this,Z,"f").info("destroy"),__classPrivateFieldGet(this,O,"m",Fe).call(this),__classPrivateFieldGet(this,W,"f").remove()}}W=new WeakMap,z=new WeakMap,j=new WeakMap,H=new WeakMap,B=new WeakMap,X=new WeakMap,U=new WeakMap,$=new WeakMap,V=new WeakMap,J=new WeakMap,q=new WeakMap,Y=new WeakMap,Z=new WeakMap,he=new WeakMap,_e=new WeakMap,ge=new WeakMap,fe=new WeakMap,me=new WeakMap,Pe=new WeakMap,ye=new WeakMap,Se=new WeakMap,O=new WeakSet,K=function _SmartGuide_createWrapperElement(){__classPrivateFieldSet(this,W,document.createElement("div"),"f"),__classPrivateFieldGet(this,W,"f").id=`smartguide-${this.uuid}`,__classPrivateFieldGet(this,W,"f").classList.add("smartguide")},Q=function _SmartGuide_createPrompterContainerElement(){__classPrivateFieldSet(this,z,document.createElement("div"),"f"),__classPrivateFieldGet(this,z,"f").id=`prompter-container-${this.uuid}`,__classPrivateFieldGet(this,z,"f").classList.add("prompter-container")},ee=function _SmartGuide_createPrompterTextElement(){__classPrivateFieldSet(this,j,document.createElement("div"),"f"),__classPrivateFieldGet(this,j,"f").id=`prompter-text-${this.uuid}`,__classPrivateFieldGet(this,j,"f").classList.add("prompter-text"),__classPrivateFieldGet(this,j,"f").setAttribute("touch-action","none")},te=function _SmartGuide_createEllipsisElement(){__classPrivateFieldSet(this,H,document.createElement("div"),"f"),__classPrivateFieldGet(this,H,"f").id=`ellipsis-${this.uuid}`,__classPrivateFieldGet(this,H,"f").classList.add("ellipsis"),__classPrivateFieldGet(this,H,"f").innerHTML="..."},ie=function _SmartGuide_createTagElement(){__classPrivateFieldSet(this,B,document.createElement("div"),"f"),__classPrivateFieldGet(this,B,"f").id=`tag-icon-${this.uuid}`,__classPrivateFieldGet(this,B,"f").classList.add("tag-icon"),__classPrivateFieldGet(this,B,"f").innerHTML="¶"},se=function _SmartGuide_createCandidatesElement(){__classPrivateFieldSet(this,X,document.createElement("div"),"f"),__classPrivateFieldGet(this,X,"f").id=`candidates-${this.uuid}`,__classPrivateFieldGet(this,X,"f").classList.add("candidates")},ne=function _SmartGuide_createMoreMenuElement(){__classPrivateFieldSet(this,U,document.createElement("div"),"f"),__classPrivateFieldGet(this,U,"f").id=`more-menu-${this.uuid}`,__classPrivateFieldGet(this,U,"f").classList.add("more-menu")},re=function _SmartGuide_createConvertElement(){__classPrivateFieldSet(this,$,document.createElement("button"),"f"),__classPrivateFieldGet(this,$,"f").id=`convert-${this.uuid}`,__classPrivateFieldGet(this,$,"f").classList.add("options-label-button"),__classPrivateFieldGet(this,$,"f").innerHTML="Convert"},oe=function _SmartGuide_createCopyElement(){__classPrivateFieldSet(this,V,document.createElement("button"),"f"),__classPrivateFieldGet(this,V,"f").id=`copy-${this.uuid}`,__classPrivateFieldGet(this,V,"f").classList.add("options-label-button"),__classPrivateFieldGet(this,V,"f").innerHTML="Copy"},ae=function _SmartGuide_createDeleteElement(){__classPrivateFieldSet(this,J,document.createElement("button"),"f"),__classPrivateFieldGet(this,J,"f").id=`delete-${this.uuid}`,__classPrivateFieldGet(this,J,"f").classList.add("options-label-button"),__classPrivateFieldGet(this,J,"f").innerHTML="Delete"},le=function _SmartGuide_initFadeOutObserver(i=3e3){new MutationObserver((()=>{clearTimeout(__classPrivateFieldGet(this,q,"f")),__classPrivateFieldGet(this,W,"f").classList.contains("smartguide-out")||"none"!==__classPrivateFieldGet(this,X,"f").style.display||__classPrivateFieldGet(this,Y,"f")||__classPrivateFieldSet(this,q,setTimeout((()=>{__classPrivateFieldGet(this,O,"m",ce).call(this)}),i),"f")})).observe(__classPrivateFieldGet(this,W,"f"),{childList:!0,subtree:!0,attributes:!0})},de=function _SmartGuide_show(){__classPrivateFieldGet(this,W,"f").classList.remove("smartguide-out"),__classPrivateFieldGet(this,W,"f").classList.add("smartguide-in")},ce=function _SmartGuide_hide(){__classPrivateFieldGet(this,W,"f").classList.add("smartguide-out"),__classPrivateFieldGet(this,W,"f").classList.remove("smartguide-in")},ve=function _SmartGuide_hideCandidates(){__classPrivateFieldGet(this,X,"f").style.display="none"},ue=function _SmartGuide_openMenu(){__classPrivateFieldGet(this,U,"f").classList.add("open"),__classPrivateFieldGet(this,U,"f").classList.remove("close"),__classPrivateFieldSet(this,Y,!0,"f")},pe=function _SmartGuide_closeMenu(){__classPrivateFieldGet(this,U,"f").classList.add("close"),__classPrivateFieldGet(this,U,"f").classList.remove("open"),__classPrivateFieldSet(this,Y,!1,"f")},we=function _SmartGuide_addListeners(){__classPrivateFieldGet(this,H,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,_e,"f").bind(this)),__classPrivateFieldGet(this,$,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,ge,"f").bind(this)),__classPrivateFieldGet(this,V,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,fe,"f").bind(this)),__classPrivateFieldGet(this,J,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,me,"f").bind(this)),__classPrivateFieldGet(this,j,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,ye,"f").bind(this)),__classPrivateFieldGet(this,X,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,Pe,"f").bind(this)),document.addEventListener("pointerdown",__classPrivateFieldGet(this,Se,"f").bind(this))},Fe=function _SmartGuide_removeListeners(){__classPrivateFieldGet(this,H,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,_e,"f")),__classPrivateFieldGet(this,$,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,ge,"f")),__classPrivateFieldGet(this,V,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,fe,"f")),__classPrivateFieldGet(this,J,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,me,"f")),__classPrivateFieldGet(this,j,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,ye,"f")),__classPrivateFieldGet(this,X,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,Pe,"f")),document.removeEventListener("pointerdown",__classPrivateFieldGet(this,Se,"f"))};var xe,be=Object.freeze({__proto__:null,SmartGuide:SmartGuide});class DeferredPromise{constructor(){this.isFullFilled=!1,this.isPending=!0,this.promise=new Promise(((i,s)=>{this.reject=i=>__awaiter(this,void 0,void 0,(function*(){return this.isFullFilled=!0,this.isPending=!1,s(i)})),this.resolve=s=>__awaiter(this,void 0,void 0,(function*(){return this.isFullFilled=!0,this.isPending=!1,i(s)}))}))}}class PointerEventGrabber{constructor(i){this.prevent=i=>i.preventDefault(),xe.set(this,LoggerManager.getLogger("GRABBER")),this.pointerDownHandler=i=>{if(__classPrivateFieldGet(this,xe,"f").info("pointerDown",{evt:i}),0===i.button&&1===i.buttons&&(this.activePointerId=i.pointerId,this.onPointerDown)){const s=this.extractPoint(i);this.onPointerDown(i,s)}},this.pointerMoveHandler=i=>{if(__classPrivateFieldGet(this,xe,"f").info("pointerMove",{evt:i}),null!=this.activePointerId&&this.activePointerId===i.pointerId&&this.onPointerMove){const s=this.extractPoint(i);this.onPointerMove(i,s)}},this.pointerUpHandler=i=>{if(__classPrivateFieldGet(this,xe,"f").info("pointerUp",{evt:i}),null!=this.activePointerId&&this.activePointerId===i.pointerId&&(this.activePointerId=void 0,i.stopPropagation(),this.onPointerUp)){const s=this.extractPoint(i);this.onPointerUp(i,s)}},__classPrivateFieldGet(this,xe,"f").info("constructor",{configuration:i}),this.configuration=i}roundFloat(i,s){if(s>=0){const n=Math.pow(10,s);return Math.round(i/n)*n}return __classPrivateFieldGet(this,xe,"f").debug("roundFloat",{oneFloat:i,requestedFloatPrecision:s}),i}extractPoint(i){let s,n;({clientX:s,clientY:n}="changedTouches"in i?i.changedTouches[0]:i);const a=this.domElement.getBoundingClientRect(),l={x:this.roundFloat(s-a.left-this.domElement.clientLeft,this.configuration.xyFloatPrecision),y:this.roundFloat(n-a.top-this.domElement.clientTop,this.configuration.xyFloatPrecision),t:this.roundFloat(Date.now(),this.configuration.timestampFloatPrecision),p:i.pressure||1};return __classPrivateFieldGet(this,xe,"f").debug("extractPoint",{event:i,pointer:l}),l}attach(i){__classPrivateFieldGet(this,xe,"f").info("attach",{domElement:i}),this.domElement&&this.detach(),this.domElement=i,this.domElement.addEventListener("pointerdown",this.pointerDownHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointermove",this.pointerMoveHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointerup",this.pointerUpHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointerleave",this.pointerUpHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointercancel",this.pointerUpHandler,this.configuration.listenerOptions),this.domElement.addEventListener("touchmove",this.prevent),document.documentElement.addEventListener("pointerdown",(()=>{}))}detach(){var i,s,n,a,l,d;__classPrivateFieldGet(this,xe,"f").info("detach"),null===(i=this.domElement)||void 0===i||i.removeEventListener("pointerdown",this.pointerDownHandler,this.configuration.listenerOptions),null===(s=this.domElement)||void 0===s||s.removeEventListener("pointermove",this.pointerMoveHandler,this.configuration.listenerOptions),null===(n=this.domElement)||void 0===n||n.removeEventListener("pointerup",this.pointerUpHandler,this.configuration.listenerOptions),null===(a=this.domElement)||void 0===a||a.removeEventListener("pointerleave",this.pointerUpHandler,this.configuration.listenerOptions),null===(l=this.domElement)||void 0===l||l.removeEventListener("pointercancel",this.pointerUpHandler,this.configuration.listenerOptions),null===(d=this.domElement)||void 0===d||d.removeEventListener("touchmove",this.prevent),document.documentElement.removeEventListener("pointerdown",(()=>{}))}}xe=new WeakMap;const Ee={table:"table",shape:"shape",recognizedShape:"recognizedShape",ellipse:"ellipse",line:"line"};function phi(i){let s=(i+Math.PI)%(2*Math.PI)-Math.PI;return s<-Math.PI&&(s+=2*Math.PI),s}function drawArrowHead(i,s,n,a){const l=phi(n+Math.PI*(7/8)),d=phi(n-Math.PI*(7/8));i.save();try{i.fillStyle=i.strokeStyle,i.moveTo(s.x,s.y),i.beginPath(),i.lineTo(s.x+a*Math.cos(l),s.y+a*Math.sin(l)),i.lineTo(s.x+a*Math.cos(d),s.y+a*Math.sin(d)),i.lineTo(s.x,s.y),i.fill()}finally{i.restore()}}function drawShapeEllipse(i,s){const n=function drawEllipseArc(i,s){const{centerPoint:n,maxRadius:a,minRadius:l,orientation:d,startAngle:c,sweepAngle:h}=s;let v=Math.cos(d),u=Math.sin(d),p=v,_=u;v*=a,p*=l,u*=a,_*=l;const g=Math.floor(Math.abs(h)/.02),f=[];i.save();try{i.beginPath();for(let s=0;s<=g;s++){const d=c+s/g*h,m=Math.atan2(Math.sin(d)/l,Math.cos(d)/a),P=Math.cos(m),y=Math.sin(m),S=n.x+v*P-_*y,w=n.y+p*y+u*P;0===s?i.moveTo(S,w):i.lineTo(S,w),0!==s&&s!==g||f.push({x:S,y:w})}i.stroke()}finally{i.restore()}return f}(i,s);"ARROW_HEAD"===(null==s?void 0:s.beginDecoration)&&drawArrowHead(i,n[0],s.beginTangentAngle,12),"ARROW_HEAD"===(null==s?void 0:s.endDecoration)&&drawArrowHead(i,n[1],s.endTangentAngle,12)}function drawLine(i,s,n){i.save();try{i.beginPath(),i.moveTo(s.x,s.y),i.lineTo(n.x,n.y),i.stroke()}finally{i.restore()}}function drawShapeSymbol(i,s){i.save();try{if(i.lineWidth=s.style.width,i.strokeStyle=s.style.color,s.elementType)switch(s.elementType){case Ee.shape:{const n=s;drawShapeSymbol(i,n.candidates[n.selectedCandidateIndex]);break}case Ee.table:s.lines.forEach((s=>drawShapeSymbol(i,s)));break;case Ee.line:{const n=s;drawLine(i,n.data.p1,n.data.p2);break}}else switch(s.type){case Ee.ellipse:drawShapeEllipse(i,s);break;case Ee.line:!function drawShapeLine(i,s){drawLine(i,s.firstPoint,s.lastPoint),"ARROW_HEAD"===s.beginDecoration&&drawArrowHead(i,s.firstPoint,s.beginTangentAngle,12),"ARROW_HEAD"===s.endDecoration&&drawArrowHead(i,s.lastPoint,s.endTangentAngle,12)}(i,s);break;case Ee.recognizedShape:s.primitives.forEach((s=>drawShapeSymbol(i,s)));break}}finally{i.restore()}}var Ce=Object.freeze({__proto__:null,ShapeSymbols:Ee,drawLine:drawLine,drawShapeSymbol:drawShapeSymbol});function drawStroke(i,s,n){n&&s&&"eraser"!==s.pointerType&&n.drawStroke(i,s)}var ke=Object.freeze({__proto__:null,drawStroke:drawStroke});const Me={inputCharacter:"inputCharacter",char:"char",string:"string",textLine:"textLine"};function drawTextLine(i,s){!function drawText(i,s,n){i.save();try{i.font=`${n.textHeight}px serif`,i.textAlign="CENTER"===n.justificationType?"center":"left",i.textBaseline="bottom",i.fillStyle=i.strokeStyle,i.fillText(s,n.topLeftPoint.x,n.topLeftPoint.y+n.height)}finally{i.restore()}}(i,s.label,s.data),s.underlineList.forEach((n=>{!function drawUnderline(i,s,n,a){const l=a.width/n.length;drawLine(i,{x:a.topLeftPoint.x+s.data.firstCharacter*l,y:a.topLeftPoint.y+a.height},{x:a.topLeftPoint.x+s.data.lastCharacter*l,y:a.topLeftPoint.y+a.height})}(i,n,s.label,s.data)}))}function drawTextSymbol(i,s){i.save();try{i.lineWidth=s.style.width,i.strokeStyle=s.style.color;if((s.elementType||s.type)===Me.textLine)drawTextLine(i,s);else console.info(`drawTextSymbol => ${s.elementType} not implemented`)}finally{i.restore()}}var Te=Object.freeze({__proto__:null,TextSymbols:Me,drawTextSymbol:drawTextSymbol});function computeLinksPoints(i,s,n){const a=i.p*n;return[{x:i.x-Math.sin(s)*a,y:i.y+Math.cos(s)*a},{x:i.x+Math.sin(s)*a,y:i.y-Math.cos(s)*a}]}function computeMiddlePoint(i,s){return{x:(s.x+i.x)/2,y:(s.y+i.y)/2,p:(s.p+i.p)/2,t:(s.t+i.t)/2}}function computeAxeAngle(i,s){return Math.atan2(s.y-i.y,s.x-i.x)}var Le,Ie=Object.freeze({__proto__:null,computeLinksPoints:computeLinksPoints,computeMiddlePoint:computeMiddlePoint,computeAxeAngle:computeAxeAngle});class CanvasStroker{renderArc(i,s,n){i.arc(s.x,s.y,n,0,2*Math.PI,!0)}renderLine(i,s,n,a){const l=computeLinksPoints(s,computeAxeAngle(s,n),a),d=computeLinksPoints(n,computeAxeAngle(s,n),a);i.moveTo(l[0].x,l[0].y),i.lineTo(d[0].x,d[0].y),i.lineTo(d[1].x,d[1].y),i.lineTo(l[1].x,l[1].y)}renderFinal(i,s,n,a){const l=computeAxeAngle(s,n),d=computeLinksPoints(n,l,a);i.moveTo(d[0].x,d[0].y);for(let s=1;s<=6;s++){const d=l-s*Math.PI/6;i.lineTo(n.x-n.p*a*Math.sin(d),n.y+n.p*a*Math.cos(d))}}renderQuadratic(i,s,n,a,l){const d=computeLinksPoints(s,computeAxeAngle(s,a),l),c=computeLinksPoints(n,computeAxeAngle(a,n),l),h=computeLinksPoints(a,computeAxeAngle(s,n),l);i.moveTo(d[0].x,d[0].y),i.quadraticCurveTo(h[0].x,h[0].y,c[0].x,c[0].y),i.lineTo(c[1].x,c[1].y),i.quadraticCurveTo(h[1].x,h[1].y,d[1].x,d[1].y)}drawStroke(i,s){const n=s.pointers.length,a=n-2,l=s.style.width>0?s.style.width:i.lineWidth,d=s.style.color?s.style.color:i.strokeStyle,c=s.pointers[0];i.save();try{if(i.beginPath(),n<3)this.renderArc(i,c,.6*l);else{this.renderArc(i,c,l*c.p);const d=computeMiddlePoint(c,s.pointers[1]);this.renderLine(i,c,d,l);for(let n=0;n{var n;const a=s.parentNode,l=Math.max(this.config.minWidth,a.clientWidth),d=Math.max(this.config.minHeight,a.clientHeight);s.width=l*i,s.height=d*i,null===(n=s.getContext("2d"))||void 0===n||n.scale(i,i),s.style.width=`${l}px`,s.style.height=`${d}px`}))}drawSymbol(i,s){const n=s.elementType||s.type;"stroke"===n?drawStroke(i,s,this.stroker):Object.keys(Me).includes(n)?drawTextSymbol(i,s):Object.keys(Ee).includes(n)&&drawShapeSymbol(i,s)}init(i){__classPrivateFieldGet(this,Le,"f").info("init",{element:i});const s=this.createCanvas("ms-rendering-canvas");i.appendChild(s);const n=this.createCanvas("ms-capture-canvas");i.appendChild(n),this.context={parent:i,renderingCanvas:s,renderingCanvasContext:s.getContext("2d"),capturingCanvas:n,capturingCanvasContext:n.getContext("2d")},this.resizeContent()}drawModel(i){var s;__classPrivateFieldGet(this,Le,"f").info("drawModel",{model:i}),null===(s=this.context.renderingCanvasContext)||void 0===s||s.clearRect(0,0,this.context.renderingCanvas.width,this.context.renderingCanvas.height),i.rawStrokes.forEach((i=>this.drawSymbol(this.context.renderingCanvasContext,i))),this.context.capturingCanvasContext.clearRect(0,0,this.context.capturingCanvas.width,this.context.capturingCanvas.height)}drawPendingStroke(i){__classPrivateFieldGet(this,Le,"f").info("drawPendingStroke",{stroke:i}),this.context.capturingCanvasContext.clearRect(0,0,this.context.capturingCanvas.width,this.context.capturingCanvas.height),i&&"eraser"!==(null==i?void 0:i.pointerType)&&this.stroker.drawStroke(this.context.capturingCanvasContext,i)}resize(i){__classPrivateFieldGet(this,Le,"f").info("resize",{model:i}),this.resizeContent(),this.drawModel(i)}destroy(){__classPrivateFieldGet(this,Le,"f").info("destroy"),this.context.parent&&(this.context.parent.innerHTML="")}}Le=new WeakMap;"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function createCommonjsModule(i,s){return i(s={exports:{}},s.exports),s.exports}var De=createCommonjsModule((function(i,s){i.exports=function(i){function e(n){if(s[n])return s[n].exports;var a=s[n]={i:n,l:!1,exports:{}};return i[n].call(a.exports,a,a.exports,e),a.l=!0,a.exports}var s={};return e.m=i,e.c=s,e.i=function(i){return i},e.d=function(i,s,n){e.o(i,s)||Object.defineProperty(i,s,{configurable:!1,enumerable:!0,get:n})},e.n=function(i){var s=i&&i.__esModule?function(){return i.default}:function(){return i};return e.d(s,"a",s),s},e.o=function(i,s){return Object.prototype.hasOwnProperty.call(i,s)},e.p="",e(e.s=1)}([function(i,s,n){function o(i,s){if(!(i instanceof s))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(s,"__esModule",{value:!0});var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(i){return typeof i}:function(i){return i&&"function"==typeof Symbol&&i.constructor===Symbol&&i!==Symbol.prototype?"symbol":typeof i},l=function t(i){var s=this;o(this,t),this.toJSON=function(i){if("string"!=typeof i)return console.error("Need a CSS string but given ",void 0===i?"undefined":a(i),i),"Not a valid CSS..!";var n={},l=void 0,d=void 0,c=void 0;try{i.split("{").forEach((function(i){if(d=i.trim())if(-1===d.indexOf("}"))n[d]={},l=d;else{d.substring(0,d.indexOf("}")).split(";").forEach((function(i){(c=i.split(":"))&&2===c.length&&(n[l][c[0].trim().replace(/^\"|\"$/g,"")]=s._trimSemiColon(c[1].trim().replace(/^\"|\"$/g,"")))}));try{(l=d.split("}")[1].trim())&&(n[l]={})}catch(i){}}}))}catch(i){return"Not a valid CSS..!"}return n},this.toCSS=function(i){if("object"!==(void 0===i?"undefined":a(i)))return console.error("Need a JSON object but given ",void 0===i?"undefined":a(i),i),"Not a valid JSON..!";var s="";try{for(var n in i)if(i.hasOwnProperty(n)){for(var l in s+=n+" {\n",i[n])i[n].hasOwnProperty(l)&&(s+=l+": "+i[n][l]+";\n");s+="}\n"}}catch(i){return"Not a valid JSON..!"}return s},this._trimSemiColon=function(i){return";"===i.slice(-1)?i.slice(0,s.length-1):i}};s.default=l},function(i,s,n){i.exports=n(0).default}])})),Ae=function unwrapExports(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}(De);De.JsonCSS;const Re=new Ae,Ne={themeToCSS:i=>Re.toCSS(i),themeToJSON(i){const s=Re.toJSON(i);return s[".text"]["font-size"]=Number(s[".text"]["font-size"]),s.ink["-myscript-pen-width"]=Number(s.ink["-myscript-pen-width"]),s.ink.width=Number(s.ink.width),s},penStyleToCSS(i){let s=Re.toCSS({css:i});return s=s.substring(6,s.length-3),s},penStyleToJSON(i){const s=Re.toJSON(`css {${i}}`).css;return s.width?s.width=Number(s.width):delete s.width,s["-myscript-pen-width"]?s["-myscript-pen-width"]=Number(s["-myscript-pen-width"]):delete s["-myscript-pen-width"],s},stringToJSON:i=>Re.toJSON(`css {${i}}`).css,JSONToString:i=>Object.entries(i).map((([i,s])=>`${i}:${s}`)).join(";")};var Oe=createCommonjsModule((function(i,s){var n;i.exports=(n=n||function(i,s){var n=Object.create||function(){function F(){}return function(i){var s;return F.prototype=i,s=new F,F.prototype=null,s}}(),a={},l=a.lib={},d=l.Base={extend:function(i){var s=n(this);return i&&s.mixIn(i),s.hasOwnProperty("init")&&this.init!==s.init||(s.init=function(){s.$super.init.apply(this,arguments)}),s.init.prototype=s,s.$super=this,s},create:function(){var i=this.extend();return i.init.apply(i,arguments),i},init:function(){},mixIn:function(i){for(var s in i)i.hasOwnProperty(s)&&(this[s]=i[s]);i.hasOwnProperty("toString")&&(this.toString=i.toString)},clone:function(){return this.init.prototype.extend(this)}},c=l.WordArray=d.extend({init:function(i,n){i=this.words=i||[],this.sigBytes=n!=s?n:4*i.length},toString:function(i){return(i||v).stringify(this)},concat:function(i){var s=this.words,n=i.words,a=this.sigBytes,l=i.sigBytes;if(this.clamp(),a%4)for(var d=0;d>>2]>>>24-d%4*8&255;s[a+d>>>2]|=c<<24-(a+d)%4*8}else for(d=0;d>>2]=n[d>>>2];return this.sigBytes+=l,this},clamp:function(){var s=this.words,n=this.sigBytes;s[n>>>2]&=4294967295<<32-n%4*8,s.length=i.ceil(n/4)},clone:function(){var i=d.clone.call(this);return i.words=this.words.slice(0),i},random:function(s){for(var n,a=[],r=function(s){var n=987654321,a=4294967295;return function(){var l=((n=36969*(65535&n)+(n>>16)&a)<<16)+(s=18e3*(65535&s)+(s>>16)&a)&a;return l/=4294967296,(l+=.5)*(i.random()>.5?1:-1)}},l=0;l>>2]>>>24-l%4*8&255;a.push((d>>>4).toString(16)),a.push((15&d).toString(16))}return a.join("")},parse:function(i){for(var s=i.length,n=[],a=0;a>>3]|=parseInt(i.substr(a,2),16)<<24-a%8*4;return new c.init(n,s/2)}},u=h.Latin1={stringify:function(i){for(var s=i.words,n=i.sigBytes,a=[],l=0;l>>2]>>>24-l%4*8&255;a.push(String.fromCharCode(d))}return a.join("")},parse:function(i){for(var s=i.length,n=[],a=0;a>>2]|=(255&i.charCodeAt(a))<<24-a%4*8;return new c.init(n,s)}},p=h.Utf8={stringify:function(i){try{return decodeURIComponent(escape(u.stringify(i)))}catch(i){throw new Error("Malformed UTF-8 data")}},parse:function(i){return u.parse(unescape(encodeURIComponent(i)))}},_=l.BufferedBlockAlgorithm=d.extend({reset:function(){this._data=new c.init,this._nDataBytes=0},_append:function(i){"string"==typeof i&&(i=p.parse(i)),this._data.concat(i),this._nDataBytes+=i.sigBytes},_process:function(s){var n=this._data,a=n.words,l=n.sigBytes,d=this.blockSize,h=l/(4*d),v=(h=s?i.ceil(h):i.max((0|h)-this._minBufferSize,0))*d,u=i.min(4*v,l);if(v){for(var p=0;p>>1|ie<<31)^(te>>>8|ie<<24)^te>>>7,ne=(ie>>>1|te<<31)^(ie>>>8|te<<24)^(ie>>>7|te<<25),re=v[Y-2],oe=re.high,ae=re.low,le=(oe>>>19|ae<<13)^(oe<<3|ae>>>29)^oe>>>6,de=(ae>>>19|oe<<13)^(ae<<3|oe>>>29)^(ae>>>6|oe<<26),ce=v[Y-7],he=ce.high,ve=ce.low,ue=v[Y-16],pe=ue.high,_e=ue.low;K=(K=(K=se+he+((Q=ne+ve)>>>0>>0?1:0))+le+((Q+=de)>>>0>>0?1:0))+pe+((Q+=_e)>>>0<_e>>>0?1:0),Z.high=K,Z.low=Q}var ge,fe=H&X^~H&$,me=B&U^~B&V,Pe=D&R^D&O^R&O,ye=A&N^A&W^N&W,Se=(D>>>28|A<<4)^(D<<30|A>>>2)^(D<<25|A>>>7),we=(A>>>28|D<<4)^(A<<30|D>>>2)^(A<<25|D>>>7),Fe=(H>>>14|B<<18)^(H>>>18|B<<14)^(H<<23|B>>>9),Ge=(B>>>14|H<<18)^(B>>>18|H<<14)^(B<<23|H>>>9),xe=h[Y],be=xe.high,Ee=xe.low,Ce=J+Fe+((ge=q+Ge)>>>0>>0?1:0),ke=we+ye;J=$,q=V,$=X,V=U,X=H,U=B,H=z+(Ce=(Ce=(Ce=Ce+fe+((ge+=me)>>>0>>0?1:0))+be+((ge+=Ee)>>>0>>0?1:0))+K+((ge+=Q)>>>0>>0?1:0))+((B=j+ge|0)>>>0>>0?1:0)|0,z=O,j=W,O=R,W=N,R=D,N=A,D=Ce+(Se+Pe+(ke>>>0>>0?1:0))+((A=ge+ke|0)>>>0>>0?1:0)|0}m=a.low=m+A,a.high=f+D+(m>>>0>>0?1:0),y=l.low=y+N,l.high=P+R+(y>>>0>>0?1:0),w=d.low=w+W,d.high=S+O+(w>>>0>>0?1:0),x=c.low=x+j,c.high=G+z+(x>>>0>>0?1:0),E=u.low=E+B,u.high=b+H+(E>>>0>>0?1:0),k=p.low=k+U,p.high=C+X+(k>>>0>>0?1:0),T=_.low=T+V,_.high=M+$+(T>>>0>>0?1:0),I=g.low=I+q,g.high=L+J+(I>>>0>>0?1:0)},_doFinalize:function(){var i=this._data,s=i.words,n=8*this._nDataBytes,a=8*i.sigBytes;return s[a>>>5]|=128<<24-a%32,s[30+(a+128>>>10<<5)]=Math.floor(n/4294967296),s[31+(a+128>>>10<<5)]=n,i.sigBytes=4*s.length,this._process(),this._hash.toX32()},clone:function(){var i=s.clone.call(this);return i._hash=this._hash.clone(),i},blockSize:32});i.SHA512=s._createHelper(u),i.HmacSHA512=s._createHmacHelper(u)}(),n.SHA512)})),createCommonjsModule((function(i,s){var n,a,l;i.exports=(a=(n=Oe).lib.Base,l=n.enc.Utf8,void(n.algo.HMAC=a.extend({init:function(i,s){i=this._hasher=new i.init,"string"==typeof s&&(s=l.parse(s));var n=i.blockSize,a=4*n;s.sigBytes>a&&(s=i.finalize(s)),s.clamp();for(var d=this._oKey=s.clone(),c=this._iKey=s.clone(),h=d.words,v=c.words,u=0;u{const n=i.split("."),a=s.split(".");for(let i=0;il)return!1;if(s{s.p.push(i.p),s.t.push(i.t),s.x.push(i.x),s.y.push(i.y)})),s}He=new WeakMap;class RestRecognizer{constructor(i,s){Be.set(this,LoggerManager.getLogger("RECOGNIZER")),__classPrivateFieldGet(this,Be,"f").info("constructor",{serverConfig:i,recognitionConfig:s}),this.serverConfiguration=i,this.recognitionConfiguration=s}get url(){return`${this.serverConfiguration.scheme}://${this.serverConfiguration.host}/api/v4.0/iink/batch`}get postConfig(){switch(this.recognitionConfiguration.type){case"DIAGRAM":return{lang:this.recognitionConfiguration.lang,diagram:this.recognitionConfiguration.diagram,export:this.recognitionConfiguration.export};case"MATH":return{lang:this.recognitionConfiguration.lang,math:this.recognitionConfiguration.math,export:this.recognitionConfiguration.export};case"Raw Content":return{lang:this.recognitionConfiguration.lang,"raw-content":this.recognitionConfiguration["raw-content"],export:this.recognitionConfiguration.export};case"TEXT":return{lang:this.recognitionConfiguration.lang,text:this.recognitionConfiguration.text,export:this.recognitionConfiguration.export};default:throw new Error(`get postConfig error Recognition type unkow "${this.recognitionConfiguration.type}"`)}}buildData(i){__classPrivateFieldGet(this,Be,"f").info("buildData",{model:i});const s=[];i.rawStrokes.forEach((i=>{const n=s.findIndex((s=>{return n=s.penStyle,a=i.style,n&&a&&n["-myscript-pen-fill-color"]===a["-myscript-pen-fill-color"]&&n["-myscript-pen-fill-style"]===a["-myscript-pen-fill-style"]&&n["-myscript-pen-width"]===a["-myscript-pen-width"]&&n.color===a.color&&n.width===a.width;var n,a}));n>-1?s[n].strokes.push(i):s.push({penStyle:i.style,strokes:[i]})}));const n=[];s.forEach((i=>{const s={penStyle:"{}"===JSON.stringify(i.penStyle)?void 0:Ne.penStyleToCSS(i.penStyle),strokes:i.strokes.map(convertStrokeToJSON)};n.push(s)}));const a="Raw Content"===this.recognitionConfiguration.type?"Raw Content":this.recognitionConfiguration.type.charAt(0).toUpperCase()+this.recognitionConfiguration.type.slice(1).toLowerCase(),l={configuration:this.postConfig,xDPI:96,yDPI:96,contentType:a,height:i.height,width:i.width,strokeGroups:n};return __classPrivateFieldGet(this,Be,"f").debug("buildData",{data:l}),l}post(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Be,"f").info("post",{data:i,mimeType:s});const n=new Headers;n.append("Accept","application/json,"+s),n.append("applicationKey",this.serverConfiguration.applicationKey),n.append("hmac",computeHmac(JSON.stringify(i),this.serverConfiguration.applicationKey,this.serverConfiguration.hmacKey)),n.append("Content-Type","application/json"),isVersionSuperiorOrEqual(this.serverConfiguration.version,"2.0.4")&&(n.append("myscript-client-name","iink-ts"),n.append("myscript-client-version","1.0.0-buildVersion"));const a={method:"POST",headers:n,body:JSON.stringify(i)},l=new Request(this.url,a),d=yield fetch(l);if(d.ok){const i=d.headers.get("content-type");let s;switch(i){case"application/vnd.openxmlformats-officedocument.presentationml.presentation":case"image/png":case"image/jpeg":s=yield d.blob();break;case"application/json":s=yield d.json();break;case"application/vnd.myscript.jiix":s=yield d.clone().json().catch((()=>__awaiter(this,void 0,void 0,(function*(){return yield d.text()}))));break;default:__classPrivateFieldGet(this,Be,"f").warn("post default",{contentType:i}),s=yield d.text()}return __classPrivateFieldGet(this,Be,"f").debug("post",{result:s}),s}{const i=yield d.json();throw __classPrivateFieldGet(this,Be,"f").error("post",{err:i}),i}}))}tryFetch(i,s){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,Be,"f").debug("tryFetch",{data:i,mimeType:s}),this.post(i,s).then((i=>{const n={};return n[s]=i,__classPrivateFieldGet(this,Be,"f").debug("tryFetch",{exports:n}),n})).catch((n=>{__classPrivateFieldGet(this,Be,"f").error("tryFetch",{data:i,mimeType:s,err:n});let a=n.message||y.UNKNOW;n.code?"access.not.granted"===n.code&&(a=y.WRONG_CREDENTIALS):a=y.CANT_ESTABLISH;throw new Error(a)}))}))}getMimeTypes(i){__classPrivateFieldGet(this,Be,"f").info("getMimeTypes",{requestedMimeTypes:i});let s=i||[];if(!s.length)switch(this.recognitionConfiguration.type){case"DIAGRAM":s=this.recognitionConfiguration.diagram.mimeTypes;break;case"MATH":s=this.recognitionConfiguration.math.mimeTypes;break;case"Raw Content":s=["application/vnd.myscript.jiix"];break;case"TEXT":s=this.recognitionConfiguration.text.mimeTypes;break;default:throw new Error(`Recognition type "${this.recognitionConfiguration.type}" is unknown.\n Possible types are:\n -DIAGRAM\n -MATH\n -Raw Content\n -TEXT`)}return s}convert(i,s,n){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Be,"f").info("convert",{model:i,conversionState:s,requestedMimeTypes:n});const a=i.getClone(),l=this.getMimeTypes(n),d=this.buildData(a);d.conversionState=s;const c=l.map((i=>this.tryFetch(d,i)));return(yield Promise.all(c)).forEach((i=>{a.mergeConvert(i)})),__classPrivateFieldGet(this,Be,"f").debug("convert",{model:a}),a}))}export(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Be,"f").info("export",{model:i,requestedMimeTypes:s});const n=i.getClone();if(0===n.rawStrokes.length)return Promise.resolve(n);const a=this.getMimeTypes(s);if(!a.length)return __classPrivateFieldGet(this,Be,"f").error("export",{model:i,requestedMimeTypes:s,"Export failed, no mimeTypes define in recognition configuration":String}),Promise.reject(new Error("Export failed, no mimeTypes define in recognition configuration"));const l=a.filter((i=>!n.exports||!n.exports[i])),d=this.buildData(i);return(yield Promise.all(l.map((i=>this.tryFetch(d,i))))).forEach((i=>{n.mergeExport(i)})),__classPrivateFieldGet(this,Be,"f").debug("export",{model:n}),n}))}resize(i){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,Be,"f").info("resize",{model:i}),this.export(i)}))}}Be=new WeakMap;class UndoRedoContext{constructor(i){this.stackIndex=0,this.possibleUndoCount=0,this.canRedo=!1,this.canUndo=!1,this.empty=!0,this.stack=[i.getClone()]}}class UndoRedoManager{constructor(i,s){Xe.set(this,LoggerManager.getLogger("UNDOREDO_MANAGER")),__classPrivateFieldGet(this,Xe,"f").info("constructor",{configuration:i,model:s}),this.configuration=i,this.context=new UndoRedoContext(s)}get internalEvent(){return InternalEvent.getInstance()}updateCanUndoRedo(){this.context.canRedo=this.context.stack.length-1>this.context.stackIndex,this.context.canUndo=this.context.stackIndex>0;const i=this.context.stack[this.context.stackIndex];this.context.empty=0===i.rawStrokes.length}addModelToStack(i){__classPrivateFieldGet(this,Xe,"f").info("addModelToStack",{model:i}),this.context.stackIndex+1this.configuration.maxStackSize&&(this.context.stack.shift(),this.context.stackIndex--),this.updateCanUndoRedo(),this.internalEvent.emitContextChange(this.context)}removeLastModelInStack(){__classPrivateFieldGet(this,Xe,"f").info("removeLastModelInStack"),this.context.stackIndex===this.context.stack.length-1&&this.context.stackIndex--,this.context.stack.pop(),this.updateCanUndoRedo()}updateModelInStack(i){__classPrivateFieldGet(this,Xe,"f").info("updateModelInStack",{model:i});const s=this.context.stack.findIndex((s=>s.modificationDate===i.modificationDate));s>-1&&this.context.stack.splice(s,1,i.getClone()),this.internalEvent.emitContextChange(this.context)}undo(){__classPrivateFieldGet(this,Xe,"f").info("undo"),this.context.canUndo&&(this.context.stackIndex--,this.updateCanUndoRedo(),this.internalEvent.emitContextChange(this.context));const i=this.context.stack[this.context.stackIndex].getClone();return __classPrivateFieldGet(this,Xe,"f").debug("undo",i),i}redo(){__classPrivateFieldGet(this,Xe,"f").info("redo"),this.context.canRedo&&(this.context.stackIndex++,this.updateCanUndoRedo(),this.internalEvent.emitContextChange(this.context));const i=this.context.stack[this.context.stackIndex].getClone();return __classPrivateFieldGet(this,Xe,"f").debug("redo",i),i}reset(i){__classPrivateFieldGet(this,Xe,"f").info("reset",{model:i}),this.context=new UndoRedoContext(i),this.internalEvent.emitContextChange(this.context)}}Xe=new WeakMap;const $e={},Ve={ink:{color:"#000000",width:1,"-myscript-pen-width":1,"-myscript-pen-fill-style":"none","-myscript-pen-fill-color":"#FFFFFF00"},".math":{"font-family":"STIXGeneral"},".math-solved":{"font-family":"STIXGeneral",color:"#A8A8A8FF"},".text":{"font-family":"MyScriptInter","font-size":10}};var Je,qe,Ye,Ze,Ke;class StyleManager{constructor(i,s){Je.set(this,void 0),qe.set(this,void 0),Ye.set(this,void 0),Ze.set(this,void 0),Ke.set(this,LoggerManager.getLogger("STYLEMANAGER")),__classPrivateFieldGet(this,Ke,"f").info("constructor",{penStyle:i,theme:s}),this.setTheme(s),this.setPenStyleClasses(),this.setPenStyle(i)}get currentPenStyle(){return __classPrivateFieldGet(this,Ze,"f")||__classPrivateFieldGet(this,Je,"f")}get penStyle(){return __classPrivateFieldGet(this,Je,"f")}setPenStyle(i){__classPrivateFieldGet(this,Ke,"f").info("setPenStyle",{style:i}),__classPrivateFieldSet(this,Je,mergeDeep(structuredClone($e),i||{}),"f"),__classPrivateFieldSet(this,Ze,i||this.theme[`.${__classPrivateFieldGet(this,Ye,"f")}`],"f"),__classPrivateFieldGet(this,Ke,"f").debug("setPenStyle",__classPrivateFieldGet(this,Ze,"f"))}get theme(){return __classPrivateFieldGet(this,qe,"f")}setTheme(i){__classPrivateFieldGet(this,Ke,"f").info("setTheme",{theme:i}),__classPrivateFieldSet(this,qe,mergeDeep(structuredClone(Ve),i||{}),"f"),__classPrivateFieldGet(this,Ke,"f").debug("setTheme",__classPrivateFieldGet(this,qe,"f"))}get penStyleClasses(){return __classPrivateFieldGet(this,Ye,"f")}setPenStyleClasses(i=""){__classPrivateFieldGet(this,Ke,"f").info("setPenStyleClasses",{penStyleClass:i}),__classPrivateFieldSet(this,Ye,i,"f"),__classPrivateFieldSet(this,Ze,this.theme[`.${__classPrivateFieldGet(this,Ye,"f")}`],"f"),__classPrivateFieldGet(this,Ke,"f").debug("setPenStyleClasses",__classPrivateFieldGet(this,Ze,"f"))}}function computeDistance(i,s){const n=Math.hypot(s.y-i.y,s.x-i.x);return isNaN(n)?0:n}Je=new WeakMap,qe=new WeakMap,Ye=new WeakMap,Ze=new WeakMap,Ke=new WeakMap;var Qe,et,tt,it,st,nt,rt,ot,at,lt,dt,ct,ht,vt,ut,pt,_t,gt,ft,mt,Pt=Object.freeze({__proto__:null,computeDistance:computeDistance});class Model{constructor(i=100,s=100,n=Date.now()){Qe.add(this),et.set(this,LoggerManager.getLogger("MODEL")),__classPrivateFieldGet(this,et,"f").info("constructor",{width:i,height:s,creationDate:n}),this.creationTime=n,this.modificationDate=n,this.width=i,this.height=s,this.rawStrokes=[],this.selectedStrokes=[],this.positions={lastSentPosition:0,lastReceivedPosition:0},this.idle=!0}mergeExport(i){__classPrivateFieldGet(this,et,"f").info("mergeExport",{exports:i}),this.exports?Object.assign(this.exports,i):this.exports=i,__classPrivateFieldGet(this,et,"f").debug("mergeExport",this.exports)}mergeConvert(i){__classPrivateFieldGet(this,et,"f").info("mergeConvert",{converts:i}),this.converts?Object.assign(this.converts,i):this.converts=i,__classPrivateFieldGet(this,et,"f").debug("mergeConvert",this.converts)}computePressure(i,s){let n=1;0===s?n=.5:i===s?n=1:i<10?n=.2+Math.pow(.1*i,.4):i>s-10&&(n=.2+Math.pow(.1*(s-i),.4));const a=n*Math.max(.1,1-.1*Math.sqrt(i));return isNaN(a)?.5:Math.round(100*a)/100}filterPointByAcquisitionDelta(i,s,n){const a=2+(i.style["-myscript-pen-width"]||0)/4;return!n||0===i.pointers.length||Math.abs(n.x-s.x)>=a||Math.abs(n.y-s.y)>=a}addPoint(i,s){__classPrivateFieldGet(this,et,"f").debug("addPoint",{stroke:i,pointer:s});const n=i.pointers.at(-1)||{p:1,t:0,x:0,y:0};if(this.filterPointByAcquisitionDelta(i,s,n)){const a=computeDistance(s,n);i.length+=a,s.p=this.computePressure(a,i.length),i.pointers.push(s)}}addStroke(i){__classPrivateFieldGet(this,et,"f").info("addStroke",{stroke:i}),this.rawStrokes.push(i)}extractUnsentStrokes(){return this.rawStrokes.slice(this.positions.lastSentPosition)}initCurrentStroke(i,s,n,a,l=96){if(__classPrivateFieldGet(this,et,"f").info("initCurrentStroke",{point:i,pointerId:s,pointerType:n,style:a,dpi:l}),a["-myscript-pen-width"]){const i=a["-myscript-pen-width"]*l/25.4;a.width=i/2}this.modificationDate=Date.now(),this.exports=void 0,this.converts=void 0,this.currentStroke=new Stroke(a,s,n),__classPrivateFieldGet(this,et,"f").debug("initCurrentStroke",this.currentStroke),this.addPoint(this.currentStroke,i)}appendToCurrentStroke(i){__classPrivateFieldGet(this,et,"f").info("appendToCurrentStroke",{point:i}),this.currentStroke&&this.addPoint(this.currentStroke,i),__classPrivateFieldGet(this,et,"f").debug("appendToCurrentStroke",this.currentStroke)}endCurrentStroke(i){__classPrivateFieldGet(this,et,"f").info("endCurrentStroke",{point:i}),this.currentStroke&&(this.addPoint(this.currentStroke,i),this.addStroke(this.currentStroke),this.currentStroke=void 0),__classPrivateFieldGet(this,et,"f").debug("endCurrentStroke",this.currentStroke)}resetSelectedStrokes(){this.selectedStrokes=[]}appendSelectedStrokesFromPoint(i){__classPrivateFieldGet(this,et,"f").info("appendSelectedStrokesFromPoint",{point:i}),__classPrivateFieldGet(this,Qe,"m",tt).call(this,i).forEach((i=>{this.selectedStrokes.includes(i)||this.selectedStrokes.push(i)}))}updateStroke(i){__classPrivateFieldGet(this,et,"f").info("updateStroke",{updatedStroke:i});const s=this.rawStrokes.findIndex((s=>s.id===i.id));-1!==s&&this.rawStrokes.splice(s,1,i),__classPrivateFieldGet(this,et,"f").debug("updateStroke",this.rawStrokes)}removeStroke(i){__classPrivateFieldGet(this,et,"f").info("removeStroke",{id:i});const s=this.rawStrokes.findIndex((s=>s.id===i));-1!==s&&this.rawStrokes.splice(s,1),__classPrivateFieldGet(this,et,"f").debug("removeStroke",this.rawStrokes)}removeStrokesFromPoint(i){__classPrivateFieldGet(this,et,"f").info("removeStrokesFromPoint",{point:i});const s=__classPrivateFieldGet(this,Qe,"m",tt).call(this,i);return s.forEach((i=>{this.removeStroke(i.id)})),__classPrivateFieldGet(this,et,"f").debug("removeStrokesFromPoint",s.map((i=>i.id))),s.map((i=>i.id))}updatePositionSent(i=this.rawStrokes.length){__classPrivateFieldGet(this,et,"f").info("updatePositionSent",{position:i}),this.positions.lastSentPosition=i,__classPrivateFieldGet(this,et,"f").debug("updatePositionSent",this.positions.lastSentPosition)}updatePositionReceived(){__classPrivateFieldGet(this,et,"f").info("updatePositionReceived"),this.positions.lastReceivedPosition=this.positions.lastSentPosition,__classPrivateFieldGet(this,et,"f").debug("updatePositionReceived",this.positions.lastReceivedPosition)}getClone(){__classPrivateFieldGet(this,et,"f").info("getClone");const i=new Model(this.width,this.height,this.creationTime);return i.modificationDate=JSON.parse(JSON.stringify(this.modificationDate)),i.currentStroke=this.currentStroke?JSON.parse(JSON.stringify(this.currentStroke)):void 0,i.rawStrokes=JSON.parse(JSON.stringify(this.rawStrokes)),i.positions=JSON.parse(JSON.stringify(this.positions)),i.exports=this.exports?JSON.parse(JSON.stringify(this.exports)):void 0,i.converts=this.converts?JSON.parse(JSON.stringify(this.converts)):void 0,i.idle=this.idle,__classPrivateFieldGet(this,et,"f").debug("getClone",{clonedModel:i}),i}clear(){__classPrivateFieldGet(this,et,"f").info("clear"),this.modificationDate=Date.now(),this.currentStroke=void 0,this.rawStrokes=[],this.positions.lastSentPosition=0,this.positions.lastReceivedPosition=0,this.exports=void 0,this.converts=void 0,this.idle=!0}}et=new WeakMap,Qe=new WeakSet,tt=function _Model_getStrokeFromPoint(i){__classPrivateFieldGet(this,et,"f").info("getStrokeFromPoint",{point:i});const isBetween=(i,s,n)=>i>=s&&i<=n,s=[];return this.rawStrokes.forEach((n=>{for(let a=0;a0&&(this.model.endCurrentStroke(s),this.updateModelRendering().then((i=>Object.assign(this.model,i))).catch((i=>this.internalEvent.emitError(i))));break;case"write":this.model.initCurrentStroke(s,i.pointerId,a,l),this.drawCurrentStroke();break;default:__classPrivateFieldGet(this,nt,"f").warn(`onPointerDown intention unknow: "${this.intention}"`)}}onPointerMove(i,s){switch(__classPrivateFieldGet(this,nt,"f").info("onPointerMove",{intention:this.intention,point:s}),this.intention){case"erase":this.model.removeStrokesFromPoint(s).length>0&&(this.model.endCurrentStroke(s),this.updateModelRendering().then((i=>Object.assign(__classPrivateFieldGet(this,st,"f"),i))).catch((i=>this.internalEvent.emitError(i))));break;case"write":this.model.appendToCurrentStroke(s),this.drawCurrentStroke();break;default:__classPrivateFieldGet(this,nt,"f").warn(`onPointerMove intention unknow: "${this.intention}"`)}}onPointerUp(i,s){switch(__classPrivateFieldGet(this,nt,"f").info("onPointerUp",{intention:this.intention,point:s}),this.intention){case"erase":this.model.removeStrokesFromPoint(s).length>0&&(this.model.endCurrentStroke(s),this.updateModelRendering().then((i=>Object.assign(__classPrivateFieldGet(this,st,"f"),i))).catch((i=>this.internalEvent.emitError(i))));break;case"write":this.model.endCurrentStroke(s),this.updateModelRendering().then((i=>Object.assign(__classPrivateFieldGet(this,st,"f"),i))).catch((i=>this.internalEvent.emitError(i)));break;default:__classPrivateFieldGet(this,nt,"f").warn(`onPointerUp intention unknow: "${this.intention}"`)}}drawCurrentStroke(){__classPrivateFieldGet(this,nt,"f").debug("drawCurrentStroke",{stroke:this.model.currentStroke}),this.renderer.drawPendingStroke(this.model.currentStroke)}updateModelRendering(){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,nt,"f").info("updateModelRendering"),this.renderer.drawModel(this.model);const i=new DeferredPromise;if(this.undoRedoManager.addModelToStack(this.model),"DEMAND"!==__classPrivateFieldGet(this,it,"f").triggers.exportContent){clearTimeout(__classPrivateFieldGet(this,ot,"f"));let s=this.model.getClone();__classPrivateFieldSet(this,ot,setTimeout((()=>__awaiter(this,void 0,void 0,(function*(){try{s=yield this.recognizer.export(s),this.undoRedoManager.updateModelInStack(s),this.model.modificationDate===s.modificationDate&&(this.model.exports=s.exports),i.resolve(this.model)}catch(s){__classPrivateFieldGet(this,nt,"f").error("updateModelRendering",{error:s}),i.reject(s)}}))),"QUIET_PERIOD"===__classPrivateFieldGet(this,it,"f").triggers.exportContent?__classPrivateFieldGet(this,it,"f").triggers.exportContentDelay:0),"f")}else i.resolve(this.model);return yield i.promise,this.internalEvent.emitExported(this.model.exports),__classPrivateFieldGet(this,nt,"f").debug("updateModelRendering",this.model.exports),i.promise}))}export(i){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,nt,"f").info("export",{mimeTypes:i});const s=yield this.recognizer.export(this.model.getClone(),i);return this.model.modificationDate===s.modificationDate&&this.model.mergeExport(s.exports),this.undoRedoManager.updateModelInStack(s),__classPrivateFieldGet(this,nt,"f").debug("export",this.model),this.model}))}convert(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,nt,"f").info("convert",{conversionState:i,requestedMimeTypes:s});const n=yield this.recognizer.convert(this.model,i,s);return Object.assign(__classPrivateFieldGet(this,st,"f"),n),__classPrivateFieldGet(this,nt,"f").debug("convert",this.model),this.model}))}resize(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,nt,"f").info("resize",{height:i,width:s});const n=new DeferredPromise;this.model.height=i,this.model.width=s,this.renderer.resize(this.model),this.model.rawStrokes.length?(clearTimeout(__classPrivateFieldGet(this,rt,"f")),__classPrivateFieldSet(this,rt,setTimeout((()=>__awaiter(this,void 0,void 0,(function*(){const i=yield this.recognizer.resize(this.model);n.resolve(i)}))),__classPrivateFieldGet(this,it,"f").triggers.resizeTriggerDelay),"f")):n.resolve(this.model);const a=yield n.promise;return __classPrivateFieldGet(this,nt,"f").debug("resize",{newModel:a}),this.internalEvent.emitExported(a.exports),a}))}undo(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,nt,"f").info("undo"),__classPrivateFieldSet(this,st,this.undoRedoManager.undo(),"f"),this.renderer.drawModel(__classPrivateFieldGet(this,st,"f")),__classPrivateFieldSet(this,st,yield this.recognizer.export(__classPrivateFieldGet(this,st,"f")),"f"),this.undoRedoManager.updateModelInStack(__classPrivateFieldGet(this,st,"f")),this.internalEvent.emitExported(__classPrivateFieldGet(this,st,"f").exports),__classPrivateFieldGet(this,nt,"f").debug("undo",__classPrivateFieldGet(this,st,"f")),__classPrivateFieldGet(this,st,"f")}))}redo(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,nt,"f").info("redo"),__classPrivateFieldSet(this,st,this.undoRedoManager.redo(),"f"),this.renderer.drawModel(__classPrivateFieldGet(this,st,"f")),__classPrivateFieldSet(this,st,yield this.recognizer.export(__classPrivateFieldGet(this,st,"f")),"f"),this.undoRedoManager.updateModelInStack(__classPrivateFieldGet(this,st,"f")),this.internalEvent.emitExported(__classPrivateFieldGet(this,st,"f").exports),__classPrivateFieldGet(this,nt,"f").debug("redo",__classPrivateFieldGet(this,st,"f")),__classPrivateFieldGet(this,st,"f")}))}clear(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,nt,"f").info("clear"),this.model.clear(),this.undoRedoManager.addModelToStack(this.model),this.renderer.drawModel(this.model),this.internalEvent.emitExported(this.model.exports),__classPrivateFieldGet(this,nt,"f").debug("clear",this.model),this.model}))}destroy(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,nt,"f").info("destroy"),this.grabber.detach(),this.renderer.destroy(),Promise.resolve()}))}}it=new WeakMap,st=new WeakMap,nt=new WeakMap,rt=new WeakMap,ot=new WeakMap;class WSRecognizer{constructor(i,s){at.set(this,LoggerManager.getLogger("RECOGNIZER")),this.pingCount=0,this.reconnectionCount=0,this.serverConfiguration=i,this.recognitionConfiguration=s;const n="https"===this.serverConfiguration.scheme?"wss":"ws";this.url=`${n}://${this.serverConfiguration.host}/api/v4.0/iink/document?applicationKey=${this.serverConfiguration.applicationKey}`,__classPrivateFieldGet(this,at,"f").info("constructor",{serverConfig:i,recognitionConfig:s,url:this.url})}get mimeTypes(){switch(this.recognitionConfiguration.type.toLocaleLowerCase()){case"text":return this.recognitionConfiguration.text.mimeTypes;case"math":return this.recognitionConfiguration.math.mimeTypes;case"diagram":return this.recognitionConfiguration.diagram.mimeTypes;default:return[]}}get internalEvent(){return InternalEvent.getInstance()}infinitePing(){this.pingCount++,this.serverConfiguration.websocket.maxPingLostCount{this.socket.readyState<=1&&(this.socket.send(JSON.stringify({type:"ping"})),this.infinitePing())}),this.serverConfiguration.websocket.pingDelay)}openCallback(){var i;null===(i=this.connected)||void 0===i||i.resolve();const s={type:this.sessionId?"restoreIInkSession":"newContentPackage",iinkSessionId:this.sessionId,applicationKey:this.serverConfiguration.applicationKey,xDpi:96,yDpi:96,viewSizeHeight:this.viewSizeHeight,viewSizeWidth:this.viewSizeWidth};isVersionSuperiorOrEqual(this.serverConfiguration.version,"2.0.4")&&(s["myscript-client-name"]="iink-ts",s["myscript-client-version"]="1.0.0-buildVersion"),this.send(s)}rejectDeferredPending(i){var s,n,a,l,d,c,h,v,u,p,_,g,f,m,P,y,S,w,G,x;(null===(s=this.connected)||void 0===s?void 0:s.isPending)&&(null===(n=this.connected)||void 0===n||n.reject(i)),(null===(a=this.initialized)||void 0===a?void 0:a.isPending)&&(null===(l=this.initialized)||void 0===l||l.reject(i)),(null===(d=this.addStrokeDeferred)||void 0===d?void 0:d.isPending)&&(null===(c=this.addStrokeDeferred)||void 0===c||c.reject(i)),(null===(h=this.exportDeferred)||void 0===h?void 0:h.isPending)&&(null===(v=this.exportDeferred)||void 0===v||v.reject(i)),(null===(u=this.convertDeferred)||void 0===u?void 0:u.isPending)&&(null===(p=this.convertDeferred)||void 0===p||p.reject(i)),(null===(_=this.importDeferred)||void 0===_?void 0:_.isPending)&&(null===(g=this.importDeferred)||void 0===g||g.reject(i)),(null===(f=this.resizeDeferred)||void 0===f?void 0:f.isPending)&&(null===(m=this.resizeDeferred)||void 0===m||m.reject(i)),(null===(P=this.undoDeferred)||void 0===P?void 0:P.isPending)&&(null===(y=this.undoDeferred)||void 0===y||y.reject(i)),(null===(S=this.redoDeferred)||void 0===S?void 0:S.isPending)&&(null===(w=this.redoDeferred)||void 0===w||w.reject(i)),(null===(G=this.clearDeferred)||void 0===G?void 0:G.isPending)&&this.clearDeferred.reject(i),(null===(x=this.waitForIdleDeferred)||void 0===x?void 0:x.isPending)&&this.waitForIdleDeferred.reject(i)}closeCallback(i){let s="";if(!this.currentErrorCode)switch(i.code){case 1e3:break;case 1001:s=y.GOING_AWAY;break;case 1002:s=y.PROTOCOL_ERROR;break;case 1003:s=y.UNSUPPORTED_DATA;break;case 1006:s=y.ABNORMAL_CLOSURE;break;case 1007:s=y.INVALID_FRAME_PAULOAD;break;case 1008:s=y.POLICY_VIOLATION;break;case 1009:s=y.MESSAGE_TOO_BIG;break;case 1011:s=y.INTERNAL_ERROR;break;case 1012:s=y.SERVICE_RESTART;break;case 1013:s=y.TRY_AGAIN;break;case 1014:s=y.BAD_GATEWAY;break;case 1015:s=y.TLS_HANDSHAKE;break;default:__classPrivateFieldGet(this,at,"f").warn("closeCallback unknow CloseEvent.code",{evt:i}),s=y.CANT_ESTABLISH}const n=new Error(s||i.reason);this.rejectDeferredPending(n),this.currentErrorCode||1e3===i.code||this.internalEvent.emitError(n)}manageHMACChallengeMessage(i){__classPrivateFieldGet(this,at,"f").info("manageHMACChallengeMessage",{websocketMessage:i});const s=i;s.hmacChallenge&&this.send({type:"hmac",hmac:computeHmac(s.hmacChallenge,this.serverConfiguration.applicationKey,this.serverConfiguration.hmacKey)}),s.iinkSessionId&&(this.sessionId=s.iinkSessionId)}manageContentPackageDescriptionMessage(){this.reconnectionCount=0,__classPrivateFieldGet(this,at,"f").info("manageContentPackageDescriptionMessage"),this.send(Object.assign(Object.assign({},this.recognitionConfiguration),{type:"configuration"})),this.currentPartId?this.send({type:"openContentPart",id:this.currentPartId,mimeTypes:this.mimeTypes}):this.send({type:"newContentPart",contentType:this.recognitionConfiguration.type,mimeTypes:this.mimeTypes})}managePartChangeMessage(i){var s;__classPrivateFieldGet(this,at,"f").info("managePartChangeMessage",{websocketMessage:i});const n=i;this.currentPartId=n.partId,null===(s=this.initialized)||void 0===s||s.resolve()}manageExportMessage(i){var s,n,a,l,d,c,h,v,u;__classPrivateFieldGet(this,at,"f").info("manageExportMessage",{websocketMessage:i});const p=i;p.exports["application/vnd.myscript.jiix"]&&(p.exports["application/vnd.myscript.jiix"]=JSON.parse(p.exports["application/vnd.myscript.jiix"].toString())),null===(s=this.initialized)||void 0===s||s.resolve(),null===(n=this.addStrokeDeferred)||void 0===n||n.resolve(p.exports),null===(a=this.exportDeferred)||void 0===a||a.resolve(p.exports),null===(l=this.convertDeferred)||void 0===l||l.resolve(p.exports),null===(d=this.importDeferred)||void 0===d||d.resolve(p.exports),null===(c=this.undoDeferred)||void 0===c||c.resolve(p.exports),null===(h=this.redoDeferred)||void 0===h||h.resolve(p.exports),null===(v=this.clearDeferred)||void 0===v||v.resolve(p.exports),null===(u=this.importPointEventsDeferred)||void 0===u||u.resolve(p.exports),this.internalEvent.emitExported(p.exports)}manageWaitForIdle(){var i;return __awaiter(this,void 0,void 0,(function*(){this.internalEvent.emitIdle(!0),null===(i=this.waitForIdleDeferred)||void 0===i||i.resolve()}))}manageErrorMessage(i){var s,n;const a=i;this.currentErrorCode=(null===(s=a.data)||void 0===s?void 0:s.code)||a.code;let l=(null===(n=a.data)||void 0===n?void 0:n.message)||a.message||y.UNKNOW;switch(this.currentErrorCode){case"no.activity":l=y.NO_ACTIVITY;break;case"access.not.granted":l=y.WRONG_CREDENTIALS;break;case"session.too.old":l=y.TOO_OLD}const d=new Error(l);this.rejectDeferredPending(d),this.internalEvent.emitError(d)}manageContentChangeMessage(i){__classPrivateFieldGet(this,at,"f").info("manageContentChangeMessage",{websocketMessage:i});const s=i,n={canRedo:s.canRedo,canUndo:s.canUndo,empty:s.empty,stackIndex:s.undoStackIndex,possibleUndoCount:s.possibleUndoCount,stack:[]};this.internalEvent.emitContextChange(n)}manageSVGPatchMessage(i){var s;__classPrivateFieldGet(this,at,"f").info("manageSVGPatchMessage",{websocketMessage:i}),null===(s=this.resizeDeferred)||void 0===s||s.resolve();const n=i;this.internalEvent.emitSVGPatch(n)}messageCallback(i){var s;__classPrivateFieldGet(this,at,"f").debug("messageCallback",{message:i}),this.currentErrorCode=void 0;const n=JSON.parse(i.data);if("pong"!==n.type)switch(this.pingCount=0,n.type){case"ack":this.manageHMACChallengeMessage(n);break;case"contentPackageDescription":this.manageContentPackageDescriptionMessage();break;case"partChanged":this.managePartChangeMessage(n);break;case"newPart":null===(s=this.initialized)||void 0===s||s.resolve();break;case"contentChanged":this.manageContentChangeMessage(n);break;case"exported":this.manageExportMessage(n);break;case"svgPatch":this.manageSVGPatchMessage(n);break;case"error":this.manageErrorMessage(n);break;case"idle":this.manageWaitForIdle();break;default:__classPrivateFieldGet(this,at,"f").warn("messageCallback",`Message type unknow: "${n.type}".`)}}init(i,s){var n,a;return __awaiter(this,void 0,void 0,(function*(){try{return __classPrivateFieldGet(this,at,"f").info("init",{height:i,width:s}),this.destroy(),this.connected=new DeferredPromise,this.initialized=new DeferredPromise,this.viewSizeHeight=i,this.viewSizeWidth=s,this.pingCount=0,this.socket=new WebSocket(this.url),this.serverConfiguration.websocket.pingEnabled&&this.infinitePing(),this.socket.addEventListener("open",this.openCallback.bind(this)),this.socket.addEventListener("close",this.closeCallback.bind(this)),this.socket.addEventListener("message",this.messageCallback.bind(this)),this.initialized.promise}catch(i){const s=new Error(y.CANT_ESTABLISH);return this.internalEvent.emitError(s),null===(n=this.initialized)||void 0===n||n.reject(s),null===(a=this.initialized)||void 0===a?void 0:a.promise}}))}send(i){return __awaiter(this,void 0,void 0,(function*(){return this.connected?(yield this.connected.promise,this.socket.readyState===this.socket.OPEN?(__classPrivateFieldGet(this,at,"f").debug("send",{message:i}),this.socket.send(JSON.stringify(i)),Promise.resolve()):this.socket.readyState!=this.socket.CONNECTING&&this.serverConfiguration.websocket.autoReconnect?(this.reconnectionCount++,this.serverConfiguration.websocket.maxRetryCount>=this.reconnectionCount?(__classPrivateFieldGet(this,at,"f").debug("send",`try to reconnect number: ${this.reconnectionCount}.`),this.internalEvent.emitClearMessage(),yield this.init(this.viewSizeHeight,this.viewSizeWidth),yield this.setPenStyle(this.penStyle),yield this.setPenStyleClasses(this.penStyleClasses),yield this.setTheme(this.theme),this.send(i)):Promise.reject(new Error("Unable to send message. The maximum number of connection attempts has been reached."))):void 0):Promise.reject(new Error("Recognizer must be initilized"))}))}addStrokes(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,at,"f").info("addStrokes",{strokes:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.addStrokeDeferred=new DeferredPromise,0===i.length?this.addStrokeDeferred.resolve({}):yield this.send({type:"addStrokes",strokes:i.map(convertStrokeToJSON)}),null===(n=this.addStrokeDeferred)||void 0===n?void 0:n.promise}))}setPenStyle(i){var s;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,at,"f").info("setPenStyle",{penStyle:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.penStyle=i;const n={type:"setPenStyle",style:Ne.penStyleToCSS(i)};return this.send(n)}))}setPenStyleClasses(i){var s;return __awaiter(this,void 0,void 0,(function*(){yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.penStyleClasses=i,__classPrivateFieldGet(this,at,"f").info("setPenStyleClasses",{penStyleClasses:i});const n={type:"setPenStyleClasses",styleClasses:i};return this.send(n)}))}setTheme(i){var s;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,at,"f").info("setTheme",{theme:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.theme=i;const n={type:"setTheme",theme:Ne.themeToCSS(i)};return this.send(n)}))}export(i,s){var n,a;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,at,"f").info("export",{model:i,requestedMimeTypes:s}),yield null===(n=this.initialized)||void 0===n?void 0:n.promise,this.exportDeferred=new DeferredPromise;const l=i.getClone();let d=s||[];if(!d.length)switch(this.recognitionConfiguration.type){case"DIAGRAM":d=this.recognitionConfiguration.diagram.mimeTypes;break;case"MATH":d=this.recognitionConfiguration.math.mimeTypes;break;case"Raw Content":d=["application/vnd.myscript.jiix"];break;case"TEXT":d=this.recognitionConfiguration.text.mimeTypes;break;default:throw new Error(`Recognition type "${this.recognitionConfiguration.type}" is unknown.\n Possible types are:\n -DIAGRAM\n -MATH\n -Raw Content\n -TEXT`)}if(!d.length)return Promise.reject(new Error(`Export failed, no mimeTypes define in recognition ${this.recognitionConfiguration.type} configuration`));const c={type:"export",partId:this.currentPartId,mimeTypes:d};yield this.send(c);const h=yield null===(a=this.exportDeferred)||void 0===a?void 0:a.promise;return l.updatePositionReceived(),l.mergeExport(h),__classPrivateFieldGet(this,at,"f").debug("export",{model:l}),l}))}import(i,s,n){var a,l;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,at,"f").info("import",{data:s,mimeType:n}),yield null===(a=this.initialized)||void 0===a?void 0:a.promise;const d=i.getClone(),c=this.serverConfiguration.websocket.fileChunkSize,h=Math.random().toString(10).substring(2,6);this.importDeferred=new DeferredPromise;const readBlob=i=>{const s=new FileReader;return new Promise(((n,a)=>{s.onloadend=i=>{var s;return n(null===(s=i.target)||void 0===s?void 0:s.result)},s.onerror=()=>a(),s.readAsText(i)}))},v={type:"importFile",importFileId:h,mimeType:n};yield this.send(v);for(let i=0;is.size};yield this.send(a)}const u=yield null===(l=this.importDeferred)||void 0===l?void 0:l.promise;return this.importDeferred=void 0,d.mergeExport(u),d}))}resize(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,at,"f").info("resize",{model:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.resizeDeferred=new DeferredPromise;const a=i.getClone();this.viewSizeHeight=a.height,this.viewSizeWidth=a.width;const l={type:"changeViewSize",height:this.viewSizeHeight,width:this.viewSizeWidth};return yield this.send(l),yield null===(n=this.resizeDeferred)||void 0===n?void 0:n.promise,a}))}importPointEvents(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,at,"f").info("importPointsEvents",{strokes:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.importPointEventsDeferred=new DeferredPromise;const a={type:"pointerEvents",events:i.map(convertStrokeToJSON)};this.send(a);const l=yield null===(n=this.importPointEventsDeferred)||void 0===n?void 0:n.promise;return this.importPointEventsDeferred=void 0,__classPrivateFieldGet(this,at,"f").debug("importPointEvents",{exportPoints:l}),l}))}convert(i,s){var n,a;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,at,"f").info("convert",{model:i,conversionState:s}),yield null===(n=this.initialized)||void 0===n?void 0:n.promise,this.convertDeferred=new DeferredPromise;const l=i.getClone(),d={type:"convert",conversionState:s};yield this.send(d);const c=yield null===(a=this.convertDeferred)||void 0===a?void 0:a.promise;return l.updatePositionReceived(),l.mergeConvert(c),l.mergeExport(c),__classPrivateFieldGet(this,at,"f").debug("convert",{model:l}),l}))}waitForIdle(){var i,s;return __awaiter(this,void 0,void 0,(function*(){yield null===(i=this.initialized)||void 0===i?void 0:i.promise,this.waitForIdleDeferred=new DeferredPromise;return yield this.send({type:"waitForIdle"}),null===(s=this.waitForIdleDeferred)||void 0===s?void 0:s.promise}))}undo(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,at,"f").info("undo",{model:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise;const a=i.getClone();this.undoDeferred=new DeferredPromise;yield this.send({type:"undo"});const l=yield null===(n=this.undoDeferred)||void 0===n?void 0:n.promise;return a.updatePositionReceived(),a.mergeExport(l),__classPrivateFieldGet(this,at,"f").debug("undo",{model:a}),this.undoDeferred=void 0,a}))}redo(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,at,"f").info("redo",{model:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise;const a=i.getClone();this.redoDeferred=new DeferredPromise;yield this.send({type:"redo"});const l=yield null===(n=this.redoDeferred)||void 0===n?void 0:n.promise;return a.updatePositionReceived(),a.mergeExport(l),__classPrivateFieldGet(this,at,"f").debug("redo",{model:l}),this.redoDeferred=void 0,a}))}clear(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,at,"f").info("clear",{model:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise;const a=i.getClone();a.modificationDate=Date.now(),this.clearDeferred=new DeferredPromise;yield this.send({type:"clear"});const l=yield null===(n=this.clearDeferred)||void 0===n?void 0:n.promise;return a.updatePositionReceived(),a.mergeExport(l),this.clearDeferred=void 0,__classPrivateFieldGet(this,at,"f").info("clear",{model:a}),a}))}close(i,s){this.socket.readyState!==this.socket.OPEN&&this.socket.readyState!==this.socket.CONNECTING||(__classPrivateFieldGet(this,at,"f").info("close",{code:i,reason:s}),this.socket.removeEventListener("close",this.closeCallback),this.socket.removeEventListener("message",this.messageCallback),this.socket.removeEventListener("open",this.openCallback),this.socket.close(i,s))}destroy(){__classPrivateFieldGet(this,at,"f").info("destroy"),this.connected=void 0,this.initialized=void 0,this.addStrokeDeferred=void 0,this.exportDeferred=void 0,this.convertDeferred=void 0,this.importDeferred=void 0,this.resizeDeferred=void 0,this.undoDeferred=void 0,this.redoDeferred=void 0,this.clearDeferred=void 0,this.socket&&(this.socket.removeEventListener("close",this.closeCallback),this.socket.removeEventListener("message",this.messageCallback),this.socket.removeEventListener("open",this.openCallback),this.close(1e3,"Recognizer destroyed"))}}at=new WeakMap;class SVGStroker{getArcPath(i,s){return[`M ${i.x},${i.y}`,`m ${-s},0`,`a ${s},${s} 0 1 0 ${2*s},0`,`a ${s},${s} 0 1 0 ${-2*s},0`].join(" ")}getLinePath(i,s,n){const a=computeLinksPoints(i,computeAxeAngle(i,s),n),l=computeLinksPoints(s,computeAxeAngle(i,s),n);return[`M ${a[0].x},${a[0].y}`,`L ${l[0].x},${l[0].y}`,`L ${l[1].x},${l[1].y}`,`L ${a[1].x},${a[1].y}`].join(" ")}getFinalPath(i,s,n){const a=computeAxeAngle(i,s),l=computeLinksPoints(s,a,n),d=[`M ${l[0].x},${l[0].y}`];for(let i=1;i<=6;i++){const l=a-i*(Math.PI/6);d.push(`L ${s.x-s.p*n*Math.sin(l)},${s.y+s.p*n*Math.cos(l)}`)}return d.join(" ")}getQuadraticPath(i,s,n,a){const l=computeLinksPoints(i,computeAxeAngle(i,n),a),d=computeLinksPoints(s,computeAxeAngle(n,s),a),c=computeLinksPoints(n,computeAxeAngle(i,s),a);return[`M ${l[0].x},${l[0].y}`,`Q ${c[0].x},${c[0].y} ${d[0].x},${d[0].y}`,`L ${d[1].x},${d[1].y}`,`Q ${c[1].x},${c[1].y} ${l[1].x},${l[1].y}`].join(" ")}buildSVGPath(i){const s=i.pointers.length,n=i.style.width,a=s-2,l=i.pointers[0],d=[];if(s<3)d.push(this.getArcPath(l,.6*n));else{d.push(this.getArcPath(l,n*l.p)),d.push(this.getLinePath(l,computeMiddlePoint(l,i.pointers[1]),n));for(let s=0;s{a.setAttribute(i.name,i.value)}));const l=this.buildSVGPath(s);a.setAttribute("d",`${l}Z`),i.appendChild(a)}}class WSSVGRenderer{constructor(i){lt.add(this),dt.set(this,LoggerManager.getLogger("RENDERER")),__classPrivateFieldGet(this,dt,"f").info("constructor",{config:i}),this.config=i,this.stroker=new SVGStroker}init(i){__classPrivateFieldGet(this,dt,"f").info("init",{element:i}),i.style.fontSize="10px",this.context={parent:i}}updateLayer(i,s){switch(__classPrivateFieldGet(this,dt,"f").info("updateLayer",{layerName:i,update:s}),s.type){case"REPLACE_ALL":__classPrivateFieldGet(this,lt,"m",ht).call(this,i,s);break;case"REPLACE_ELEMENT":__classPrivateFieldGet(this,lt,"m",vt).call(this,s);break;case"APPEND_CHILD":__classPrivateFieldGet(this,lt,"m",ut).call(this,i,s);break;case"REMOVE_ELEMENT":__classPrivateFieldGet(this,lt,"m",_t).call(this,s);break;case"REMOVE_CHILD":__classPrivateFieldGet(this,lt,"m",pt).call(this,s);break;case"INSERT_BEFORE":__classPrivateFieldGet(this,lt,"m",gt).call(this,s);break;case"SET_ATTRIBUTE":__classPrivateFieldGet(this,lt,"m",ft).call(this,s);break;case"REMOVE_ATTRIBUTE":__classPrivateFieldGet(this,lt,"m",mt).call(this,s);break;default:__classPrivateFieldGet(this,dt,"f").warn("updateLayer Default",{layerName:i,update:s})}}updatesLayer(i,s){__classPrivateFieldGet(this,dt,"f").info("updatesLayer",{layerName:i,updates:s}),s.forEach((s=>this.updateLayer(i,s))),this.clearPendingStroke()}clearPendingStroke(){__classPrivateFieldGet(this,dt,"f").info("clearPendingStroke",{});const i=this.context.parent.querySelector("#pendingStrokes");i&&(i.innerHTML="")}drawPendingStroke(i){if(__classPrivateFieldGet(this,dt,"f").info("drawPendingStroke",{stroke:i}),i){const s=this.context.parent.querySelector("#pendingStrokes");if(s){const n=s.querySelector(`#${null==i?void 0:i.id}`);n&&n.remove(),__classPrivateFieldGet(this,lt,"m",ct).call(this,s,i)}}}clearErasingStrokes(){this.context.parent.querySelectorAll("[type=eraser]").forEach((i=>{i.remove()}))}resize(i){__classPrivateFieldGet(this,dt,"f").info("resize",{model:i});const s=this.context.parent.getBoundingClientRect(),n=this.context.parent.querySelectorAll("svg"),a=Math.max(s.width,i.width),l=Math.max(s.height,i.height);n.forEach((i=>{i.setAttribute("viewBox",`0 0 ${a}, ${l}`),i.setAttribute("width",`${a}px`),i.setAttribute("height",`${l}px`)}))}destroy(){var i;__classPrivateFieldGet(this,dt,"f").info("destroy",{context:this.context}),(null===(i=this.context)||void 0===i?void 0:i.parent)&&this.context.parent.querySelectorAll("svg").forEach((i=>i.remove()))}}dt=new WeakMap,lt=new WeakSet,ct=function _WSSVGRenderer_drawStroke(i,s){let n;"eraser"===s.pointerType?(s.style.width=20,n="fill:grey;stroke:transparent;shadowBlur:5;opacity:0.2;"):n=`fill:${s.style.color};stroke:transparent;`,this.stroker.drawStroke(i,s,[{name:"style",value:n}])},ht=function _WSSVGRenderer_replaceAll(i,s){const n=this.context.parent.querySelector(`svg[data-layer="${i}"]`);null==n||n.remove(),this.context.parent.insertAdjacentHTML("beforeend",s.svg);const a=this.context.parent.querySelector(`svg[data-layer="${i}"]`);if("MODEL"===i){const i=document.createElementNS("http://www.w3.org/2000/svg","g");i.id="pendingStrokes",a.appendChild(i)}},vt=function _WSSVGRenderer_replaceElement(i){const s=this.context.parent.querySelector(`#${i.id}`);if(s){const n=s.parentNode;null==s||s.remove(),null==n||n.insertAdjacentHTML("beforeend",i.svg)}},ut=function _WSSVGRenderer_appendChild(i,s){const n=s.parentId?`#${s.parentId}`:`svg[data-layer="${i}"]`,a=this.context.parent.querySelector(n);null==a||a.insertAdjacentHTML("beforeend",s.svg)},pt=function _WSSVGRenderer_removeChild(i){var s;null===(s=this.context.parent.querySelector(`#${i.parentId} > *:nth-child(${i.index+1})`))||void 0===s||s.remove()},_t=function _WSSVGRenderer_removeElement(i){const s=this.context.parent.querySelector(`#${i.id}`);s&&(i.id.includes("s")||i.id.includes("MODEL")?s.remove():(s.setAttribute("class","removed-stroke"),setTimeout((()=>{null==s||s.remove()}),100)))},gt=function _WSSVGRenderer_insertBefore(i){const s=this.context.parent.querySelector(`#${i.refId}`);null==s||s.insertAdjacentHTML("beforebegin",i.svg)},ft=function _WSSVGRenderer_setAttribute(i){const s=i.id?`#${i.id}`:"svg",n=this.context.parent.querySelector(s);null==n||n.setAttribute(i.name,i.value)},mt=function _WSSVGRenderer_removeAttribute(i){const s=i.id?`#${i.id}`:"svg",n=this.context.parent.querySelector(s);null==n||n.removeAttribute(i.name)};var yt,St,wt,Ft,Gt=Object.freeze({__proto__:null,UndoRedoContext:UndoRedoContext,UndoRedoManager:UndoRedoManager});class WSBehaviors{constructor(i){this.name="WSBehaviors",yt.set(this,void 0),St.set(this,void 0),wt.set(this,LoggerManager.getLogger("BEHAVIORS")),Ft.set(this,void 0),this.onSVGPatch=i=>{__classPrivateFieldGet(this,wt,"f").info("onSVGPatch",{evt:i}),this.renderer.updatesLayer(i.layer,i.updates)},__classPrivateFieldGet(this,wt,"f").info("constructor",{options:i}),this.options=i,__classPrivateFieldSet(this,yt,new Configuration(null==i?void 0:i.configuration),"f"),this.styleManager=new StyleManager(i.penStyle,i.theme),this.grabber=new PointerEventGrabber(__classPrivateFieldGet(this,yt,"f").grabber),this.renderer=new WSSVGRenderer(__classPrivateFieldGet(this,yt,"f").rendering),this.recognizer=new WSRecognizer(__classPrivateFieldGet(this,yt,"f").server,__classPrivateFieldGet(this,yt,"f").recognition),this.intention="write",__classPrivateFieldSet(this,St,new Model,"f"),this.undoRedoManager=new UndoRedoManager(__classPrivateFieldGet(this,yt,"f")["undo-redo"],this.model)}get internalEvent(){return InternalEvent.getInstance()}get model(){return __classPrivateFieldGet(this,St,"f")}get context(){return this.undoRedoManager.context}get configuration(){return __classPrivateFieldGet(this,yt,"f")}get currentPenStyle(){return this.styleManager.currentPenStyle}get penStyle(){return this.styleManager.penStyle}setPenStyle(i){return __classPrivateFieldGet(this,wt,"f").info("setPenStyle",{penStyle:i}),this.styleManager.setPenStyle(i),__classPrivateFieldGet(this,wt,"f").debug("setPenStyle",this.styleManager.penStyle),this.recognizer.setPenStyle(this.styleManager.penStyle)}get penStyleClasses(){return this.styleManager.penStyleClasses}setPenStyleClasses(i){return __classPrivateFieldGet(this,wt,"f").info("setPenStyleClasses",{penClass:i}),this.styleManager.setPenStyleClasses(i),__classPrivateFieldGet(this,wt,"f").debug("setPenStyleClasses",this.styleManager.penStyleClasses),this.recognizer.setPenStyleClasses(this.styleManager.penStyleClasses)}get theme(){return this.styleManager.theme}setTheme(i){return __classPrivateFieldGet(this,wt,"f").info("setTheme",{theme:i}),this.styleManager.setTheme(i),__classPrivateFieldGet(this,wt,"f").debug("setTheme",this.styleManager.theme),this.recognizer.setTheme(this.styleManager.theme)}init(i){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,wt,"f").info("init",{domElement:i});const s=window.getComputedStyle(i);this.model.width=Math.max(parseInt(s.width.replace("px","")),__classPrivateFieldGet(this,yt,"f").rendering.minWidth),this.model.height=Math.max(parseInt(s.height.replace("px","")),__classPrivateFieldGet(this,yt,"f").rendering.minHeight),this.undoRedoManager.updateModelInStack(this.model),this.renderer.init(i),this.grabber.attach(i),this.grabber.onPointerDown=this.onPointerDown.bind(this),this.grabber.onPointerMove=this.onPointerMove.bind(this),this.grabber.onPointerUp=this.onPointerUp.bind(this),this.internalEvent.addSVGPatchListener(this.onSVGPatch),yield this.recognizer.init(this.model.height,this.model.width),yield this.setPenStyle(this.penStyle),yield this.setTheme(this.theme),yield this.setPenStyleClasses(this.penStyleClasses)}))}onPointerDown(i,s){var n;__classPrivateFieldGet(this,wt,"f").info("onPointerDown",{intention:this.intention,evt:i,point:s});let{pointerType:a}=i;const l=Object.assign({},null===(n=this.theme)||void 0===n?void 0:n.ink,this.currentPenStyle);"erase"===this.intention&&(a="eraser"),this.model.initCurrentStroke(s,i.pointerId,a,l),this.drawCurrentStroke()}onPointerMove(i,s){__classPrivateFieldGet(this,wt,"f").info("onPointerMove",{intention:this.intention,point:s}),this.model.appendToCurrentStroke(s),this.drawCurrentStroke()}onPointerUp(i,s){return __awaiter(this,void 0,void 0,(function*(){try{__classPrivateFieldGet(this,wt,"f").info("onPointerUp",{intention:this.intention,point:s}),this.model.endCurrentStroke(s),yield this.updateModelRendering()}catch(i){this.internalEvent.emitError(i)}}))}drawCurrentStroke(){__classPrivateFieldGet(this,wt,"f").debug("drawCurrentStroke",{stroke:this.model.currentStroke});const i=this.model.currentStroke;i&&this.renderer.drawPendingStroke(i)}updateModelRendering(){return __awaiter(this,void 0,void 0,(function*(){if(__classPrivateFieldGet(this,wt,"f").info("updateModelRendering"),"DEMAND"!==__classPrivateFieldGet(this,yt,"f").triggers.exportContent){const i=this.model.extractUnsentStrokes();this.model.updatePositionSent(),this.undoRedoManager.addModelToStack(this.model),this.renderer.clearErasingStrokes();const s=yield this.recognizer.addStrokes(i);this.model.mergeExport(s),this.undoRedoManager.updateModelInStack(this.model)}return __classPrivateFieldGet(this,wt,"f").debug("updateModelRendering",this.model),this.model}))}waitForIdle(){return __awaiter(this,void 0,void 0,(function*(){return this.recognizer.waitForIdle()}))}importPointEvents(i){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,wt,"f").info("importPointEvents",{strokes:i});const s=yield this.recognizer.importPointEvents(i);return this.model.mergeExport(s),__classPrivateFieldGet(this,wt,"f").debug("importPointEvents",this.model),this.model}))}export(i){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,wt,"f").info("export",{mimeTypes:i});try{if("DEMAND"===__classPrivateFieldGet(this,yt,"f").triggers.exportContent){const i=this.model.extractUnsentStrokes();this.model.updatePositionSent();const s=yield this.recognizer.addStrokes(i);return this.model.updatePositionReceived(),this.model.mergeExport(s),__classPrivateFieldGet(this,wt,"f").debug("export",this.model),this.model}return this.recognizer.export(this.model,i)}catch(i){return __classPrivateFieldGet(this,wt,"f").error("export",{error:i}),this.internalEvent.emitError(i),Promise.reject(i)}}))}convert(i){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,wt,"f").info("convert",{conversionState:i}),this.undoRedoManager.addModelToStack(this.model),this.context.stack.push(this.model.getClone()),__classPrivateFieldSet(this,St,yield this.recognizer.convert(this.model,i),"f"),__classPrivateFieldGet(this,wt,"f").debug("convert",this.model),this.undoRedoManager.addModelToStack(this.model),this.model}))}import(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,wt,"f").info("import",{data:i,mimeType:s}),this.context.stack.push(this.model.getClone());const n=yield this.recognizer.import(this.model,i,s);return this.undoRedoManager.addModelToStack(n),n}))}resize(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,wt,"f").info("resize",{height:i,width:s});const n=new DeferredPromise;this.model.height=i,this.model.width=s;const a=this.model.getClone();return this.renderer.resize(a),clearTimeout(__classPrivateFieldGet(this,Ft,"f")),__classPrivateFieldSet(this,Ft,setTimeout((()=>__awaiter(this,void 0,void 0,(function*(){try{const i=yield this.recognizer.resize(a);n.resolve(i)}catch(a){__classPrivateFieldGet(this,wt,"f").error("resize",{height:i,width:s,error:a}),n.reject(a)}}))),__classPrivateFieldGet(this,yt,"f").triggers.resizeTriggerDelay),"f"),__classPrivateFieldSet(this,St,yield n.promise,"f"),this.internalEvent.emitExported(this.model.exports),__classPrivateFieldGet(this,wt,"f").debug("resize",this.model),this.model}))}undo(){return __awaiter(this,void 0,void 0,(function*(){if(__classPrivateFieldGet(this,wt,"f").info("undo"),this.context.canUndo)return __classPrivateFieldSet(this,St,this.undoRedoManager.undo(),"f"),this.recognizer.undo(this.model);throw new Error("Undo not allowed")}))}redo(){return __awaiter(this,void 0,void 0,(function*(){if(__classPrivateFieldGet(this,wt,"f").info("redo"),this.context.canRedo)return __classPrivateFieldSet(this,St,this.undoRedoManager.redo(),"f"),__classPrivateFieldGet(this,wt,"f").debug("undo",__classPrivateFieldGet(this,St,"f")),this.recognizer.redo(this.model);throw new Error("Redo not allowed")}))}clear(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,wt,"f").info("clear"),this.model.clear(),this.undoRedoManager.addModelToStack(this.model),this.recognizer.clear(this.model)}))}destroy(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,wt,"f").info("destroy"),this.grabber.detach(),this.renderer.destroy(),this.recognizer.destroy(),Promise.resolve()}))}}yt=new WeakMap,St=new WeakMap,wt=new WeakMap,Ft=new WeakMap;var xt,bt,Et,Ct,kt,Mt,Tt,Lt,It,Dt,At,Rt,Nt,Ot,Wt,zt,jt,Ht,Bt;!function styleInject(i,s){void 0===s&&(s={});var n=s.insertAt;if(i&&"undefined"!=typeof document){var a=document.head||document.getElementsByTagName("head")[0],l=document.createElement("style");l.type="text/css","top"===n&&a.firstChild?a.insertBefore(l,a.firstChild):a.appendChild(l),l.styleSheet?l.styleSheet.cssText=i:l.appendChild(document.createTextNode(i))}}('.ms-editor {\n position: relative;\n z-index: 10;\n color: #1A9FFF;\n font-family: sans-serif;\n}\n\n.ms-editor.erasing {\n cursor: url(\'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEsSURBVDiNrdO7SgNBFMbx/3fmCbQ1tunDIayFBvFSKxbxBfSdBPEBtLIWb3Ebl4R9AQWLkE70CWbHZl1Eg2iSr5vL+c1hhhFTMhwOdyX1gQ2gVU+PgTyldNHtdq+/1+jroCiKtpmdSupNO6ApkgZmdtzpdJ5+QGVZ9qqqugSWfkO+5F3SnrvnDVQURTuE8PgP5DNvkjJ3fzaAEMLJDAjAclVVZwCqL/ZqBqSJme2YpMN5EIAYY9+A9XkhST0DVuaFgJYtAAGoDJgsAJoYkM+rSHqwlNL5Ajq6EMBoNLoBtmbsZuDumwYQYzwCXmdw3oAjAAPIsuxF0kG98GdE0r67PzcQgLvnIYQ14P4PyF39WZuH0rRdZVluxxj7kjaA1Xp6nFLKzezc3W+/13wAItdV6XjME1AAAAAASUVORK5CYII=\') 10 10, auto;\n}\n\n.ms-editor canvas,\n.ms-editor svg {\n z-index: 20;\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n width: 100%;\n}\n\n.ms-editor canvas.ms-rendering-canvas {\n z-index: 9;\n pointer-events: none;\n background-image: linear-gradient(to right, #F5F6F7 1px, transparent 1px), linear-gradient(to bottom, #F5F6F7 1px, transparent 1px);\n background-size: 18px 18px;\n}\n\n.ms-editor .loader {\n z-index: 30;\n position: absolute;\n width: 120px;\n height: 120px;\n top: calc(50% - 60px);\n left: calc(50% - 60px);\n border: 16px solid #F5F6F7;\n border-radius: 50%;\n border-top-color: #1A9FFF;\n -webkit-animation: spin 2s linear infinite;\n animation: spin 2s linear infinite;\n}\n\n.ms-editor .message {\n z-index: 25;\n position: absolute;\n width: 300px;\n max-height: calc(25%);\n min-height: 200px;\n top: calc(50% - 100px);\n left: calc(50% - 150px);\n font-size: 16px;\n text-align: center;\n word-wrap: break-word;\n}\n\n.ms-editor .message.error-msg::before {\n content: url("data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCA3Ni41IDYxMiA0NTkiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWluIG1lZXQiPgogICAgPHBhdGggZmlsbD0iIzFBOUZGRiIgZD0iTTQ5NC43LDIyOS41Yy0xNy44NTEtODYuNy05NC4zNTEtMTUzLTE4OC43LTE1M2MtMzguMjUsMC03My45NSwxMC4yLTEwMiwzMC42bDM4LjI1LDM4LjI1IGMxNy44NS0xMi43NSw0MC44LTE3Ljg1LDYzLjc1LTE3Ljg1Yzc2LjUsMCwxNDAuMjUsNjMuNzUsMTQwLjI1LDE0MC4yNXYxMi43NWgzOC4yNWM0My4zNSwwLDc2LjUsMzMuMTUsNzYuNSw3Ni41IGMwLDI4LjA1LTE1LjMsNTMuNTUtNDAuOCw2Ni4zbDM4LjI1LDM4LjI1QzU5MS42LDQzOC42LDYxMiw0MDAuMzUsNjEyLDM1N0M2MTIsMjkwLjcsNTU4LjQ1LDIzNC42LDQ5NC43LDIyOS41eiBNNzYuNSwxMDkuNjUgbDcxLjQsNjguODVDNjYuMywxODMuNiwwLDI0OS45LDAsMzMxLjVjMCw4NC4xNSw2OC44NSwxNTMsMTUzLDE1M2gyOTguMzVsNTEsNTFsMzMuMTUtMzMuMTVMMTA5LjY1LDc2LjVMNzYuNSwxMDkuNjV6IE0xOTYuMzUsMjI5LjVsMjA0LDIwNEgxNTNjLTU2LjEsMC0xMDItNDUuOS0xMDItMTAyYzAtNTYuMSw0NS45LTEwMiwxMDItMTAySDE5Ni4zNXoiIC8+Cjwvc3ZnPgo=");\n}\n\n.ms-editor .message.info-msg::before {\n content: "";\n background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgdmlld0JveD0iMCAwIDI0IDI0IgogIGZpbGw9Im5vbmUiCiAgc3Ryb2tlPSIjMUE5RkZGIgogIHN0cm9rZS13aWR0aD0iMiIKICBzdHJva2UtbGluZWNhcD0icm91bmQiCiAgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIKPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIiAvPgogIDxsaW5lIHgxPSIxMiIgeTE9IjE2IiB4Mj0iMTIiIHkyPSIxMiIgLz4KICA8bGluZSB4MT0iMTIiIHkxPSI4IiB4Mj0iMTIuMDEiIHkyPSI4IiAvPgo8L3N2Zz4=");\n background-size: 100% 100%;\n display: block;\n margin: auto;\n padding-bottom: 10px;\n height: 25px;\n width: 25px;\n}\n\n.ms-editor .smartguide {\n position: absolute;\n z-index: 40;\n font-size: 16px;\n height: 48px;\n line-height: 48px;\n}\n\n.ms-editor .smartguide.smartguide-in {\n visibility: visible !important;\n transition: opacity 0.5s;\n opacity: 1;\n}\n\n.ms-editor .smartguide.smartguide-out {\n transition: opacity 1s, visibility 1s;\n visibility: hidden !important;\n opacity: 0;\n}\n\n.ms-editor .smartguide .tag-icon {\n padding: 0 18px;\n border: 1px solid #959DA6;\n font-weight: bold;\n font-size: large;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n position: absolute;\n z-index: 31;\n height: 100%;\n line-height: 48px;\n background-color: rgba(255, 255, 255, 0.9);\n color: #959DA6;\n}\n\n.ms-editor .smartguide .ellipsis {\n cursor: pointer;\n border-bottom: 1px solid #959DA6;\n position: absolute;\n z-index: 31;\n height: 48px;\n line-height: 38px;\n padding: 0 8px;\n font-weight: bold;\n font-size: x-large;\n background-color: rgba(255, 255, 255, 0.9);\n color: #959DA6;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .ellipsis:active {\n background-color: #e0e0e0;\n}\n\n.ms-editor .smartguide .prompter-container {\n background-color: rgba(255, 255, 255, 0.9);\n height: 48px;\n line-height: 48px;\n overflow: hidden;\n white-space: nowrap;\n display: block;\n text-align: left;\n border-bottom: 1px solid #959DA6;\n position: absolute;\n z-index: 30;\n color: #bfbfbf;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .prompter-container > div > span {\n cursor: pointer;\n display: inline-block;\n}\n\n.ms-editor .smartguide .prompter-container .prompter-text {\n margin-left: 12px;\n}\n\n.ms-editor .smartguide .prompter-container .prompter-text .added-word {\n animation: 0.1s linear word-added,\n 3s ease-in-out color-input;\n}\n\n.ms-editor .smartguide .prompter-container .prompter-text .modified-word {\n animation: 0.1s linear word-modified,\n 3s ease-in-out color-input;\n}\n\n.ms-editor .smartguide .candidates {\n color: black;\n flex-direction: column;\n text-align: center;\n line-height: 30px;\n border-radius: 3px;\n position: absolute;\n box-shadow: 2px 2px 12px #BDBDBD, -2px 2px 12px #BDBDBD;\n background-color: #F5F5F5;\n z-index: 100;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .candidates > span {\n cursor: pointer;\n padding: 2px 20px;\n}\n\n.ms-editor .smartguide .candidates > span:hover {\n background-color: #EEEEEE;\n}\n\n.ms-editor .smartguide .candidates > span:active {\n background-color: #E0E0E0;\n}\n\n.ms-editor .smartguide .candidates .selected-word {\n font-weight: bold;\n background-color: #E0E0E0;\n}\n\n.ms-editor .smartguide .more-menu {\n display: flex;\n flex-direction: column;\n margin-right: 12px;\n line-height: 30px;\n border-radius: 3px;\n position: absolute;\n z-index: 100;\n box-shadow: 2px 2px 12px #BDBDBD;\n background-color: #F5F5F5;\n overflow: hidden;\n transition: max-height 1s ease-out, opacity 1s, visibility 0.5s linear;\n}\n.ms-editor .smartguide .more-menu.open {\n max-height: 500px;\n visibility: visible;\n opacity: 1;\n}\n.ms-editor .smartguide .more-menu.close {\n max-height: 0;\n visibility: hidden;\n opacity: 0;\n}\n\n.ms-editor .smartguide .more-menu .options-label-button {\n color: black;\n font-size: 16px;\n cursor: pointer;\n box-sizing: border-box;\n background: transparent;\n border: none;\n padding: 0 24px;\n margin: 0;\n height: 40px;\n outline: none;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .more-menu .options-label-button:hover {\n background-color: #EEEEEE;\n}\n\n.ms-editor .smartguide .more-menu .options-label-button:active {\n background-color: #E0E0E0;\n}\n\n.ms-editor .ps__rail-x {\n top: 32px !important;\n}\n\n.ms-editor #stroke-panel {\n position: fixed;\n bottom: 10px;\n left: 10px;\n right: 10px;\n background-color: white;\n border: solid black 2px;\n padding: 5px;\n word-wrap: break-word;\n overflow: auto;\n cursor: copy;\n max-height: 100px;\n z-index: 999;\n}\n\n/** Stroke **/\n\n.ms-editor .removed-stroke {\n opacity: 0;\n transition: opacity 0.1s ease-in-out;\n}\n\n.ms-editor .added-stroke {\n animation: 0.2s opacity-appear;\n}\n\n@keyframes color-input {\n 0% {\n color: black;\n }\n 100% {\n color: #bfbfbf;\n }\n}\n\n@keyframes word-added {\n 0% {\n transform: translate(5px, 0);\n }\n 100% {\n transform: none;\n }\n}\n\n@keyframes word-modified {\n 0% {\n transform: translate(0, 5px);\n }\n 100% {\n transform: none;\n }\n}\n\n@keyframes opacity-appear {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity : 1;\n }\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n@-webkit-keyframes spin {\n 0% {\n -webkit-transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n }\n}\n');class Editor{constructor(i,s,n="ms-editor"){xt.add(this),bt.set(this,void 0),Et.set(this,void 0),Ct.set(this,void 0),kt.set(this,void 0),Mt.set(this,void 0),Tt.set(this,void 0),this.showStrokesPan=!1,zt.set(this,(i=>{this.events.emitChanged(i)})),jt.set(this,(i=>{this.events.emitIdle(i)})),__classPrivateFieldSet(this,Tt,Object.assign({},v,s.logger),"f"),this.logger=LoggerManager.getLogger("EDITOR"),this.logger.info("constructor",{wrapperHTML:i,options:s,globalClassCss:n}),__classPrivateFieldSet(this,Mt,new DeferredPromise,"f"),this.wrapperHTML=i,this.wrapperHTML.classList.add(n),this.events.setElement(this.wrapperHTML),__classPrivateFieldSet(this,bt,document.createElement("div"),"f"),__classPrivateFieldGet(this,bt,"f").classList.add("loader"),__classPrivateFieldGet(this,bt,"f").style.display="none",this.wrapperHTML.appendChild(__classPrivateFieldGet(this,bt,"f")),__classPrivateFieldSet(this,Et,document.createElement("div"),"f"),__classPrivateFieldGet(this,Et,"f").classList.add("message"),__classPrivateFieldGet(this,Et,"f").style.display="none",this.wrapperHTML.appendChild(__classPrivateFieldGet(this,Et,"f")),__classPrivateFieldGet(this,xt,"m",Lt).call(this,s)}get loggerConfiguration(){return __classPrivateFieldGet(this,Tt,"f")}set loggerConfiguration(i){__classPrivateFieldSet(this,Tt,i,"f"),LoggerManager.setLoggerLevel(i)}get initializationPromise(){return __classPrivateFieldGet(this,Mt,"f").promise}get model(){return this.behaviors.model}get behaviors(){return __classPrivateFieldGet(this,Ct,"f")}get configuration(){return this.behaviors.configuration}set configuration(i){this.logger.info("set configuration",{configuration:i}),__classPrivateFieldGet(this,xt,"m",Lt).call(this,{configuration:i}),this.initialize()}get intention(){return this.behaviors.intention}set intention(i){if(this.logger.info("set intention",{m:i}),this.behaviors.intention=i,"erase"===this.behaviors.intention)this.wrapperHTML.classList.add("erasing"),this.wrapperHTML.classList.remove("selecting");else this.logger.warn("set intention default",{m:i}),document.body.style.cursor="initial",this.wrapperHTML.classList.remove("erasing"),this.wrapperHTML.classList.remove("selecting");this.logger.debug("set intention",this.wrapperHTML)}get events(){return PublicEvent.getInstance()}get context(){return this.behaviors.context}get grabber(){return this.behaviors.grabber}get currentPenStyle(){return this.behaviors.currentPenStyle}get penStyle(){return this.behaviors.penStyle}set penStyle(i){this.logger.info("set penStyle",{ps:i}),this.behaviors.setPenStyle(i)}get theme(){return this.behaviors.theme}set theme(i){this.logger.info("set theme",{t:i}),this.behaviors.setTheme(i)}get penStyleClasses(){return this.behaviors.penStyleClasses}set penStyleClasses(i){this.logger.info("set penStyleClasses",{psc:i}),this.behaviors.setPenStyleClasses(i)}initialize(){return __awaiter(this,void 0,void 0,(function*(){this.logger.info("initialize"),yield __classPrivateFieldGet(this,xt,"m",It).call(this),__classPrivateFieldGet(this,xt,"m",Dt).call(this),__classPrivateFieldGet(this,xt,"m",Wt).call(this)}))}waitForIdle(){return __awaiter(this,void 0,void 0,(function*(){if(this.behaviors.waitForIdle)return this.behaviors.waitForIdle()}))}undo(){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("undo",this.model),this.logger.info("undo",{}),yield __classPrivateFieldGet(this,Mt,"f").promise,yield this.behaviors.undo(),__classPrivateFieldGet(this,xt,"m",Ot).call(this),this.logger.debug("undo",this.model),this.model}))}redo(){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("redo",this.model),this.logger.info("redo"),yield __classPrivateFieldGet(this,Mt,"f").promise,yield this.behaviors.redo(),__classPrivateFieldGet(this,xt,"m",Ot).call(this),this.logger.debug("redo",this.model),this.model}))}clear(){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("clear",this.model),this.logger.info("clear"),yield __classPrivateFieldGet(this,Mt,"f").promise,yield this.behaviors.clear(),this.events.emitCleared(this.model),__classPrivateFieldGet(this,xt,"m",Ot).call(this),this.logger.debug("clear",this.model),this.model}))}resize(){var i;return __awaiter(this,void 0,void 0,(function*(){this.logger.debug("resize",this.model),this.logger.info("resize"),yield __classPrivateFieldGet(this,Mt,"f").promise,this.configuration.rendering.smartGuide.enable&&(null===(i=__classPrivateFieldGet(this,kt,"f"))||void 0===i||i.resize());const s=window.getComputedStyle(this.wrapperHTML),n=Math.max(parseInt(s.height.replace("px","")),this.configuration.rendering.minHeight),a=Math.max(parseInt(s.width.replace("px","")),this.configuration.rendering.minWidth);return yield this.behaviors.resize(n,a),this.logger.debug("resize",this.model),this.model}))}export(i){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("export",this.model),this.logger.info("export",{mimeTypes:i}),yield __classPrivateFieldGet(this,Mt,"f").promise,yield this.behaviors.export(i),this.logger.debug("export",this.model),this.model}))}convert(i){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("convert",this.model),this.logger.info("export",{params:i}),yield __classPrivateFieldGet(this,Mt,"f").promise,yield this.behaviors.convert(null==i?void 0:i.conversionState,null==i?void 0:i.mimeTypes),this.events.emitConverted(this.model.converts),this.logger.debug("convert",this.model),this.model}))}import(i,s){return __awaiter(this,void 0,void 0,(function*(){if(this.logger.debug("import",this.model),this.logger.info("import",{data:i,mimeType:s}),yield __classPrivateFieldGet(this,Mt,"f").promise,this.behaviors.import){let n;return n=i instanceof Blob?i:"string"==typeof i?new Blob([i]):new Blob([JSON.stringify(i)]),yield this.behaviors.import(n,s),this.events.emitImported(this.model.exports),this.logger.debug("import",this.model),this.model}return Promise.reject("Import impossible, behaviors has no import function")}))}importPointEvents(i){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("importPointEvents",this.model),this.logger.info("importPointEvents",{strokes:i}),yield __classPrivateFieldGet(this,Mt,"f").promise,this.behaviors.importPointEvents?(yield this.behaviors.importPointEvents(i),this.events.emitImported(this.model.exports),this.logger.debug("importPointEvents",this.model),this.model):Promise.reject("Import impossible, behaviors has no importPointEvents function")}))}}bt=new WeakMap,Et=new WeakMap,Ct=new WeakMap,kt=new WeakMap,Mt=new WeakMap,Tt=new WeakMap,zt=new WeakMap,jt=new WeakMap,xt=new WeakSet,Lt=function _Editor_instantiateBehaviors(i){var s;if(this.logger.info("instantiateBehaviors",{options:i}),!(null==i?void 0:i.configuration))throw new Error("Configuration required");let n;InternalEvent.getInstance().removeAllListeners(),__classPrivateFieldGet(this,Ct,"f")&&__classPrivateFieldGet(this,Ct,"f").destroy(),n="REST"===(null===(s=i.configuration.server)||void 0===s?void 0:s.protocol)?new RestBehaviors(i):new WSBehaviors(i),__classPrivateFieldSet(this,Ct,Object.assign(n,i.behaviors),"f"),this.logger.debug("instantiateBehaviors",__classPrivateFieldGet(this,Ct,"f"))},It=function _Editor_initializeBehaviors(){return __awaiter(this,void 0,void 0,(function*(){return this.logger.info("initializeBehaviors start"),__classPrivateFieldSet(this,Mt,new DeferredPromise,"f"),__classPrivateFieldGet(this,bt,"f").style.display="initial",__classPrivateFieldGet(this,xt,"m",At).call(this),this.logger.debug("initializeBehaviors",this.wrapperHTML),this.behaviors.init(this.wrapperHTML).then((()=>__awaiter(this,void 0,void 0,(function*(){this.logger.info("initializeBehaviors then"),this.wrapperHTML.editor=this,__classPrivateFieldGet(this,Mt,"f").resolve(),this.events.emitLoaded(),this.logger.debug("initializeBehaviors",this.wrapperHTML)})))).catch((i=>{this.logger.error("initializeBehaviors catch",{error:i}),__classPrivateFieldGet(this,Mt,"f").reject(i),__classPrivateFieldGet(this,xt,"m",Rt).call(this,i)})).finally((()=>(this.logger.info("initializeBehaviors finally",{}),__classPrivateFieldGet(this,bt,"f").style.display="none",__classPrivateFieldGet(this,Mt,"f").promise)))}))},Dt=function _Editor_initializeSmartGuide(){var i;if(null===(i=__classPrivateFieldGet(this,kt,"f"))||void 0===i||i.destroy(),this.logger.info("initializeSmartGuide",{smartGuide:this.configuration.rendering.smartGuide}),this.configuration.rendering.smartGuide.enable){let i;switch(__classPrivateFieldSet(this,kt,new SmartGuide,"f"),this.configuration.recognition.type){case"TEXT":i=this.configuration.recognition.text.margin;break;case"MATH":i=this.configuration.recognition.math.margin;break;default:this.logger.warn("initializeSmartGuide default",this.configuration.recognition.type),i={top:20,left:10,right:10,bottom:10}}__classPrivateFieldGet(this,kt,"f").init(this.wrapperHTML,i,this.configuration.rendering)}},At=function _Editor_cleanMessage(){this.logger.debug("cleanMessage",__classPrivateFieldGet(this,Et,"f")),__classPrivateFieldGet(this,Et,"f").style.display="none",__classPrivateFieldGet(this,Et,"f").innerHTML="",this.logger.debug("cleanMessage",__classPrivateFieldGet(this,Et,"f"))},Rt=function _Editor_showError(i){this.logger.debug("showError",__classPrivateFieldGet(this,Et,"f")),__classPrivateFieldGet(this,Et,"f").style.display="initial",__classPrivateFieldGet(this,Et,"f").classList.add("error-msg"),__classPrivateFieldGet(this,Et,"f").classList.remove("info-msg"),__classPrivateFieldGet(this,Et,"f").innerText=i.message,this.logger.debug("showError",__classPrivateFieldGet(this,Et,"f"))},Nt=function _Editor_showNotif(i){this.logger.debug("showNotif",__classPrivateFieldGet(this,Et,"f")),__classPrivateFieldGet(this,Et,"f").style.display="initial",__classPrivateFieldGet(this,Et,"f").classList.add("info-msg"),__classPrivateFieldGet(this,Et,"f").classList.remove("error-msg"),__classPrivateFieldGet(this,Et,"f").innerText=i.message,setTimeout((()=>{__classPrivateFieldGet(this,xt,"m",At).call(this)}),i.timeout||2500),this.logger.debug("showNotif",__classPrivateFieldGet(this,Et,"f"))},Ot=function _Editor_showStrokesIfDebug(){if(this.showStrokesPan){let i=document.getElementById("stroke-panel");const s=JSON.stringify(this.model.rawStrokes.map((i=>({pointerType:i.pointerType,pointerId:i.pointerId,pointers:i.pointers}))));i||(i=document.createElement("div"),i.id="stroke-panel",i.addEventListener("click",(s=>{s.preventDefault(),s.stopPropagation(),navigator.clipboard.writeText(null==i?void 0:i.innerText),__classPrivateFieldGet(this,xt,"m",Nt).call(this,{message:"strokes copied to clipboard!",timeout:1500})})),this.wrapperHTML.appendChild(i)),i.innerText=s}},Wt=function _Editor_addListeners(){InternalEvent.getInstance().addConvertListener(this.convert.bind(this)),InternalEvent.getInstance().addClearListener(this.clear.bind(this)),InternalEvent.getInstance().addErrorListener(__classPrivateFieldGet(this,xt,"m",Rt).bind(this)),InternalEvent.getInstance().addImportJIIXListener(__classPrivateFieldGet(this,xt,"m",Bt).bind(this)),InternalEvent.getInstance().addExportedListener(__classPrivateFieldGet(this,xt,"m",Ht).bind(this)),InternalEvent.getInstance().addNotifListener(__classPrivateFieldGet(this,xt,"m",Nt).bind(this)),InternalEvent.getInstance().addClearMessageListener(__classPrivateFieldGet(this,xt,"m",At).bind(this)),InternalEvent.getInstance().addContextChangeListener(__classPrivateFieldGet(this,zt,"f").bind(this)),InternalEvent.getInstance().addIdleListener(__classPrivateFieldGet(this,jt,"f").bind(this))},Ht=function _Editor_onExport(i){var s;if(this.logger.info("onExport",{exports:i}),this.model.mergeExport(i),this.configuration.rendering.smartGuide.enable&&i&&i["application/vnd.myscript.jiix"]){const n=i["application/vnd.myscript.jiix"];null===(s=__classPrivateFieldGet(this,kt,"f"))||void 0===s||s.update(n)}__classPrivateFieldGet(this,xt,"m",Ot).call(this),this.events.emitExported(i)},Bt=function _Editor_onImportJIIX(i){this.logger.info("onImportJIIX",{jiix:i}),this.import(new Blob([JSON.stringify(i)],{type:"application/vnd.myscript.jiix"}),"application/vnd.myscript.jiix")};var Xt=Object.freeze({__proto__:null,geometric:Pt,version:Ue,crypto:je,DeferredPromise:DeferredPromise,getAvailableFontList:function getAvailableFontList(i){var s,n,a;return __awaiter(this,void 0,void 0,(function*(){if(!(null===(s=null==i?void 0:i.server)||void 0===s?void 0:s.scheme)&&!(null===(n=null==i?void 0:i.server)||void 0===n?void 0:n.host))return Promise.reject("Failed to get fonts: configuration.server.scheme & configuration.server.host are required!");if(!(null===(a=null==i?void 0:i.recognition)||void 0===a?void 0:a.lang))return Promise.reject("Failed to get fonts: configuration.recognition.lang is required!");const l=i.server,d=yield fetch(`${l.scheme}://${l.host}/api/v4.0/iink/font/google/language/`+i.recognition.lang),{result:c}=yield d.json();return c.sort()}))},getAvailableLanguageList:function getAvailableLanguageList(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){if((null===(s=null==i?void 0:i.server)||void 0===s?void 0:s.scheme)&&(null===(n=null==i?void 0:i.server)||void 0===n?void 0:n.host)){const s=i.server;return(yield fetch(`${s.scheme}://${s.host}/api/v4.0/iink/availableLanguageList`)).json()}return Promise.reject("Failed to get languages: configuration.server.scheme & configuration.server.host are required!")}))}}),Ut=Object.freeze({__proto__:null,RestBehaviors:RestBehaviors,WSBehaviors:WSBehaviors}),$t=Object.freeze({__proto__:null,RestRecognizer:RestRecognizer,WSRecognizer:WSRecognizer}),Vt=Object.freeze({__proto__:null,quadradicsUtils:Ie,CanvasRenderer:CanvasRenderer,CanvasStroker:CanvasStroker,canvasRendererShape:Ce,canvasRendererStroke:ke,canvasRendererText:Te,SVGStroker:SVGStroker,WSSVGRenderer:WSSVGRenderer}),Jt=Object.freeze({__proto__:null,PointerEventGrabber:PointerEventGrabber}),qt=Object.freeze({__proto__:null,DefaultPenStyle:$e,DefaultTheme:Ve,StyleHelper:Ne,StyleManager:StyleManager}),Yt=Object.freeze({__proto__:null,Model:Model,Stroke:Stroke,convertStrokeToJSON:convertStrokeToJSON}),Zt=Object.freeze({__proto__:null,InternalEvent:InternalEvent,PublicEvent:PublicEvent});export{Editor,Ut as behaviors,P as configuration,Ge as constants,Zt as event,Jt as grabber,g as logger,Yt as model,$t as recognizer,Vt as renderer,be as smartguide,qt as style,Gt as undoredo,Xt as utils}; +//# sourceMappingURL=iink.esm.js.map diff --git a/dist/iink.esm.js.map b/dist/iink.esm.js.map new file mode 100644 index 000000000..4d85cf86f --- /dev/null +++ b/dist/iink.esm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"iink.esm.js","sources":["../node_modules/tslib/tslib.es6.mjs","../src/configuration/DefaultConfiguration.ts","../src/utils/MergeHelper.ts","../src/logger/logger.ts","../src/logger/loggerManager.ts","../src/configuration/Configuration.ts","../src/@types/configuration/LoggerConfiguration.ts","../src/Constants.ts","../src/event/PublicEvent.ts","../src/event/InternalEvent.ts","../src/smartguide/SmartGuide.ts","../src/utils/DeferredPromise.ts","../src/grabber/PointerEventGrabber.ts","../src/renderer/canvas/CanvasRendererShapeSymbol.ts","../src/renderer/canvas/CanvasRendererStrokeSymbol.ts","../src/renderer/canvas/CanvasRendererTextSymbol.ts","../src/renderer/QuadraticUtils.ts","../src/renderer/canvas/CanvasStroker.ts","../src/renderer/canvas/CanvasRenderer.ts","../node_modules/json-css/lib/jsoncss.min.js","../src/style/StyleHelper.ts","../node_modules/crypto-js/core.js","../node_modules/crypto-js/enc-hex.js","../node_modules/crypto-js/x64-core.js","../node_modules/crypto-js/sha512.js","../node_modules/crypto-js/hmac.js","../node_modules/crypto-js/hmac-sha512.js","../src/utils/CryptoHelper.ts","../src/utils/version.ts","../src/model/Stroke.ts","../src/recognizer/RestRecognizer.ts","../src/undo-redo/UndoRedoContext.ts","../src/undo-redo/UndoRedoManager.ts","../src/style/DefaultPenStyle.ts","../src/style/DefaultTheme.ts","../src/style/StyleManager.ts","../src/utils/geometric.ts","../src/model/Model.ts","../src/behaviors/RestBehaviors.ts","../src/recognizer/WSRecognizer.ts","../src/renderer/svg/SVGStroker.ts","../src/renderer/svg/WSSVGRenderer.ts","../src/behaviors/WSBehaviors.ts","../node_modules/style-inject/dist/style-inject.es.js","../src/Editor.ts","../src/utils/font.ts","../src/utils/language.ts"],"sourcesContent":["/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n};\n","import { TConfiguration } from \"../@types/configuration\"\nimport { TGrabberConfiguration } from \"../@types/configuration/GrabberConfiguration\"\nimport { TRenderingConfiguration } from \"../@types/configuration/RenderingConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TTriggerConfiguration } from \"../@types/configuration/TriggerConfiguration\"\nimport { TEventConfiguration } from \"../@types/configuration/EventConfiguration\"\nimport { TUndoRedoConfiguration } from \"../@types/configuration/UndoRedoConfiguration\"\nimport { TLoggerConfiguration, LoggerClass, LoggerLevel } from \"../@types/configuration/LoggerConfiguration\"\n\nexport const DefaultServerConfiguration: TServerConfiguration = {\n protocol: \"WEBSOCKET\",\n scheme: \"https\",\n host: \"cloud.myscript.com\",\n applicationKey: \"\",\n hmacKey: \"\",\n version: \"2.1.0\",\n useWindowLocation: false,\n websocket: {\n pingEnabled: true,\n pingDelay: 30000,\n maxPingLostCount: 10,\n autoReconnect: true,\n maxRetryCount: 2,\n fileChunkSize: 300000\n }\n}\n\nexport const DefaultRecognitionConfiguration: TRecognitionConfiguration = {\n type: \"TEXT\",\n alwaysConnected: true,\n lang: \"en_US\",\n gesture: {\n enable: true\n },\n export: {\n \"image-resolution\": 300,\n jiix: {\n \"bounding-box\": false,\n strokes: false,\n text: {\n chars: false,\n words: true\n }\n },\n },\n renderer: {\n debug: {\n \"draw-text-boxes\": false,\n \"draw-image-boxes\": false\n }\n },\n math: {\n mimeTypes: [\"application/vnd.myscript.jiix\"], // \"application/mathml+xml\", \"application/x-latex\" ,\n solver: {\n enable: true,\n \"fractional-part-digits\": 3,\n \"decimal-separator\": \".\",\n \"rounding-mode\": \"half up\",\n \"angle-unit\": \"deg\"\n },\n margin: {\n bottom: 10,\n left: 15,\n right: 15,\n top: 10\n },\n eraser: {\n \"erase-precisely\": false\n },\n \"undo-redo\": {\n mode: \"stroke\"\n }\n },\n text: {\n guides: {\n enable: true\n },\n mimeTypes: [\"application/vnd.myscript.jiix\"], // \"text/plain\"\n margin: {\n top: 20,\n left: 10,\n right: 10,\n bottom: 10\n },\n eraser: {\n \"erase-precisely\": false\n }\n },\n diagram: {\n mimeTypes: [\"application/vnd.myscript.jiix\"], // \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n eraser: {\n \"erase-precisely\": false\n },\n convert: {\n \"match-text-size\": true\n }\n },\n \"raw-content\": {\n recognition: {\n text: true,\n shape: true\n },\n eraser: {\n \"erase-precisely\": false\n }\n }\n}\n\nexport const DefaultGrabberConfiguration: TGrabberConfiguration = {\n listenerOptions: {\n capture: false,\n passive: true\n },\n xyFloatPrecision: 0,\n timestampFloatPrecision: 0\n}\n\nexport const DefaultRenderingConfiguration: TRenderingConfiguration = {\n minHeight: 100,\n minWidth: 100,\n smartGuide: {\n enable: true,\n fadeOut: {\n enable: false,\n duration: 5000\n }\n },\n guides: {\n enable: true,\n gap: 50\n }\n}\n\nexport const DefaultTriggerConfiguration: TTriggerConfiguration = {\n exportContent: \"POINTER_UP\",\n exportContentDelay: 1000,\n resizeTriggerDelay: 100\n}\n\nexport const DefaultEventsConfiguration: TEventConfiguration = {\n processDelay: 10\n}\n\nexport const DefaultUndoRedoConfiguration: TUndoRedoConfiguration = {\n maxStackSize: 100\n}\n\nexport const DefaultConfiguration: TConfiguration = {\n server: DefaultServerConfiguration,\n recognition: DefaultRecognitionConfiguration,\n grabber: DefaultGrabberConfiguration,\n rendering: DefaultRenderingConfiguration,\n triggers: DefaultTriggerConfiguration,\n events: DefaultEventsConfiguration,\n \"undo-redo\": DefaultUndoRedoConfiguration\n}\n\nexport const DefaultLoggerConfiguration: TLoggerConfiguration = {\n [LoggerClass.EDITOR]: LoggerLevel.ERROR,\n [LoggerClass.BEHAVIORS]: LoggerLevel.ERROR,\n [LoggerClass.RECOGNIZER]: LoggerLevel.ERROR,\n [LoggerClass.GRABBER]: LoggerLevel.ERROR,\n [LoggerClass.RENDERER]: LoggerLevel.ERROR,\n [LoggerClass.CONFIGURATION]: LoggerLevel.ERROR,\n [LoggerClass.PUBLIC_EVENT]: LoggerLevel.ERROR,\n [LoggerClass.INTERNALEVENT]: LoggerLevel.ERROR,\n [LoggerClass.MODEL]: LoggerLevel.ERROR,\n [LoggerClass.STROKE]: LoggerLevel.ERROR,\n [LoggerClass.SMARTGUIDE]: LoggerLevel.ERROR,\n [LoggerClass.STYLEMANAGER]: LoggerLevel.ERROR,\n [LoggerClass.UNDOREDO_MANAGER]: LoggerLevel.ERROR,\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const mergeDeep = (target: any, ...sources: any[]): any =>\n {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const isObject = (item: any) =>\n {\n return (item && typeof item === \"object\" && !Array.isArray(item))\n }\n if (!sources.length) return target\n const source = sources.shift()\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) {\n Object.assign(target, { [key]: {} })\n }\n mergeDeep(target[key], source[key])\n } else {\n Object.assign(target, { [key]: source[key] })\n }\n }\n }\n\n return mergeDeep(target, ...sources)\n }\n","import { LoggerClass, LoggerLevel } from \"../@types\"\n\nexport class Logger\n{\n instanceName: LoggerClass\n level: LoggerLevel\n\n constructor(instanceName: LoggerClass, level: LoggerLevel)\n {\n this.instanceName = instanceName\n this.level = level\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n debug(...data: any)\n {\n if (LoggerLevel.DEBUG >= this.level) {\n const dataLog = {\n from: this.instanceName,\n message: data,\n }\n console.debug(dataLog)\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n info(...data: any)\n {\n if (LoggerLevel.INFO >= this.level) {\n const dataLog = {\n from: this.instanceName,\n message: data,\n }\n console.info(dataLog)\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n warn(...data: any)\n {\n if (LoggerLevel.WARN >= this.level) {\n const dataLog = {\n from: this.instanceName,\n message: data,\n }\n console.warn(dataLog)\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error(...error: any)\n {\n const dataLog = {\n from: this.instanceName,\n error,\n }\n console.error(dataLog)\n }\n}\n","import { TLoggerConfiguration } from \"../@types\"\nimport { LoggerClass, LoggerLevel } from \"../Constants\"\nimport { Logger } from \"./logger\"\n\nexport class LoggerManager\n{\n static #loggerMap: Map = new Map()\n static getLogger(name: LoggerClass): Logger {\n if(!this.#loggerMap.has(name))\n {\n this.#loggerMap.set(name, new Logger(name, LoggerLevel.ERROR))\n }\n return this.#loggerMap.get(name) as Logger\n }\n\n static setLoggerLevel(config: TLoggerConfiguration)\n {\n\n Object.keys(config).forEach((lc) => {\n LoggerManager.getLogger(lc as LoggerClass).level = config[lc as LoggerClass]\n })\n }\n}\n","\nimport { TConfiguration, TConfigurationClient } from \"../@types/configuration\"\nimport { TEventConfiguration } from \"../@types/configuration/EventConfiguration\"\nimport { TGrabberConfiguration } from \"../@types/configuration/GrabberConfiguration\"\nimport { TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TRenderingConfiguration } from \"../@types/configuration/RenderingConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { TTriggerConfiguration } from \"../@types/configuration/TriggerConfiguration\"\nimport { TUndoRedoConfiguration } from \"../@types/configuration/UndoRedoConfiguration\"\nimport { DefaultConfiguration } from \"./DefaultConfiguration\"\nimport { mergeDeep } from \"../utils/MergeHelper\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class Configuration implements TConfiguration\n{\n events: TEventConfiguration\n grabber: TGrabberConfiguration\n recognition: TRecognitionConfiguration\n rendering: TRenderingConfiguration\n server: TServerConfiguration\n triggers: TTriggerConfiguration\n \"undo-redo\": TUndoRedoConfiguration\n #logger = LoggerManager.getLogger(LoggerClass.CONFIGURATION)\n\n constructor(configuration?: TConfigurationClient)\n {\n this.#logger.info(\"constructor\", { configuration })\n this.events = JSON.parse(JSON.stringify(DefaultConfiguration.events))\n this.grabber = JSON.parse(JSON.stringify(DefaultConfiguration.grabber))\n this.recognition = JSON.parse(JSON.stringify(DefaultConfiguration.recognition))\n this.rendering = JSON.parse(JSON.stringify(DefaultConfiguration.rendering))\n this.server = JSON.parse(JSON.stringify(DefaultConfiguration.server))\n this.triggers = JSON.parse(JSON.stringify(DefaultConfiguration.triggers))\n\n this.overrideDefaultConfiguration(configuration)\n }\n\n overrideDefaultConfiguration(configuration?: TConfigurationClient): void\n {\n this.#logger.info(\"overrideDefaultConfiguration\", { configuration })\n const defaultConf = JSON.parse(JSON.stringify(DefaultConfiguration))\n this.events = mergeDeep({}, defaultConf.events, configuration?.events)\n this.grabber = mergeDeep({}, defaultConf.grabber, configuration?.grabber)\n this.recognition = mergeDeep({}, defaultConf.recognition, configuration?.recognition)\n this.rendering = mergeDeep({}, defaultConf.rendering, configuration?.rendering)\n this.server = mergeDeep({}, defaultConf.server, configuration?.server)\n this.triggers = mergeDeep({}, defaultConf.triggers, configuration?.triggers)\n this[\"undo-redo\"] = mergeDeep({}, defaultConf[\"undo-redo\"], configuration?.[\"undo-redo\"])\n\n this.recognition.text.mimeTypes = configuration?.recognition?.text?.mimeTypes || defaultConf.recognition.text.mimeTypes\n this.recognition.math.mimeTypes = configuration?.recognition?.math?.mimeTypes || defaultConf.recognition.math.mimeTypes\n this.recognition.diagram.mimeTypes = configuration?.recognition?.diagram?.mimeTypes || defaultConf.recognition.diagram.mimeTypes\n\n if (this.server?.useWindowLocation) {\n this.server.scheme = window.location.protocol.indexOf(\"s\") > -1 ? \"https\" : \"http\"\n this.server.host = window.location.host\n }\n\n if (\n this.server.protocol === \"REST\" &&\n this.triggers.exportContent === \"POINTER_UP\"\n ) {\n this.triggers.exportContent = \"QUIET_PERIOD\"\n this.triggers.exportContentDelay = Math.max(this.triggers.exportContentDelay, 50)\n }\n\n if (\n this.server.protocol === \"WEBSOCKET\" &&\n this.recognition.type === \"TEXT\"\n ) {\n if (\n this.rendering.smartGuide.enable &&\n !this.recognition.text.mimeTypes.includes(\"application/vnd.myscript.jiix\")\n ) {\n // mimeType required for smartGuide\n this.recognition.text.mimeTypes.push(\"application/vnd.myscript.jiix\")\n }\n } else {\n // smartGuide enable only on websocket text\n this.rendering.smartGuide.enable = false\n }\n this.#logger.debug(\"overrideDefaultConfiguration\", { configuration: this })\n }\n}\n","\n/**\n * @group Logger\n */\nexport const enum LoggerLevel {\n DEBUG = \"1\",\n INFO = \"2\",\n WARN = \"3\",\n ERROR = \"4\"\n }\n\n/**\n * @group Logger\n */\n export const enum LoggerClass {\n EDITOR = \"EDITOR\",\n RECOGNIZER = \"RECOGNIZER\",\n GRABBER = \"GRABBER\",\n BEHAVIORS = \"BEHAVIORS\",\n CONFIGURATION = \"CONFIGURATION\",\n PUBLIC_EVENT = \"PUBLIC_EVENT\",\n MODEL = \"MODEL\",\n RENDERER = \"RENDERER\",\n SMARTGUIDE = \"SMARTGUIDE\",\n STYLEMANAGER = \"STYLEMANAGER\",\n UNDOREDO_MANAGER = \"UNDOREDO_MANAGER\",\n STROKE = \"STROKE\",\n INTERNALEVENT = \"INTERNALEVENT\"\n }\n\n export type TLoggerConfiguration = {\n [key in keyof typeof LoggerClass]: LoggerLevel\n }\n","/**\n * @group Error\n * @remarks List all errors generated by the backend with their descriptions\n */\nexport const Error = {\n NO_ACTIVITY: \"Session closed due to no activity.\",\n WRONG_CREDENTIALS: \"Application credentials are invalid. Please check or regenerate your application key and hmackey.\",\n TOO_OLD: \"Session is too old. Max Session Duration Reached.\",\n UNKNOW: \"An unknown error has occurred.\",\n ABNORMAL_CLOSURE: \"MyScript recognition server is not reachable.\",\n CANT_ESTABLISH: \"Unable to establish a connection to MyScript recognition server. Check the host and your connectivity.\",\n GOING_AWAY: \"MyScript recognition server is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection.\",\n PROTOCOL_ERROR: \"MyScript recognition server terminated the connection due to a protocol error.\",\n UNSUPPORTED_DATA: \"MyScript recognition server terminated the connection because the endpoint received data of a type it cannot accept. (For example, a text-only endpoint received binary data.)\",\n INVALID_FRAME_PAULOAD: \"MyScript recognition server terminated the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message).\",\n POLICY_VIOLATION: \"MyScript recognition server terminated the connection because it received a message that violates its policy.\",\n MESSAGE_TOO_BIG: \"MyScript recognition server terminated the connection because a data frame was received that is too large.\",\n INTERNAL_ERROR: \"MyScript recognition server terminated the connection because it encountered an unexpected condition that prevented it from fulfilling the request.\",\n SERVICE_RESTART: \"MyScript recognition server terminated the connection because it is restarting.\",\n TRY_AGAIN: \"MyScript recognition server terminated the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients.\",\n BAD_GATEWAY: \"MyScript recognition server was acting as a gateway or proxy and received an invalid response from the upstream server.\",\n TLS_HANDSHAKE: \"MyScript recognition server connection was closed due to a failure to perform a TLS handshake\"\n} as const\n\n/**\n * @event\n * @remarks Lists all events that can be listened to on the editor or DOM element\n */\nexport const EventType = {\n /**\n * @event\n * event emitted when history has changed i.e. the context of undo-redo\n */\n CHANGED: \"changed\",\n /**\n * @event\n * event emitted when clearing is complete\n */\n CLEARED: \"cleared\",\n /**\n * @event\n * event emitted after the conversion is complete\n */\n CONVERTED: \"converted\",\n /**\n * @event\n * event emitted when the editor encounters an error\n */\n ERROR: \"error\",\n /**\n * @event\n * event emitted on click on pointer events\n */\n POINTEREVENTS: \"pointer_events\",\n /**\n * @event\n * event emitted after the end of the export\n */\n EXPORTED: \"exported\",\n /**\n * @event\n * event emitted after the end of the import\n */\n IMPORTED: \"imported\",\n /**\n * @event\n * event emitted when the server is idle after a job\n */\n IDLE: \"idle\",\n /**\n * @event\n * event emitted after full editor initialization\n */\n LOADED: \"loaded\",\n} as const\n\n/**\n * @event\n * @internal\n * @remarks Lists all internal library events\n */\nexport const InternalEventType = {\n SVG_PATCH: \"internal_svg_patch\",\n EXPORTED: \"internal_exported\",\n CLEAR_MESSAGE: \"internal_clear_message\",\n ERROR: \"internal_error\",\n NOTIF: \"internal_notif\",\n IMPORT_JIIX: \"internal_import_jiix\",\n CONVERT: \"internal_convert\",\n CLEAR: \"internal_clear\",\n CONTEXT_CHANGE: \"internal_context_change\",\n IDLE: \"internal_idle\",\n WS_CLOSED: \"internal_websocket_closed\",\n} as const\n\n/**\n * @group Export\n * @remarks List all supported MIME types for export. Attention, the MIME types supported depend on the {@link TRecognitionType | type of recognition}\n */\nexport const enum ExportType {\n JIIX = \"application/vnd.myscript.jiix\",\n TEXT = \"text/plain\",\n LATEX = \"application/x-latex\",\n MATHML = \"application/mathml+xml\",\n SVG = \"image/svg+xml\",\n OFFICE_DOCUMENT = \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n}\n\n/**\n * @group Editor\n * @remarks List the possibilities of interactions\n */\nexport const enum Intention\n{\n Write = \"write\",\n Erase = \"erase\",\n // Selecting = \"selecting\"\n}\n\n/**\n * @group Logger\n */\nexport { LoggerClass, LoggerLevel } from \"./@types/configuration/LoggerConfiguration\"\n","import { IModel, TExport } from \"../@types/model/Model\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { EventType } from \"../Constants\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class PublicEvent extends EventTarget\n{\n static #instance: PublicEvent\n #element?: HTMLElement\n #logger = LoggerManager.getLogger(LoggerClass.PUBLIC_EVENT)\n\n private constructor()\n {\n super()\n }\n\n public static getInstance(): PublicEvent\n {\n if (!PublicEvent.#instance) {\n PublicEvent.#instance = new PublicEvent()\n }\n\n return PublicEvent.#instance\n }\n\n setElement(el: HTMLElement)\n {\n this.#logger.info(\"setElement\", { el })\n this.#element = el\n }\n\n #emit(type: string, data?: unknown): void\n {\n const evt = new CustomEvent(type, Object.assign({ bubbles: true, composed: true }, data ? { detail: data } : undefined))\n this.dispatchEvent(evt)\n this.#element?.dispatchEvent(evt)\n }\n\n emitLoaded(): void\n {\n this.#logger.info(\"emitLoaded\")\n this.#emit(EventType.LOADED)\n }\n\n emitExported(exports: TExport): void\n {\n this.#logger.info(\"emitExported\", { exports })\n this.#emit(EventType.EXPORTED, exports)\n }\n\n emitChanged(undoRedoContext: TUndoRedoContext): void\n {\n this.#logger.info(\"emitChanged\", { undoRedoContext })\n this.#emit(EventType.CHANGED, {\n ...undoRedoContext,\n canClear: !undoRedoContext.empty\n })\n }\n\n emitIdle(idle: boolean): void\n {\n this.#logger.info(\"emitIdle\", { idle })\n this.#emit(EventType.IDLE, idle)\n }\n\n emitCleared(model?: IModel): void\n {\n this.#logger.info(\"emitCleared\", { model })\n this.#emit(EventType.CLEARED, model)\n }\n\n emitConverted(exports: TExport): void\n {\n this.#logger.info(\"emitConverted\", { exports })\n this.#emit(EventType.CONVERTED, exports)\n }\n\n emitImported(exports: TExport): void\n {\n this.#logger.info(\"emitImported\", { exports })\n this.#emit(EventType.IMPORTED, exports)\n }\n}\n","import { TConverstionState } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TExport, TJIIXExport } from \"../@types/model/Model\"\nimport { TWebSocketSVGPatchEvent } from \"../@types/recognizer/WSRecognizer\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { InternalEventType } from \"../Constants\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class InternalEvent extends EventTarget\n{\n static #instance: InternalEvent\n #abortController: AbortController\n #logger = LoggerManager.getLogger(LoggerClass.INTERNALEVENT)\n\n private constructor()\n {\n super()\n this.#logger.info(\"constructor\")\n this.#abortController = new AbortController()\n }\n\n public static getInstance(): InternalEvent\n {\n if (!InternalEvent.#instance) {\n InternalEvent.#instance = new InternalEvent()\n }\n\n return InternalEvent.#instance\n }\n\n removeAllListeners(): void\n {\n this.#logger.info(\"removeAllListeners\")\n this.#abortController.abort()\n this.#abortController = new AbortController()\n }\n\n #emit(type: string, data?: unknown): void\n {\n this.dispatchEvent(new CustomEvent(type, Object.assign({ bubbles: true, composed: true }, data ? { detail: data } : undefined)))\n }\n\n emitSVGPatch(patchChange: TWebSocketSVGPatchEvent): void\n {\n this.#logger.info(\"emitSVGPatch\", { patchChange })\n this.#emit(InternalEventType.SVG_PATCH, patchChange)\n }\n addSVGPatchListener(callback: (contentChange: TWebSocketSVGPatchEvent) => void): void\n {\n this.#logger.info(\"addSVGPatchListener\", { callback })\n this.addEventListener(InternalEventType.SVG_PATCH, (evt: unknown) => callback(((evt as CustomEvent).detail as TWebSocketSVGPatchEvent)), { signal: this.#abortController.signal })\n }\n\n emitExported(exports: TExport): void\n {\n this.#logger.info(\"emitExported\", { exports })\n this.#emit(InternalEventType.EXPORTED, exports)\n }\n addExportedListener(callback: (exports: TExport) => void): void\n {\n this.#logger.info(\"addExportedListener\", { callback })\n this.addEventListener(InternalEventType.EXPORTED, (evt: unknown) => callback(((evt as CustomEvent).detail as TExport)), { signal: this.#abortController.signal })\n }\n\n emitClearMessage(): void\n {\n this.#logger.info(\"emitClearMessage\", { })\n this.#emit(InternalEventType.CLEAR_MESSAGE)\n }\n addClearMessageListener(callback: () => void): void\n {\n this.#logger.info(\"addClearMessageListener\", { callback })\n this.addEventListener(InternalEventType.CLEAR_MESSAGE, () => callback(), { signal: this.#abortController.signal })\n }\n\n emitError(err: Error): void\n {\n this.#logger.info(\"emitError\", { err })\n this.#emit(InternalEventType.ERROR, err)\n }\n\n addErrorListener(callback: (err: Error) => void): void\n {\n this.#logger.info(\"addErrorListener\", { callback })\n this.addEventListener(InternalEventType.ERROR, (evt: unknown) => callback(((evt as CustomEvent).detail as Error)), { signal: this.#abortController.signal })\n }\n\n emitWSClosed(): void\n {\n this.#logger.info(\"emitWSClosed\", { })\n this.#emit(InternalEventType.WS_CLOSED)\n }\n addWSClosedListener(callback: () => void): void\n {\n this.#logger.info(\"addWSClosedListener\", { callback })\n this.addEventListener(InternalEventType.WS_CLOSED, () => callback(), { signal: this.#abortController.signal })\n }\n\n emitNotif(notif: { message: string, timeout?: number }): void\n {\n this.#logger.info(\"emitWNotif\", { notif })\n this.#emit(InternalEventType.NOTIF, notif)\n }\n addNotifListener(callback: (notif: { message: string, timeout?: number }) => void): void\n {\n this.#logger.info(\"addNotifListener\", { callback })\n this.addEventListener(InternalEventType.NOTIF, (evt: unknown) => callback(((evt as CustomEvent).detail as { message: string, timeout?: number })), { signal: this.#abortController.signal })\n }\n\n emitImportJIIX(jiix: TJIIXExport): void\n {\n this.#logger.info(\"emitImportJIIX\", { jiix })\n this.#emit(InternalEventType.IMPORT_JIIX, jiix)\n }\n addImportJIIXListener(callback: (jiix: TJIIXExport) => void): void\n {\n this.#logger.info(\"addImportJIIXListener\", { callback })\n this.addEventListener(InternalEventType.IMPORT_JIIX, (evt: unknown) => callback(((evt as CustomEvent).detail as TJIIXExport)), { signal: this.#abortController.signal })\n }\n\n emitConvert(conversionState: TConverstionState = \"DIGITAL_EDIT\"): void\n {\n this.#logger.info(\"emitConvert\", { conversionState })\n this.#emit(InternalEventType.CONVERT, conversionState)\n }\n addConvertListener(callback: (params?: { conversionState?: TConverstionState, mimeTypes?: string[] }) => void): void\n {\n this.#logger.info(\"addConvertListener\", { callback })\n this.addEventListener(InternalEventType.CONVERT, (evt: unknown) => callback(((evt as CustomEvent).detail as { conversionState?: TConverstionState, mimeTypes?: string[] })), { signal: this.#abortController.signal })\n }\n\n emitClear(): void\n {\n this.#logger.info(\"emitClear\")\n this.#emit(InternalEventType.CLEAR)\n }\n addClearListener(callback: () => void): void\n {\n this.#logger.info(\"addClearListener\", { callback })\n this.addEventListener(InternalEventType.CLEAR, () => callback(), { signal: this.#abortController.signal })\n }\n\n emitContextChange(context: TUndoRedoContext): void\n {\n this.#logger.info(\"emitContextChange\", { context })\n this.#emit(InternalEventType.CONTEXT_CHANGE, context)\n }\n addContextChangeListener(callback: (context: TUndoRedoContext) => void): void\n {\n this.#logger.info(\"addContextChangeListener\", { callback })\n this.addEventListener(InternalEventType.CONTEXT_CHANGE, (evt: unknown) => callback(((evt as CustomEvent).detail as TUndoRedoContext)), { signal: this.#abortController.signal })\n }\n\n emitIdle(idle: boolean): void\n {\n this.#logger.info(\"emitIdle\", { idle })\n this.#emit(InternalEventType.IDLE, idle)\n }\n addIdleListener(callback: (idle: boolean) => void): void\n {\n this.#logger.info(\"addIdleListener\", { callback })\n this.addEventListener(InternalEventType.IDLE, (evt: unknown) => callback(((evt as CustomEvent).detail as boolean)), { signal: this.#abortController.signal })\n }\n}\n","import { TMarginConfiguration } from \"../@types/configuration/recognition/MarginConfiguration\"\nimport { TRenderingConfiguration } from \"../@types/configuration/RenderingConfiguration\"\nimport { TJIIXExport, TWordExport } from \"../@types/model/Model\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class SmartGuide {\n uuid: string\n #smartGuideElement!: HTMLDivElement\n #prompterContainerElement!: HTMLDivElement\n #prompterTextElement!: HTMLDivElement\n #ellipsisElement!: HTMLDivElement\n #tagElement!: HTMLDivElement\n #candidatesElement!: HTMLDivElement\n #menuElement!: HTMLDivElement\n #convertElement!: HTMLButtonElement\n #copyElement!: HTMLButtonElement\n #deleteElement!: HTMLButtonElement\n #fadeOutTimout?: ReturnType\n #isMenuOpen!: boolean\n margin: TMarginConfiguration\n renderingConfiguration!: TRenderingConfiguration\n jiix?: TJIIXExport\n lastWord?: TWordExport\n wordToChange?: TWordExport\n #logger = LoggerManager.getLogger(LoggerClass.SMARTGUIDE)\n\n constructor() {\n this.#logger.info(\"constructor\", { })\n this.uuid = Math.random().toString(10).substring(2, 12)\n this.margin = {\n bottom: 0,\n left: 0,\n right: 0,\n top: 0\n }\n this.#createWrapperElement()\n this.#createPrompterContainerElement()\n this.#createPrompterTextElement()\n this.#createEllipsisElement()\n this.#createTagElement()\n this.#createCandidatesElement()\n this.#createMoreMenuElement()\n this.#createConvertElement()\n this.#createCopyElement()\n this.#createDeleteElement()\n }\n\n get internalEvent(): InternalEvent {\n return InternalEvent.getInstance()\n }\n\n #createWrapperElement(): void {\n this.#smartGuideElement = document.createElement(\"div\")\n this.#smartGuideElement.id = `smartguide-${this.uuid}`\n this.#smartGuideElement.classList.add(\"smartguide\")\n }\n\n #createPrompterContainerElement(): void {\n this.#prompterContainerElement = document.createElement(\"div\")\n this.#prompterContainerElement.id = `prompter-container-${this.uuid}`\n this.#prompterContainerElement.classList.add(\"prompter-container\")\n // this.#prompterContainerElement.appendChild(textElement)\n }\n\n #createPrompterTextElement(): void {\n this.#prompterTextElement = document.createElement(\"div\")\n this.#prompterTextElement.id = `prompter-text-${this.uuid}`\n this.#prompterTextElement.classList.add(\"prompter-text\")\n this.#prompterTextElement.setAttribute(\"touch-action\", \"none\")\n }\n\n #createEllipsisElement(): void {\n this.#ellipsisElement = document.createElement(\"div\")\n this.#ellipsisElement.id = `ellipsis-${this.uuid}`\n this.#ellipsisElement.classList.add(\"ellipsis\")\n this.#ellipsisElement.innerHTML = \"...\"\n }\n\n #createTagElement(): void {\n this.#tagElement = document.createElement(\"div\")\n this.#tagElement.id = `tag-icon-${this.uuid}`\n this.#tagElement.classList.add(\"tag-icon\")\n this.#tagElement.innerHTML = \"¶\"\n }\n\n #createCandidatesElement(): void {\n this.#candidatesElement = document.createElement(\"div\")\n this.#candidatesElement.id = `candidates-${this.uuid}`\n this.#candidatesElement.classList.add(\"candidates\")\n }\n\n #createMoreMenuElement(): void {\n this.#menuElement = document.createElement(\"div\")\n this.#menuElement.id = `more-menu-${this.uuid}`\n this.#menuElement.classList.add(\"more-menu\")\n }\n\n #createConvertElement(): void {\n this.#convertElement = document.createElement(\"button\")\n this.#convertElement.id = `convert-${this.uuid}`\n this.#convertElement.classList.add(\"options-label-button\")\n this.#convertElement.innerHTML = \"Convert\"\n }\n\n #createCopyElement(): void {\n this.#copyElement = document.createElement(\"button\")\n this.#copyElement.id = `copy-${this.uuid}`\n this.#copyElement.classList.add(\"options-label-button\")\n this.#copyElement.innerHTML = \"Copy\"\n }\n\n #createDeleteElement(): void {\n this.#deleteElement = document.createElement(\"button\")\n this.#deleteElement.id = `delete-${this.uuid}`\n this.#deleteElement.classList.add(\"options-label-button\")\n this.#deleteElement.innerHTML = \"Delete\"\n }\n\n init(domElement: HTMLElement, margin: TMarginConfiguration, renderingConfiguration: TRenderingConfiguration): void {\n this.#logger.info(\"init\", { domElement, margin, renderingConfiguration })\n domElement.appendChild(this.#smartGuideElement)\n this.#smartGuideElement.appendChild(this.#tagElement)\n\n this.#prompterContainerElement.appendChild(this.#prompterTextElement)\n this.#smartGuideElement.appendChild(this.#prompterContainerElement)\n\n this.#smartGuideElement.appendChild(this.#ellipsisElement)\n\n this.#menuElement.appendChild(this.#convertElement)\n this.#menuElement.appendChild(this.#copyElement)\n this.#menuElement.appendChild(this.#deleteElement)\n this.#smartGuideElement.appendChild(this.#menuElement)\n this.#menuElement.classList.add(\"close\")\n this.#isMenuOpen = false\n\n this.#smartGuideElement.appendChild(this.#candidatesElement)\n this.#candidatesElement.style.display = \"none\"\n this.margin = margin\n this.renderingConfiguration = renderingConfiguration\n this.#addListeners()\n\n this.#show()\n if (this.renderingConfiguration.smartGuide.fadeOut.enable) {\n this.#initFadeOutObserver(this.renderingConfiguration.smartGuide.fadeOut.duration)\n }\n\n this.resize()\n }\n\n #initFadeOutObserver(duration = 3000): void {\n const observer = new MutationObserver(() => {\n clearTimeout(this.#fadeOutTimout)\n if (\n !this.#smartGuideElement.classList.contains(\"smartguide-out\") &&\n this.#candidatesElement.style.display === \"none\" &&\n !this.#isMenuOpen\n ) {\n this.#fadeOutTimout = setTimeout(() => {\n this.#hide()\n }, duration)\n }\n })\n observer.observe(this.#smartGuideElement, { childList: true, subtree: true, attributes: true })\n }\n\n #show(): void {\n this.#smartGuideElement.classList.remove(\"smartguide-out\")\n this.#smartGuideElement.classList.add(\"smartguide-in\")\n }\n #hide(): void {\n this.#smartGuideElement.classList.add(\"smartguide-out\")\n this.#smartGuideElement.classList.remove(\"smartguide-in\")\n }\n\n #showCandidates = (target: HTMLElement) => {\n this.#logger.info(\"showCandidates\", { target })\n const wordId = parseInt(target.id.replace(\"word-\", \"\").replace(this.uuid, \"\"))\n const words = this.jiix?.words as TWordExport[]\n this.wordToChange = words[wordId]\n if (this.wordToChange) {\n this.wordToChange.id = wordId.toString()\n this.#candidatesElement.innerHTML = \"\"\n if (this.wordToChange?.candidates) {\n this.#candidatesElement.style.display = \"flex\"\n this.wordToChange.candidates.forEach((word, index) => {\n if (this.wordToChange?.label === word) {\n this.#candidatesElement.innerHTML += `${word}`\n } else {\n this.#candidatesElement.innerHTML += `${word}`\n }\n })\n const top = 48\n const left = target.getBoundingClientRect().left - 60\n this.#candidatesElement.style.top = `${top}px`\n this.#candidatesElement.style.left = `${left}px`\n\n const parent = target.parentNode?.parentNode?.parentNode\n if (parent) {\n parent.insertBefore(this.#candidatesElement, target.parentNode?.parentNode)\n }\n }\n }\n }\n #hideCandidates(): void {\n this.#candidatesElement.style.display = \"none\"\n }\n\n #openMenu(): void {\n this.#menuElement.classList.add(\"open\")\n this.#menuElement.classList.remove(\"close\")\n this.#isMenuOpen = true\n }\n #closeMenu(): void {\n this.#menuElement.classList.add(\"close\")\n this.#menuElement.classList.remove(\"open\")\n this.#isMenuOpen = false\n }\n\n #onClickEllipsis = (evt: Event) => {\n this.#logger.info(\"onClickEllipsis\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n this.#isMenuOpen ? this.#closeMenu() : this.#openMenu()\n this.#hideCandidates()\n }\n\n #onClickConvert = (evt: Event) => {\n this.#logger.info(\"onClickConvert\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n this.internalEvent.emitConvert()\n this.#closeMenu()\n }\n\n #onClickCopy = async (evt: Event): Promise => {\n this.#logger.info(\"onClickCopy\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n try {\n this.#closeMenu()\n let message = \"Nothing to copy\"\n if (this.#prompterTextElement.innerText) {\n message = `\"${this.#prompterTextElement.innerText}\" copied to clipboard`\n if (/iPad|iPhone|iPod/.test(navigator.userAgent)) {\n const permissionName = \"clipboard-write\" as PermissionName;\n const permissionStatus = await navigator.permissions.query({ name: permissionName });\n if (permissionStatus.state === \"granted\") {\n await navigator.clipboard.writeText(this.#prompterTextElement.innerText)\n }\n } else {\n await navigator.clipboard.writeText(this.#prompterTextElement.innerText)\n }\n }\n this.internalEvent.emitNotif({ message, timeout: 1500 })\n } catch (err) {\n this.#logger.error(\"onClickCopy\", { err })\n this.internalEvent.emitError(err as Error)\n }\n }\n\n #onClickDelete = (evt: Event) => {\n this.#logger.info(\"onClickDelete\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n this.internalEvent.emitClear()\n this.#closeMenu()\n }\n\n #onClickCandidate = (evt: Event) => {\n this.#logger.info(\"onClickCandidate\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n const target = evt.target as HTMLElement\n const candidate = target.innerText\n if (this.jiix && candidate !== this.wordToChange?.label && this.wordToChange?.candidates?.includes(candidate)) {\n this.jiix.words[parseInt(this.wordToChange?.id as string)].label = candidate\n this.internalEvent.emitImportJIIX(this.jiix)\n }\n this.#candidatesElement.style.display = \"none\"\n }\n\n #onClickPrompter = (evt: Event): void => {\n this.#logger.info(\"onClickPrompter\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n this.#closeMenu()\n const target = evt.target as HTMLElement\n if (target.id !== this.#prompterTextElement.id) {\n this.#showCandidates(target)\n } else {\n this.#hideCandidates()\n }\n\n }\n\n #onClickOutSide = () => {\n this.#hideCandidates()\n this.#closeMenu()\n }\n\n #addListeners(): void {\n this.#ellipsisElement.addEventListener(\"pointerdown\", this.#onClickEllipsis.bind(this))\n this.#convertElement.addEventListener(\"pointerdown\", this.#onClickConvert.bind(this))\n this.#copyElement.addEventListener(\"pointerdown\", this.#onClickCopy.bind(this))\n this.#deleteElement.addEventListener(\"pointerdown\", this.#onClickDelete.bind(this))\n this.#prompterTextElement.addEventListener(\"pointerdown\", this.#onClickPrompter.bind(this))\n this.#candidatesElement.addEventListener(\"pointerdown\", this.#onClickCandidate.bind(this))\n document.addEventListener(\"pointerdown\", this.#onClickOutSide.bind(this))\n }\n\n #removeListeners(): void {\n this.#ellipsisElement.removeEventListener(\"pointerdown\", this.#onClickEllipsis)\n this.#convertElement.removeEventListener(\"pointerdown\", this.#onClickConvert)\n this.#copyElement.removeEventListener(\"pointerdown\", this.#onClickCopy)\n this.#deleteElement.removeEventListener(\"pointerdown\", this.#onClickDelete)\n this.#prompterTextElement.removeEventListener(\"pointerdown\", this.#onClickPrompter)\n this.#candidatesElement.removeEventListener(\"pointerdown\", this.#onClickCandidate)\n document.removeEventListener(\"pointerdown\", this.#onClickOutSide)\n }\n\n resize(): void {\n this.#logger.info(\"resize\")\n const mmToPixels = 3.779527559\n const marginTop = this.margin.top * mmToPixels\n const marginLeft = this.margin.left * mmToPixels\n const marginRight = this.margin.right * mmToPixels\n // 12 is the space between line in mm\n const top = marginTop - (12 * mmToPixels)\n\n this.#smartGuideElement.style.top = `${top}px`\n this.#smartGuideElement.style.left = `${marginLeft}px`\n this.#smartGuideElement.style.right = `${marginRight}px`\n\n let left = this.#tagElement.offsetWidth\n this.#prompterContainerElement.style.marginLeft = `${left}px`\n this.#prompterContainerElement.style.width = `${this.#smartGuideElement.clientWidth - this.#tagElement.offsetWidth - this.#ellipsisElement.offsetHeight}px`\n left += this.#prompterContainerElement.offsetWidth\n this.#menuElement.style.left = `${left - this.#menuElement.offsetWidth + this.#ellipsisElement.offsetWidth}px`\n this.#menuElement.style.top = `${this.#ellipsisElement.offsetHeight}px`\n this.#ellipsisElement.style.left = `${left}px`\n }\n\n update(exports: TJIIXExport): void {\n this.#logger.info(\"update\", { exports })\n this.jiix = exports\n const createWordSpan = (index: number, word?: TWordExport) => {\n const span = document.createElement(\"span\")\n span.id = `word-${index}${this.uuid}`\n if (word) {\n span.textContent = word.label\n } else {\n span.innerHTML = \" \"\n }\n this.#logger.debug(\"update\", { span })\n return span\n }\n\n const populatePrompter = () => {\n this.#logger.info(\"populatePrompter\", { })\n this.#prompterTextElement.innerHTML = \"\"\n if (this.jiix?.words) {\n const words = this.jiix.words as TWordExport[]\n const myFragment = document.createDocumentFragment()\n words.forEach((word, index) => {\n if (word.label === \" \" || word.label.includes(\"\\n\")) {\n myFragment.appendChild(createWordSpan(index))\n } else if (index !== words.length - 1) {\n myFragment.appendChild(createWordSpan(index, word))\n } else {\n this.#prompterTextElement.appendChild(myFragment)\n if (this.lastWord) {\n this.lastWord = word\n }\n const span = createWordSpan(index, word)\n // This is used to scroll to last word if last word is modified\n\n if ((this.lastWord?.candidates !== word.candidates) && (this.lastWord?.label !== word.label)) {\n this.lastWord = word\n }\n if(this.wordToChange?.id === index.toString())\n {\n span.classList.add(\"modified-word\")\n this.wordToChange = undefined\n }\n else\n {\n span.classList.add(\"added-word\")\n }\n this.#prompterTextElement.appendChild(span)\n this.#prompterContainerElement.scrollLeft = span.offsetLeft\n this.#logger.debug(\"update => populatePrompter\", { span })\n this.#logger.debug(\"update => populatePrompter\", this.lastWord)\n }\n })\n }\n }\n populatePrompter()\n if (this.jiix?.words?.length) {\n this.#show()\n }\n }\n\n clear(): void {\n this.#logger.info(\"clear\")\n this.#prompterTextElement.innerHTML = \"\"\n this.#candidatesElement.innerHTML = \"\"\n this.#hide()\n }\n\n destroy(): void {\n this.#logger.info(\"destroy\")\n this.#removeListeners()\n this.#smartGuideElement.remove()\n }\n}\n","\nexport class DeferredPromise {\n promise: Promise\n resolve!: (value: T) => void\n reject!: (value: Error) => void\n\n isFullFilled: boolean\n isPending: boolean\n\n\n constructor()\n {\n this.isFullFilled = false\n this.isPending = true\n\n this.promise = new Promise((resolve, reject) =>\n {\n this.reject = async (v: unknown) =>\n {\n this.isFullFilled = true\n this.isPending = false\n return reject(v)\n }\n this.resolve = async (v: unknown) =>\n {\n this.isFullFilled = true\n this.isPending = false\n return resolve(v as T)\n }\n })\n }\n}\n","import { IGrabber } from \"../@types/grabber/Grabber\"\nimport { TGrabberConfiguration } from \"../@types/configuration/GrabberConfiguration\"\nimport { TPointer } from \"../@types/geometry\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class PointerEventGrabber implements IGrabber\n{\n private configuration: TGrabberConfiguration\n\n private domElement!: HTMLElement\n\n private activePointerId?: number\n\n private prevent = (e: Event) => e.preventDefault()\n #logger = LoggerManager.getLogger(LoggerClass.GRABBER)\n\n onPointerDown!: (evt: PointerEvent, point: TPointer) => void\n onPointerMove!: (evt: PointerEvent, point: TPointer) => void\n onPointerUp!: (evt: PointerEvent, point: TPointer) => void\n\n constructor(configuration: TGrabberConfiguration)\n {\n this.#logger.info(\"constructor\", { configuration })\n this.configuration = configuration\n }\n\n private roundFloat(oneFloat: number, requestedFloatPrecision: number): number\n {\n if (requestedFloatPrecision >= 0) {\n const floatPrecision: number = Math.pow(10, requestedFloatPrecision)\n return Math.round(oneFloat / floatPrecision) * floatPrecision\n }\n this.#logger.debug(\"roundFloat\", { oneFloat, requestedFloatPrecision })\n return oneFloat\n }\n\n private extractPoint(event: MouseEvent | TouchEvent): TPointer\n {\n let clientX: number, clientY: number\n if (\"changedTouches\" in event) {\n ({ clientX, clientY } = event.changedTouches[0])\n } else {\n ({ clientX, clientY } = event)\n }\n const rect: DOMRect = this.domElement.getBoundingClientRect()\n const pointer = {\n x: this.roundFloat(clientX - rect.left - this.domElement.clientLeft, this.configuration.xyFloatPrecision),\n y: this.roundFloat(clientY - rect.top - this.domElement.clientTop, this.configuration.xyFloatPrecision),\n t: this.roundFloat(Date.now(), this.configuration.timestampFloatPrecision),\n p: (event as PointerEvent).pressure || 1,\n }\n this.#logger.debug(\"extractPoint\", { event, pointer })\n return pointer\n }\n\n private pointerDownHandler = (evt: PointerEvent) =>\n {\n this.#logger.info(\"pointerDown\", { evt })\n // exit if not a left click or multi-touch\n if (evt.button !== 0 || evt.buttons !== 1) {\n return\n }\n\n this.activePointerId = evt.pointerId\n\n if (this.onPointerDown) {\n const point = this.extractPoint(evt)\n this.onPointerDown(evt, point)\n }\n }\n\n private pointerMoveHandler = (evt: PointerEvent) =>\n {\n this.#logger.info(\"pointerMove\", { evt })\n if (this.activePointerId != undefined && this.activePointerId === evt.pointerId) {\n if (this.onPointerMove) {\n const point = this.extractPoint(evt)\n this.onPointerMove(evt, point)\n }\n }\n }\n\n private pointerUpHandler = (evt: PointerEvent) =>\n {\n this.#logger.info(\"pointerUp\", { evt })\n if (this.activePointerId != undefined && this.activePointerId === evt.pointerId) {\n this.activePointerId = undefined\n evt.stopPropagation()\n if (this.onPointerUp) {\n const point = this.extractPoint(evt)\n this.onPointerUp(evt, point)\n }\n }\n }\n\n attach(domElement: HTMLElement)\n {\n this.#logger.info(\"attach\", { domElement })\n if (this.domElement) {\n this.detach()\n }\n this.domElement = domElement\n this.domElement.addEventListener(\"pointerdown\", this.pointerDownHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointermove\", this.pointerMoveHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointerup\", this.pointerUpHandler, this.configuration.listenerOptions)\n // this.domElement.addEventListener(\"pointerout\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointerleave\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointercancel\", this.pointerUpHandler, this.configuration.listenerOptions)\n\n this.domElement.addEventListener(\"touchmove\", this.prevent)\n\n // FIXME investigate why this is needed for iOS devices\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n document.documentElement.addEventListener(\"pointerdown\", () => { })\n }\n\n detach()\n {\n this.#logger.info(\"detach\")\n this.domElement?.removeEventListener(\"pointerdown\", this.pointerDownHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointermove\", this.pointerMoveHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointerup\", this.pointerUpHandler, this.configuration.listenerOptions)\n // this.domElement?.removeEventListener(\"pointerout\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointerleave\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointercancel\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"touchmove\", this.prevent)\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n document.documentElement.removeEventListener(\"pointerdown\", () => { })\n }\n}\n","\nimport { TPoint } from \"../../@types/geometry\"\nimport { TSymbol, TShapeEllipseSymbol, TShapeLineSymbol, TShapeSymbol, TShapeTableSymbol, TLineSymbol, TShapeRecognizedSymbol } from \"../../@types/renderer/Symbol\"\n\nexport const ShapeSymbols = {\n table: \"table\",\n shape: \"shape\",\n recognizedShape: \"recognizedShape\",\n ellipse: \"ellipse\",\n line: \"line\"\n}\n\nfunction phi(angle: number): number\n{\n let returnedAngle = ((angle + Math.PI) % (Math.PI * 2)) - Math.PI\n if (returnedAngle < -Math.PI) {\n returnedAngle += Math.PI * 2\n }\n return returnedAngle\n}\n\nfunction drawEllipseArc(context2D: CanvasRenderingContext2D, shapeEllipse: TShapeEllipseSymbol): TPoint[]\n{\n const { centerPoint, maxRadius, minRadius, orientation, startAngle, sweepAngle } = shapeEllipse\n const angleStep = 0.02 // angle delta between interpolated\n\n let z1 = Math.cos(orientation)\n let z3 = Math.sin(orientation)\n let z2 = z1\n let z4 = z3\n z1 *= maxRadius\n z2 *= minRadius\n z3 *= maxRadius\n z4 *= minRadius\n\n const n = Math.floor(Math.abs(sweepAngle) / angleStep)\n\n const boundariesPoints = []\n\n context2D.save()\n try {\n context2D.beginPath()\n\n for (let i = 0; i <= n; i++) {\n const angle = startAngle + ((i / n) * sweepAngle) // points on the arc, in radian\n const alpha = Math.atan2(Math.sin(angle) / minRadius, Math.cos(angle) / maxRadius)\n\n const cosAlpha = Math.cos(alpha)\n const sinAlpha = Math.sin(alpha)\n\n // current point\n const x = (centerPoint.x + (z1 * cosAlpha)) - (z4 * sinAlpha)\n const y = (centerPoint.y + (z2 * sinAlpha)) + (z3 * cosAlpha)\n if (i === 0) {\n context2D.moveTo(x, y)\n } else {\n context2D.lineTo(x, y)\n }\n\n if (i === 0 || i === n) {\n boundariesPoints.push({ x, y })\n }\n }\n\n context2D.stroke()\n } finally {\n context2D.restore()\n }\n\n return boundariesPoints\n}\n\nfunction drawArrowHead(context2D: CanvasRenderingContext2D, headPoint: TPoint, angle: number, length: number)\n{\n const alpha = phi(angle + (Math.PI * (7 / 8)))\n const beta = phi(angle - (Math.PI * (7 / 8)))\n context2D.save()\n try {\n context2D.fillStyle = context2D.strokeStyle\n\n context2D.moveTo(headPoint.x, headPoint.y)\n context2D.beginPath()\n context2D.lineTo(headPoint.x + (length * Math.cos(alpha)), headPoint.y + (length * Math.sin(alpha)))\n context2D.lineTo(headPoint.x + (length * Math.cos(beta)), headPoint.y + (length * Math.sin(beta)))\n context2D.lineTo(headPoint.x, headPoint.y)\n context2D.fill()\n } finally {\n context2D.restore()\n }\n}\n\nfunction drawShapeEllipse(context2D: CanvasRenderingContext2D, shapeEllipse: TShapeEllipseSymbol)\n{\n const points = drawEllipseArc(context2D, shapeEllipse)\n\n if (shapeEllipse?.beginDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, points[0], shapeEllipse.beginTangentAngle, 12.0)\n }\n if (shapeEllipse?.endDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, points[1], shapeEllipse.endTangentAngle, 12.0)\n }\n}\n\n/**\n * Draw a line\n * @param {Object} context2D Current rendering context2D\n * @param {{x: Number, y: Number}} p1 Origin point\n * @param {{x: Number, y: Number}} p2 Destination point\n */\nexport function drawLine(context2D: CanvasRenderingContext2D, p1: TPoint, p2: TPoint)\n{\n context2D.save()\n try {\n context2D.beginPath()\n context2D.moveTo(p1.x, p1.y)\n context2D.lineTo(p2.x, p2.y)\n context2D.stroke()\n } finally {\n context2D.restore()\n }\n}\n\nfunction drawShapeLine(context2D: CanvasRenderingContext2D, shapeLine: TShapeLineSymbol)\n{\n drawLine(context2D, shapeLine.firstPoint, shapeLine.lastPoint)\n if (shapeLine.beginDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, shapeLine.firstPoint, shapeLine.beginTangentAngle, 12.0)\n }\n if (shapeLine.endDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, shapeLine.lastPoint, shapeLine.endTangentAngle, 12.0)\n }\n}\n\n/**\n * Draw a shape symbol\n * @param {Object} context2D Current rendering context2D\n * @param {Object} symbol Symbol to draw\n */\nexport function drawShapeSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol)\n{\n context2D.save()\n try {\n context2D.lineWidth = symbol.style.width as number\n context2D.strokeStyle = symbol.style.color as string\n\n if (symbol.elementType) {\n switch (symbol.elementType) {\n case ShapeSymbols.shape: {\n const shapeSymbol = symbol as TShapeSymbol\n drawShapeSymbol(context2D, shapeSymbol.candidates[shapeSymbol.selectedCandidateIndex])\n break\n }\n case ShapeSymbols.table:{\n const tableSymbols = symbol as TShapeTableSymbol\n tableSymbols.lines.forEach(line => drawShapeSymbol(context2D, line))\n break\n }\n case ShapeSymbols.line: {\n const lineSymbol = symbol as TLineSymbol\n drawLine(context2D, lineSymbol.data.p1, lineSymbol.data.p2)\n break\n }\n default:\n // logger.error(`${ symbol.elementType } not implemented`)\n break\n }\n } else {\n switch (symbol.type) {\n case ShapeSymbols.ellipse: {\n drawShapeEllipse(context2D, symbol as TShapeEllipseSymbol)\n break\n }\n case ShapeSymbols.line: {\n drawShapeLine(context2D, symbol as TShapeLineSymbol)\n break\n }\n case ShapeSymbols.recognizedShape: {\n const recognizedShape = symbol as TShapeRecognizedSymbol\n recognizedShape.primitives.forEach(primitive => drawShapeSymbol(context2D, primitive))\n break\n }\n default:\n // logger.error(`${ symbol.type } not implemented`)\n break\n }\n }\n } finally {\n context2D.restore()\n }\n}\n","import { TStroke } from \"../../@types/model/Stroke\"\nimport { CanvasStroker } from \"./CanvasStroker\"\n\nexport function drawStroke (context2D: CanvasRenderingContext2D, stroke: TStroke, stroker: CanvasStroker) {\n if (stroker && stroke && stroke.pointerType !== \"eraser\") {\n stroker.drawStroke(context2D, stroke)\n }\n}\n","import { TPoint } from \"../../@types/geometry\"\nimport { drawLine } from \"./CanvasRendererShapeSymbol\"\nimport { TSymbol, TTextUnderlineDataSymbol, TTextUnderlineSymbol, TUnderLineSymbol } from \"../../@types/renderer/Symbol\"\n\nexport const TextSymbols = {\n inputCharacter: \"inputCharacter\",\n char: \"char\",\n string: \"string\",\n textLine: \"textLine\"\n}\n\nfunction drawUnderline(context2D: CanvasRenderingContext2D, underline: TUnderLineSymbol, label: string, data: TTextUnderlineDataSymbol)\n{\n const delta = data.width / label.length\n const p1: TPoint = {\n x: data.topLeftPoint.x + (underline.data.firstCharacter * delta),\n y: data.topLeftPoint.y + data.height\n }\n const p2: TPoint = {\n x: data.topLeftPoint.x + (underline.data.lastCharacter * delta),\n y: data.topLeftPoint.y + data.height\n }\n drawLine(context2D, p1, p2)\n}\n\nfunction drawText(context2D: CanvasRenderingContext2D, label: string, data: TTextUnderlineDataSymbol)\n{\n context2D.save()\n try {\n context2D.font = `${ data.textHeight }px serif`\n context2D.textAlign = (data.justificationType === \"CENTER\") ? \"center\" : \"left\"\n context2D.textBaseline = \"bottom\"\n context2D.fillStyle = context2D.strokeStyle\n context2D.fillText(label, data.topLeftPoint.x, (data.topLeftPoint.y + data.height))\n } finally {\n context2D.restore()\n }\n}\n\nfunction drawTextLine(context2D: CanvasRenderingContext2D, textLine: TTextUnderlineSymbol)\n{\n drawText(context2D, textLine.label, textLine.data)\n textLine.underlineList.forEach((underline) =>\n {\n drawUnderline(context2D, underline, textLine.label, textLine.data)\n })\n}\n\n/**\n * Draw a text symbol\n * @param {Object} context Current rendering context\n * @param {Object} symbol Symbol to draw\n */\nexport function drawTextSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol)\n{\n context2D.save()\n try {\n context2D.lineWidth = (symbol.style.width as number)\n context2D.strokeStyle = (symbol.style.color as string)\n const type: string = symbol.elementType || symbol.type\n\n switch (type) {\n case TextSymbols.textLine:\n drawTextLine(context2D, symbol as TTextUnderlineSymbol)\n break\n default:\n console.info(`drawTextSymbol => ${symbol.elementType} not implemented`)\n break\n }\n\n } finally {\n context2D.restore()\n }\n}\n","import { TPoint, TPointer } from \"../@types/geometry\"\n\nexport function computeLinksPoints(point: TPointer, angle: number, width: number): TPoint[]\n{\n const radius = point.p * width\n return [\n {\n x: (point.x - (Math.sin(angle) * radius)),\n y: (point.y + (Math.cos(angle) * radius))\n },\n {\n x: (point.x + (Math.sin(angle) * radius)),\n y: (point.y - (Math.cos(angle) * radius))\n }\n ]\n}\n\nexport function computeMiddlePoint(point1: TPointer, point2: TPointer): TPointer\n{\n return {\n x: ((point2.x + point1.x) / 2),\n y: ((point2.y + point1.y) / 2),\n p: ((point2.p + point1.p) / 2),\n t: ((point2.t + point1.t) / 2)\n }\n}\n\nexport function computeAxeAngle(begin: TPointer, end: TPointer): number\n{\n return Math.atan2(end.y - begin.y, end.x - begin.x)\n}\n","import { TPointer } from \"../../@types/geometry\"\nimport { TStroke } from \"../../@types/model/Stroke\"\nimport { computeAxeAngle, computeLinksPoints, computeMiddlePoint } from \"../QuadraticUtils\"\n\nexport class CanvasStroker\n{\n\n private renderArc(context2d: CanvasRenderingContext2D, center: TPointer, radius: number): void\n {\n context2d.arc(center.x, center.y, radius, 0, Math.PI * 2, true)\n }\n\n private renderLine(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, width: number): void\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, end), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(begin, end), width)\n\n context2d.moveTo(linkPoints1[0].x, linkPoints1[0].y)\n context2d.lineTo(linkPoints2[0].x, linkPoints2[0].y)\n context2d.lineTo(linkPoints2[1].x, linkPoints2[1].y)\n context2d.lineTo(linkPoints1[1].x, linkPoints1[1].y)\n }\n\n private renderFinal(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, width: number): void\n {\n const ARCSPLIT = 6\n const angle = computeAxeAngle(begin, end)\n const linkPoints = computeLinksPoints(end, angle, width)\n context2d.moveTo(linkPoints[0].x, linkPoints[0].y)\n for (let i = 1; i <= ARCSPLIT; i++) {\n const newAngle = angle - ((i * Math.PI) / ARCSPLIT)\n context2d.lineTo(end.x - ((end.p * width) * Math.sin(newAngle)), end.y + (end.p * width * Math.cos(newAngle)))\n }\n }\n\n private renderQuadratic(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, ctrl: TPointer, width: number): void\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, ctrl), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(ctrl, end), width)\n const linkPoints3 = computeLinksPoints(ctrl, computeAxeAngle(begin, end), width)\n\n context2d.moveTo(linkPoints1[0].x, linkPoints1[0].y)\n context2d.quadraticCurveTo(linkPoints3[0].x, linkPoints3[0].y, linkPoints2[0].x, linkPoints2[0].y)\n context2d.lineTo(linkPoints2[1].x, linkPoints2[1].y)\n context2d.quadraticCurveTo(linkPoints3[1].x, linkPoints3[1].y, linkPoints1[1].x, linkPoints1[1].y)\n }\n\n drawStroke(context2d: CanvasRenderingContext2D, stroke: TStroke): void\n {\n const NUMBER_POINTS = stroke.pointers.length\n const NUMBER_QUADRATICS = NUMBER_POINTS - 2\n const width = (stroke.style.width as number) > 0 ? (stroke.style.width as number) : context2d.lineWidth\n const color = (stroke.style.color as string) ? (stroke.style.color as string) : context2d.strokeStyle\n const firstPoint = stroke.pointers[0] as TPointer\n\n context2d.save()\n try {\n context2d.beginPath()\n if (NUMBER_POINTS < 3) {\n this.renderArc(context2d, firstPoint, width * 0.6)\n } else {\n this.renderArc(context2d, firstPoint, width * firstPoint.p)\n const secondPoint: TPointer = computeMiddlePoint(firstPoint, stroke.pointers[1])\n this.renderLine(context2d, firstPoint, secondPoint, width)\n\n // Possibility to try this (the start looks better when the ink is large)\n // var first = computeMiddlePoint(stroke.pointers[0], stroke.pointers[1]);\n // context2d.arc(first.x, first.y, width * first.p, 0, Math.PI * 2, true);\n\n for (let i = 0; i < NUMBER_QUADRATICS; i++) {\n const begin: TPointer = computeMiddlePoint(stroke.pointers[i], stroke.pointers[i + 1])\n const end: TPointer = computeMiddlePoint(stroke.pointers[i + 1], stroke.pointers[i + 2])\n const ctrl: TPointer = stroke.pointers[i + 1]\n this.renderQuadratic(context2d, begin, end, ctrl, width)\n }\n const beginLine: TPointer = computeMiddlePoint(stroke.pointers[NUMBER_POINTS - 2], stroke.pointers[NUMBER_POINTS - 1])\n const endLine: TPointer = stroke.pointers[NUMBER_POINTS - 1]\n this.renderLine(context2d, beginLine, endLine, width)\n\n const beginFinal: TPointer = stroke.pointers[NUMBER_POINTS - 2]\n const endFinal: TPointer = stroke.pointers[NUMBER_POINTS - 1]\n this.renderFinal(context2d, beginFinal, endFinal, width)\n }\n context2d.closePath()\n if (color !== undefined) {\n context2d.fillStyle = color\n context2d.fill()\n }\n context2d.save()\n }\n finally {\n context2d.restore()\n }\n }\n}\n","import { TStroke } from \"../../@types/model/Stroke\"\nimport { TRenderingConfiguration } from \"../../@types/configuration/RenderingConfiguration\"\nimport { IModel } from \"../../@types/model/Model\"\nimport { TSymbol } from \"../../@types/renderer/Symbol\"\n\nimport { drawShapeSymbol, ShapeSymbols } from \"./CanvasRendererShapeSymbol\"\nimport { drawStroke } from \"./CanvasRendererStrokeSymbol\"\nimport { drawTextSymbol, TextSymbols } from \"./CanvasRendererTextSymbol\"\nimport { CanvasStroker } from \"./CanvasStroker\"\nimport { LoggerManager } from \"../../logger\"\nimport { LoggerClass } from \"../../Constants\"\n\nexport class CanvasRenderer\n{\n config: TRenderingConfiguration\n stroker: CanvasStroker\n context!: {\n parent: HTMLElement\n renderingCanvas: HTMLCanvasElement\n renderingCanvasContext: CanvasRenderingContext2D\n capturingCanvas: HTMLCanvasElement\n capturingCanvasContext: CanvasRenderingContext2D\n }\n #logger = LoggerManager.getLogger(LoggerClass.RENDERER)\n\n constructor(config: TRenderingConfiguration)\n {\n this.#logger.info(\"constructor\", { config })\n this.config = config\n this.stroker = new CanvasStroker()\n }\n\n private createCanvas(type: string): HTMLCanvasElement\n {\n this.#logger.debug(\"createCanvas\", { type })\n const canvas: HTMLCanvasElement = document.createElement(\"canvas\")\n canvas.id = type\n canvas.classList.add(type)\n canvas.classList.add(\"ms-canvas\")\n return canvas\n }\n\n private resizeContent(): void\n {\n const pixelRatio: number = window.devicePixelRatio\n const elements: HTMLCanvasElement[] = [this.context.renderingCanvas, this.context.capturingCanvas]\n elements.forEach((canvas) =>\n {\n const domElement = canvas.parentNode as HTMLElement\n const width = Math.max(this.config.minWidth, domElement.clientWidth)\n const height = Math.max(this.config.minHeight, domElement.clientHeight)\n canvas.width = width * pixelRatio\n canvas.height = height * pixelRatio\n canvas.getContext(\"2d\")?.scale(pixelRatio, pixelRatio)\n canvas.style.width = `${ width }px`\n canvas.style.height = `${ height }px`\n })\n }\n\n private drawSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol)\n {\n const type = symbol.elementType || symbol.type\n if (type === \"stroke\") {\n drawStroke(context2D, symbol as TStroke, this.stroker)\n } else if (Object.keys(TextSymbols).includes(type)) {\n drawTextSymbol(context2D, symbol)\n } else if (Object.keys(ShapeSymbols).includes(type)) {\n drawShapeSymbol(context2D, symbol)\n }\n }\n\n init(element: HTMLElement): void\n {\n this.#logger.info(\"init\", { element })\n const renderingCanvas: HTMLCanvasElement = this.createCanvas(\"ms-rendering-canvas\")\n element.appendChild(renderingCanvas)\n\n const capturingCanvas: HTMLCanvasElement = this.createCanvas(\"ms-capture-canvas\")\n element.appendChild(capturingCanvas)\n\n this.context = {\n parent: element,\n renderingCanvas,\n renderingCanvasContext: renderingCanvas.getContext(\"2d\") as CanvasRenderingContext2D,\n capturingCanvas,\n capturingCanvasContext: capturingCanvas.getContext(\"2d\") as CanvasRenderingContext2D\n }\n\n this.resizeContent()\n }\n\n drawModel(model: IModel): void\n {\n this.#logger.info(\"drawModel\", { model })\n this.context.renderingCanvasContext?.clearRect(0, 0, this.context.renderingCanvas.width, this.context.renderingCanvas.height)\n model.rawStrokes.forEach(symbol => this.drawSymbol(this.context.renderingCanvasContext, symbol))\n this.context.capturingCanvasContext.clearRect(0, 0, this.context.capturingCanvas.width, this.context.capturingCanvas.height)\n }\n\n drawPendingStroke(stroke: TStroke | undefined): void\n {\n this.#logger.info(\"drawPendingStroke\", { stroke })\n this.context.capturingCanvasContext.clearRect(0, 0, this.context.capturingCanvas.width, this.context.capturingCanvas.height)\n if (stroke && stroke?.pointerType !== \"eraser\") {\n this.stroker.drawStroke(this.context.capturingCanvasContext, stroke)\n }\n }\n\n resize(model: IModel): void\n {\n this.#logger.info(\"resize\", { model })\n this.resizeContent()\n this.drawModel(model)\n }\n\n destroy(): void\n {\n this.#logger.info(\"destroy\")\n if (this.context.parent) {\n this.context.parent.innerHTML = \"\"\n }\n }\n}\n","!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.JsonCSS=e():t.JsonCSS=e()}(this,function(){return function(t){function e(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,o){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,\"a\",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p=\"\",e(e.s=1)}([function(t,e,n){\"use strict\";function o(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(e,\"__esModule\",{value:!0});var r=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},i=function t(e){var n=this;o(this,t),this.toJSON=function(t){if(\"string\"!=typeof t)return console.error(\"Need a CSS string but given \",void 0===t?\"undefined\":r(t),t),\"Not a valid CSS..!\";var e={},o=void 0,i=void 0,u=void 0;try{t.split(\"{\").forEach(function(t){if(i=t.trim())if(-1===i.indexOf(\"}\"))e[i]={},o=i;else{i.substring(0,i.indexOf(\"}\")).split(\";\").forEach(function(t){(u=t.split(\":\"))&&2===u.length&&(e[o][u[0].trim().replace(/^\\\"|\\\"$/g,\"\")]=n._trimSemiColon(u[1].trim().replace(/^\\\"|\\\"$/g,\"\")))});try{o=i.split(\"}\")[1].trim(),o&&(e[o]={})}catch(t){}}})}catch(t){return\"Not a valid CSS..!\"}return e},this.toCSS=function(t){if(\"object\"!==(void 0===t?\"undefined\":r(t)))return console.error(\"Need a JSON object but given \",void 0===t?\"undefined\":r(t),t),\"Not a valid JSON..!\";var e=\"\";try{for(var n in t)if(t.hasOwnProperty(n)){e+=n+\" {\\n\";for(var o in t[n])t[n].hasOwnProperty(o)&&(e+=o+\": \"+t[n][o]+\";\\n\");e+=\"}\\n\"}}catch(t){return\"Not a valid JSON..!\"}return e},this._trimSemiColon=function(t){return\";\"===t.slice(-1)?t.slice(0,n.length-1):t}};e.default=i},function(t,e,n){\"use strict\";t.exports=n(0).default}])});","import JsonCSS from \"json-css\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TTheme } from \"../@types/style/Theme\"\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst parser: any = new JsonCSS()\n\nexport const StyleHelper = {\n themeToCSS(json: TTheme): string\n {\n return parser.toCSS(json) as string\n // css = css.replace( /[\\r\\n]+/gm, \"\" )\n // return css\n },\n themeToJSON(style: string): TTheme\n {\n const theme = parser.toJSON(style) as TTheme\n theme[\".text\"][\"font-size\"] = Number(theme[\".text\"][\"font-size\"])\n theme.ink[\"-myscript-pen-width\"] = Number(theme.ink[\"-myscript-pen-width\"])\n theme.ink.width = Number(theme.ink.width)\n return theme\n },\n penStyleToCSS (penStyle: TPenStyle): string {\n let css = parser.toCSS({ css: penStyle }) as string\n css = css.substring(6, css.length - 3)\n return css\n },\n penStyleToJSON (penStyleString: string): TPenStyle {\n const penStyle = parser.toJSON(`css {${penStyleString}}`).css as TPenStyle\n if (penStyle.width) {\n penStyle.width = Number(penStyle.width)\n } else {\n delete penStyle.width\n }\n if (penStyle[\"-myscript-pen-width\"]) {\n penStyle[\"-myscript-pen-width\"] = Number(penStyle[\"-myscript-pen-width\"])\n } else {\n delete penStyle[\"-myscript-pen-width\"]\n }\n return penStyle\n },\n\n stringToJSON(style: string): {[key: string]: string}\n {\n return parser.toJSON(`css {${style}}`).css\n },\n JSONToString(style: {[key: string]: string}): string\n {\n return Object.entries(style).map(([k, v]) => `${k}:${v}`).join(\";\")\n }\n}\n",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory();\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\troot.CryptoJS = factory();\n\t}\n}(this, function () {\n\n\t/**\n\t * CryptoJS core components.\n\t */\n\tvar CryptoJS = CryptoJS || (function (Math, undefined) {\n\t /*\n\t * Local polyfil of Object.create\n\t */\n\t var create = Object.create || (function () {\n\t function F() {};\n\n\t return function (obj) {\n\t var subtype;\n\n\t F.prototype = obj;\n\n\t subtype = new F();\n\n\t F.prototype = null;\n\n\t return subtype;\n\t };\n\t }())\n\n\t /**\n\t * CryptoJS namespace.\n\t */\n\t var C = {};\n\n\t /**\n\t * Library namespace.\n\t */\n\t var C_lib = C.lib = {};\n\n\t /**\n\t * Base object for prototypal inheritance.\n\t */\n\t var Base = C_lib.Base = (function () {\n\n\n\t return {\n\t /**\n\t * Creates a new object that inherits from this object.\n\t *\n\t * @param {Object} overrides Properties to copy into the new object.\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * field: 'value',\n\t *\n\t * method: function () {\n\t * }\n\t * });\n\t */\n\t extend: function (overrides) {\n\t // Spawn\n\t var subtype = create(this);\n\n\t // Augment\n\t if (overrides) {\n\t subtype.mixIn(overrides);\n\t }\n\n\t // Create default initializer\n\t if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\n\t subtype.init = function () {\n\t subtype.$super.init.apply(this, arguments);\n\t };\n\t }\n\n\t // Initializer's prototype is the subtype object\n\t subtype.init.prototype = subtype;\n\n\t // Reference supertype\n\t subtype.$super = this;\n\n\t return subtype;\n\t },\n\n\t /**\n\t * Extends this object and runs the init method.\n\t * Arguments to create() will be passed to init().\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var instance = MyType.create();\n\t */\n\t create: function () {\n\t var instance = this.extend();\n\t instance.init.apply(instance, arguments);\n\n\t return instance;\n\t },\n\n\t /**\n\t * Initializes a newly created object.\n\t * Override this method to add some logic when your objects are created.\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * init: function () {\n\t * // ...\n\t * }\n\t * });\n\t */\n\t init: function () {\n\t },\n\n\t /**\n\t * Copies properties into this object.\n\t *\n\t * @param {Object} properties The properties to mix in.\n\t *\n\t * @example\n\t *\n\t * MyType.mixIn({\n\t * field: 'value'\n\t * });\n\t */\n\t mixIn: function (properties) {\n\t for (var propertyName in properties) {\n\t if (properties.hasOwnProperty(propertyName)) {\n\t this[propertyName] = properties[propertyName];\n\t }\n\t }\n\n\t // IE won't copy toString using the loop above\n\t if (properties.hasOwnProperty('toString')) {\n\t this.toString = properties.toString;\n\t }\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = instance.clone();\n\t */\n\t clone: function () {\n\t return this.init.prototype.extend(this);\n\t }\n\t };\n\t }());\n\n\t /**\n\t * An array of 32-bit words.\n\t *\n\t * @property {Array} words The array of 32-bit words.\n\t * @property {number} sigBytes The number of significant bytes in this word array.\n\t */\n\t var WordArray = C_lib.WordArray = Base.extend({\n\t /**\n\t * Initializes a newly created word array.\n\t *\n\t * @param {Array} words (Optional) An array of 32-bit words.\n\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.create();\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n\t */\n\t init: function (words, sigBytes) {\n\t words = this.words = words || [];\n\n\t if (sigBytes != undefined) {\n\t this.sigBytes = sigBytes;\n\t } else {\n\t this.sigBytes = words.length * 4;\n\t }\n\t },\n\n\t /**\n\t * Converts this word array to a string.\n\t *\n\t * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n\t *\n\t * @return {string} The stringified word array.\n\t *\n\t * @example\n\t *\n\t * var string = wordArray + '';\n\t * var string = wordArray.toString();\n\t * var string = wordArray.toString(CryptoJS.enc.Utf8);\n\t */\n\t toString: function (encoder) {\n\t return (encoder || Hex).stringify(this);\n\t },\n\n\t /**\n\t * Concatenates a word array to this word array.\n\t *\n\t * @param {WordArray} wordArray The word array to append.\n\t *\n\t * @return {WordArray} This word array.\n\t *\n\t * @example\n\t *\n\t * wordArray1.concat(wordArray2);\n\t */\n\t concat: function (wordArray) {\n\t // Shortcuts\n\t var thisWords = this.words;\n\t var thatWords = wordArray.words;\n\t var thisSigBytes = this.sigBytes;\n\t var thatSigBytes = wordArray.sigBytes;\n\n\t // Clamp excess bits\n\t this.clamp();\n\n\t // Concat\n\t if (thisSigBytes % 4) {\n\t // Copy one byte at a time\n\t for (var i = 0; i < thatSigBytes; i++) {\n\t var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n\t }\n\t } else {\n\t // Copy one word at a time\n\t for (var i = 0; i < thatSigBytes; i += 4) {\n\t thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\n\t }\n\t }\n\t this.sigBytes += thatSigBytes;\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Removes insignificant bits.\n\t *\n\t * @example\n\t *\n\t * wordArray.clamp();\n\t */\n\t clamp: function () {\n\t // Shortcuts\n\t var words = this.words;\n\t var sigBytes = this.sigBytes;\n\n\t // Clamp\n\t words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n\t words.length = Math.ceil(sigBytes / 4);\n\t },\n\n\t /**\n\t * Creates a copy of this word array.\n\t *\n\t * @return {WordArray} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = wordArray.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone.words = this.words.slice(0);\n\n\t return clone;\n\t },\n\n\t /**\n\t * Creates a word array filled with random bytes.\n\t *\n\t * @param {number} nBytes The number of random bytes to generate.\n\t *\n\t * @return {WordArray} The random word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.random(16);\n\t */\n\t random: function (nBytes) {\n\t var words = [];\n\n\t var r = (function (m_w) {\n\t var m_w = m_w;\n\t var m_z = 0x3ade68b1;\n\t var mask = 0xffffffff;\n\n\t return function () {\n\t m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;\n\t m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;\n\t var result = ((m_z << 0x10) + m_w) & mask;\n\t result /= 0x100000000;\n\t result += 0.5;\n\t return result * (Math.random() > .5 ? 1 : -1);\n\t }\n\t });\n\n\t for (var i = 0, rcache; i < nBytes; i += 4) {\n\t var _r = r((rcache || Math.random()) * 0x100000000);\n\n\t rcache = _r() * 0x3ade67b7;\n\t words.push((_r() * 0x100000000) | 0);\n\t }\n\n\t return new WordArray.init(words, nBytes);\n\t }\n\t });\n\n\t /**\n\t * Encoder namespace.\n\t */\n\t var C_enc = C.enc = {};\n\n\t /**\n\t * Hex encoding strategy.\n\t */\n\t var Hex = C_enc.Hex = {\n\t /**\n\t * Converts a word array to a hex string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The hex string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var hexChars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t hexChars.push((bite >>> 4).toString(16));\n\t hexChars.push((bite & 0x0f).toString(16));\n\t }\n\n\t return hexChars.join('');\n\t },\n\n\t /**\n\t * Converts a hex string to a word array.\n\t *\n\t * @param {string} hexStr The hex string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Hex.parse(hexString);\n\t */\n\t parse: function (hexStr) {\n\t // Shortcut\n\t var hexStrLength = hexStr.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < hexStrLength; i += 2) {\n\t words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n\t }\n\n\t return new WordArray.init(words, hexStrLength / 2);\n\t }\n\t };\n\n\t /**\n\t * Latin1 encoding strategy.\n\t */\n\t var Latin1 = C_enc.Latin1 = {\n\t /**\n\t * Converts a word array to a Latin1 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The Latin1 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var latin1Chars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t latin1Chars.push(String.fromCharCode(bite));\n\t }\n\n\t return latin1Chars.join('');\n\t },\n\n\t /**\n\t * Converts a Latin1 string to a word array.\n\t *\n\t * @param {string} latin1Str The Latin1 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n\t */\n\t parse: function (latin1Str) {\n\t // Shortcut\n\t var latin1StrLength = latin1Str.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < latin1StrLength; i++) {\n\t words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n\t }\n\n\t return new WordArray.init(words, latin1StrLength);\n\t }\n\t };\n\n\t /**\n\t * UTF-8 encoding strategy.\n\t */\n\t var Utf8 = C_enc.Utf8 = {\n\t /**\n\t * Converts a word array to a UTF-8 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The UTF-8 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t try {\n\t return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n\t } catch (e) {\n\t throw new Error('Malformed UTF-8 data');\n\t }\n\t },\n\n\t /**\n\t * Converts a UTF-8 string to a word array.\n\t *\n\t * @param {string} utf8Str The UTF-8 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n\t */\n\t parse: function (utf8Str) {\n\t return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n\t }\n\t };\n\n\t /**\n\t * Abstract buffered block algorithm template.\n\t *\n\t * The property blockSize must be implemented in a concrete subtype.\n\t *\n\t * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n\t */\n\t var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\n\t /**\n\t * Resets this block algorithm's data buffer to its initial state.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm.reset();\n\t */\n\t reset: function () {\n\t // Initial values\n\t this._data = new WordArray.init();\n\t this._nDataBytes = 0;\n\t },\n\n\t /**\n\t * Adds new data to this block algorithm's buffer.\n\t *\n\t * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm._append('data');\n\t * bufferedBlockAlgorithm._append(wordArray);\n\t */\n\t _append: function (data) {\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof data == 'string') {\n\t data = Utf8.parse(data);\n\t }\n\n\t // Append\n\t this._data.concat(data);\n\t this._nDataBytes += data.sigBytes;\n\t },\n\n\t /**\n\t * Processes available data blocks.\n\t *\n\t * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n\t *\n\t * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n\t *\n\t * @return {WordArray} The processed data.\n\t *\n\t * @example\n\t *\n\t * var processedData = bufferedBlockAlgorithm._process();\n\t * var processedData = bufferedBlockAlgorithm._process(!!'flush');\n\t */\n\t _process: function (doFlush) {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\t var dataSigBytes = data.sigBytes;\n\t var blockSize = this.blockSize;\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count blocks ready\n\t var nBlocksReady = dataSigBytes / blockSizeBytes;\n\t if (doFlush) {\n\t // Round up to include partial blocks\n\t nBlocksReady = Math.ceil(nBlocksReady);\n\t } else {\n\t // Round down to include only full blocks,\n\t // less the number of blocks that must remain in the buffer\n\t nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n\t }\n\n\t // Count words ready\n\t var nWordsReady = nBlocksReady * blockSize;\n\n\t // Count bytes ready\n\t var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n\t // Process blocks\n\t if (nWordsReady) {\n\t for (var offset = 0; offset < nWordsReady; offset += blockSize) {\n\t // Perform concrete-algorithm logic\n\t this._doProcessBlock(dataWords, offset);\n\t }\n\n\t // Remove processed words\n\t var processedWords = dataWords.splice(0, nWordsReady);\n\t data.sigBytes -= nBytesReady;\n\t }\n\n\t // Return processed words\n\t return new WordArray.init(processedWords, nBytesReady);\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = bufferedBlockAlgorithm.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone._data = this._data.clone();\n\n\t return clone;\n\t },\n\n\t _minBufferSize: 0\n\t });\n\n\t /**\n\t * Abstract hasher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n\t */\n\t var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\n\t /**\n\t * Configuration options.\n\t */\n\t cfg: Base.extend(),\n\n\t /**\n\t * Initializes a newly created hasher.\n\t *\n\t * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n\t *\n\t * @example\n\t *\n\t * var hasher = CryptoJS.algo.SHA256.create();\n\t */\n\t init: function (cfg) {\n\t // Apply config defaults\n\t this.cfg = this.cfg.extend(cfg);\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this hasher to its initial state.\n\t *\n\t * @example\n\t *\n\t * hasher.reset();\n\t */\n\t reset: function () {\n\t // Reset data buffer\n\t BufferedBlockAlgorithm.reset.call(this);\n\n\t // Perform concrete-hasher logic\n\t this._doReset();\n\t },\n\n\t /**\n\t * Updates this hasher with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {Hasher} This hasher.\n\t *\n\t * @example\n\t *\n\t * hasher.update('message');\n\t * hasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t // Append\n\t this._append(messageUpdate);\n\n\t // Update the hash\n\t this._process();\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the hash computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @example\n\t *\n\t * var hash = hasher.finalize();\n\t * var hash = hasher.finalize('message');\n\t * var hash = hasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Final message update\n\t if (messageUpdate) {\n\t this._append(messageUpdate);\n\t }\n\n\t // Perform concrete-hasher logic\n\t var hash = this._doFinalize();\n\n\t return hash;\n\t },\n\n\t blockSize: 512/32,\n\n\t /**\n\t * Creates a shortcut function to a hasher's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to create a helper for.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHelper: function (hasher) {\n\t return function (message, cfg) {\n\t return new hasher.init(cfg).finalize(message);\n\t };\n\t },\n\n\t /**\n\t * Creates a shortcut function to the HMAC's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to use in this HMAC helper.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHmacHelper: function (hasher) {\n\t return function (message, key) {\n\t return new C_algo.HMAC.init(hasher, key).finalize(message);\n\t };\n\t }\n\t });\n\n\t /**\n\t * Algorithm namespace.\n\t */\n\t var C_algo = C.algo = {};\n\n\t return C;\n\t}(Math));\n\n\n\treturn CryptoJS;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.enc.Hex;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (undefined) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var X32WordArray = C_lib.WordArray;\n\n\t /**\n\t * x64 namespace.\n\t */\n\t var C_x64 = C.x64 = {};\n\n\t /**\n\t * A 64-bit word.\n\t */\n\t var X64Word = C_x64.Word = Base.extend({\n\t /**\n\t * Initializes a newly created 64-bit word.\n\t *\n\t * @param {number} high The high 32 bits.\n\t * @param {number} low The low 32 bits.\n\t *\n\t * @example\n\t *\n\t * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);\n\t */\n\t init: function (high, low) {\n\t this.high = high;\n\t this.low = low;\n\t }\n\n\t /**\n\t * Bitwise NOTs this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after negating.\n\t *\n\t * @example\n\t *\n\t * var negated = x64Word.not();\n\t */\n\t // not: function () {\n\t // var high = ~this.high;\n\t // var low = ~this.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise ANDs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to AND with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after ANDing.\n\t *\n\t * @example\n\t *\n\t * var anded = x64Word.and(anotherX64Word);\n\t */\n\t // and: function (word) {\n\t // var high = this.high & word.high;\n\t // var low = this.low & word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise ORs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to OR with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after ORing.\n\t *\n\t * @example\n\t *\n\t * var ored = x64Word.or(anotherX64Word);\n\t */\n\t // or: function (word) {\n\t // var high = this.high | word.high;\n\t // var low = this.low | word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise XORs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to XOR with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after XORing.\n\t *\n\t * @example\n\t *\n\t * var xored = x64Word.xor(anotherX64Word);\n\t */\n\t // xor: function (word) {\n\t // var high = this.high ^ word.high;\n\t // var low = this.low ^ word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Shifts this word n bits to the left.\n\t *\n\t * @param {number} n The number of bits to shift.\n\t *\n\t * @return {X64Word} A new x64-Word object after shifting.\n\t *\n\t * @example\n\t *\n\t * var shifted = x64Word.shiftL(25);\n\t */\n\t // shiftL: function (n) {\n\t // if (n < 32) {\n\t // var high = (this.high << n) | (this.low >>> (32 - n));\n\t // var low = this.low << n;\n\t // } else {\n\t // var high = this.low << (n - 32);\n\t // var low = 0;\n\t // }\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Shifts this word n bits to the right.\n\t *\n\t * @param {number} n The number of bits to shift.\n\t *\n\t * @return {X64Word} A new x64-Word object after shifting.\n\t *\n\t * @example\n\t *\n\t * var shifted = x64Word.shiftR(7);\n\t */\n\t // shiftR: function (n) {\n\t // if (n < 32) {\n\t // var low = (this.low >>> n) | (this.high << (32 - n));\n\t // var high = this.high >>> n;\n\t // } else {\n\t // var low = this.high >>> (n - 32);\n\t // var high = 0;\n\t // }\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Rotates this word n bits to the left.\n\t *\n\t * @param {number} n The number of bits to rotate.\n\t *\n\t * @return {X64Word} A new x64-Word object after rotating.\n\t *\n\t * @example\n\t *\n\t * var rotated = x64Word.rotL(25);\n\t */\n\t // rotL: function (n) {\n\t // return this.shiftL(n).or(this.shiftR(64 - n));\n\t // },\n\n\t /**\n\t * Rotates this word n bits to the right.\n\t *\n\t * @param {number} n The number of bits to rotate.\n\t *\n\t * @return {X64Word} A new x64-Word object after rotating.\n\t *\n\t * @example\n\t *\n\t * var rotated = x64Word.rotR(7);\n\t */\n\t // rotR: function (n) {\n\t // return this.shiftR(n).or(this.shiftL(64 - n));\n\t // },\n\n\t /**\n\t * Adds this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to add with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after adding.\n\t *\n\t * @example\n\t *\n\t * var added = x64Word.add(anotherX64Word);\n\t */\n\t // add: function (word) {\n\t // var low = (this.low + word.low) | 0;\n\t // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;\n\t // var high = (this.high + word.high + carry) | 0;\n\n\t // return X64Word.create(high, low);\n\t // }\n\t });\n\n\t /**\n\t * An array of 64-bit words.\n\t *\n\t * @property {Array} words The array of CryptoJS.x64.Word objects.\n\t * @property {number} sigBytes The number of significant bytes in this word array.\n\t */\n\t var X64WordArray = C_x64.WordArray = Base.extend({\n\t /**\n\t * Initializes a newly created word array.\n\t *\n\t * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.\n\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create();\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create([\n\t * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t * ]);\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create([\n\t * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t * ], 10);\n\t */\n\t init: function (words, sigBytes) {\n\t words = this.words = words || [];\n\n\t if (sigBytes != undefined) {\n\t this.sigBytes = sigBytes;\n\t } else {\n\t this.sigBytes = words.length * 8;\n\t }\n\t },\n\n\t /**\n\t * Converts this 64-bit word array to a 32-bit word array.\n\t *\n\t * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.\n\t *\n\t * @example\n\t *\n\t * var x32WordArray = x64WordArray.toX32();\n\t */\n\t toX32: function () {\n\t // Shortcuts\n\t var x64Words = this.words;\n\t var x64WordsLength = x64Words.length;\n\n\t // Convert\n\t var x32Words = [];\n\t for (var i = 0; i < x64WordsLength; i++) {\n\t var x64Word = x64Words[i];\n\t x32Words.push(x64Word.high);\n\t x32Words.push(x64Word.low);\n\t }\n\n\t return X32WordArray.create(x32Words, this.sigBytes);\n\t },\n\n\t /**\n\t * Creates a copy of this word array.\n\t *\n\t * @return {X64WordArray} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = x64WordArray.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\n\t // Clone \"words\" array\n\t var words = clone.words = this.words.slice(0);\n\n\t // Clone each X64Word object\n\t var wordsLength = words.length;\n\t for (var i = 0; i < wordsLength; i++) {\n\t words[i] = words[i].clone();\n\t }\n\n\t return clone;\n\t }\n\t });\n\t}());\n\n\n\treturn CryptoJS;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./x64-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Hasher = C_lib.Hasher;\n\t var C_x64 = C.x64;\n\t var X64Word = C_x64.Word;\n\t var X64WordArray = C_x64.WordArray;\n\t var C_algo = C.algo;\n\n\t function X64Word_create() {\n\t return X64Word.create.apply(X64Word, arguments);\n\t }\n\n\t // Constants\n\t var K = [\n\t X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),\n\t X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),\n\t X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),\n\t X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),\n\t X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),\n\t X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),\n\t X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),\n\t X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),\n\t X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),\n\t X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),\n\t X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),\n\t X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),\n\t X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),\n\t X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),\n\t X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),\n\t X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),\n\t X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),\n\t X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),\n\t X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),\n\t X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),\n\t X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),\n\t X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),\n\t X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),\n\t X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),\n\t X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),\n\t X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),\n\t X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),\n\t X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),\n\t X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),\n\t X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),\n\t X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),\n\t X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),\n\t X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),\n\t X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),\n\t X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),\n\t X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),\n\t X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),\n\t X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),\n\t X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),\n\t X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)\n\t ];\n\n\t // Reusable objects\n\t var W = [];\n\t (function () {\n\t for (var i = 0; i < 80; i++) {\n\t W[i] = X64Word_create();\n\t }\n\t }());\n\n\t /**\n\t * SHA-512 hash algorithm.\n\t */\n\t var SHA512 = C_algo.SHA512 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new X64WordArray.init([\n\t new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),\n\t new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),\n\t new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),\n\t new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)\n\t ]);\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcuts\n\t var H = this._hash.words;\n\n\t var H0 = H[0];\n\t var H1 = H[1];\n\t var H2 = H[2];\n\t var H3 = H[3];\n\t var H4 = H[4];\n\t var H5 = H[5];\n\t var H6 = H[6];\n\t var H7 = H[7];\n\n\t var H0h = H0.high;\n\t var H0l = H0.low;\n\t var H1h = H1.high;\n\t var H1l = H1.low;\n\t var H2h = H2.high;\n\t var H2l = H2.low;\n\t var H3h = H3.high;\n\t var H3l = H3.low;\n\t var H4h = H4.high;\n\t var H4l = H4.low;\n\t var H5h = H5.high;\n\t var H5l = H5.low;\n\t var H6h = H6.high;\n\t var H6l = H6.low;\n\t var H7h = H7.high;\n\t var H7l = H7.low;\n\n\t // Working variables\n\t var ah = H0h;\n\t var al = H0l;\n\t var bh = H1h;\n\t var bl = H1l;\n\t var ch = H2h;\n\t var cl = H2l;\n\t var dh = H3h;\n\t var dl = H3l;\n\t var eh = H4h;\n\t var el = H4l;\n\t var fh = H5h;\n\t var fl = H5l;\n\t var gh = H6h;\n\t var gl = H6l;\n\t var hh = H7h;\n\t var hl = H7l;\n\n\t // Rounds\n\t for (var i = 0; i < 80; i++) {\n\t // Shortcut\n\t var Wi = W[i];\n\n\t // Extend message\n\t if (i < 16) {\n\t var Wih = Wi.high = M[offset + i * 2] | 0;\n\t var Wil = Wi.low = M[offset + i * 2 + 1] | 0;\n\t } else {\n\t // Gamma0\n\t var gamma0x = W[i - 15];\n\t var gamma0xh = gamma0x.high;\n\t var gamma0xl = gamma0x.low;\n\t var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);\n\t var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));\n\n\t // Gamma1\n\t var gamma1x = W[i - 2];\n\t var gamma1xh = gamma1x.high;\n\t var gamma1xl = gamma1x.low;\n\t var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);\n\t var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));\n\n\t // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]\n\t var Wi7 = W[i - 7];\n\t var Wi7h = Wi7.high;\n\t var Wi7l = Wi7.low;\n\n\t var Wi16 = W[i - 16];\n\t var Wi16h = Wi16.high;\n\t var Wi16l = Wi16.low;\n\n\t var Wil = gamma0l + Wi7l;\n\t var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);\n\t var Wil = Wil + gamma1l;\n\t var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);\n\t var Wil = Wil + Wi16l;\n\t var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);\n\n\t Wi.high = Wih;\n\t Wi.low = Wil;\n\t }\n\n\t var chh = (eh & fh) ^ (~eh & gh);\n\t var chl = (el & fl) ^ (~el & gl);\n\t var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);\n\t var majl = (al & bl) ^ (al & cl) ^ (bl & cl);\n\n\t var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));\n\t var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));\n\t var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));\n\t var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));\n\n\t // t1 = h + sigma1 + ch + K[i] + W[i]\n\t var Ki = K[i];\n\t var Kih = Ki.high;\n\t var Kil = Ki.low;\n\n\t var t1l = hl + sigma1l;\n\t var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);\n\t var t1l = t1l + chl;\n\t var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);\n\t var t1l = t1l + Kil;\n\t var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);\n\t var t1l = t1l + Wil;\n\t var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);\n\n\t // t2 = sigma0 + maj\n\t var t2l = sigma0l + majl;\n\t var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);\n\n\t // Update working variables\n\t hh = gh;\n\t hl = gl;\n\t gh = fh;\n\t gl = fl;\n\t fh = eh;\n\t fl = el;\n\t el = (dl + t1l) | 0;\n\t eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;\n\t dh = ch;\n\t dl = cl;\n\t ch = bh;\n\t cl = bl;\n\t bh = ah;\n\t bl = al;\n\t al = (t1l + t2l) | 0;\n\t ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;\n\t }\n\n\t // Intermediate hash value\n\t H0l = H0.low = (H0l + al);\n\t H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));\n\t H1l = H1.low = (H1l + bl);\n\t H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));\n\t H2l = H2.low = (H2l + cl);\n\t H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));\n\t H3l = H3.low = (H3l + dl);\n\t H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));\n\t H4l = H4.low = (H4l + el);\n\t H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));\n\t H5l = H5.low = (H5l + fl);\n\t H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));\n\t H6l = H6.low = (H6l + gl);\n\t H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));\n\t H7l = H7.low = (H7l + hl);\n\t H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);\n\t dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;\n\t data.sigBytes = dataWords.length * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Convert hash to 32-bit word array before returning\n\t var hash = this._hash.toX32();\n\n\t // Return final computed hash\n\t return hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t },\n\n\t blockSize: 1024/32\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA512('message');\n\t * var hash = CryptoJS.SHA512(wordArray);\n\t */\n\t C.SHA512 = Hasher._createHelper(SHA512);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA512(message, key);\n\t */\n\t C.HmacSHA512 = Hasher._createHmacHelper(SHA512);\n\t}());\n\n\n\treturn CryptoJS.SHA512;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var C_enc = C.enc;\n\t var Utf8 = C_enc.Utf8;\n\t var C_algo = C.algo;\n\n\t /**\n\t * HMAC algorithm.\n\t */\n\t var HMAC = C_algo.HMAC = Base.extend({\n\t /**\n\t * Initializes a newly created HMAC.\n\t *\n\t * @param {Hasher} hasher The hash algorithm to use.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @example\n\t *\n\t * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n\t */\n\t init: function (hasher, key) {\n\t // Init hasher\n\t hasher = this._hasher = new hasher.init();\n\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof key == 'string') {\n\t key = Utf8.parse(key);\n\t }\n\n\t // Shortcuts\n\t var hasherBlockSize = hasher.blockSize;\n\t var hasherBlockSizeBytes = hasherBlockSize * 4;\n\n\t // Allow arbitrary length keys\n\t if (key.sigBytes > hasherBlockSizeBytes) {\n\t key = hasher.finalize(key);\n\t }\n\n\t // Clamp excess bits\n\t key.clamp();\n\n\t // Clone key for inner and outer pads\n\t var oKey = this._oKey = key.clone();\n\t var iKey = this._iKey = key.clone();\n\n\t // Shortcuts\n\t var oKeyWords = oKey.words;\n\t var iKeyWords = iKey.words;\n\n\t // XOR keys with pad constants\n\t for (var i = 0; i < hasherBlockSize; i++) {\n\t oKeyWords[i] ^= 0x5c5c5c5c;\n\t iKeyWords[i] ^= 0x36363636;\n\t }\n\t oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this HMAC to its initial state.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.reset();\n\t */\n\t reset: function () {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Reset\n\t hasher.reset();\n\t hasher.update(this._iKey);\n\t },\n\n\t /**\n\t * Updates this HMAC with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {HMAC} This HMAC instance.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.update('message');\n\t * hmacHasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t this._hasher.update(messageUpdate);\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the HMAC computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @example\n\t *\n\t * var hmac = hmacHasher.finalize();\n\t * var hmac = hmacHasher.finalize('message');\n\t * var hmac = hmacHasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Compute HMAC\n\t var innerHash = hasher.finalize(messageUpdate);\n\t hasher.reset();\n\t var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n\t return hmac;\n\t }\n\t });\n\t}());\n\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"), require(\"./sha512\"), require(\"./hmac\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./x64-core\", \"./sha512\", \"./hmac\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.HmacSHA512;\n\n}));","import Hex from \"crypto-js/enc-hex\"\nimport HmacSHA512 from \"crypto-js/hmac-sha512\"\n\nexport function computeHmac (message: string, applicationKey: string, hmacKey: string): string {\n const hmac = new HmacSHA512(message, applicationKey + hmacKey)\n return hmac.toString(Hex) as string\n}\n","\nexport const isVersionSuperiorOrEqual = (source: string, target: string): boolean =>\n{\n const sourceParts = source.split(\".\")\n const targetParts = target.split(\".\")\n\n for (let i = 0; i < targetParts.length; i++) {\n const a = Number(targetParts[i])\n const b = Number(sourceParts[i])\n if (a > b) return false\n if (a < b) return true\n }\n return true\n}\n","import { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TStroke, TStrokeJSON } from \"../@types/model/Stroke\"\nimport { TPointer } from \"../@types/geometry\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class Stroke implements TStroke\n{\n id: string\n type: string\n pointerId: number\n pointerType: string\n elementType?: string\n pointers: TPointer[]\n length: number\n style: TPenStyle\n #logger = LoggerManager.getLogger(LoggerClass.STROKE)\n\n constructor(style: TPenStyle, pointerId: number, pointerType = \"pen\")\n {\n this.#logger.info(\"constructor\", { style, pointerId, pointerType })\n this.id = `${pointerType}-${Date.now().toString()}`\n this.type = \"stroke\"\n this.pointerId = pointerId\n this.pointerType = pointerType\n this.pointers = []\n this.length = 0\n this.style = style\n }\n}\n\nexport function convertStrokeToJSON(stroke: TStroke): TStrokeJSON\n{\n const json: TStrokeJSON = {\n id: stroke.id,\n pointerType: stroke.pointerType,\n p: [],\n t: [],\n x: [],\n y: []\n }\n stroke.pointers.forEach(p => {\n json.p.push(p.p)\n json.t.push(p.t)\n json.x.push(p.x)\n json.y.push(p.y)\n })\n return json\n}\n","\nimport { IRecognizer } from \"../@types/recognizer/Recognizer\"\nimport { TRestPostConfiguration, TRestPostData } from \"../@types/recognizer/RestRecognizer\"\nimport { TStrokeGroup, TStrokeGroupJSON } from \"../@types/model/Stroke\"\nimport { TConverstionState, TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { IModel, TExport, TJIIXExport } from \"../@types/model/Model\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\n\nimport { Error as ErrorConst } from \"../Constants\"\nimport { StyleHelper } from \"../style/StyleHelper\"\nimport { computeHmac } from \"../utils/CryptoHelper\"\nimport { isVersionSuperiorOrEqual } from \"../utils/version\"\nimport { convertStrokeToJSON } from \"../model/Stroke\"\n\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\ntype ApiError = {\n code?: string\n message: string\n}\n\nexport class RestRecognizer implements IRecognizer\n{\n protected serverConfiguration: TServerConfiguration\n protected recognitionConfiguration: TRecognitionConfiguration\n #logger = LoggerManager.getLogger(LoggerClass.RECOGNIZER)\n\n constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration)\n {\n this.#logger.info(\"constructor\", { serverConfig, recognitionConfig })\n this.serverConfiguration = serverConfig\n this.recognitionConfiguration = recognitionConfig\n }\n\n get url()\n {\n return `${ this.serverConfiguration.scheme }://${ this.serverConfiguration.host }/api/v4.0/iink/batch`\n }\n\n get postConfig(): TRestPostConfiguration\n {\n switch (this.recognitionConfiguration.type) {\n case \"DIAGRAM\":\n return {\n lang: this.recognitionConfiguration.lang,\n diagram: this.recognitionConfiguration.diagram,\n export: this.recognitionConfiguration.export\n }\n case \"MATH\":\n return {\n lang: this.recognitionConfiguration.lang,\n math: this.recognitionConfiguration.math,\n export: this.recognitionConfiguration.export\n }\n case \"Raw Content\":\n return {\n lang: this.recognitionConfiguration.lang,\n \"raw-content\": this.recognitionConfiguration[\"raw-content\"],\n export: this.recognitionConfiguration.export\n }\n case \"TEXT\":\n return {\n lang: this.recognitionConfiguration.lang,\n text: this.recognitionConfiguration.text,\n export: this.recognitionConfiguration.export\n }\n default:\n throw new Error(`get postConfig error Recognition type unkow \"${ this.recognitionConfiguration.type }\"`)\n break\n }\n }\n\n private buildData(model: IModel): TRestPostData\n {\n this.#logger.info(\"buildData\", { model })\n const isPenStyleEqual = (ps1: TPenStyle, ps2: TPenStyle) =>\n {\n return ps1 && ps2 && ps1[\"-myscript-pen-fill-color\"] === ps2[\"-myscript-pen-fill-color\"] &&\n ps1[\"-myscript-pen-fill-style\"] === ps2[\"-myscript-pen-fill-style\"] &&\n ps1[\"-myscript-pen-width\"] === ps2[\"-myscript-pen-width\"] &&\n ps1.color === ps2.color &&\n ps1.width === ps2.width\n }\n\n const strokeGroupByPenStyle: TStrokeGroup[] = []\n model.rawStrokes.forEach((s) => {\n const groupIndex = strokeGroupByPenStyle.findIndex(sg => isPenStyleEqual(sg.penStyle, s.style))\n if (groupIndex > -1) {\n strokeGroupByPenStyle[groupIndex].strokes.push(s)\n } else {\n strokeGroupByPenStyle.push({\n penStyle: s.style,\n strokes: [s]\n })\n }\n })\n\n const strokeGroupsToSend: TStrokeGroupJSON[] = []\n strokeGroupByPenStyle.forEach((group: TStrokeGroup) =>\n {\n const newPenStyle = JSON.stringify(group.penStyle) === \"{}\" ? undefined : StyleHelper.penStyleToCSS(group.penStyle as TPenStyle)\n const newGroup = {\n penStyle: newPenStyle,\n strokes: group.strokes.map(convertStrokeToJSON)\n }\n strokeGroupsToSend.push(newGroup)\n })\n\n const contentType: string = this.recognitionConfiguration.type === \"Raw Content\" ?\n \"Raw Content\" :\n this.recognitionConfiguration.type.charAt(0).toUpperCase() + this.recognitionConfiguration.type.slice(1).toLowerCase()\n\n const data = {\n configuration: this.postConfig,\n xDPI: 96,\n yDPI: 96,\n contentType,\n // theme: StyleHelper.themeToCSS(),\n height: model.height,\n width: model.width,\n strokeGroups: strokeGroupsToSend\n }\n this.#logger.debug(\"buildData\", { data })\n return data\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private async post(data: any, mimeType: string): Promise\n {\n this.#logger.info(\"post\", { data, mimeType })\n const headers = new Headers()\n headers.append(\"Accept\", \"application/json,\" + mimeType)\n headers.append(\"applicationKey\", this.serverConfiguration.applicationKey)\n headers.append(\"hmac\", computeHmac(JSON.stringify(data), this.serverConfiguration.applicationKey, this.serverConfiguration.hmacKey))\n headers.append(\"Content-Type\", \"application/json\")\n\n if (isVersionSuperiorOrEqual(this.serverConfiguration.version, \"2.0.4\")) {\n headers.append(\"myscript-client-name\", \"iink-ts\")\n headers.append(\"myscript-client-version\", \"1.0.0-buildVersion\")\n }\n\n const reqInit: RequestInit = {\n method: \"POST\",\n headers,\n body: JSON.stringify(data)\n }\n const request = new Request(this.url, reqInit)\n const response: Response = await fetch(request)\n if (response.ok) {\n const contentType = response.headers.get(\"content-type\")\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let result: any\n switch (contentType) {\n case \"application/vnd.openxmlformats-officedocument.presentationml.presentation\":\n case \"image/png\":\n case \"image/jpeg\":\n result = await response.blob()\n break\n case \"application/json\":\n result = await response.json()\n break\n case \"application/vnd.myscript.jiix\":\n result = await response.clone().json().catch(async () => await response.text())\n break\n default:\n this.#logger.warn(\"post default\", { contentType })\n result = await response.text()\n break\n }\n this.#logger.debug(\"post\", { result })\n return result\n } else {\n const err = await response.json() as ApiError\n this.#logger.error(\"post\", { err })\n throw err\n }\n }\n\n private async tryFetch(data: unknown, mimeType: string): Promise\n {\n this.#logger.debug(\"tryFetch\", { data, mimeType })\n return this.post(data, mimeType)\n .then((res) =>\n {\n const exports: TExport = {}\n exports[mimeType] = res as TJIIXExport | string | Blob\n this.#logger.debug(\"tryFetch\", { exports })\n return exports\n })\n .catch((err) =>\n {\n this.#logger.error(\"tryFetch\", { data, mimeType, err })\n let message = err.message || ErrorConst.UNKNOW\n if (!err.code) {\n message = ErrorConst.CANT_ESTABLISH\n } else if (err.code === \"access.not.granted\") {\n message = ErrorConst.WRONG_CREDENTIALS\n }\n const error = new Error(message)\n throw error\n })\n }\n\n private getMimeTypes(requestedMimeTypes?: string[]): string[]\n {\n this.#logger.info(\"getMimeTypes\", { requestedMimeTypes })\n let mimeTypes: string[] = requestedMimeTypes || []\n if (!mimeTypes.length) {\n switch (this.recognitionConfiguration.type) {\n case \"DIAGRAM\":\n mimeTypes = this.recognitionConfiguration.diagram.mimeTypes\n break\n case \"MATH\":\n mimeTypes = this.recognitionConfiguration.math.mimeTypes\n break\n case \"Raw Content\":\n mimeTypes = [\"application/vnd.myscript.jiix\"]\n break\n case \"TEXT\":\n mimeTypes = this.recognitionConfiguration.text.mimeTypes\n break\n default:\n throw new Error(`Recognition type \"${ this.recognitionConfiguration.type }\" is unknown.\\n Possible types are:\\n -DIAGRAM\\n -MATH\\n -Raw Content\\n -TEXT`)\n break\n }\n }\n return mimeTypes\n }\n\n async convert(model: IModel, conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise\n {\n this.#logger.info(\"convert\", { model, conversionState, requestedMimeTypes })\n const myModel = model.getClone()\n const mimeTypes = this.getMimeTypes(requestedMimeTypes)\n const dataToConcert = this.buildData(myModel)\n dataToConcert.conversionState = conversionState\n const promises = mimeTypes.map(mt => this.tryFetch(dataToConcert, mt))\n const converts: TExport[] = await Promise.all(promises)\n converts.forEach(c =>\n {\n myModel.mergeConvert(c)\n })\n this.#logger.debug(\"convert\", { model: myModel })\n return myModel\n }\n\n async export(model: IModel, requestedMimeTypes?: string[]): Promise\n {\n this.#logger.info(\"export\", { model, requestedMimeTypes })\n const myModel = model.getClone()\n if (myModel.rawStrokes.length === 0) {\n return Promise.resolve(myModel)\n }\n const mimeTypes = this.getMimeTypes(requestedMimeTypes)\n if (!mimeTypes.length) {\n this.#logger.error(\"export\", { model, requestedMimeTypes, \"Export failed, no mimeTypes define in recognition configuration\": String })\n return Promise.reject(new Error(\"Export failed, no mimeTypes define in recognition configuration\"))\n }\n const mimeTypesRequiringExport: string[] = mimeTypes.filter(m => !myModel.exports || !myModel.exports[m])\n const data = this.buildData(model)\n const exports: TExport[] = await Promise.all(mimeTypesRequiringExport.map(mimeType => this.tryFetch(data, mimeType)))\n exports.forEach(e =>\n {\n myModel.mergeExport(e)\n })\n this.#logger.debug(\"export\", { model: myModel })\n return myModel\n }\n\n async resize(model: IModel): Promise\n {\n this.#logger.info(\"resize\", { model })\n return this.export(model)\n }\n\n}\n","import { IModel } from \"../@types/model/Model\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\n\nexport class UndoRedoContext implements TUndoRedoContext\n{\n canUndo: boolean\n canRedo: boolean\n empty: boolean\n stackIndex: number\n possibleUndoCount: number\n stack: IModel[]\n\n constructor(model: IModel)\n {\n this.stackIndex = 0\n this.possibleUndoCount = 0\n this.canRedo = false\n this.canUndo = false\n this.empty = true\n this.stack = [model.getClone()]\n }\n}\n","import { TUndoRedoConfiguration } from \"../@types/configuration/UndoRedoConfiguration\"\nimport { IModel } from \"../@types/model/Model\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { UndoRedoContext } from \"./UndoRedoContext\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class UndoRedoManager\n{\n context: UndoRedoContext\n configuration: TUndoRedoConfiguration\n #logger = LoggerManager.getLogger(LoggerClass.UNDOREDO_MANAGER)\n\n constructor(configuration: TUndoRedoConfiguration, model: IModel)\n {\n this.#logger.info(\"constructor\", { configuration, model })\n this.configuration = configuration\n this.context = new UndoRedoContext(model)\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n private updateCanUndoRedo(): void\n {\n this.context.canRedo = this.context.stack.length - 1 > this.context.stackIndex\n this.context.canUndo = this.context.stackIndex > 0\n const currentModel = this.context.stack[this.context.stackIndex]\n this.context.empty = currentModel.rawStrokes.length === 0\n }\n\n addModelToStack(model: IModel): void\n {\n this.#logger.info(\"addModelToStack\", { model })\n if (this.context.stackIndex + 1 < this.context.stack.length) {\n this.context.stack.splice(this.context.stackIndex + 1)\n }\n\n this.context.stack.push(model.getClone())\n this.context.stackIndex = this.context.stack.length - 1\n\n if (this.context.stack.length > this.configuration.maxStackSize) {\n this.context.stack.shift()\n this.context.stackIndex--\n }\n\n this.updateCanUndoRedo()\n this.internalEvent.emitContextChange(this.context)\n }\n\n removeLastModelInStack(): void\n {\n this.#logger.info(\"removeLastModelInStack\")\n if (this.context.stackIndex === this.context.stack.length - 1) {\n this.context.stackIndex--\n }\n this.context.stack.pop()\n this.updateCanUndoRedo()\n }\n\n updateModelInStack(model: IModel): void\n {\n this.#logger.info(\"updateModelInStack\", { model })\n const index = this.context.stack.findIndex(m => m.modificationDate === model.modificationDate)\n if (index > -1) {\n this.context.stack.splice(index, 1, model.getClone())\n }\n this.internalEvent.emitContextChange(this.context)\n }\n\n undo(): IModel\n {\n this.#logger.info(\"undo\")\n if (this.context.canUndo) {\n this.context.stackIndex--\n this.updateCanUndoRedo()\n this.internalEvent.emitContextChange(this.context)\n }\n const previousModel = this.context.stack[this.context.stackIndex].getClone()\n this.#logger.debug(\"undo\", previousModel)\n return previousModel\n }\n\n redo(): IModel\n {\n this.#logger.info(\"redo\")\n if (this.context.canRedo) {\n this.context.stackIndex++\n this.updateCanUndoRedo()\n this.internalEvent.emitContextChange(this.context)\n }\n const nextModel = this.context.stack[this.context.stackIndex].getClone()\n this.#logger.debug(\"redo\", nextModel)\n return nextModel\n }\n\n reset(model: IModel): void\n {\n this.#logger.info(\"reset\", { model })\n this.context = new UndoRedoContext(model)\n this.internalEvent.emitContextChange(this.context)\n }\n\n}\n","import { TPenStyle } from \"../@types/style/PenStyle\"\n\nexport const DefaultPenStyle: TPenStyle = {}","import { TTheme } from \"../@types/style/Theme\"\n\nexport const DefaultTheme: TTheme = {\n ink: {\n color: \"#000000\",\n width: 1,\n \"-myscript-pen-width\": 1,\n \"-myscript-pen-fill-style\": \"none\",\n \"-myscript-pen-fill-color\": \"#FFFFFF00\"\n },\n \".math\": {\n \"font-family\": \"STIXGeneral\"\n },\n \".math-solved\": {\n \"font-family\": \"STIXGeneral\",\n color: \"#A8A8A8FF\"\n },\n \".text\": {\n \"font-family\": \"MyScriptInter\",\n \"font-size\": 10\n }\n}\n","import { TTheme } from \"../@types/style/Theme\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\n\nimport { mergeDeep } from \"../utils/MergeHelper\"\n\nimport { DefaultPenStyle } from \"./DefaultPenStyle\"\nimport { DefaultTheme } from \"./DefaultTheme\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class StyleManager\n{\n #penStyle!: TPenStyle\n #theme!: TTheme\n #penStyleClasses!: string\n #currentPenStyle!: TPenStyle\n #logger = LoggerManager.getLogger(LoggerClass.STYLEMANAGER)\n\n constructor(penStyle?: TPenStyle, theme?: TTheme)\n {\n this.#logger.info(\"constructor\", { penStyle, theme })\n this.setTheme(theme)\n this.setPenStyleClasses()\n this.setPenStyle(penStyle)\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.#currentPenStyle || this.#penStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.#penStyle\n }\n setPenStyle(style?: TPenStyle)\n {\n this.#logger.info(\"setPenStyle\", { style })\n this.#penStyle = mergeDeep(structuredClone(DefaultPenStyle), style || {}) as TPenStyle\n this.#currentPenStyle = style || (this.theme[`.${ this.#penStyleClasses }`]) as TPenStyle\n this.#logger.debug(\"setPenStyle\", this.#currentPenStyle)\n }\n\n get theme(): TTheme\n {\n return this.#theme\n }\n setTheme(theme?: TTheme)\n {\n this.#logger.info(\"setTheme\", { theme })\n this.#theme = mergeDeep(structuredClone(DefaultTheme), theme || {}) as TTheme\n this.#logger.debug(\"setTheme\", this.#theme)\n }\n\n get penStyleClasses(): string\n {\n return this.#penStyleClasses\n }\n setPenStyleClasses(penStyleClass = \"\")\n {\n this.#logger.info(\"setPenStyleClasses\", { penStyleClass })\n this.#penStyleClasses = penStyleClass\n this.#currentPenStyle = (this.theme[`.${ this.#penStyleClasses }`]) as TPenStyle\n this.#logger.debug(\"setPenStyleClasses\", this.#currentPenStyle)\n }\n\n}\n","import { TPoint } from \"../@types/geometry\"\n\nexport function computeDistance(p1: TPoint, p2: TPoint): number\n{\n const distance = Math.hypot(p2.y - p1.y, p2.x - p1.x)\n return isNaN(distance) ? 0 : distance\n}\n","import { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TPoint, TPointer } from \"../@types/geometry\"\nimport { TStroke } from \"../@types/model/Stroke\"\nimport { IModel, TExport } from \"../@types/model/Model\"\nimport { TRecognitionPositions } from \"../@types/model/RecognitionPositions\"\n\nimport { computeDistance } from \"../utils/geometric\"\nimport { Stroke } from \"./Stroke\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class Model implements IModel\n{\n readonly creationTime: number\n modificationDate: number\n currentStroke?: TStroke\n positions: TRecognitionPositions\n rawStrokes: TStroke[]\n selectedStrokes: TStroke[]\n exports?: TExport\n converts?: TExport\n width: number\n height: number\n idle: boolean\n #logger = LoggerManager.getLogger(LoggerClass.MODEL)\n\n constructor(width = 100, height = 100, creationDate: number = Date.now())\n {\n this.#logger.info(\"constructor\", { width, height, creationDate })\n this.creationTime = creationDate\n this.modificationDate = creationDate\n this.width = width\n this.height = height\n this.rawStrokes = []\n this.selectedStrokes = []\n this.positions = {\n lastSentPosition: 0,\n lastReceivedPosition: 0\n }\n this.idle = true\n }\n\n mergeExport(exports: TExport)\n {\n this.#logger.info(\"mergeExport\", { exports })\n if (this.exports) {\n Object.assign(this.exports, exports)\n } else {\n this.exports = exports\n }\n this.#logger.debug(\"mergeExport\", this.exports)\n }\n\n mergeConvert(converts: TExport)\n {\n this.#logger.info(\"mergeConvert\", { converts })\n if (this.converts) {\n Object.assign(this.converts, converts)\n } else {\n this.converts = converts\n }\n this.#logger.debug(\"mergeConvert\", this.converts)\n }\n\n private computePressure(distance: number, globalDistance: number): number\n {\n let ratio = 1.0\n if (globalDistance === 0) {\n ratio = 0.5\n } else if (distance === globalDistance) {\n ratio = 1.0\n } else if (distance < 10) {\n ratio = 0.2 + Math.pow(0.1 * distance, 0.4)\n } else if (distance > globalDistance - 10) {\n ratio = 0.2 + Math.pow(0.1 * (globalDistance - distance), 0.4)\n }\n const pressure = ratio * Math.max(0.1, 1.0 - (0.1 * Math.sqrt(distance)))\n return isNaN(pressure) ? 0.5 : Math.round(pressure * 100) / 100\n }\n\n private filterPointByAcquisitionDelta(stroke: TStroke, point: TPointer, lastPointer: TPointer): boolean\n {\n const delta: number = (2 + ((stroke.style[\"-myscript-pen-width\"] || 0) / 4))\n return !lastPointer ||\n stroke.pointers.length === 0 ||\n Math.abs(lastPointer.x - point.x) >= delta ||\n Math.abs(lastPointer.y - point.y) >= delta\n }\n\n addPoint(stroke: TStroke, pointer: TPointer): void\n {\n this.#logger.debug(\"addPoint\", { stroke, pointer })\n const lastPointer: TPointer = stroke.pointers.at(-1) || { p: 1, t: 0, x: 0, y: 0 }\n if (this.filterPointByAcquisitionDelta(stroke, pointer, lastPointer)) {\n const distance = computeDistance(pointer, lastPointer)\n stroke.length += distance\n pointer.p = this.computePressure(distance, stroke.length)\n stroke.pointers.push(pointer)\n }\n }\n\n addStroke(stroke: TStroke): void\n {\n this.#logger.info(\"addStroke\", { stroke })\n this.rawStrokes.push(stroke)\n }\n\n extractUnsentStrokes(): TStroke[]\n {\n return this.rawStrokes.slice(this.positions.lastSentPosition)\n }\n\n initCurrentStroke(point: TPointer, pointerId: number, pointerType: string, style: TPenStyle, dpi = 96): void\n {\n this.#logger.info(\"initCurrentStroke\", { point, pointerId, pointerType, style, dpi })\n if (style[\"-myscript-pen-width\"]) {\n const pxWidth = (style[\"-myscript-pen-width\"] * dpi) / 25.4\n style.width = pxWidth / 2\n }\n this.modificationDate = Date.now()\n this.exports = undefined\n this.converts = undefined\n this.currentStroke = new Stroke(style, pointerId, pointerType)\n this.#logger.debug(\"initCurrentStroke\", this.currentStroke)\n this.addPoint(this.currentStroke, point)\n }\n\n appendToCurrentStroke(point: TPointer): void\n {\n this.#logger.info(\"appendToCurrentStroke\", { point })\n if (this.currentStroke) {\n this.addPoint(this.currentStroke, point)\n }\n this.#logger.debug(\"appendToCurrentStroke\", this.currentStroke)\n }\n\n endCurrentStroke(point: TPointer): void\n {\n this.#logger.info(\"endCurrentStroke\", { point })\n if (this.currentStroke) {\n this.addPoint(this.currentStroke, point)\n this.addStroke(this.currentStroke)\n this.currentStroke = undefined\n }\n this.#logger.debug(\"endCurrentStroke\", this.currentStroke)\n }\n\n #getStrokeFromPoint(point: TPoint): TStroke[]\n {\n this.#logger.info(\"getStrokeFromPoint\", { point })\n const isBetween = (val: number, min: number, max: number): boolean => (val >= min && val <= max)\n\n const _strokeList: TStroke[] = []\n this.rawStrokes.forEach((stroke) =>\n {\n for (let i = 0; i < stroke.pointers.length; i++) {\n const strokePointer = stroke.pointers[i]\n if (\n isBetween(strokePointer.x, point.x - 5, point.x + 5) &&\n isBetween(strokePointer.y, point.y - 5, point.y + 5)\n ) {\n _strokeList.push(stroke)\n break\n }\n else {\n if (computeDistance(point, strokePointer) < 10) {\n _strokeList.push(stroke)\n break\n }\n }\n }\n })\n this.#logger.debug(\"getStrokeFromPoint\", { strokes: _strokeList })\n return _strokeList\n }\n\n resetSelectedStrokes(): void\n {\n this.selectedStrokes = []\n }\n\n appendSelectedStrokesFromPoint(point: TPoint): void\n {\n this.#logger.info(\"appendSelectedStrokesFromPoint\", { point })\n this.#getStrokeFromPoint(point)\n .forEach(s =>\n {\n if (!this.selectedStrokes.includes(s)) {\n this.selectedStrokes.push(s)\n }\n })\n }\n\n updateStroke(updatedStroke: TStroke): void\n {\n this.#logger.info(\"updateStroke\", { updatedStroke })\n const strokeIndex = this.rawStrokes.findIndex((s: TStroke): boolean => s.id === updatedStroke.id)\n if (strokeIndex !== -1) {\n this.rawStrokes.splice(strokeIndex, 1, updatedStroke)\n }\n this.#logger.debug(\"updateStroke\", this.rawStrokes)\n }\n\n removeStroke(id: string): void\n {\n this.#logger.info(\"removeStroke\", { id })\n const strokeIndex = this.rawStrokes.findIndex((s: TStroke): boolean => s.id === id)\n if (strokeIndex !== -1) {\n this.rawStrokes.splice(strokeIndex, 1)\n }\n this.#logger.debug(\"removeStroke\", this.rawStrokes)\n }\n\n removeStrokesFromPoint(point: TPoint): string[]\n {\n this.#logger.info(\"removeStrokesFromPoint\", { point })\n const strokes = this.#getStrokeFromPoint(point)\n strokes.forEach(strokeToRemove =>\n {\n this.removeStroke(strokeToRemove.id)\n })\n this.#logger.debug(\"removeStrokesFromPoint\", strokes.map(s => s.id))\n return strokes.map(s => s.id)\n }\n\n updatePositionSent(position: number = this.rawStrokes.length): void\n {\n this.#logger.info(\"updatePositionSent\", { position })\n this.positions.lastSentPosition = position\n this.#logger.debug(\"updatePositionSent\", this.positions.lastSentPosition)\n }\n\n updatePositionReceived(): void\n {\n this.#logger.info(\"updatePositionReceived\")\n this.positions.lastReceivedPosition = this.positions.lastSentPosition\n this.#logger.debug(\"updatePositionReceived\", this.positions.lastReceivedPosition)\n }\n\n getClone(): IModel\n {\n this.#logger.info(\"getClone\")\n const clonedModel = new Model(this.width, this.height, this.creationTime)\n clonedModel.modificationDate = JSON.parse(JSON.stringify(this.modificationDate))\n clonedModel.currentStroke = this.currentStroke ? JSON.parse(JSON.stringify(this.currentStroke)) : undefined\n clonedModel.rawStrokes = JSON.parse(JSON.stringify(this.rawStrokes))\n clonedModel.positions = JSON.parse(JSON.stringify(this.positions))\n clonedModel.exports = this.exports ? JSON.parse(JSON.stringify(this.exports)) : undefined\n clonedModel.converts = this.converts ? JSON.parse(JSON.stringify(this.converts)) : undefined\n clonedModel.idle = this.idle\n this.#logger.debug(\"getClone\", { clonedModel })\n return clonedModel\n }\n\n clear(): void\n {\n this.#logger.info(\"clear\")\n this.modificationDate = Date.now()\n this.currentStroke = undefined\n this.rawStrokes = []\n this.positions.lastSentPosition = 0\n this.positions.lastReceivedPosition = 0\n this.exports = undefined\n this.converts = undefined\n this.idle = true\n }\n}\n","import { IBehaviors, TBehaviorOptions } from \"../@types/Behaviors\"\nimport { IModel, TExport } from \"../@types/model/Model\"\nimport { TConfiguration } from \"../@types/configuration\"\nimport { TConverstionState } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TTheme } from \"../@types/style/Theme\"\nimport { TPointer } from \"../@types/geometry\"\n\nimport { PointerEventGrabber } from \"../grabber/PointerEventGrabber\"\nimport { CanvasRenderer } from \"../renderer/canvas/CanvasRenderer\"\nimport { RestRecognizer } from \"../recognizer/RestRecognizer\"\nimport { DeferredPromise } from \"../utils/DeferredPromise\"\nimport { UndoRedoManager } from \"../undo-redo/UndoRedoManager\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { StyleManager } from \"../style/StyleManager\"\nimport { Configuration } from \"../configuration/Configuration\"\nimport { Model } from \"../model/Model\"\nimport { Intention, LoggerClass } from \"../Constants\"\nimport { LoggerManager } from \"../logger\"\n\nexport class RestBehaviors implements IBehaviors\n{\n name = \"RestBehaviors\"\n options: TBehaviorOptions\n grabber: PointerEventGrabber\n renderer: CanvasRenderer\n recognizer: RestRecognizer\n undoRedoManager: UndoRedoManager\n styleManager: StyleManager\n #configuration: TConfiguration\n #model: IModel\n intention: Intention\n #logger = LoggerManager.getLogger(LoggerClass.BEHAVIORS)\n\n #resizeTimer?: ReturnType\n #exportTimer?: ReturnType\n\n constructor(options: TBehaviorOptions)\n {\n this.#logger.info(\"constructor\", { options })\n this.options = options\n this.#configuration = new Configuration(options?.configuration)\n this.styleManager = new StyleManager(options.penStyle, options.theme)\n\n this.grabber = new PointerEventGrabber(this.#configuration.grabber)\n this.renderer = new CanvasRenderer(this.#configuration.rendering)\n this.recognizer = new RestRecognizer(this.#configuration.server, this.#configuration.recognition)\n\n this.intention = Intention.Write\n this.#model = new Model()\n this.undoRedoManager = new UndoRedoManager(this.#configuration[\"undo-redo\"], this.model)\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n get model(): IModel\n {\n return this.#model\n }\n\n get context(): TUndoRedoContext\n {\n return this.undoRedoManager.context\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.styleManager.currentPenStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.styleManager.penStyle\n }\n setPenStyle(style?: TPenStyle)\n {\n this.#logger.info(\"setPenStyle\", { style })\n this.styleManager.setPenStyle(style)\n }\n\n get penStyleClasses(): string\n {\n return this.styleManager.penStyleClasses\n }\n setPenStyleClasses(penClass?: string)\n {\n this.#logger.info(\"setPenStyleClasses\", { penClass })\n this.styleManager.setPenStyleClasses(penClass)\n }\n\n get theme(): TTheme\n {\n return this.styleManager.theme\n }\n setTheme(theme?: TTheme)\n {\n this.#logger.info(\"setTheme\", { theme })\n this.styleManager.setTheme(theme)\n }\n\n get configuration(): TConfiguration\n {\n return this.#configuration\n }\n\n async init(domElement: HTMLElement): Promise\n {\n this.#logger.info(\"init\", { domElement })\n this.model.width = Math.max(domElement.clientWidth, this.#configuration.rendering.minWidth)\n this.model.height = Math.max(domElement.clientHeight, this.#configuration.rendering.minHeight)\n this.undoRedoManager.updateModelInStack(this.model)\n\n this.renderer.init(domElement)\n\n this.grabber.attach(domElement)\n this.grabber.onPointerDown = this.onPointerDown.bind(this)\n this.grabber.onPointerMove = this.onPointerMove.bind(this)\n this.grabber.onPointerUp = this.onPointerUp.bind(this)\n }\n\n private onPointerDown(evt: PointerEvent, point: TPointer): void\n {\n this.#logger.info(\"onPointerDown\", { intention: this.intention, evt, point })\n const { pointerType } = evt\n const style: TPenStyle = Object.assign({}, this.theme?.ink, this.currentPenStyle)\n switch (this.intention) {\n case Intention.Erase:\n if (this.model.removeStrokesFromPoint(point).length > 0) {\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(model => Object.assign(this.model, model))\n .catch(error => this.internalEvent.emitError(error as Error))\n }\n break\n case Intention.Write:\n this.model.initCurrentStroke(point, evt.pointerId, pointerType, style)\n this.drawCurrentStroke()\n break\n default:\n this.#logger.warn(`onPointerDown intention unknow: \"${this.intention}\"`)\n break\n }\n }\n\n private onPointerMove(_evt: PointerEvent, point: TPointer): void\n {\n this.#logger.info(\"onPointerMove\", { intention: this.intention, point })\n switch (this.intention) {\n case Intention.Erase:\n if (this.model.removeStrokesFromPoint(point).length > 0) {\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(newModel => Object.assign(this.#model, newModel))\n .catch(error => this.internalEvent.emitError(error as Error))\n }\n break\n case Intention.Write:\n this.model.appendToCurrentStroke(point)\n this.drawCurrentStroke()\n break\n default:\n this.#logger.warn(`onPointerMove intention unknow: \"${this.intention}\"`)\n break\n }\n }\n\n private onPointerUp(_evt: PointerEvent, point: TPointer): void\n {\n this.#logger.info(\"onPointerUp\", { intention: this.intention, point })\n switch (this.intention) {\n case Intention.Erase:\n if (this.model.removeStrokesFromPoint(point).length > 0) {\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(newModel => Object.assign(this.#model, newModel))\n .catch(error => this.internalEvent.emitError(error as Error))\n }\n break\n case Intention.Write:\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(newModel => Object.assign(this.#model, newModel))\n .catch(error => this.internalEvent.emitError(error as Error))\n break\n default:\n this.#logger.warn(`onPointerUp intention unknow: \"${this.intention}\"`)\n break\n }\n }\n\n drawCurrentStroke(): void\n {\n this.#logger.debug(\"drawCurrentStroke\", { stroke: this.model.currentStroke })\n this.renderer.drawPendingStroke(this.model.currentStroke)\n }\n\n async updateModelRendering(): Promise\n {\n this.#logger.info(\"updateModelRendering\")\n this.renderer.drawModel(this.model)\n const deferred = new DeferredPromise()\n this.undoRedoManager.addModelToStack(this.model)\n if (this.#configuration.triggers.exportContent !== \"DEMAND\") {\n clearTimeout(this.#exportTimer)\n let currentModel = this.model.getClone()\n this.#exportTimer = setTimeout(async () =>\n {\n try {\n currentModel = await this.recognizer.export(currentModel)\n this.undoRedoManager.updateModelInStack(currentModel)\n if (this.model.modificationDate === currentModel.modificationDate) {\n this.model.exports = currentModel.exports\n }\n deferred.resolve(this.model)\n } catch (error) {\n this.#logger.error(\"updateModelRendering\", { error })\n deferred.reject(error as Error)\n }\n }, this.#configuration.triggers.exportContent === \"QUIET_PERIOD\" ? this.#configuration.triggers.exportContentDelay : 0)\n } else {\n deferred.resolve(this.model)\n }\n await deferred.promise\n this.internalEvent.emitExported(this.model.exports as TExport)\n this.#logger.debug(\"updateModelRendering\", this.model.exports)\n return deferred.promise\n }\n\n async export(mimeTypes?: string[]): Promise\n {\n this.#logger.info(\"export\", { mimeTypes })\n const newModel = await this.recognizer.export(this.model.getClone(), mimeTypes)\n if (this.model.modificationDate === newModel.modificationDate) {\n this.model.mergeExport(newModel.exports as TExport)\n }\n this.undoRedoManager.updateModelInStack(newModel)\n this.#logger.debug(\"export\", this.model)\n return this.model\n }\n\n async convert(conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise\n {\n this.#logger.info(\"convert\", { conversionState, requestedMimeTypes })\n const newModel = await this.recognizer.convert(this.model, conversionState, requestedMimeTypes)\n Object.assign(this.#model, newModel)\n this.#logger.debug(\"convert\", this.model)\n return this.model\n }\n\n async resize(height: number, width: number): Promise\n {\n this.#logger.info(\"resize\", { height, width })\n const deferredResize = new DeferredPromise()\n this.model.height = height\n this.model.width = width\n this.renderer.resize(this.model)\n if (this.model.rawStrokes.length) {\n clearTimeout(this.#resizeTimer)\n this.#resizeTimer = setTimeout(async () =>\n {\n const resizeModel = await this.recognizer.resize(this.model)\n deferredResize.resolve(resizeModel)\n }, this.#configuration.triggers.resizeTriggerDelay)\n } else {\n deferredResize.resolve(this.model)\n }\n const newModel = await deferredResize.promise\n this.#logger.debug(\"resize\", { newModel })\n this.internalEvent.emitExported(newModel.exports as TExport)\n return newModel\n }\n\n async undo(): Promise\n {\n this.#logger.info(\"undo\")\n this.#model = this.undoRedoManager.undo()\n this.renderer.drawModel(this.#model)\n this.#model = await this.recognizer.export(this.#model)\n this.undoRedoManager.updateModelInStack(this.#model)\n this.internalEvent.emitExported(this.#model.exports as TExport)\n this.#logger.debug(\"undo\", this.#model)\n return this.#model\n }\n\n async redo(): Promise\n {\n this.#logger.info(\"redo\")\n this.#model = this.undoRedoManager.redo()\n this.renderer.drawModel(this.#model)\n this.#model = await this.recognizer.export(this.#model)\n this.undoRedoManager.updateModelInStack(this.#model)\n this.internalEvent.emitExported(this.#model.exports as TExport)\n this.#logger.debug(\"redo\", this.#model)\n return this.#model\n }\n\n async clear(): Promise\n {\n this.#logger.info(\"clear\")\n this.model.clear()\n this.undoRedoManager.addModelToStack(this.model)\n this.renderer.drawModel(this.model)\n this.internalEvent.emitExported(this.model.exports as TExport)\n this.#logger.debug(\"clear\", this.model)\n return this.model\n }\n\n async destroy(): Promise\n {\n this.#logger.info(\"destroy\")\n this.grabber.detach()\n this.renderer.destroy()\n return Promise.resolve()\n }\n}\n","\nimport { IRecognizer } from \"../@types/recognizer/Recognizer\"\nimport { TConverstionState, TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { IModel, TExport, TJIIXExport } from \"../@types/model/Model\"\nimport { TWebSocketContentChangeEvent, TWebSocketErrorEvent, TWebSocketEvent, TWebSocketExportEvent, TWebSocketHMACChallengeEvent, TWebSocketPartChangeEvent, TWebSocketSVGPatchEvent } from \"../@types/recognizer/WSRecognizer\"\nimport { TStroke } from \"../@types/model/Stroke\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TTheme } from \"../@types/style/Theme\"\nimport { LoggerClass } from \"../@types/configuration/LoggerConfiguration\"\n\nimport { Error as ErrorConst } from \"../Constants\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { computeHmac } from \"../utils/CryptoHelper\"\nimport { StyleHelper } from \"../style/StyleHelper\"\nimport { DeferredPromise } from \"../utils/DeferredPromise\"\nimport { isVersionSuperiorOrEqual } from \"../utils/version\"\nimport { convertStrokeToJSON } from \"../model/Stroke\"\nimport { LoggerManager } from \"../logger\"\n\n/**\n * A websocket dialog have this sequence :\n * --------------------------- Client --------------------------------------------------- Server ----------------------------------\n * init: send newContentPackage or restoreIInkSession ==================>\n * <================== hmacChallenge\n * answer hmacChallenge: send the hmac ==================>\n * <================== contentPackageDescription\n * answer contentPackageDescription:\n * send the configuration ==================>\n * send newContentPart or openContentPart ==================>\n * <================== partChanged\n * <================== contentChanged\n * <================== newPart\n * <================== svgPatch\n *\n * setPenStyle (send the parameters) ==================>\n * setTheme (send the parameters) ==================>\n * setPenStyleClasses (send the parameters) ==================>\n * <================== svgPatch\n * addStrokes (send the strokes ) ============>\n * <================== update\n */\nexport class WSRecognizer implements IRecognizer\n{\n #logger = LoggerManager.getLogger(LoggerClass.RECOGNIZER)\n protected serverConfiguration: TServerConfiguration\n protected recognitionConfiguration: TRecognitionConfiguration\n\n protected socket!: WebSocket\n protected pingCount = 0\n protected reconnectionCount = 0\n protected viewSizeHeight!: number\n protected viewSizeWidth!: number\n // contentPartCount = 0\n protected sessionId?: string\n protected currentPartId?: string\n protected currentErrorCode?: string | number\n\n protected penStyle?: TPenStyle\n protected penStyleClasses?: string\n protected theme?: TTheme\n\n protected connected?: DeferredPromise\n protected initialized?: DeferredPromise\n protected addStrokeDeferred?: DeferredPromise\n protected exportDeferred?: DeferredPromise\n protected convertDeferred?: DeferredPromise\n protected importDeferred?: DeferredPromise\n protected resizeDeferred?: DeferredPromise\n protected undoDeferred?: DeferredPromise\n protected redoDeferred?: DeferredPromise\n protected clearDeferred?: DeferredPromise\n protected importPointEventsDeferred?: DeferredPromise\n protected waitForIdleDeferred?: DeferredPromise\n\n url: string\n\n constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration)\n {\n this.serverConfiguration = serverConfig\n this.recognitionConfiguration = recognitionConfig\n const scheme = (this.serverConfiguration.scheme === \"https\") ? \"wss\" : \"ws\"\n this.url = `${ scheme }://${ this.serverConfiguration.host }/api/v4.0/iink/document?applicationKey=${ this.serverConfiguration.applicationKey }`\n this.#logger.info(\"constructor\", { serverConfig, recognitionConfig, url: this.url })\n }\n\n get mimeTypes(): string[]\n {\n switch (this.recognitionConfiguration.type.toLocaleLowerCase()) {\n case \"text\":\n return this.recognitionConfiguration.text.mimeTypes\n case \"math\":\n return this.recognitionConfiguration.math.mimeTypes\n case \"diagram\":\n return this.recognitionConfiguration.diagram.mimeTypes\n default:\n //\"raw-content\"\n return []\n }\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n protected infinitePing(): void\n {\n this.pingCount++\n if (this.serverConfiguration.websocket.maxPingLostCount < this.pingCount) {\n this.socket.close(1000, \"PING_LOST\")\n } else if (this.socket.readyState <= 1) {\n setTimeout(() =>\n {\n if (this.socket.readyState <= 1) {\n this.socket.send(JSON.stringify({ type: \"ping\" }))\n this.infinitePing()\n }\n }, this.serverConfiguration.websocket.pingDelay)\n }\n }\n\n protected openCallback(): void\n {\n this.connected?.resolve()\n const params: TWebSocketEvent = {\n type: this.sessionId ? \"restoreIInkSession\" : \"newContentPackage\",\n iinkSessionId: this.sessionId,\n applicationKey: this.serverConfiguration.applicationKey,\n xDpi: 96,\n yDpi: 96,\n viewSizeHeight: this.viewSizeHeight,\n viewSizeWidth: this.viewSizeWidth\n }\n if (isVersionSuperiorOrEqual(this.serverConfiguration.version, \"2.0.4\")) {\n params[\"myscript-client-name\"] = \"iink-ts\"\n params[\"myscript-client-version\"] = \"1.0.0-buildVersion\"\n }\n this.send(params)\n }\n\n protected rejectDeferredPending(error: Error): void\n {\n if (this.connected?.isPending) {\n this.connected?.reject(error)\n }\n if (this.initialized?.isPending) {\n this.initialized?.reject(error)\n }\n if (this.addStrokeDeferred?.isPending) {\n this.addStrokeDeferred?.reject(error)\n }\n if (this.exportDeferred?.isPending) {\n this.exportDeferred?.reject(error)\n }\n if (this.convertDeferred?.isPending) {\n this.convertDeferred?.reject(error)\n }\n if (this.importDeferred?.isPending) {\n this.importDeferred?.reject(error)\n }\n if (this.resizeDeferred?.isPending) {\n this.resizeDeferred?.reject(error)\n }\n if (this.undoDeferred?.isPending) {\n this.undoDeferred?.reject(error)\n }\n if (this.redoDeferred?.isPending) {\n this.redoDeferred?.reject(error)\n }\n if (this.clearDeferred?.isPending) {\n this.clearDeferred.reject(error)\n }\n if (this.waitForIdleDeferred?.isPending) {\n this.waitForIdleDeferred.reject(error)\n }\n }\n\n protected closeCallback(evt: CloseEvent): void\n {\n let message = \"\"\n if (!this.currentErrorCode) {\n switch (evt.code) {\n case 1000:\n // Normal Closure\n break\n case 1001:\n message = ErrorConst.GOING_AWAY\n break\n case 1002:\n message = ErrorConst.PROTOCOL_ERROR\n break\n case 1003:\n message = ErrorConst.UNSUPPORTED_DATA\n break\n case 1006:\n message = ErrorConst.ABNORMAL_CLOSURE\n break\n case 1007:\n message = ErrorConst.INVALID_FRAME_PAULOAD\n break\n case 1008:\n message = ErrorConst.POLICY_VIOLATION\n break\n case 1009:\n message = ErrorConst.MESSAGE_TOO_BIG\n break\n case 1011:\n message = ErrorConst.INTERNAL_ERROR\n break\n case 1012:\n message = ErrorConst.SERVICE_RESTART\n break\n case 1013:\n message = ErrorConst.TRY_AGAIN\n break\n case 1014:\n message = ErrorConst.BAD_GATEWAY\n break\n case 1015:\n message = ErrorConst.TLS_HANDSHAKE\n break\n default:\n this.#logger.warn(\"closeCallback unknow CloseEvent.code\", { evt })\n message = ErrorConst.CANT_ESTABLISH\n break\n }\n }\n const error = new Error(message || evt.reason)\n\n this.rejectDeferredPending(error)\n\n if (!this.currentErrorCode && evt.code !== 1000) {\n this.internalEvent.emitError(error)\n }\n }\n\n protected manageHMACChallengeMessage(websocketMessage: TWebSocketEvent): void\n {\n this.#logger.info(\"manageHMACChallengeMessage\", { websocketMessage })\n const hmacChallengeMessage = websocketMessage as TWebSocketHMACChallengeEvent\n if (hmacChallengeMessage.hmacChallenge) {\n this.send({\n type: \"hmac\",\n hmac: computeHmac(hmacChallengeMessage.hmacChallenge, this.serverConfiguration.applicationKey, this.serverConfiguration.hmacKey)\n })\n }\n if (hmacChallengeMessage.iinkSessionId) {\n this.sessionId = hmacChallengeMessage.iinkSessionId\n }\n }\n\n protected manageContentPackageDescriptionMessage(): void\n {\n this.reconnectionCount = 0\n this.#logger.info(\"manageContentPackageDescriptionMessage\")\n\n this.send({ ...this.recognitionConfiguration, type: \"configuration\" })\n\n if (this.currentPartId) {\n this.send({ type: \"openContentPart\", id: this.currentPartId, mimeTypes: this.mimeTypes })\n }\n else {\n this.send({ type: \"newContentPart\", contentType: this.recognitionConfiguration.type, mimeTypes: this.mimeTypes })\n }\n }\n\n protected managePartChangeMessage(websocketMessage: TWebSocketEvent): void\n {\n this.#logger.info(\"managePartChangeMessage\", { websocketMessage })\n const partChangeMessage = websocketMessage as TWebSocketPartChangeEvent\n this.currentPartId = partChangeMessage.partId\n this.initialized?.resolve()\n }\n\n protected manageExportMessage(websocketMessage: TWebSocketEvent): void\n {\n this.#logger.info(\"manageExportMessage\", { websocketMessage })\n const exportMessage = websocketMessage as TWebSocketExportEvent\n if (exportMessage.exports[\"application/vnd.myscript.jiix\"]) {\n exportMessage.exports[\"application/vnd.myscript.jiix\"] = JSON.parse(exportMessage.exports[\"application/vnd.myscript.jiix\"].toString()) as TJIIXExport\n }\n this.initialized?.resolve()\n this.addStrokeDeferred?.resolve(exportMessage.exports)\n this.exportDeferred?.resolve(exportMessage.exports)\n this.convertDeferred?.resolve(exportMessage.exports)\n this.importDeferred?.resolve(exportMessage.exports)\n this.undoDeferred?.resolve(exportMessage.exports)\n this.redoDeferred?.resolve(exportMessage.exports)\n this.clearDeferred?.resolve(exportMessage.exports)\n this.importPointEventsDeferred?.resolve(exportMessage.exports)\n this.internalEvent.emitExported(exportMessage.exports)\n }\n\n protected async manageWaitForIdle(): Promise {\n this.internalEvent.emitIdle(true)\n this.waitForIdleDeferred?.resolve()\n }\n\n protected manageErrorMessage(websocketMessage: TWebSocketEvent): void\n {\n const err = websocketMessage as TWebSocketErrorEvent\n this.currentErrorCode = err.data?.code || err.code\n let message = err.data?.message || err.message || ErrorConst.UNKNOW\n\n switch (this.currentErrorCode) {\n case \"no.activity\":\n message = ErrorConst.NO_ACTIVITY\n break\n case \"access.not.granted\":\n message = ErrorConst.WRONG_CREDENTIALS\n break\n case \"session.too.old\":\n message = ErrorConst.TOO_OLD\n break\n }\n const error = new Error(message)\n this.rejectDeferredPending(error)\n this.internalEvent.emitError(error)\n }\n\n protected manageContentChangeMessage(websocketMessage: TWebSocketEvent): void\n {\n this.#logger.info(\"manageContentChangeMessage\", { websocketMessage })\n const contentChangeMessage = websocketMessage as TWebSocketContentChangeEvent\n const context: TUndoRedoContext = {\n canRedo: contentChangeMessage.canRedo,\n canUndo: contentChangeMessage.canUndo,\n empty: contentChangeMessage.empty,\n stackIndex: contentChangeMessage.undoStackIndex,\n possibleUndoCount: contentChangeMessage.possibleUndoCount,\n stack: []\n }\n this.internalEvent.emitContextChange(context)\n }\n\n protected manageSVGPatchMessage(websocketMessage: TWebSocketEvent): void\n {\n this.#logger.info(\"manageSVGPatchMessage\", { websocketMessage })\n this.resizeDeferred?.resolve()\n const svgPatchMessage = websocketMessage as TWebSocketSVGPatchEvent\n this.internalEvent.emitSVGPatch(svgPatchMessage)\n }\n\n protected messageCallback(message: MessageEvent): void\n {\n this.#logger.debug(\"messageCallback\", { message })\n this.currentErrorCode = undefined\n const websocketMessage: TWebSocketEvent = JSON.parse(message.data)\n if (websocketMessage.type !== \"pong\") {\n this.pingCount = 0\n switch (websocketMessage.type) {\n case \"ack\":\n this.manageHMACChallengeMessage(websocketMessage)\n break\n case \"contentPackageDescription\":\n this.manageContentPackageDescriptionMessage()\n break\n case \"partChanged\":\n this.managePartChangeMessage(websocketMessage)\n break\n case \"newPart\":\n this.initialized?.resolve()\n break\n case \"contentChanged\":\n this.manageContentChangeMessage(websocketMessage)\n break\n case \"exported\":\n this.manageExportMessage(websocketMessage)\n break\n case \"svgPatch\":\n this.manageSVGPatchMessage(websocketMessage)\n break\n case \"error\":\n this.manageErrorMessage(websocketMessage)\n break\n case \"idle\":\n this.manageWaitForIdle()\n break\n default :\n this.#logger.warn(\"messageCallback\", `Message type unknow: \"${websocketMessage.type}\".`)\n }\n }\n }\n\n async init(height: number, width: number): Promise\n {\n try {\n this.#logger.info(\"init\", { height, width })\n this.destroy()\n this.connected = new DeferredPromise()\n this.initialized = new DeferredPromise()\n this.viewSizeHeight = height\n this.viewSizeWidth = width\n this.pingCount = 0\n this.socket = new WebSocket(this.url)\n\n if (this.serverConfiguration.websocket.pingEnabled) {\n this.infinitePing()\n }\n\n this.socket.addEventListener(\"open\", this.openCallback.bind(this))\n this.socket.addEventListener(\"close\", this.closeCallback.bind(this))\n this.socket.addEventListener(\"message\", this.messageCallback.bind(this))\n\n return this.initialized.promise\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (err: any) {\n const error = new Error(ErrorConst.CANT_ESTABLISH)\n this.internalEvent.emitError(error)\n this.initialized?.reject(error)\n return this.initialized?.promise\n }\n }\n\n async send(message: TWebSocketEvent): Promise\n {\n if (!this.connected) {\n return Promise.reject(new Error(\"Recognizer must be initilized\"))\n }\n await this.connected.promise\n if (this.socket.readyState === this.socket.OPEN) {\n this.#logger.debug(\"send\", { message })\n this.socket.send(JSON.stringify(message))\n return Promise.resolve()\n } else {\n if (this.socket.readyState != this.socket.CONNECTING && this.serverConfiguration.websocket.autoReconnect) {\n this.reconnectionCount++\n if (this.serverConfiguration.websocket.maxRetryCount >= this.reconnectionCount) {\n this.#logger.debug(\"send\", `try to reconnect number: ${this.reconnectionCount}.`)\n this.internalEvent.emitClearMessage()\n await this.init(this.viewSizeHeight, this.viewSizeWidth)\n await this.setPenStyle(this.penStyle as TPenStyle)\n await this.setPenStyleClasses(this.penStyleClasses as string)\n await this.setTheme(this.theme as TTheme)\n return this.send(message)\n }\n else {\n return Promise.reject(new Error(\"Unable to send message. The maximum number of connection attempts has been reached.\"))\n }\n }\n }\n }\n\n async addStrokes(strokes: TStroke[]): Promise\n {\n this.#logger.info(\"addStrokes\", { strokes })\n await this.initialized?.promise\n this.addStrokeDeferred = new DeferredPromise()\n if (strokes.length === 0) {\n this.addStrokeDeferred.resolve({} as TExport)\n }\n else {\n await this.send({\n type: \"addStrokes\",\n strokes: strokes.map(convertStrokeToJSON)\n })\n }\n return this.addStrokeDeferred?.promise\n }\n\n async setPenStyle(penStyle: TPenStyle): Promise\n {\n this.#logger.info(\"setPenStyle\", { penStyle })\n await this.initialized?.promise\n this.penStyle = penStyle\n const message: TWebSocketEvent = {\n type: \"setPenStyle\",\n style: StyleHelper.penStyleToCSS(penStyle)\n }\n return this.send(message)\n }\n\n async setPenStyleClasses(penStyleClasses: string): Promise\n {\n await this.initialized?.promise\n this.penStyleClasses = penStyleClasses\n this.#logger.info(\"setPenStyleClasses\", { penStyleClasses })\n const message: TWebSocketEvent = {\n type: \"setPenStyleClasses\",\n styleClasses: penStyleClasses\n }\n return this.send(message)\n }\n\n async setTheme(theme: TTheme): Promise\n {\n this.#logger.info(\"setTheme\", { theme })\n await this.initialized?.promise\n this.theme = theme\n const message: TWebSocketEvent = {\n type: \"setTheme\",\n theme: StyleHelper.themeToCSS(theme)\n }\n return this.send(message)\n }\n\n async export(model: IModel, requestedMimeTypes?: string[]): Promise\n {\n this.#logger.info(\"export\", { model, requestedMimeTypes })\n await this.initialized?.promise\n this.exportDeferred = new DeferredPromise()\n const localModel = model.getClone()\n let mimeTypes: string[] = requestedMimeTypes || []\n if (!mimeTypes.length) {\n switch (this.recognitionConfiguration.type) {\n case \"DIAGRAM\":\n mimeTypes = this.recognitionConfiguration.diagram.mimeTypes\n break\n case \"MATH\":\n mimeTypes = this.recognitionConfiguration.math.mimeTypes\n break\n case \"Raw Content\":\n mimeTypes = [\"application/vnd.myscript.jiix\"]\n break\n case \"TEXT\":\n mimeTypes = this.recognitionConfiguration.text.mimeTypes\n break\n default:\n throw new Error(`Recognition type \"${ this.recognitionConfiguration.type }\" is unknown.\\n Possible types are:\\n -DIAGRAM\\n -MATH\\n -Raw Content\\n -TEXT`)\n }\n }\n\n if (!mimeTypes.length) {\n return Promise.reject(new Error(`Export failed, no mimeTypes define in recognition ${ this.recognitionConfiguration.type } configuration`))\n }\n\n const message: TWebSocketEvent = {\n type: \"export\",\n partId: this.currentPartId,\n mimeTypes\n }\n await this.send(message)\n const exports: TExport = await this.exportDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(exports)\n this.#logger.debug(\"export\", { model: localModel })\n return localModel\n }\n\n async import(model: IModel, data: Blob, mimeType?: string): Promise\n {\n this.#logger.info(\"import\", { data, mimeType })\n await this.initialized?.promise\n const localModel = model.getClone()\n const chunkSize = this.serverConfiguration.websocket.fileChunkSize\n const importFileId = Math.random().toString(10).substring(2, 6)\n this.importDeferred = new DeferredPromise()\n const readBlob = (blob: Blob): Promise =>\n {\n const fileReader = new FileReader()\n return new Promise((resolve, reject) =>\n {\n fileReader.onloadend = (ev) => resolve(ev.target?.result as string)\n fileReader.onerror = () => reject()\n fileReader.readAsText(blob)\n })\n }\n\n const importFileMessage: TWebSocketEvent = {\n type: \"importFile\",\n importFileId,\n mimeType\n }\n await this.send(importFileMessage)\n for (let i = 0; i < data.size; i += chunkSize) {\n const blobPart = data.slice(i, i + chunkSize, data.type)\n const partFileString = await readBlob(blobPart)\n const fileChuckMessage: TWebSocketEvent = {\n type: \"fileChunk\",\n importFileId,\n data: partFileString,\n lastChunk: i + chunkSize > data.size\n }\n await this.send(fileChuckMessage)\n }\n const exports = await this.importDeferred?.promise\n this.importDeferred = undefined\n localModel.mergeExport(exports)\n return localModel\n }\n\n async resize(model: IModel): Promise\n {\n this.#logger.info(\"resize\", { model })\n await this.initialized?.promise\n this.resizeDeferred = new DeferredPromise()\n const localModel = model.getClone()\n this.viewSizeHeight = localModel.height\n this.viewSizeWidth = localModel.width\n const message: TWebSocketEvent = {\n type: \"changeViewSize\",\n height: this.viewSizeHeight,\n width: this.viewSizeWidth,\n }\n await this.send(message)\n await this.resizeDeferred?.promise\n return localModel\n }\n\n async importPointEvents(strokes: TStroke[]): Promise\n {\n this.#logger.info(\"importPointsEvents\", { strokes })\n await this.initialized?.promise\n this.importPointEventsDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"pointerEvents\",\n events: strokes.map(convertStrokeToJSON)\n }\n this.send(message)\n const exportPoints = await this.importPointEventsDeferred?.promise\n this.importPointEventsDeferred = undefined\n this.#logger.debug(\"importPointEvents\", { exportPoints })\n return exportPoints as TExport\n }\n\n async convert(model: IModel, conversionState?: TConverstionState): Promise\n {\n this.#logger.info(\"convert\", { model, conversionState })\n await this.initialized?.promise\n this.convertDeferred = new DeferredPromise()\n const localModel = model.getClone()\n const message: TWebSocketEvent = {\n type: \"convert\",\n conversionState\n }\n await this.send(message)\n const myExportConverted: TExport = await this.convertDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeConvert(myExportConverted)\n localModel.mergeExport(myExportConverted)\n this.#logger.debug(\"convert\", { model: localModel })\n return localModel\n }\n\n async waitForIdle(): Promise\n {\n await this.initialized?.promise\n this.waitForIdleDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"waitForIdle\",\n }\n await this.send(message)\n return this.waitForIdleDeferred?.promise\n }\n\n async undo(model: IModel): Promise\n {\n this.#logger.info(\"undo\", { model })\n await this.initialized?.promise\n const localModel = model.getClone()\n this.undoDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"undo\",\n }\n await this.send(message)\n const undoExports = await this.undoDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(undoExports)\n this.#logger.debug(\"undo\", { model: localModel })\n this.undoDeferred = undefined\n return localModel\n }\n\n async redo(model: IModel): Promise\n {\n this.#logger.info(\"redo\", { model })\n await this.initialized?.promise\n const localModel = model.getClone()\n this.redoDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"redo\",\n }\n await this.send(message)\n const redoExports = await this.redoDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(redoExports)\n this.#logger.debug(\"redo\", { model: redoExports })\n this.redoDeferred = undefined\n return localModel\n }\n\n async clear(model: IModel): Promise\n {\n this.#logger.info(\"clear\", { model })\n await this.initialized?.promise\n const localModel = model.getClone()\n localModel.modificationDate = Date.now()\n this.clearDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"clear\",\n }\n await this.send(message)\n const clearExports = await this.clearDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(clearExports)\n this.clearDeferred = undefined\n this.#logger.info(\"clear\", { model: localModel })\n return localModel\n }\n\n close(code: number, reason: string): void\n {\n if (this.socket.readyState === this.socket.OPEN || this.socket.readyState === this.socket.CONNECTING) {\n this.#logger.info(\"close\", { code, reason })\n this.socket.removeEventListener(\"close\", this.closeCallback)\n this.socket.removeEventListener(\"message\", this.messageCallback)\n this.socket.removeEventListener(\"open\", this.openCallback)\n this.socket.close(code, reason)\n }\n }\n\n destroy(): void\n {\n this.#logger.info(\"destroy\")\n this.connected = undefined\n this.initialized = undefined\n this.addStrokeDeferred = undefined\n this.exportDeferred = undefined\n this.convertDeferred = undefined\n this.importDeferred = undefined\n this.resizeDeferred = undefined\n this.undoDeferred = undefined\n this.redoDeferred = undefined\n this.clearDeferred = undefined\n if (this.socket) {\n this.socket.removeEventListener(\"close\", this.closeCallback)\n this.socket.removeEventListener(\"message\", this.messageCallback)\n this.socket.removeEventListener(\"open\", this.openCallback)\n this.close(1000, \"Recognizer destroyed\")\n }\n }\n}\n","import { TPointer } from \"../../@types/geometry\"\nimport { TStroke } from \"../../@types/model/Stroke\"\nimport { computeAxeAngle, computeLinksPoints, computeMiddlePoint } from \"../QuadraticUtils\"\n\nexport class SVGStroker\n{\n\n private getArcPath(center: TPointer, radius: number): string\n {\n const svgPath = [\n `M ${ center.x },${ center.y }`,\n `m ${ -radius },0`,\n `a ${ radius },${ radius } 0 1 0 ${ radius * 2 },0`,\n `a ${ radius },${ radius } 0 1 0 ${ -(radius * 2) },0`\n ].join(\" \")\n return svgPath\n }\n\n private getLinePath(begin: TPointer, end: TPointer, width: number): string\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, end), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(begin, end), width)\n const svgPath = [\n `M ${ linkPoints1[0].x },${ linkPoints1[0].y }`,\n `L ${ linkPoints2[0].x },${ linkPoints2[0].y }`,\n `L ${ linkPoints2[1].x },${ linkPoints2[1].y }`,\n `L ${ linkPoints1[1].x },${ linkPoints1[1].y }`\n ].join(\" \")\n return svgPath\n }\n\n private getFinalPath(begin: TPointer, end: TPointer, width: number): string\n {\n const ARCSPLIT = 6\n const angle = computeAxeAngle(begin, end)\n const linkPoints = computeLinksPoints(end, angle, width)\n const parts = [`M ${ linkPoints[0].x },${ linkPoints[0].y }`]\n for (let i = 1; i <= ARCSPLIT; i++) {\n const newAngle = angle - (i * (Math.PI / ARCSPLIT))\n parts.push(`L ${ end.x - (end.p * width * Math.sin(newAngle)) },${ end.y + (end.p * width * Math.cos(newAngle)) }`)\n }\n const svgPath = parts.join(\" \")\n return svgPath\n }\n\n private getQuadraticPath(begin: TPointer, end: TPointer, central: TPointer, width: number): string\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, central), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(central, end), width)\n const linkPoints3 = computeLinksPoints(central, computeAxeAngle(begin, end), width)\n const svgPath = [\n `M ${ linkPoints1[0].x },${ linkPoints1[0].y }`,\n `Q ${ linkPoints3[0].x },${ linkPoints3[0].y } ${ linkPoints2[0].x },${ linkPoints2[0].y }`,\n `L ${ linkPoints2[1].x },${ linkPoints2[1].y }`,\n `Q ${ linkPoints3[1].x },${ linkPoints3[1].y } ${ linkPoints1[1].x },${ linkPoints1[1].y }`\n ].join(\" \")\n return svgPath\n }\n\n private buildSVGPath(stroke: TStroke): string\n {\n const STROKE_LENGTH = stroke.pointers.length\n const STROKE_WIDTH = (stroke.style.width as number)\n const NB_QUADRATICS = STROKE_LENGTH - 2\n const firstPoint = stroke.pointers[0]\n\n const parts = []\n if (STROKE_LENGTH < 3) {\n parts.push(this.getArcPath(firstPoint, STROKE_WIDTH * 0.6))\n } else {\n parts.push(this.getArcPath(firstPoint, STROKE_WIDTH * firstPoint.p))\n parts.push(this.getLinePath(firstPoint, computeMiddlePoint(firstPoint, stroke.pointers[1]), STROKE_WIDTH))\n\n for (let i = 0; i < NB_QUADRATICS; i++) {\n const begin = computeMiddlePoint(stroke.pointers[i], stroke.pointers[i + 1])\n const end = computeMiddlePoint(stroke.pointers[i + 1], stroke.pointers[i + 2])\n const central = stroke.pointers[i + 1]\n parts.push(this.getQuadraticPath(begin, end, central, STROKE_WIDTH)\n )\n }\n const beforeLastPoint = stroke.pointers[STROKE_LENGTH - 2]\n const lastPoint = stroke.pointers[STROKE_LENGTH - 1]\n parts.push(this.getLinePath(computeMiddlePoint(beforeLastPoint, lastPoint), lastPoint, STROKE_WIDTH))\n parts.push(this.getFinalPath(beforeLastPoint, lastPoint, STROKE_WIDTH))\n }\n return parts.join(\" \")\n }\n\n drawStroke(svgElement: SVGElement, stroke: TStroke, attrs?: { name: string, value: string }[]): void\n {\n const svgPathElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\")\n svgPathElement.classList.add(\"pending-stroke\")\n svgPathElement.setAttribute(\"id\", stroke.id)\n svgPathElement.setAttribute(\"type\", stroke.pointerType)\n attrs?.forEach(a =>\n {\n svgPathElement.setAttribute(a.name, a.value)\n })\n const svgPath = this.buildSVGPath(stroke)\n svgPathElement.setAttribute(\"d\", `${ svgPath }Z`)\n svgElement.appendChild(svgPathElement)\n }\n}\n","import { TRenderingConfiguration } from \"../../@types/configuration/RenderingConfiguration\"\nimport { IModel } from \"../../@types/model/Model\"\nimport { TUpdatePatch, TUpdatePatchAppendChild, TUpdatePatchInsertBefore, TUpdatePatchRemoveAttribut, TUpdatePatchRemoveChild, TUpdatePatchRemoveElement, TUpdatePatchReplaceAll, TUpdatePatchReplaceELement, TUpdatePatchSetAttribut } from \"../../@types/recognizer/WSRecognizer\"\nimport { TStroke } from \"../../@types/model/Stroke\"\nimport { SVGStroker } from \"./SVGStroker\"\nimport { LoggerManager } from \"../../logger\"\nimport { LoggerClass } from \"../../Constants\"\n\nexport class WSSVGRenderer\n{\n config: TRenderingConfiguration\n stroker: SVGStroker\n context!: {\n parent: HTMLElement\n }\n #logger = LoggerManager.getLogger(LoggerClass.RENDERER)\n\n constructor(config: TRenderingConfiguration)\n {\n this.#logger.info(\"constructor\", { config })\n this.config = config\n this.stroker = new SVGStroker()\n }\n\n init(element: HTMLElement): void\n {\n this.#logger.info(\"init\", { element })\n element.style.fontSize = \"10px\"\n this.context = {\n parent: element\n }\n }\n\n #drawStroke(svgElement: SVGElement, stroke: TStroke)\n {\n let style: string\n if (stroke.pointerType === \"eraser\") {\n stroke.style.width = 20\n style = \"fill:grey;stroke:transparent;shadowBlur:5;opacity:0.2;\"\n } else {\n style = `fill:${ stroke.style.color };stroke:transparent;`\n }\n this.stroker.drawStroke(svgElement, stroke, [{ name: \"style\", value: style }])\n }\n\n #replaceAll(layerName: string, update: TUpdatePatchReplaceAll): void\n {\n const oldLayer = this.context.parent.querySelector(`svg[data-layer=\"${ layerName }\"]`) as SVGElement | null\n oldLayer?.remove()\n this.context.parent.insertAdjacentHTML(\"beforeend\", update.svg)\n const layer = this.context.parent.querySelector(`svg[data-layer=\"${ layerName }\"]`) as SVGElement\n if (layerName === \"MODEL\") {\n const pendingStrokesGroup = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\")\n pendingStrokesGroup.id = \"pendingStrokes\"\n layer.appendChild(pendingStrokesGroup)\n }\n }\n\n #replaceElement(update: TUpdatePatchReplaceELement): void\n {\n const elementToRemove = this.context.parent.querySelector(`#${ update.id }`) as HTMLElement | null\n if (elementToRemove) {\n const parent = elementToRemove.parentNode as HTMLElement | null | undefined\n elementToRemove?.remove()\n parent?.insertAdjacentHTML(\"beforeend\", update.svg)\n }\n }\n\n #appendChild(layerName: string, update: TUpdatePatchAppendChild): void\n {\n const parentSelector = update.parentId ? `#${ update.parentId }` : `svg[data-layer=\"${ layerName }\"]`\n const parent = this.context.parent.querySelector(parentSelector) as HTMLElement\n parent?.insertAdjacentHTML(\"beforeend\", update.svg)\n }\n\n #removeChild(update: TUpdatePatchRemoveChild): void\n {\n this.context.parent.querySelector(`#${ update.parentId } > *:nth-child(${ update.index + 1 })`)?.remove()\n }\n\n #removeElement(update: TUpdatePatchRemoveElement): void\n {\n const elementToRemove = this.context.parent.querySelector(`#${ update.id }`)\n if (elementToRemove) {\n if (update.id.includes(\"s\") || update.id.includes(\"MODEL\")) {\n elementToRemove.remove()\n } else {\n elementToRemove.setAttribute(\"class\", \"removed-stroke\")\n setTimeout(() =>\n {\n elementToRemove?.remove()\n }, 100)\n }\n }\n }\n\n #insertBefore(update: TUpdatePatchInsertBefore): void\n {\n const parent = this.context.parent.querySelector(`#${ update.refId }`) as HTMLElement | null\n parent?.insertAdjacentHTML(\"beforebegin\", update.svg)\n }\n\n #setAttribute(update: TUpdatePatchSetAttribut): void\n {\n const selector = update.id ? `#${ update.id }` : \"svg\"\n const element = this.context.parent.querySelector(selector) as HTMLElement | null\n element?.setAttribute(update.name, update.value)\n }\n\n #removeAttribute(update: TUpdatePatchRemoveAttribut): void\n {\n const selector = update.id ? `#${ update.id }` : \"svg\"\n const element = this.context.parent.querySelector(selector) as HTMLElement | null\n element?.removeAttribute(update.name)\n }\n\n updateLayer(layerName: string, update: TUpdatePatch): void\n {\n this.#logger.info(\"updateLayer\", { layerName, update })\n switch (update.type) {\n case \"REPLACE_ALL\":\n this.#replaceAll(layerName, update as TUpdatePatchReplaceAll)\n break\n case \"REPLACE_ELEMENT\":\n this.#replaceElement(update as TUpdatePatchReplaceELement)\n break\n case \"APPEND_CHILD\":\n this.#appendChild(layerName, update as TUpdatePatchAppendChild)\n break\n case \"REMOVE_ELEMENT\":\n this.#removeElement(update as TUpdatePatchRemoveElement)\n break\n case \"REMOVE_CHILD\":\n this.#removeChild(update as TUpdatePatchRemoveChild)\n break\n case \"INSERT_BEFORE\":\n this.#insertBefore(update as TUpdatePatchInsertBefore)\n break\n case \"SET_ATTRIBUTE\":\n this.#setAttribute(update as TUpdatePatchSetAttribut)\n break\n case \"REMOVE_ATTRIBUTE\":\n this.#removeAttribute(update as TUpdatePatchRemoveAttribut)\n break\n default:\n this.#logger.warn(\"updateLayer Default\", {layerName, update})\n break\n }\n }\n\n updatesLayer(layerName: string, updates: TUpdatePatch[]): void\n {\n this.#logger.info(\"updatesLayer\", { layerName, updates })\n updates.forEach(u => this.updateLayer(layerName, u))\n this.clearPendingStroke()\n }\n\n clearPendingStroke(): void\n {\n this.#logger.info(\"clearPendingStroke\", { })\n const pendingStrokeGroup = this.context.parent.querySelector(\"#pendingStrokes\") as SVGElement\n if (pendingStrokeGroup) {\n pendingStrokeGroup.innerHTML = \"\"\n }\n }\n\n drawPendingStroke(stroke: TStroke): void\n {\n this.#logger.info(\"drawPendingStroke\", { stroke })\n if (stroke) {\n const pendingStrokeGroup = this.context.parent.querySelector(\"#pendingStrokes\") as SVGElement\n if (pendingStrokeGroup) {\n const oldStroke = pendingStrokeGroup.querySelector(`#${ stroke?.id }`)\n if (oldStroke) {\n oldStroke.remove()\n }\n this.#drawStroke(pendingStrokeGroup, stroke)\n }\n }\n }\n\n clearErasingStrokes(): void\n {\n const erasingStrokeList = this.context.parent.querySelectorAll(\"[type=eraser]\") as NodeListOf\n erasingStrokeList.forEach(erasingStroke => {\n erasingStroke.remove()\n })\n }\n\n resize(model: IModel): void\n {\n this.#logger.info(\"resize\", { model })\n const rect = this.context.parent.getBoundingClientRect()\n const svgList = this.context.parent.querySelectorAll(\"svg\")\n const width = Math.max(rect.width, model.width)\n const height = Math.max(rect.height, model.height)\n svgList.forEach(svg =>\n {\n svg.setAttribute(\"viewBox\", `0 0 ${ width }, ${ height }`)\n svg.setAttribute(\"width\", `${ width }px`)\n svg.setAttribute(\"height\", `${ height }px`)\n })\n }\n\n destroy(): void\n {\n this.#logger.info(\"destroy\", { context: this.context })\n if (this.context?.parent) {\n this.context.parent.querySelectorAll(\"svg\").forEach(n => n.remove())\n }\n }\n}\n","import { IBehaviors, TBehaviorOptions } from \"../@types/Behaviors\"\nimport { TConfiguration } from \"../@types/configuration\"\nimport { IModel, TExport } from \"../@types/model/Model\"\nimport { TWebSocketSVGPatchEvent } from \"../@types/recognizer/WSRecognizer\"\nimport { TStroke } from \"../@types/model/Stroke\"\nimport { TConverstionState } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { TTheme } from \"../@types/style/Theme\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TPointer } from \"../@types/geometry\"\n\nimport { PointerEventGrabber } from \"../grabber/PointerEventGrabber\"\nimport { WSRecognizer } from \"../recognizer/WSRecognizer\"\nimport { Intention } from \"../Constants\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { DeferredPromise } from \"../utils/DeferredPromise\"\nimport { WSSVGRenderer } from \"../renderer/svg/WSSVGRenderer\"\nimport { StyleManager } from \"../style/StyleManager\"\nimport { Configuration } from \"../configuration/Configuration\"\nimport { Model } from \"../model/Model\"\nimport { UndoRedoManager } from \"../undo-redo\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class WSBehaviors implements IBehaviors\n{\n name = \"WSBehaviors\"\n options: TBehaviorOptions\n grabber: PointerEventGrabber\n renderer: WSSVGRenderer\n recognizer: WSRecognizer\n undoRedoManager: UndoRedoManager\n styleManager: StyleManager\n #configuration: TConfiguration\n #model: IModel\n intention: Intention\n #logger = LoggerManager.getLogger(LoggerClass.BEHAVIORS)\n\n #resizeTimer?: ReturnType\n\n constructor(options: TBehaviorOptions)\n {\n this.#logger.info(\"constructor\", { options })\n this.options = options\n this.#configuration = new Configuration(options?.configuration)\n this.styleManager = new StyleManager(options.penStyle, options.theme)\n\n this.grabber = new PointerEventGrabber(this.#configuration.grabber)\n this.renderer = new WSSVGRenderer(this.#configuration.rendering)\n this.recognizer = new WSRecognizer(this.#configuration.server, this.#configuration.recognition)\n\n this.intention = Intention.Write\n this.#model = new Model()\n this.undoRedoManager = new UndoRedoManager(this.#configuration[\"undo-redo\"], this.model)\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n get model(): IModel\n {\n return this.#model\n }\n\n get context(): TUndoRedoContext\n {\n return this.undoRedoManager.context\n }\n\n get configuration(): TConfiguration\n {\n return this.#configuration\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.styleManager.currentPenStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.styleManager.penStyle\n }\n setPenStyle(penStyle?: TPenStyle): Promise\n {\n this.#logger.info(\"setPenStyle\", { penStyle })\n this.styleManager.setPenStyle(penStyle)\n this.#logger.debug(\"setPenStyle\", this.styleManager.penStyle)\n return this.recognizer.setPenStyle(this.styleManager.penStyle)\n }\n\n get penStyleClasses(): string\n {\n return this.styleManager.penStyleClasses\n }\n setPenStyleClasses(penClass?: string): Promise\n {\n this.#logger.info(\"setPenStyleClasses\", { penClass })\n this.styleManager.setPenStyleClasses(penClass)\n this.#logger.debug(\"setPenStyleClasses\", this.styleManager.penStyleClasses)\n return this.recognizer.setPenStyleClasses(this.styleManager.penStyleClasses)\n }\n\n get theme(): TTheme\n {\n return this.styleManager.theme\n }\n setTheme(theme: TTheme): Promise\n {\n this.#logger.info(\"setTheme\", { theme })\n this.styleManager.setTheme(theme)\n this.#logger.debug(\"setTheme\", this.styleManager.theme)\n return this.recognizer.setTheme(this.styleManager.theme)\n }\n\n async init(domElement: HTMLElement): Promise\n {\n this.#logger.info(\"init\", { domElement })\n const compStyles = window.getComputedStyle(domElement);\n this.model.width = Math.max(parseInt(compStyles.width.replace(\"px\",\"\")), this.#configuration.rendering.minWidth)\n this.model.height = Math.max(parseInt(compStyles.height.replace(\"px\",\"\")), this.#configuration.rendering.minHeight)\n this.undoRedoManager.updateModelInStack(this.model)\n\n this.renderer.init(domElement)\n\n this.grabber.attach(domElement)\n this.grabber.onPointerDown = this.onPointerDown.bind(this)\n this.grabber.onPointerMove = this.onPointerMove.bind(this)\n this.grabber.onPointerUp = this.onPointerUp.bind(this)\n\n this.internalEvent.addSVGPatchListener(this.onSVGPatch)\n\n await this.recognizer.init(this.model.height, this.model.width)\n await this.setPenStyle(this.penStyle)\n await this.setTheme(this.theme)\n await this.setPenStyleClasses(this.penStyleClasses)\n }\n\n private onPointerDown(evt: PointerEvent, point: TPointer): void\n {\n this.#logger.info(\"onPointerDown\", { intention: this.intention, evt, point })\n let { pointerType } = evt\n const style: TPenStyle = Object.assign({}, this.theme?.ink, this.currentPenStyle)\n if (this.intention === Intention.Erase) {\n pointerType = \"eraser\"\n }\n this.model.initCurrentStroke(point, evt.pointerId, pointerType, style)\n this.drawCurrentStroke()\n }\n\n private onPointerMove(_evt: PointerEvent, point: TPointer): void\n {\n this.#logger.info(\"onPointerMove\", { intention: this.intention, point })\n this.model.appendToCurrentStroke(point)\n this.drawCurrentStroke()\n }\n\n private async onPointerUp(_evt: PointerEvent, point: TPointer): Promise\n {\n try {\n this.#logger.info(\"onPointerUp\", { intention: this.intention, point })\n this.model.endCurrentStroke(point)\n await this.updateModelRendering()\n } catch (error) {\n this.internalEvent.emitError(error as Error)\n }\n }\n\n private onSVGPatch = (evt: TWebSocketSVGPatchEvent) =>\n {\n this.#logger.info(\"onSVGPatch\", { evt })\n this.renderer.updatesLayer(evt.layer, evt.updates)\n }\n\n drawCurrentStroke(): void\n {\n this.#logger.debug(\"drawCurrentStroke\", { stroke: this.model.currentStroke })\n const currentStroke = this.model.currentStroke as TStroke\n if (currentStroke) {\n this.renderer.drawPendingStroke(currentStroke)\n }\n }\n\n async updateModelRendering(): Promise\n {\n this.#logger.info(\"updateModelRendering\")\n if (this.#configuration.triggers.exportContent !== \"DEMAND\") {\n const unsentStrokes = this.model.extractUnsentStrokes()\n this.model.updatePositionSent()\n this.undoRedoManager.addModelToStack(this.model)\n this.renderer.clearErasingStrokes()\n const exports = await this.recognizer.addStrokes(unsentStrokes)\n this.model.mergeExport(exports)\n this.undoRedoManager.updateModelInStack(this.model)\n }\n this.#logger.debug(\"updateModelRendering\", this.model)\n return this.model\n }\n\n async waitForIdle(): Promise\n {\n return this.recognizer.waitForIdle()\n }\n\n async importPointEvents(strokes: TStroke[]): Promise\n {\n this.#logger.info(\"importPointEvents\", { strokes })\n const exportPoints = await this.recognizer.importPointEvents(strokes)\n this.model.mergeExport(exportPoints)\n this.#logger.debug(\"importPointEvents\", this.model)\n return this.model\n }\n\n async export(mimeTypes?: string[]): Promise\n {\n this.#logger.info(\"export\", { mimeTypes })\n try {\n if (this.#configuration.triggers.exportContent === \"DEMAND\") {\n const unsentStrokes = this.model.extractUnsentStrokes()\n this.model.updatePositionSent()\n const exports = await this.recognizer.addStrokes(unsentStrokes)\n this.model.updatePositionReceived()\n this.model.mergeExport(exports)\n this.#logger.debug(\"export\", this.model)\n return this.model\n } else {\n return this.recognizer.export(this.model, mimeTypes)\n }\n } catch (error) {\n this.#logger.error(\"export\", { error } )\n this.internalEvent.emitError(error as Error)\n return Promise.reject(error)\n }\n }\n\n async convert(conversionState?: TConverstionState): Promise\n {\n this.#logger.info(\"convert\", { conversionState })\n this.undoRedoManager.addModelToStack(this.model)\n this.context.stack.push(this.model.getClone())\n this.#model = await this.recognizer.convert(this.model, conversionState)\n this.#logger.debug(\"convert\", this.model)\n this.undoRedoManager.addModelToStack(this.model)\n return this.model\n }\n\n async import(data: Blob, mimeType?: string): Promise\n {\n this.#logger.info(\"import\", { data, mimeType })\n this.context.stack.push(this.model.getClone())\n const m = await this.recognizer.import(this.model, data, mimeType)\n this.undoRedoManager.addModelToStack(m)\n return m\n }\n\n async resize(height: number, width: number): Promise\n {\n this.#logger.info(\"resize\", { height, width })\n const deferredResize = new DeferredPromise()\n this.model.height = height\n this.model.width = width\n const clonedModel = this.model.getClone()\n this.renderer.resize(clonedModel)\n clearTimeout(this.#resizeTimer)\n this.#resizeTimer = setTimeout(async () =>\n {\n try {\n const resizeModel = await this.recognizer.resize(clonedModel)\n deferredResize.resolve(resizeModel)\n } catch (error) {\n this.#logger.error(\"resize\", { height, width, error } )\n deferredResize.reject(error as Error)\n }\n }, this.#configuration.triggers.resizeTriggerDelay)\n\n this.#model = await deferredResize.promise\n this.internalEvent.emitExported(this.model.exports as TExport)\n this.#logger.debug(\"resize\", this.model)\n return this.model\n }\n\n async undo(): Promise\n {\n this.#logger.info(\"undo\")\n if (this.context.canUndo) {\n this.#model = this.undoRedoManager.undo()\n return this.recognizer.undo(this.model)\n }\n else {\n throw new Error(\"Undo not allowed\")\n }\n }\n\n async redo(): Promise\n {\n this.#logger.info(\"redo\")\n if (this.context.canRedo) {\n this.#model = this.undoRedoManager.redo()\n this.#logger.debug(\"undo\", this.#model)\n return this.recognizer.redo(this.model)\n }\n else {\n throw new Error(\"Redo not allowed\")\n }\n }\n\n async clear(): Promise\n {\n this.#logger.info(\"clear\")\n this.model.clear()\n this.undoRedoManager.addModelToStack(this.model)\n return this.recognizer.clear(this.model)\n }\n\n async destroy(): Promise\n {\n this.#logger.info(\"destroy\")\n this.grabber.detach()\n this.renderer.destroy()\n this.recognizer.destroy()\n return Promise.resolve()\n }\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { TConfiguration } from \"./@types/configuration\"\nimport { IGrabber } from \"./@types/grabber/Grabber\"\nimport { TStroke } from \"./@types/model/Stroke\"\nimport { IModel, TExport, TJIIXExport } from \"./@types/model/Model\"\nimport { TPenStyle } from \"./@types/style/PenStyle\"\nimport { TTheme } from \"./@types/style/Theme\"\nimport { IBehaviors, TBehaviorOptions } from \"./@types/Behaviors\"\nimport { TConverstionState } from \"./@types/configuration/RecognitionConfiguration\"\nimport { TMarginConfiguration } from \"./@types/configuration/recognition/MarginConfiguration\"\nimport { TUndoRedoContext } from \"./@types/undo-redo/UndoRedoContext\"\nimport { LoggerClass, TLoggerConfiguration } from \"./@types/configuration/LoggerConfiguration\"\n\nimport { ExportType, Intention } from \"./Constants\"\nimport { DefaultLoggerConfiguration } from \"./configuration\"\nimport { PublicEvent } from \"./event/PublicEvent\"\nimport { InternalEvent } from \"./event/InternalEvent\"\nimport { SmartGuide } from \"./smartguide/SmartGuide\"\nimport { DeferredPromise } from \"./utils/DeferredPromise\"\nimport { RestBehaviors } from \"./behaviors/RestBehaviors\"\nimport { WSBehaviors } from \"./behaviors/WSBehaviors\"\nimport { LoggerManager, Logger } from \"./logger\"\n\nimport \"./iink.css\"\n\nexport type HTMLEditorElement = HTMLElement &\n{\n editor: Editor\n}\n\nexport class Editor\n{\n wrapperHTML: HTMLEditorElement\n #loaderHTML: HTMLDivElement\n #messageHTML: HTMLDivElement\n #behaviors!: IBehaviors\n #smartGuide?: SmartGuide\n #initializationDeferred: DeferredPromise\n\n logger: Logger\n #loggerConfiguration: TLoggerConfiguration\n showStrokesPan = false\n\n constructor(wrapperHTML: HTMLElement, options: TBehaviorOptions, globalClassCss = \"ms-editor\")\n {\n this.#loggerConfiguration = Object.assign({}, DefaultLoggerConfiguration, options.logger)\n\n this.logger = LoggerManager.getLogger(LoggerClass.EDITOR)\n this.logger.info(\"constructor\", { wrapperHTML, options, globalClassCss })\n this.#initializationDeferred = new DeferredPromise()\n\n this.wrapperHTML = wrapperHTML as HTMLEditorElement\n this.wrapperHTML.classList.add(globalClassCss)\n this.events.setElement(this.wrapperHTML)\n\n this.#loaderHTML = document.createElement(\"div\")\n this.#loaderHTML.classList.add(\"loader\")\n this.#loaderHTML.style.display = \"none\"\n this.wrapperHTML.appendChild(this.#loaderHTML)\n\n this.#messageHTML = document.createElement(\"div\")\n this.#messageHTML.classList.add(\"message\")\n this.#messageHTML.style.display = \"none\"\n this.wrapperHTML.appendChild(this.#messageHTML)\n\n this.#instantiateBehaviors(options)\n }\n\n get loggerConfiguration(): TLoggerConfiguration\n {\n return this.#loggerConfiguration\n }\n\n set loggerConfiguration(loggerConfig: TLoggerConfiguration)\n {\n this.#loggerConfiguration = loggerConfig\n LoggerManager.setLoggerLevel(loggerConfig)\n }\n\n get initializationPromise(): Promise\n {\n return this.#initializationDeferred.promise\n }\n\n get model(): IModel\n {\n return this.behaviors.model\n }\n\n get behaviors(): IBehaviors\n {\n return this.#behaviors\n }\n\n get configuration(): TConfiguration\n {\n return this.behaviors.configuration\n }\n set configuration(configuration: TConfiguration)\n {\n this.logger.info(\"set configuration\", { configuration })\n this.#instantiateBehaviors({ configuration })\n this.initialize()\n }\n\n get intention(): Intention\n {\n return this.behaviors.intention\n }\n set intention(m: Intention)\n {\n this.logger.info(\"set intention\", { m })\n this.behaviors.intention = m\n switch (this.behaviors.intention) {\n case Intention.Erase:\n this.wrapperHTML.classList.add(\"erasing\")\n this.wrapperHTML.classList.remove(\"selecting\")\n break\n // case Intention.Selecting:\n // this.model.resetSelectedStrokes()\n // this.wrapperHTML.classList.remove(\"erasing\")\n // this.wrapperHTML.classList.add(\"selecting\")\n // break;\n default:\n this.logger.warn(\"set intention default\", { m })\n document.body.style.cursor = \"initial\"\n this.wrapperHTML.classList.remove(\"erasing\")\n this.wrapperHTML.classList.remove(\"selecting\")\n break\n }\n this.logger.debug(\"set intention\", this.wrapperHTML)\n }\n\n get events(): PublicEvent\n {\n return PublicEvent.getInstance()\n }\n\n get context(): TUndoRedoContext\n {\n return this.behaviors.context\n }\n\n get grabber(): IGrabber\n {\n return this.behaviors.grabber\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.behaviors.currentPenStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.behaviors.penStyle\n }\n set penStyle(ps: TPenStyle)\n {\n this.logger.info(\"set penStyle\", { ps })\n this.behaviors.setPenStyle(ps)\n }\n\n get theme(): TTheme\n {\n return this.behaviors.theme\n }\n set theme(t: TTheme)\n {\n this.logger.info(\"set theme\", { t })\n this.behaviors.setTheme(t)\n }\n\n get penStyleClasses(): string\n {\n return this.behaviors.penStyleClasses\n }\n set penStyleClasses(psc: string)\n {\n this.logger.info(\"set penStyleClasses\", { psc })\n this.behaviors.setPenStyleClasses(psc)\n }\n\n #instantiateBehaviors(options: TBehaviorOptions)\n {\n this.logger.info(\"instantiateBehaviors\", { options })\n if (!options?.configuration) {\n throw new Error(\"Configuration required\")\n }\n InternalEvent.getInstance().removeAllListeners()\n if (this.#behaviors) {\n this.#behaviors.destroy()\n }\n let defaultBehaviors: IBehaviors\n if (options.configuration.server?.protocol === \"REST\") {\n defaultBehaviors = new RestBehaviors(options)\n } else {\n defaultBehaviors = new WSBehaviors(options)\n }\n this.#behaviors = Object.assign(defaultBehaviors, options.behaviors)\n this.logger.debug(\"instantiateBehaviors\", this.#behaviors)\n }\n\n async #initializeBehaviors(): Promise\n {\n this.logger.info(\"initializeBehaviors start\")\n this.#initializationDeferred = new DeferredPromise()\n this.#loaderHTML.style.display = \"initial\"\n this.#cleanMessage()\n this.logger.debug(\"initializeBehaviors\", this.wrapperHTML)\n return this.behaviors.init(this.wrapperHTML)\n .then(async () =>\n {\n this.logger.info(\"initializeBehaviors then\")\n this.wrapperHTML.editor = this\n this.#initializationDeferred.resolve()\n this.events.emitLoaded()\n this.logger.debug(\"initializeBehaviors\", this.wrapperHTML)\n })\n .catch((error: Error) =>\n {\n this.logger.error(\"initializeBehaviors catch\", { error })\n this.#initializationDeferred.reject(error)\n this.#showError(error)\n })\n .finally(() =>\n {\n this.logger.info(\"initializeBehaviors finally\", { })\n this.#loaderHTML.style.display = \"none\"\n return this.#initializationDeferred.promise\n })\n }\n\n #initializeSmartGuide(): void\n {\n this.#smartGuide?.destroy()\n this.logger.info(\"initializeSmartGuide\", { smartGuide: this.configuration.rendering.smartGuide })\n if (this.configuration.rendering.smartGuide.enable) {\n this.#smartGuide = new SmartGuide()\n let margin: TMarginConfiguration\n switch (this.configuration.recognition.type) {\n case \"TEXT\":\n margin = this.configuration.recognition.text.margin\n break\n case \"MATH\":\n margin = this.configuration.recognition.math.margin\n break\n default:\n this.logger.warn(\"initializeSmartGuide default\", this.configuration.recognition.type)\n margin = {\n top: 20,\n left: 10,\n right: 10,\n bottom: 10\n }\n break\n }\n this.#smartGuide.init(this.wrapperHTML, margin, this.configuration.rendering)\n }\n }\n\n #cleanMessage()\n {\n this.logger.debug(\"cleanMessage\", this.#messageHTML)\n this.#messageHTML.style.display = \"none\"\n this.#messageHTML.innerHTML = \"\"\n this.logger.debug(\"cleanMessage\", this.#messageHTML)\n }\n\n #showError(err: Error)\n {\n this.logger.debug(\"showError\", this.#messageHTML)\n this.#messageHTML.style.display = \"initial\"\n this.#messageHTML.classList.add(\"error-msg\")\n this.#messageHTML.classList.remove(\"info-msg\")\n this.#messageHTML.innerText = err.message\n this.logger.debug(\"showError\", this.#messageHTML)\n }\n\n #showNotif(notif: { message: string, timeout?: number })\n {\n this.logger.debug(\"showNotif\", this.#messageHTML)\n this.#messageHTML.style.display = \"initial\"\n this.#messageHTML.classList.add(\"info-msg\")\n this.#messageHTML.classList.remove(\"error-msg\")\n this.#messageHTML.innerText = notif.message\n setTimeout(() =>\n {\n this.#cleanMessage()\n }, notif.timeout || 2500)\n this.logger.debug(\"showNotif\", this.#messageHTML)\n }\n\n #showStrokesIfDebug(): void\n {\n if (this.showStrokesPan) {\n let panel = document.getElementById(\"stroke-panel\")\n const text = JSON.stringify(this.model.rawStrokes.map((s: TStroke) => ({ pointerType: s.pointerType, pointerId: s.pointerId, pointers: s.pointers })))\n if (!panel) {\n panel = document.createElement(\"div\")\n panel.id = \"stroke-panel\"\n panel.addEventListener(\"click\", (e) =>\n {\n e.preventDefault()\n e.stopPropagation()\n navigator.clipboard.writeText(panel?.innerText as string)\n this.#showNotif({ message: \"strokes copied to clipboard!\", timeout: 1500 })\n })\n this.wrapperHTML.appendChild(panel)\n }\n panel.innerText = text\n }\n }\n\n #addListeners(): void\n {\n InternalEvent.getInstance().addConvertListener(this.convert.bind(this))\n InternalEvent.getInstance().addClearListener(this.clear.bind(this))\n InternalEvent.getInstance().addErrorListener(this.#showError.bind(this))\n InternalEvent.getInstance().addImportJIIXListener(this.#onImportJIIX.bind(this))\n InternalEvent.getInstance().addExportedListener(this.#onExport.bind(this))\n InternalEvent.getInstance().addNotifListener(this.#showNotif.bind(this))\n InternalEvent.getInstance().addClearMessageListener(this.#cleanMessage.bind(this))\n InternalEvent.getInstance().addContextChangeListener(this.#onContextChange.bind(this))\n InternalEvent.getInstance().addIdleListener(this.#onIdleChange.bind(this))\n }\n\n #onContextChange = (context: TUndoRedoContext) =>\n {\n this.events.emitChanged(context)\n }\n\n #onIdleChange = (idle: boolean) =>\n {\n this.events.emitIdle(idle)\n }\n\n #onExport(exports: TExport): void\n {\n this.logger.info(\"onExport\", { exports })\n this.model.mergeExport(exports)\n if (this.configuration.rendering.smartGuide.enable) {\n if (exports && exports[\"application/vnd.myscript.jiix\"]) {\n const jjix = exports[\"application/vnd.myscript.jiix\"] as TJIIXExport\n this.#smartGuide?.update(jjix)\n }\n }\n this.#showStrokesIfDebug()\n this.events.emitExported(exports)\n }\n\n #onImportJIIX(jiix: TJIIXExport): void\n {\n this.logger.info(\"onImportJIIX\", { jiix })\n this.import(new Blob([JSON.stringify(jiix)], { type: ExportType.JIIX }), ExportType.JIIX)\n }\n\n async initialize(): Promise\n {\n this.logger.info(\"initialize\")\n await this.#initializeBehaviors()\n this.#initializeSmartGuide()\n this.#addListeners()\n }\n\n async waitForIdle(): Promise\n {\n if (this.behaviors.waitForIdle)\n {\n return this.behaviors.waitForIdle()\n }\n return\n }\n\n async undo(): Promise\n {\n this.logger.debug(\"undo\", this.model)\n this.logger.info(\"undo\", { })\n await this.#initializationDeferred.promise\n await this.behaviors.undo()\n this.#showStrokesIfDebug()\n this.logger.debug(\"undo\", this.model)\n return this.model\n }\n\n async redo(): Promise\n {\n this.logger.debug(\"redo\", this.model)\n this.logger.info(\"redo\")\n await this.#initializationDeferred.promise\n await this.behaviors.redo()\n this.#showStrokesIfDebug()\n this.logger.debug(\"redo\", this.model)\n return this.model\n }\n\n async clear(): Promise\n {\n this.logger.debug(\"clear\", this.model)\n this.logger.info(\"clear\")\n await this.#initializationDeferred.promise\n await this.behaviors.clear()\n this.events.emitCleared(this.model)\n this.#showStrokesIfDebug()\n this.logger.debug(\"clear\", this.model)\n return this.model\n }\n\n async resize(): Promise\n {\n this.logger.debug(\"resize\", this.model)\n this.logger.info(\"resize\")\n await this.#initializationDeferred.promise\n if (this.configuration.rendering.smartGuide.enable) {\n this.#smartGuide?.resize()\n }\n const compStyles = window.getComputedStyle(this.wrapperHTML)\n const height = Math.max(parseInt(compStyles.height.replace(\"px\",\"\")), this.configuration.rendering.minHeight)\n const width = Math.max(parseInt(compStyles.width.replace(\"px\",\"\")), this.configuration.rendering.minWidth)\n await this.behaviors.resize(height, width)\n this.logger.debug(\"resize\", this.model)\n return this.model\n }\n\n async export(mimeTypes?: string[]): Promise\n {\n this.logger.debug(\"export\", this.model)\n this.logger.info(\"export\", { mimeTypes })\n await this.#initializationDeferred.promise\n await this.behaviors.export(mimeTypes)\n this.logger.debug(\"export\", this.model)\n return this.model\n }\n\n async convert(params?: { conversionState?: TConverstionState, mimeTypes?: string[] }): Promise\n {\n this.logger.debug(\"convert\", this.model)\n this.logger.info(\"export\", { params })\n await this.#initializationDeferred.promise\n await this.behaviors.convert(params?.conversionState, params?.mimeTypes)\n this.events.emitConverted(this.model.converts as TExport)\n this.logger.debug(\"convert\", this.model)\n return this.model\n }\n\n async import(data: Blob | string | TJIIXExport, mimeType?: string): Promise\n {\n this.logger.debug(\"import\", this.model)\n this.logger.info(\"import\", { data, mimeType })\n await this.#initializationDeferred.promise\n if (this.behaviors.import) {\n let blobToImport: Blob\n if (data instanceof Blob) {\n blobToImport = data\n }\n else if (typeof data === \"string\") {\n blobToImport = new Blob([data])\n }\n else {\n blobToImport = new Blob([JSON.stringify(data)])\n }\n await this.behaviors.import(blobToImport, mimeType)\n this.events.emitImported(this.model.exports as TExport)\n this.logger.debug(\"import\", this.model)\n return this.model\n }\n return Promise.reject(\"Import impossible, behaviors has no import function\")\n }\n\n async importPointEvents(strokes: TStroke[]): Promise\n {\n this.logger.debug(\"importPointEvents\", this.model)\n this.logger.info(\"importPointEvents\", { strokes })\n await this.#initializationDeferred.promise\n if (this.behaviors.importPointEvents) {\n await this.behaviors.importPointEvents(strokes)\n this.events.emitImported(this.model.exports as TExport)\n this.logger.debug(\"importPointEvents\", this.model)\n return this.model\n }\n return Promise.reject(\"Import impossible, behaviors has no importPointEvents function\")\n }\n\n}\n","import { TConfigurationClient } from \"../@types/configuration\"\n\nexport async function getAvailableFontList(configuration: TConfigurationClient): Promise>\n{\n if (!configuration?.server?.scheme && !configuration?.server?.host) {\n return Promise.reject(\"Failed to get fonts: configuration.server.scheme & configuration.server.host are required!\")\n }\n if (!configuration?.recognition?.lang) {\n return Promise.reject(\"Failed to get fonts: configuration.recognition.lang is required!\")\n }\n const serverConfig = configuration.server\n const response = await fetch(`${ serverConfig.scheme }://${ serverConfig.host }/api/v4.0/iink/font/google/language/` + configuration.recognition.lang)\n const { result } = await response.json()\n return result.sort()\n}\n","import { TConfigurationClient } from \"../@types/configuration\"\n\nexport async function getAvailableLanguageList(configuration: TConfigurationClient): Promise>>\n{\n if (configuration?.server?.scheme && configuration?.server?.host) {\n const serverConfig = configuration.server\n const response = await fetch(`${ serverConfig.scheme }://${ serverConfig.host }/api/v4.0/iink/availableLanguageList`)\n return response.json()\n } else {\n return Promise.reject(\"Failed to get languages: configuration.server.scheme & configuration.server.host are required!\")\n }\n}\n"],"names":["__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","adopt","then","apply","__classPrivateFieldGet","receiver","state","kind","f","TypeError","has","call","get","__classPrivateFieldSet","set","DefaultServerConfiguration","protocol","scheme","host","applicationKey","hmacKey","version","useWindowLocation","websocket","pingEnabled","pingDelay","maxPingLostCount","autoReconnect","maxRetryCount","fileChunkSize","DefaultRecognitionConfiguration","type","alwaysConnected","lang","gesture","enable","export","jiix","strokes","text","chars","words","renderer","debug","math","mimeTypes","solver","margin","bottom","left","right","top","eraser","mode","guides","diagram","convert","recognition","shape","DefaultGrabberConfiguration","listenerOptions","capture","passive","xyFloatPrecision","timestampFloatPrecision","DefaultRenderingConfiguration","minHeight","minWidth","smartGuide","fadeOut","duration","gap","DefaultTriggerConfiguration","exportContent","exportContentDelay","resizeTriggerDelay","DefaultEventsConfiguration","processDelay","DefaultUndoRedoConfiguration","maxStackSize","DefaultConfiguration","server","grabber","rendering","triggers","events","DefaultLoggerConfiguration","EDITOR","BEHAVIORS","RECOGNIZER","GRABBER","RENDERER","CONFIGURATION","PUBLIC_EVENT","INTERNALEVENT","MODEL","STROKE","SMARTGUIDE","STYLEMANAGER","UNDOREDO_MANAGER","mergeDeep","target","sources","isObject","item","Array","isArray","length","source","shift","key","Object","assign","Logger","constructor","instanceName","level","this","data","dataLog","from","message","console","info","warn","error","LoggerManager","static","name","_a","_LoggerManager_loggerMap","config","keys","forEach","lc","getLogger","Map","Configuration","configuration","_Configuration_logger","JSON","parse","stringify","overrideDefaultConfiguration","defaultConf","_b","_d","_c","_f","_e","_g","window","location","indexOf","Math","max","includes","push","LoggerLevel","LoggerClass","Error","NO_ACTIVITY","WRONG_CREDENTIALS","TOO_OLD","UNKNOW","ABNORMAL_CLOSURE","CANT_ESTABLISH","GOING_AWAY","PROTOCOL_ERROR","UNSUPPORTED_DATA","INVALID_FRAME_PAULOAD","POLICY_VIOLATION","MESSAGE_TOO_BIG","INTERNAL_ERROR","SERVICE_RESTART","TRY_AGAIN","BAD_GATEWAY","TLS_HANDSHAKE","EventType","CHANGED","CLEARED","CONVERTED","ERROR","POINTEREVENTS","EXPORTED","IMPORTED","IDLE","LOADED","InternalEventType","SVG_PATCH","CLEAR_MESSAGE","NOTIF","IMPORT_JIIX","CONVERT","CLEAR","CONTEXT_CHANGE","WS_CLOSED","ExportType","Intention","PublicEvent","EventTarget","super","_PublicEvent_element","_PublicEvent_logger","_PublicEvent_instance","setElement","el","emitLoaded","emitExported","exports","_PublicEvent_instances","_PublicEvent_emit","emitChanged","undoRedoContext","canClear","empty","emitIdle","idle","emitCleared","model","emitConverted","emitImported","WeakMap","WeakSet","evt","CustomEvent","bubbles","composed","detail","undefined","dispatchEvent","InternalEvent","_InternalEvent_abortController","_InternalEvent_logger","AbortController","_InternalEvent_instance","removeAllListeners","abort","emitSVGPatch","patchChange","_InternalEvent_instances","_InternalEvent_emit","addSVGPatchListener","callback","addEventListener","signal","addExportedListener","emitClearMessage","addClearMessageListener","emitError","err","addErrorListener","emitWSClosed","addWSClosedListener","emitNotif","notif","addNotifListener","emitImportJIIX","addImportJIIXListener","emitConvert","conversionState","addConvertListener","emitClear","addClearListener","emitContextChange","context","addContextChangeListener","addIdleListener","SmartGuide","_SmartGuide_smartGuideElement","_SmartGuide_prompterContainerElement","_SmartGuide_prompterTextElement","_SmartGuide_ellipsisElement","_SmartGuide_tagElement","_SmartGuide_candidatesElement","_SmartGuide_menuElement","_SmartGuide_convertElement","_SmartGuide_copyElement","_SmartGuide_deleteElement","_SmartGuide_fadeOutTimout","_SmartGuide_isMenuOpen","_SmartGuide_logger","_SmartGuide_showCandidates","wordId","parseInt","id","replace","uuid","wordToChange","toString","innerHTML","candidates","style","display","word","index","label","getBoundingClientRect","parent","parentNode","insertBefore","_SmartGuide_onClickEllipsis","preventDefault","stopPropagation","_SmartGuide_instances","_SmartGuide_hideCandidates","_SmartGuide_onClickConvert","internalEvent","_SmartGuide_closeMenu","_SmartGuide_onClickCopy","innerText","test","navigator","userAgent","permissionName","permissions","query","clipboard","writeText","timeout","_SmartGuide_onClickDelete","_SmartGuide_onClickCandidate","candidate","_SmartGuide_onClickPrompter","_SmartGuide_onClickOutSide","random","substring","_SmartGuide_createWrapperElement","_SmartGuide_createPrompterContainerElement","_SmartGuide_createPrompterTextElement","_SmartGuide_createEllipsisElement","_SmartGuide_createTagElement","_SmartGuide_createCandidatesElement","_SmartGuide_createMoreMenuElement","_SmartGuide_createConvertElement","_SmartGuide_createCopyElement","_SmartGuide_createDeleteElement","getInstance","init","domElement","renderingConfiguration","appendChild","classList","add","_SmartGuide_addListeners","_SmartGuide_show","_SmartGuide_initFadeOutObserver","resize","mmToPixels","marginTop","marginLeft","marginRight","offsetWidth","width","clientWidth","offsetHeight","update","createWordSpan","span","document","createElement","textContent","myFragment","createDocumentFragment","lastWord","scrollLeft","offsetLeft","populatePrompter","clear","_SmartGuide_hide","destroy","_SmartGuide_removeListeners","remove","setAttribute","MutationObserver","clearTimeout","contains","setTimeout","observe","childList","subtree","attributes","_SmartGuide_openMenu","bind","removeEventListener","DeferredPromise","isFullFilled","isPending","promise","v","PointerEventGrabber","prevent","_PointerEventGrabber_logger","pointerDownHandler","button","buttons","activePointerId","pointerId","onPointerDown","point","extractPoint","pointerMoveHandler","onPointerMove","pointerUpHandler","onPointerUp","roundFloat","oneFloat","requestedFloatPrecision","floatPrecision","pow","round","event","clientX","clientY","changedTouches","rect","pointer","x","clientLeft","y","clientTop","t","Date","now","p","pressure","attach","detach","documentElement","ShapeSymbols","table","recognizedShape","ellipse","line","phi","angle","returnedAngle","PI","drawArrowHead","context2D","headPoint","alpha","beta","save","fillStyle","strokeStyle","moveTo","beginPath","lineTo","cos","sin","fill","restore","drawShapeEllipse","shapeEllipse","points","drawEllipseArc","centerPoint","maxRadius","minRadius","orientation","startAngle","sweepAngle","z1","z3","z2","z4","n","floor","abs","boundariesPoints","i","atan2","cosAlpha","sinAlpha","stroke","beginDecoration","beginTangentAngle","endDecoration","endTangentAngle","drawLine","p1","p2","drawShapeSymbol","symbol","lineWidth","color","elementType","shapeSymbol","selectedCandidateIndex","lines","lineSymbol","drawShapeLine","shapeLine","firstPoint","lastPoint","primitives","primitive","drawStroke","stroker","pointerType","TextSymbols","inputCharacter","char","string","textLine","drawTextLine","drawText","font","textHeight","textAlign","justificationType","textBaseline","fillText","topLeftPoint","height","underlineList","underline","drawUnderline","delta","firstCharacter","lastCharacter","drawTextSymbol","computeLinksPoints","radius","computeMiddlePoint","point1","point2","computeAxeAngle","begin","end","CanvasStroker","renderArc","context2d","center","arc","renderLine","linkPoints1","linkPoints2","renderFinal","linkPoints","newAngle","renderQuadratic","ctrl","linkPoints3","quadraticCurveTo","NUMBER_POINTS","pointers","NUMBER_QUADRATICS","secondPoint","beginLine","endLine","beginFinal","endFinal","closePath","CanvasRenderer","_CanvasRenderer_logger","createCanvas","canvas","resizeContent","pixelRatio","devicePixelRatio","renderingCanvas","capturingCanvas","clientHeight","getContext","scale","drawSymbol","element","renderingCanvasContext","capturingCanvasContext","drawModel","clearRect","rawStrokes","drawPendingStroke","module","o","r","l","m","c","d","defineProperty","configurable","enumerable","__esModule","default","prototype","hasOwnProperty","s","Symbol","iterator","toJSON","u","split","trim","_trimSemiColon","toCSS","slice","parser","JsonCSS","StyleHelper","themeToCSS","json","themeToJSON","theme","Number","ink","penStyleToCSS","penStyle","css","penStyleToJSON","penStyleString","stringToJSON","JSONToString","entries","map","k","join","CryptoJS","create","F","obj","subtype","C","C_lib","lib","Base","extend","overrides","mixIn","$super","arguments","instance","properties","propertyName","clone","WordArray","sigBytes","encoder","Hex","concat","wordArray","thisWords","thatWords","thisSigBytes","thatSigBytes","clamp","thatByte","ceil","nBytes","rcache","m_w","m_z","mask","_r","C_enc","enc","hexChars","bite","hexStr","hexStrLength","substr","Latin1","latin1Chars","String","fromCharCode","latin1Str","latin1StrLength","charCodeAt","Utf8","decodeURIComponent","escape","utf8Str","unescape","encodeURIComponent","BufferedBlockAlgorithm","reset","_data","_nDataBytes","_append","_process","doFlush","dataWords","dataSigBytes","blockSize","nBlocksReady","nWordsReady","_minBufferSize","nBytesReady","min","offset","_doProcessBlock","processedWords","splice","Hasher","cfg","_doReset","messageUpdate","finalize","_doFinalize","_createHelper","hasher","_createHmacHelper","C_algo","HMAC","algo","require$$0","X32WordArray","C_x64","x64","Word","high","low","toX32","x64Words","x64WordsLength","x32Words","x64Word","wordsLength","X64Word","X64WordArray","X64Word_create","K","W","SHA512","_hash","M","H","H0","H1","H2","H3","H4","H5","H6","H7","H0h","H0l","H1h","H1l","H2h","H2l","H3h","H3l","H4h","H4l","H5h","H5l","H6h","H6l","H7h","H7l","ah","al","bh","bl","ch","cl","dh","dl","eh","fh","fl","gh","gl","hh","hl","Wi","Wih","Wil","gamma0x","gamma0xh","gamma0xl","gamma0h","gamma0l","gamma1x","gamma1xh","gamma1xl","gamma1h","gamma1l","Wi7","Wi7h","Wi7l","Wi16","Wi16h","Wi16l","t1l","chh","chl","majh","majl","sigma0h","sigma0l","sigma1h","sigma1l","Ki","Kih","Kil","t1h","t2l","nBitsTotal","nBitsLeft","HmacSHA512","_hasher","hasherBlockSize","hasherBlockSizeBytes","oKey","_oKey","iKey","_iKey","oKeyWords","iKeyWords","innerHash","computeHmac","isVersionSuperiorOrEqual","sourceParts","targetParts","a","b","Stroke","_Stroke_logger","convertStrokeToJSON","RestRecognizer","serverConfig","recognitionConfig","_RestRecognizer_logger","serverConfiguration","recognitionConfiguration","url","postConfig","buildData","strokeGroupByPenStyle","groupIndex","findIndex","sg","isPenStyleEqual","ps1","ps2","strokeGroupsToSend","group","newGroup","contentType","charAt","toUpperCase","toLowerCase","xDPI","yDPI","strokeGroups","post","mimeType","headers","Headers","append","reqInit","method","body","request","Request","response","fetch","ok","blob","catch","tryFetch","res","ErrorConst","code","getMimeTypes","requestedMimeTypes","myModel","getClone","dataToConcert","promises","mt","all","mergeConvert","mimeTypesRequiringExport","filter","mergeExport","UndoRedoContext","stackIndex","possibleUndoCount","canRedo","canUndo","stack","UndoRedoManager","_UndoRedoManager_logger","updateCanUndoRedo","currentModel","addModelToStack","removeLastModelInStack","pop","updateModelInStack","modificationDate","undo","previousModel","redo","nextModel","DefaultPenStyle","DefaultTheme","StyleManager","_StyleManager_penStyle","_StyleManager_theme","_StyleManager_penStyleClasses","_StyleManager_currentPenStyle","_StyleManager_logger","setTheme","setPenStyleClasses","setPenStyle","currentPenStyle","structuredClone","penStyleClasses","penStyleClass","computeDistance","distance","hypot","isNaN","Model","creationDate","_Model_logger","creationTime","selectedStrokes","positions","lastSentPosition","lastReceivedPosition","converts","computePressure","globalDistance","ratio","sqrt","filterPointByAcquisitionDelta","lastPointer","addPoint","at","addStroke","extractUnsentStrokes","initCurrentStroke","dpi","pxWidth","currentStroke","appendToCurrentStroke","endCurrentStroke","resetSelectedStrokes","appendSelectedStrokesFromPoint","_Model_instances","_Model_getStrokeFromPoint","updateStroke","updatedStroke","strokeIndex","removeStroke","removeStrokesFromPoint","strokeToRemove","updatePositionSent","position","updatePositionReceived","clonedModel","isBetween","val","_strokeList","strokePointer","RestBehaviors","options","_RestBehaviors_configuration","_RestBehaviors_model","_RestBehaviors_logger","_RestBehaviors_resizeTimer","_RestBehaviors_exportTimer","styleManager","recognizer","intention","undoRedoManager","penClass","updateModelRendering","drawCurrentStroke","_evt","newModel","deferred","deferredResize","resizeModel","WSRecognizer","_WSRecognizer_logger","pingCount","reconnectionCount","toLocaleLowerCase","infinitePing","socket","close","readyState","send","openCallback","connected","params","sessionId","iinkSessionId","xDpi","yDpi","viewSizeHeight","viewSizeWidth","rejectDeferredPending","initialized","addStrokeDeferred","exportDeferred","_h","convertDeferred","_j","_k","importDeferred","_l","_m","resizeDeferred","_o","_p","undoDeferred","_q","redoDeferred","_s","_t","clearDeferred","_u","waitForIdleDeferred","_v","closeCallback","currentErrorCode","reason","manageHMACChallengeMessage","websocketMessage","hmacChallengeMessage","hmacChallenge","hmac","manageContentPackageDescriptionMessage","currentPartId","managePartChangeMessage","partChangeMessage","partId","manageExportMessage","exportMessage","importPointEventsDeferred","manageWaitForIdle","manageErrorMessage","manageContentChangeMessage","contentChangeMessage","undoStackIndex","manageSVGPatchMessage","svgPatchMessage","messageCallback","WebSocket","OPEN","CONNECTING","addStrokes","styleClasses","localModel","import","chunkSize","importFileId","readBlob","fileReader","FileReader","onloadend","ev","onerror","readAsText","importFileMessage","size","blobPart","fileChuckMessage","lastChunk","importPointEvents","exportPoints","myExportConverted","waitForIdle","undoExports","redoExports","clearExports","SVGStroker","getArcPath","getLinePath","getFinalPath","parts","getQuadraticPath","central","buildSVGPath","STROKE_LENGTH","STROKE_WIDTH","NB_QUADRATICS","beforeLastPoint","svgElement","attrs","svgPathElement","createElementNS","svgPath","WSSVGRenderer","_WSSVGRenderer_logger","fontSize","updateLayer","layerName","_WSSVGRenderer_instances","_WSSVGRenderer_replaceElement","_WSSVGRenderer_removeElement","_WSSVGRenderer_removeChild","_WSSVGRenderer_insertBefore","_WSSVGRenderer_setAttribute","_WSSVGRenderer_removeAttribute","updatesLayer","updates","clearPendingStroke","pendingStrokeGroup","querySelector","oldStroke","clearErasingStrokes","querySelectorAll","erasingStroke","svgList","svg","_WSSVGRenderer_drawStroke","_WSSVGRenderer_replaceAll","oldLayer","insertAdjacentHTML","layer","pendingStrokesGroup","elementToRemove","_WSSVGRenderer_appendChild","parentSelector","parentId","refId","selector","removeAttribute","WSBehaviors","_WSBehaviors_configuration","_WSBehaviors_model","_WSBehaviors_logger","_WSBehaviors_resizeTimer","onSVGPatch","compStyles","getComputedStyle","unsentStrokes","styleInject","ref","insertAt","head","getElementsByTagName","firstChild","styleSheet","cssText","createTextNode","Editor","wrapperHTML","globalClassCss","_Editor_loaderHTML","_Editor_messageHTML","_Editor_behaviors","_Editor_smartGuide","_Editor_initializationDeferred","_Editor_loggerConfiguration","showStrokesPan","_Editor_onContextChange","_Editor_onIdleChange","logger","_Editor_instances","_Editor_instantiateBehaviors","loggerConfiguration","loggerConfig","setLoggerLevel","initializationPromise","behaviors","initialize","cursor","ps","psc","_Editor_initializeBehaviors","_Editor_initializeSmartGuide","_Editor_addListeners","_Editor_showStrokesIfDebug","blobToImport","Blob","defaultBehaviors","_Editor_cleanMessage","editor","_Editor_showError","finally","panel","getElementById","_Editor_showNotif","_Editor_onImportJIIX","_Editor_onExport","jjix","getAvailableFontList","sort","getAvailableLanguageList"],"mappings":"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"} \ No newline at end of file diff --git a/dist/iink.min.js b/dist/iink.min.js new file mode 100644 index 000000000..1390cc62e --- /dev/null +++ b/dist/iink.min.js @@ -0,0 +1,2 @@ +!function(i,s){"object"==typeof exports&&"undefined"!=typeof module?s(exports):"function"==typeof define&&define.amd?define(["exports"],s):s((i="undefined"!=typeof globalThis?globalThis:i||self).iink={})}(this,(function(i){"use strict";function __awaiter(i,s,n,a){return new(n||(n=Promise))((function(l,d){function fulfilled(i){try{step(a.next(i))}catch(i){d(i)}}function rejected(i){try{step(a.throw(i))}catch(i){d(i)}}function step(i){i.done?l(i.value):function adopt(i){return i instanceof n?i:new n((function(s){s(i)}))}(i.value).then(fulfilled,rejected)}step((a=a.apply(i,s||[])).next())}))}function __classPrivateFieldGet(i,s,n,a){if("a"===n&&!a)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof s?i!==s||!a:!s.has(i))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?a:"a"===n?a.call(i):a?a.value:s.get(i)}function __classPrivateFieldSet(i,s,n,a,l){if("m"===a)throw new TypeError("Private method is not writable");if("a"===a&&!l)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof s?i!==s||!l:!s.has(i))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===a?l.call(i,n):l?l.value=n:s.set(i,n),n}const s={protocol:"WEBSOCKET",scheme:"https",host:"cloud.myscript.com",applicationKey:"",hmacKey:"",version:"2.1.0",useWindowLocation:!1,websocket:{pingEnabled:!0,pingDelay:3e4,maxPingLostCount:10,autoReconnect:!0,maxRetryCount:2,fileChunkSize:3e5}},n={type:"TEXT",alwaysConnected:!0,lang:"en_US",gesture:{enable:!0},export:{"image-resolution":300,jiix:{"bounding-box":!1,strokes:!1,text:{chars:!1,words:!0}}},renderer:{debug:{"draw-text-boxes":!1,"draw-image-boxes":!1}},math:{mimeTypes:["application/vnd.myscript.jiix"],solver:{enable:!0,"fractional-part-digits":3,"decimal-separator":".","rounding-mode":"half up","angle-unit":"deg"},margin:{bottom:10,left:15,right:15,top:10},eraser:{"erase-precisely":!1},"undo-redo":{mode:"stroke"}},text:{guides:{enable:!0},mimeTypes:["application/vnd.myscript.jiix"],margin:{top:20,left:10,right:10,bottom:10},eraser:{"erase-precisely":!1}},diagram:{mimeTypes:["application/vnd.myscript.jiix"],eraser:{"erase-precisely":!1},convert:{"match-text-size":!0}},"raw-content":{recognition:{text:!0,shape:!0},eraser:{"erase-precisely":!1}}},a={listenerOptions:{capture:!1,passive:!0},xyFloatPrecision:0,timestampFloatPrecision:0},l={minHeight:100,minWidth:100,smartGuide:{enable:!0,fadeOut:{enable:!1,duration:5e3}},guides:{enable:!0,gap:50}},d={exportContent:"POINTER_UP",exportContentDelay:1e3,resizeTriggerDelay:100},c={processDelay:10},h={maxStackSize:100},v={server:s,recognition:n,grabber:a,rendering:l,triggers:d,events:c,"undo-redo":h},u={EDITOR:"4",BEHAVIORS:"4",RECOGNIZER:"4",GRABBER:"4",RENDERER:"4",CONFIGURATION:"4",PUBLIC_EVENT:"4",INTERNALEVENT:"4",MODEL:"4",STROKE:"4",SMARTGUIDE:"4",STYLEMANAGER:"4",UNDOREDO_MANAGER:"4"},mergeDeep=(i,...s)=>{const isObject=i=>i&&"object"==typeof i&&!Array.isArray(i);if(!s.length)return i;const n=s.shift();if(isObject(i)&&isObject(n))for(const s in n)isObject(n[s])?(i[s]||Object.assign(i,{[s]:{}}),mergeDeep(i[s],n[s])):Object.assign(i,{[s]:n[s]});return mergeDeep(i,...s)};class Logger{constructor(i,s){this.instanceName=i,this.level=s}debug(...i){if("1">=this.level){const s={from:this.instanceName,message:i};console.debug(s)}}info(...i){if("2">=this.level){const s={from:this.instanceName,message:i};console.info(s)}}warn(...i){if("3">=this.level){const s={from:this.instanceName,message:i};console.warn(s)}}error(...i){const s={from:this.instanceName,error:i};console.error(s)}}var p,_;class LoggerManager{static getLogger(i){return __classPrivateFieldGet(this,p,"f",_).has(i)||__classPrivateFieldGet(this,p,"f",_).set(i,new Logger(i,"4")),__classPrivateFieldGet(this,p,"f",_).get(i)}static setLoggerLevel(i){Object.keys(i).forEach((s=>{LoggerManager.getLogger(s).level=i[s]}))}}p=LoggerManager,_={value:new Map};var g,f=Object.freeze({__proto__:null,LoggerManager:LoggerManager,Logger:Logger});class Configuration{constructor(i){g.set(this,LoggerManager.getLogger("CONFIGURATION")),__classPrivateFieldGet(this,g,"f").info("constructor",{configuration:i}),this.events=JSON.parse(JSON.stringify(v.events)),this.grabber=JSON.parse(JSON.stringify(v.grabber)),this.recognition=JSON.parse(JSON.stringify(v.recognition)),this.rendering=JSON.parse(JSON.stringify(v.rendering)),this.server=JSON.parse(JSON.stringify(v.server)),this.triggers=JSON.parse(JSON.stringify(v.triggers)),this.overrideDefaultConfiguration(i)}overrideDefaultConfiguration(i){var s,n,a,l,d,c,h;__classPrivateFieldGet(this,g,"f").info("overrideDefaultConfiguration",{configuration:i});const u=JSON.parse(JSON.stringify(v));this.events=mergeDeep({},u.events,null==i?void 0:i.events),this.grabber=mergeDeep({},u.grabber,null==i?void 0:i.grabber),this.recognition=mergeDeep({},u.recognition,null==i?void 0:i.recognition),this.rendering=mergeDeep({},u.rendering,null==i?void 0:i.rendering),this.server=mergeDeep({},u.server,null==i?void 0:i.server),this.triggers=mergeDeep({},u.triggers,null==i?void 0:i.triggers),this["undo-redo"]=mergeDeep({},u["undo-redo"],null==i?void 0:i["undo-redo"]),this.recognition.text.mimeTypes=(null===(n=null===(s=null==i?void 0:i.recognition)||void 0===s?void 0:s.text)||void 0===n?void 0:n.mimeTypes)||u.recognition.text.mimeTypes,this.recognition.math.mimeTypes=(null===(l=null===(a=null==i?void 0:i.recognition)||void 0===a?void 0:a.math)||void 0===l?void 0:l.mimeTypes)||u.recognition.math.mimeTypes,this.recognition.diagram.mimeTypes=(null===(c=null===(d=null==i?void 0:i.recognition)||void 0===d?void 0:d.diagram)||void 0===c?void 0:c.mimeTypes)||u.recognition.diagram.mimeTypes,(null===(h=this.server)||void 0===h?void 0:h.useWindowLocation)&&(this.server.scheme=window.location.protocol.indexOf("s")>-1?"https":"http",this.server.host=window.location.host),"REST"===this.server.protocol&&"POINTER_UP"===this.triggers.exportContent&&(this.triggers.exportContent="QUIET_PERIOD",this.triggers.exportContentDelay=Math.max(this.triggers.exportContentDelay,50)),"WEBSOCKET"===this.server.protocol&&"TEXT"===this.recognition.type?this.rendering.smartGuide.enable&&!this.recognition.text.mimeTypes.includes("application/vnd.myscript.jiix")&&this.recognition.text.mimeTypes.push("application/vnd.myscript.jiix"):this.rendering.smartGuide.enable=!1,__classPrivateFieldGet(this,g,"f").debug("overrideDefaultConfiguration",{configuration:this})}}g=new WeakMap;var m,P,y=Object.freeze({__proto__:null,Configuration:Configuration,DefaultServerConfiguration:s,DefaultRecognitionConfiguration:n,DefaultGrabberConfiguration:a,DefaultRenderingConfiguration:l,DefaultTriggerConfiguration:d,DefaultEventsConfiguration:c,DefaultUndoRedoConfiguration:h,DefaultConfiguration:v,DefaultLoggerConfiguration:u});!function(i){i.DEBUG="1",i.INFO="2",i.WARN="3",i.ERROR="4"}(m||(m={})),function(i){i.EDITOR="EDITOR",i.RECOGNIZER="RECOGNIZER",i.GRABBER="GRABBER",i.BEHAVIORS="BEHAVIORS",i.CONFIGURATION="CONFIGURATION",i.PUBLIC_EVENT="PUBLIC_EVENT",i.MODEL="MODEL",i.RENDERER="RENDERER",i.SMARTGUIDE="SMARTGUIDE",i.STYLEMANAGER="STYLEMANAGER",i.UNDOREDO_MANAGER="UNDOREDO_MANAGER",i.STROKE="STROKE",i.INTERNALEVENT="INTERNALEVENT"}(P||(P={}));const S={NO_ACTIVITY:"Session closed due to no activity.",WRONG_CREDENTIALS:"Application credentials are invalid. Please check or regenerate your application key and hmackey.",TOO_OLD:"Session is too old. Max Session Duration Reached.",UNKNOW:"An unknown error has occurred.",ABNORMAL_CLOSURE:"MyScript recognition server is not reachable.",CANT_ESTABLISH:"Unable to establish a connection to MyScript recognition server. Check the host and your connectivity.",GOING_AWAY:"MyScript recognition server is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection.",PROTOCOL_ERROR:"MyScript recognition server terminated the connection due to a protocol error.",UNSUPPORTED_DATA:"MyScript recognition server terminated the connection because the endpoint received data of a type it cannot accept. (For example, a text-only endpoint received binary data.)",INVALID_FRAME_PAULOAD:"MyScript recognition server terminated the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message).",POLICY_VIOLATION:"MyScript recognition server terminated the connection because it received a message that violates its policy.",MESSAGE_TOO_BIG:"MyScript recognition server terminated the connection because a data frame was received that is too large.",INTERNAL_ERROR:"MyScript recognition server terminated the connection because it encountered an unexpected condition that prevented it from fulfilling the request.",SERVICE_RESTART:"MyScript recognition server terminated the connection because it is restarting.",TRY_AGAIN:"MyScript recognition server terminated the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients.",BAD_GATEWAY:"MyScript recognition server was acting as a gateway or proxy and received an invalid response from the upstream server.",TLS_HANDSHAKE:"MyScript recognition server connection was closed due to a failure to perform a TLS handshake"},w={CHANGED:"changed",CLEARED:"cleared",CONVERTED:"converted",ERROR:"error",POINTEREVENTS:"pointer_events",EXPORTED:"exported",IMPORTED:"imported",IDLE:"idle",LOADED:"loaded"},G={SVG_PATCH:"internal_svg_patch",EXPORTED:"internal_exported",CLEAR_MESSAGE:"internal_clear_message",ERROR:"internal_error",NOTIF:"internal_notif",IMPORT_JIIX:"internal_import_jiix",CONVERT:"internal_convert",CLEAR:"internal_clear",CONTEXT_CHANGE:"internal_context_change",IDLE:"internal_idle",WS_CLOSED:"internal_websocket_closed"};var b,x;!function(i){i.JIIX="application/vnd.myscript.jiix",i.TEXT="text/plain",i.LATEX="application/x-latex",i.MATHML="application/mathml+xml",i.SVG="image/svg+xml",i.OFFICE_DOCUMENT="application/vnd.openxmlformats-officedocument.presentationml.presentation"}(b||(b={})),function(i){i.Write="write",i.Erase="erase"}(x||(x={}));var E,C,k,M,T,L,I,D,A,R,N,O,W,z,j,H,B,X,U,$,V,J,q,Y,Z,K,Q,ee,te,ie,se,ne,re,oe,ae,le,de,ce,he,ve,ue,pe,_e,ge,fe,me,Pe,ye,Se,we,Fe,Ge,be=Object.freeze({__proto__:null,Error:S,EventType:w,InternalEventType:G,get ExportType(){return b},get Intention(){return x},get LoggerClass(){return P},get LoggerLevel(){return m}});class PublicEvent extends EventTarget{constructor(){super(),E.add(this),M.set(this,void 0),T.set(this,LoggerManager.getLogger("PUBLIC_EVENT"))}static getInstance(){return __classPrivateFieldGet(PublicEvent,C,"f",k)||__classPrivateFieldSet(PublicEvent,C,new PublicEvent,"f",k),__classPrivateFieldGet(PublicEvent,C,"f",k)}setElement(i){__classPrivateFieldGet(this,T,"f").info("setElement",{el:i}),__classPrivateFieldSet(this,M,i,"f")}emitLoaded(){__classPrivateFieldGet(this,T,"f").info("emitLoaded"),__classPrivateFieldGet(this,E,"m",L).call(this,w.LOADED)}emitExported(i){__classPrivateFieldGet(this,T,"f").info("emitExported",{exports:i}),__classPrivateFieldGet(this,E,"m",L).call(this,w.EXPORTED,i)}emitChanged(i){__classPrivateFieldGet(this,T,"f").info("emitChanged",{undoRedoContext:i}),__classPrivateFieldGet(this,E,"m",L).call(this,w.CHANGED,Object.assign(Object.assign({},i),{canClear:!i.empty}))}emitIdle(i){__classPrivateFieldGet(this,T,"f").info("emitIdle",{idle:i}),__classPrivateFieldGet(this,E,"m",L).call(this,w.IDLE,i)}emitCleared(i){__classPrivateFieldGet(this,T,"f").info("emitCleared",{model:i}),__classPrivateFieldGet(this,E,"m",L).call(this,w.CLEARED,i)}emitConverted(i){__classPrivateFieldGet(this,T,"f").info("emitConverted",{exports:i}),__classPrivateFieldGet(this,E,"m",L).call(this,w.CONVERTED,i)}emitImported(i){__classPrivateFieldGet(this,T,"f").info("emitImported",{exports:i}),__classPrivateFieldGet(this,E,"m",L).call(this,w.IMPORTED,i)}}C=PublicEvent,M=new WeakMap,T=new WeakMap,E=new WeakSet,L=function _PublicEvent_emit(i,s){var n;const a=new CustomEvent(i,Object.assign({bubbles:!0,composed:!0},s?{detail:s}:void 0));this.dispatchEvent(a),null===(n=__classPrivateFieldGet(this,M,"f"))||void 0===n||n.dispatchEvent(a)},k={value:void 0};class InternalEvent extends EventTarget{constructor(){super(),I.add(this),R.set(this,void 0),N.set(this,LoggerManager.getLogger("INTERNALEVENT")),__classPrivateFieldGet(this,N,"f").info("constructor"),__classPrivateFieldSet(this,R,new AbortController,"f")}static getInstance(){return __classPrivateFieldGet(InternalEvent,D,"f",A)||__classPrivateFieldSet(InternalEvent,D,new InternalEvent,"f",A),__classPrivateFieldGet(InternalEvent,D,"f",A)}removeAllListeners(){__classPrivateFieldGet(this,N,"f").info("removeAllListeners"),__classPrivateFieldGet(this,R,"f").abort(),__classPrivateFieldSet(this,R,new AbortController,"f")}emitSVGPatch(i){__classPrivateFieldGet(this,N,"f").info("emitSVGPatch",{patchChange:i}),__classPrivateFieldGet(this,I,"m",O).call(this,G.SVG_PATCH,i)}addSVGPatchListener(i){__classPrivateFieldGet(this,N,"f").info("addSVGPatchListener",{callback:i}),this.addEventListener(G.SVG_PATCH,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,R,"f").signal})}emitExported(i){__classPrivateFieldGet(this,N,"f").info("emitExported",{exports:i}),__classPrivateFieldGet(this,I,"m",O).call(this,G.EXPORTED,i)}addExportedListener(i){__classPrivateFieldGet(this,N,"f").info("addExportedListener",{callback:i}),this.addEventListener(G.EXPORTED,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,R,"f").signal})}emitClearMessage(){__classPrivateFieldGet(this,N,"f").info("emitClearMessage",{}),__classPrivateFieldGet(this,I,"m",O).call(this,G.CLEAR_MESSAGE)}addClearMessageListener(i){__classPrivateFieldGet(this,N,"f").info("addClearMessageListener",{callback:i}),this.addEventListener(G.CLEAR_MESSAGE,(()=>i()),{signal:__classPrivateFieldGet(this,R,"f").signal})}emitError(i){__classPrivateFieldGet(this,N,"f").info("emitError",{err:i}),__classPrivateFieldGet(this,I,"m",O).call(this,G.ERROR,i)}addErrorListener(i){__classPrivateFieldGet(this,N,"f").info("addErrorListener",{callback:i}),this.addEventListener(G.ERROR,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,R,"f").signal})}emitWSClosed(){__classPrivateFieldGet(this,N,"f").info("emitWSClosed",{}),__classPrivateFieldGet(this,I,"m",O).call(this,G.WS_CLOSED)}addWSClosedListener(i){__classPrivateFieldGet(this,N,"f").info("addWSClosedListener",{callback:i}),this.addEventListener(G.WS_CLOSED,(()=>i()),{signal:__classPrivateFieldGet(this,R,"f").signal})}emitNotif(i){__classPrivateFieldGet(this,N,"f").info("emitWNotif",{notif:i}),__classPrivateFieldGet(this,I,"m",O).call(this,G.NOTIF,i)}addNotifListener(i){__classPrivateFieldGet(this,N,"f").info("addNotifListener",{callback:i}),this.addEventListener(G.NOTIF,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,R,"f").signal})}emitImportJIIX(i){__classPrivateFieldGet(this,N,"f").info("emitImportJIIX",{jiix:i}),__classPrivateFieldGet(this,I,"m",O).call(this,G.IMPORT_JIIX,i)}addImportJIIXListener(i){__classPrivateFieldGet(this,N,"f").info("addImportJIIXListener",{callback:i}),this.addEventListener(G.IMPORT_JIIX,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,R,"f").signal})}emitConvert(i="DIGITAL_EDIT"){__classPrivateFieldGet(this,N,"f").info("emitConvert",{conversionState:i}),__classPrivateFieldGet(this,I,"m",O).call(this,G.CONVERT,i)}addConvertListener(i){__classPrivateFieldGet(this,N,"f").info("addConvertListener",{callback:i}),this.addEventListener(G.CONVERT,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,R,"f").signal})}emitClear(){__classPrivateFieldGet(this,N,"f").info("emitClear"),__classPrivateFieldGet(this,I,"m",O).call(this,G.CLEAR)}addClearListener(i){__classPrivateFieldGet(this,N,"f").info("addClearListener",{callback:i}),this.addEventListener(G.CLEAR,(()=>i()),{signal:__classPrivateFieldGet(this,R,"f").signal})}emitContextChange(i){__classPrivateFieldGet(this,N,"f").info("emitContextChange",{context:i}),__classPrivateFieldGet(this,I,"m",O).call(this,G.CONTEXT_CHANGE,i)}addContextChangeListener(i){__classPrivateFieldGet(this,N,"f").info("addContextChangeListener",{callback:i}),this.addEventListener(G.CONTEXT_CHANGE,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,R,"f").signal})}emitIdle(i){__classPrivateFieldGet(this,N,"f").info("emitIdle",{idle:i}),__classPrivateFieldGet(this,I,"m",O).call(this,G.IDLE,i)}addIdleListener(i){__classPrivateFieldGet(this,N,"f").info("addIdleListener",{callback:i}),this.addEventListener(G.IDLE,(s=>i(s.detail)),{signal:__classPrivateFieldGet(this,R,"f").signal})}}D=InternalEvent,R=new WeakMap,N=new WeakMap,I=new WeakSet,O=function _InternalEvent_emit(i,s){this.dispatchEvent(new CustomEvent(i,Object.assign({bubbles:!0,composed:!0},s?{detail:s}:void 0)))},A={value:void 0};class SmartGuide{constructor(){W.add(this),z.set(this,void 0),j.set(this,void 0),H.set(this,void 0),B.set(this,void 0),X.set(this,void 0),U.set(this,void 0),$.set(this,void 0),V.set(this,void 0),J.set(this,void 0),q.set(this,void 0),Y.set(this,void 0),Z.set(this,void 0),K.set(this,LoggerManager.getLogger("SMARTGUIDE")),ve.set(this,(i=>{var s,n,a,l,d;__classPrivateFieldGet(this,K,"f").info("showCandidates",{target:i});const c=parseInt(i.id.replace("word-","").replace(this.uuid,"")),h=null===(s=this.jiix)||void 0===s?void 0:s.words;if(this.wordToChange=h[c],this.wordToChange&&(this.wordToChange.id=c.toString(),__classPrivateFieldGet(this,U,"f").innerHTML="",null===(n=this.wordToChange)||void 0===n?void 0:n.candidates)){__classPrivateFieldGet(this,U,"f").style.display="flex",this.wordToChange.candidates.forEach(((i,s)=>{var n;(null===(n=this.wordToChange)||void 0===n?void 0:n.label)===i?__classPrivateFieldGet(this,U,"f").innerHTML+=`${i}`:__classPrivateFieldGet(this,U,"f").innerHTML+=`${i}`}));const s=48,n=i.getBoundingClientRect().left-60;__classPrivateFieldGet(this,U,"f").style.top=`${s}px`,__classPrivateFieldGet(this,U,"f").style.left=`${n}px`;const c=null===(l=null===(a=i.parentNode)||void 0===a?void 0:a.parentNode)||void 0===l?void 0:l.parentNode;c&&c.insertBefore(__classPrivateFieldGet(this,U,"f"),null===(d=i.parentNode)||void 0===d?void 0:d.parentNode)}})),ge.set(this,(i=>{__classPrivateFieldGet(this,K,"f").info("onClickEllipsis",{evt:i}),i.preventDefault(),i.stopPropagation(),__classPrivateFieldGet(this,Z,"f")?__classPrivateFieldGet(this,W,"m",_e).call(this):__classPrivateFieldGet(this,W,"m",pe).call(this),__classPrivateFieldGet(this,W,"m",ue).call(this)})),fe.set(this,(i=>{__classPrivateFieldGet(this,K,"f").info("onClickConvert",{evt:i}),i.preventDefault(),i.stopPropagation(),this.internalEvent.emitConvert(),__classPrivateFieldGet(this,W,"m",_e).call(this)})),me.set(this,(i=>__awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,K,"f").info("onClickCopy",{evt:i}),i.preventDefault(),i.stopPropagation();try{__classPrivateFieldGet(this,W,"m",_e).call(this);let i="Nothing to copy";if(__classPrivateFieldGet(this,H,"f").innerText)if(i=`"${__classPrivateFieldGet(this,H,"f").innerText}" copied to clipboard`,/iPad|iPhone|iPod/.test(navigator.userAgent)){const i="clipboard-write";"granted"===(yield navigator.permissions.query({name:i})).state&&(yield navigator.clipboard.writeText(__classPrivateFieldGet(this,H,"f").innerText))}else yield navigator.clipboard.writeText(__classPrivateFieldGet(this,H,"f").innerText);this.internalEvent.emitNotif({message:i,timeout:1500})}catch(i){__classPrivateFieldGet(this,K,"f").error("onClickCopy",{err:i}),this.internalEvent.emitError(i)}})))),Pe.set(this,(i=>{__classPrivateFieldGet(this,K,"f").info("onClickDelete",{evt:i}),i.preventDefault(),i.stopPropagation(),this.internalEvent.emitClear(),__classPrivateFieldGet(this,W,"m",_e).call(this)})),ye.set(this,(i=>{var s,n,a,l;__classPrivateFieldGet(this,K,"f").info("onClickCandidate",{evt:i}),i.preventDefault(),i.stopPropagation();const d=i.target.innerText;this.jiix&&d!==(null===(s=this.wordToChange)||void 0===s?void 0:s.label)&&(null===(a=null===(n=this.wordToChange)||void 0===n?void 0:n.candidates)||void 0===a?void 0:a.includes(d))&&(this.jiix.words[parseInt(null===(l=this.wordToChange)||void 0===l?void 0:l.id)].label=d,this.internalEvent.emitImportJIIX(this.jiix)),__classPrivateFieldGet(this,U,"f").style.display="none"})),Se.set(this,(i=>{__classPrivateFieldGet(this,K,"f").info("onClickPrompter",{evt:i}),i.preventDefault(),i.stopPropagation(),__classPrivateFieldGet(this,W,"m",_e).call(this);const s=i.target;s.id!==__classPrivateFieldGet(this,H,"f").id?__classPrivateFieldGet(this,ve,"f").call(this,s):__classPrivateFieldGet(this,W,"m",ue).call(this)})),we.set(this,(()=>{__classPrivateFieldGet(this,W,"m",ue).call(this),__classPrivateFieldGet(this,W,"m",_e).call(this)})),__classPrivateFieldGet(this,K,"f").info("constructor",{}),this.uuid=Math.random().toString(10).substring(2,12),this.margin={bottom:0,left:0,right:0,top:0},__classPrivateFieldGet(this,W,"m",Q).call(this),__classPrivateFieldGet(this,W,"m",ee).call(this),__classPrivateFieldGet(this,W,"m",te).call(this),__classPrivateFieldGet(this,W,"m",ie).call(this),__classPrivateFieldGet(this,W,"m",se).call(this),__classPrivateFieldGet(this,W,"m",ne).call(this),__classPrivateFieldGet(this,W,"m",re).call(this),__classPrivateFieldGet(this,W,"m",oe).call(this),__classPrivateFieldGet(this,W,"m",ae).call(this),__classPrivateFieldGet(this,W,"m",le).call(this)}get internalEvent(){return InternalEvent.getInstance()}init(i,s,n){__classPrivateFieldGet(this,K,"f").info("init",{domElement:i,margin:s,renderingConfiguration:n}),i.appendChild(__classPrivateFieldGet(this,z,"f")),__classPrivateFieldGet(this,z,"f").appendChild(__classPrivateFieldGet(this,X,"f")),__classPrivateFieldGet(this,j,"f").appendChild(__classPrivateFieldGet(this,H,"f")),__classPrivateFieldGet(this,z,"f").appendChild(__classPrivateFieldGet(this,j,"f")),__classPrivateFieldGet(this,z,"f").appendChild(__classPrivateFieldGet(this,B,"f")),__classPrivateFieldGet(this,$,"f").appendChild(__classPrivateFieldGet(this,V,"f")),__classPrivateFieldGet(this,$,"f").appendChild(__classPrivateFieldGet(this,J,"f")),__classPrivateFieldGet(this,$,"f").appendChild(__classPrivateFieldGet(this,q,"f")),__classPrivateFieldGet(this,z,"f").appendChild(__classPrivateFieldGet(this,$,"f")),__classPrivateFieldGet(this,$,"f").classList.add("close"),__classPrivateFieldSet(this,Z,!1,"f"),__classPrivateFieldGet(this,z,"f").appendChild(__classPrivateFieldGet(this,U,"f")),__classPrivateFieldGet(this,U,"f").style.display="none",this.margin=s,this.renderingConfiguration=n,__classPrivateFieldGet(this,W,"m",Fe).call(this),__classPrivateFieldGet(this,W,"m",ce).call(this),this.renderingConfiguration.smartGuide.fadeOut.enable&&__classPrivateFieldGet(this,W,"m",de).call(this,this.renderingConfiguration.smartGuide.fadeOut.duration),this.resize()}resize(){__classPrivateFieldGet(this,K,"f").info("resize");const i=3.779527559,s=this.margin.top*i,n=this.margin.left*i,a=this.margin.right*i,l=s-45.354330708;__classPrivateFieldGet(this,z,"f").style.top=`${l}px`,__classPrivateFieldGet(this,z,"f").style.left=`${n}px`,__classPrivateFieldGet(this,z,"f").style.right=`${a}px`;let d=__classPrivateFieldGet(this,X,"f").offsetWidth;__classPrivateFieldGet(this,j,"f").style.marginLeft=`${d}px`,__classPrivateFieldGet(this,j,"f").style.width=__classPrivateFieldGet(this,z,"f").clientWidth-__classPrivateFieldGet(this,X,"f").offsetWidth-__classPrivateFieldGet(this,B,"f").offsetHeight+"px",d+=__classPrivateFieldGet(this,j,"f").offsetWidth,__classPrivateFieldGet(this,$,"f").style.left=`${d-__classPrivateFieldGet(this,$,"f").offsetWidth+__classPrivateFieldGet(this,B,"f").offsetWidth}px`,__classPrivateFieldGet(this,$,"f").style.top=`${__classPrivateFieldGet(this,B,"f").offsetHeight}px`,__classPrivateFieldGet(this,B,"f").style.left=`${d}px`}update(i){var s,n;__classPrivateFieldGet(this,K,"f").info("update",{exports:i}),this.jiix=i;const createWordSpan=(i,s)=>{const n=document.createElement("span");return n.id=`word-${i}${this.uuid}`,s?n.textContent=s.label:n.innerHTML=" ",__classPrivateFieldGet(this,K,"f").debug("update",{span:n}),n};(()=>{var i;if(__classPrivateFieldGet(this,K,"f").info("populatePrompter",{}),__classPrivateFieldGet(this,H,"f").innerHTML="",null===(i=this.jiix)||void 0===i?void 0:i.words){const i=this.jiix.words,s=document.createDocumentFragment();i.forEach(((n,a)=>{var l,d,c;if(" "===n.label||n.label.includes("\n"))s.appendChild(createWordSpan(a));else if(a!==i.length-1)s.appendChild(createWordSpan(a,n));else{__classPrivateFieldGet(this,H,"f").appendChild(s),this.lastWord&&(this.lastWord=n);const i=createWordSpan(a,n);(null===(l=this.lastWord)||void 0===l?void 0:l.candidates)!==n.candidates&&(null===(d=this.lastWord)||void 0===d?void 0:d.label)!==n.label&&(this.lastWord=n),(null===(c=this.wordToChange)||void 0===c?void 0:c.id)===a.toString()?(i.classList.add("modified-word"),this.wordToChange=void 0):i.classList.add("added-word"),__classPrivateFieldGet(this,H,"f").appendChild(i),__classPrivateFieldGet(this,j,"f").scrollLeft=i.offsetLeft,__classPrivateFieldGet(this,K,"f").debug("update => populatePrompter",{span:i}),__classPrivateFieldGet(this,K,"f").debug("update => populatePrompter",this.lastWord)}}))}})(),(null===(n=null===(s=this.jiix)||void 0===s?void 0:s.words)||void 0===n?void 0:n.length)&&__classPrivateFieldGet(this,W,"m",ce).call(this)}clear(){__classPrivateFieldGet(this,K,"f").info("clear"),__classPrivateFieldGet(this,H,"f").innerHTML="",__classPrivateFieldGet(this,U,"f").innerHTML="",__classPrivateFieldGet(this,W,"m",he).call(this)}destroy(){__classPrivateFieldGet(this,K,"f").info("destroy"),__classPrivateFieldGet(this,W,"m",Ge).call(this),__classPrivateFieldGet(this,z,"f").remove()}}z=new WeakMap,j=new WeakMap,H=new WeakMap,B=new WeakMap,X=new WeakMap,U=new WeakMap,$=new WeakMap,V=new WeakMap,J=new WeakMap,q=new WeakMap,Y=new WeakMap,Z=new WeakMap,K=new WeakMap,ve=new WeakMap,ge=new WeakMap,fe=new WeakMap,me=new WeakMap,Pe=new WeakMap,ye=new WeakMap,Se=new WeakMap,we=new WeakMap,W=new WeakSet,Q=function _SmartGuide_createWrapperElement(){__classPrivateFieldSet(this,z,document.createElement("div"),"f"),__classPrivateFieldGet(this,z,"f").id=`smartguide-${this.uuid}`,__classPrivateFieldGet(this,z,"f").classList.add("smartguide")},ee=function _SmartGuide_createPrompterContainerElement(){__classPrivateFieldSet(this,j,document.createElement("div"),"f"),__classPrivateFieldGet(this,j,"f").id=`prompter-container-${this.uuid}`,__classPrivateFieldGet(this,j,"f").classList.add("prompter-container")},te=function _SmartGuide_createPrompterTextElement(){__classPrivateFieldSet(this,H,document.createElement("div"),"f"),__classPrivateFieldGet(this,H,"f").id=`prompter-text-${this.uuid}`,__classPrivateFieldGet(this,H,"f").classList.add("prompter-text"),__classPrivateFieldGet(this,H,"f").setAttribute("touch-action","none")},ie=function _SmartGuide_createEllipsisElement(){__classPrivateFieldSet(this,B,document.createElement("div"),"f"),__classPrivateFieldGet(this,B,"f").id=`ellipsis-${this.uuid}`,__classPrivateFieldGet(this,B,"f").classList.add("ellipsis"),__classPrivateFieldGet(this,B,"f").innerHTML="..."},se=function _SmartGuide_createTagElement(){__classPrivateFieldSet(this,X,document.createElement("div"),"f"),__classPrivateFieldGet(this,X,"f").id=`tag-icon-${this.uuid}`,__classPrivateFieldGet(this,X,"f").classList.add("tag-icon"),__classPrivateFieldGet(this,X,"f").innerHTML="¶"},ne=function _SmartGuide_createCandidatesElement(){__classPrivateFieldSet(this,U,document.createElement("div"),"f"),__classPrivateFieldGet(this,U,"f").id=`candidates-${this.uuid}`,__classPrivateFieldGet(this,U,"f").classList.add("candidates")},re=function _SmartGuide_createMoreMenuElement(){__classPrivateFieldSet(this,$,document.createElement("div"),"f"),__classPrivateFieldGet(this,$,"f").id=`more-menu-${this.uuid}`,__classPrivateFieldGet(this,$,"f").classList.add("more-menu")},oe=function _SmartGuide_createConvertElement(){__classPrivateFieldSet(this,V,document.createElement("button"),"f"),__classPrivateFieldGet(this,V,"f").id=`convert-${this.uuid}`,__classPrivateFieldGet(this,V,"f").classList.add("options-label-button"),__classPrivateFieldGet(this,V,"f").innerHTML="Convert"},ae=function _SmartGuide_createCopyElement(){__classPrivateFieldSet(this,J,document.createElement("button"),"f"),__classPrivateFieldGet(this,J,"f").id=`copy-${this.uuid}`,__classPrivateFieldGet(this,J,"f").classList.add("options-label-button"),__classPrivateFieldGet(this,J,"f").innerHTML="Copy"},le=function _SmartGuide_createDeleteElement(){__classPrivateFieldSet(this,q,document.createElement("button"),"f"),__classPrivateFieldGet(this,q,"f").id=`delete-${this.uuid}`,__classPrivateFieldGet(this,q,"f").classList.add("options-label-button"),__classPrivateFieldGet(this,q,"f").innerHTML="Delete"},de=function _SmartGuide_initFadeOutObserver(i=3e3){new MutationObserver((()=>{clearTimeout(__classPrivateFieldGet(this,Y,"f")),__classPrivateFieldGet(this,z,"f").classList.contains("smartguide-out")||"none"!==__classPrivateFieldGet(this,U,"f").style.display||__classPrivateFieldGet(this,Z,"f")||__classPrivateFieldSet(this,Y,setTimeout((()=>{__classPrivateFieldGet(this,W,"m",he).call(this)}),i),"f")})).observe(__classPrivateFieldGet(this,z,"f"),{childList:!0,subtree:!0,attributes:!0})},ce=function _SmartGuide_show(){__classPrivateFieldGet(this,z,"f").classList.remove("smartguide-out"),__classPrivateFieldGet(this,z,"f").classList.add("smartguide-in")},he=function _SmartGuide_hide(){__classPrivateFieldGet(this,z,"f").classList.add("smartguide-out"),__classPrivateFieldGet(this,z,"f").classList.remove("smartguide-in")},ue=function _SmartGuide_hideCandidates(){__classPrivateFieldGet(this,U,"f").style.display="none"},pe=function _SmartGuide_openMenu(){__classPrivateFieldGet(this,$,"f").classList.add("open"),__classPrivateFieldGet(this,$,"f").classList.remove("close"),__classPrivateFieldSet(this,Z,!0,"f")},_e=function _SmartGuide_closeMenu(){__classPrivateFieldGet(this,$,"f").classList.add("close"),__classPrivateFieldGet(this,$,"f").classList.remove("open"),__classPrivateFieldSet(this,Z,!1,"f")},Fe=function _SmartGuide_addListeners(){__classPrivateFieldGet(this,B,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,ge,"f").bind(this)),__classPrivateFieldGet(this,V,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,fe,"f").bind(this)),__classPrivateFieldGet(this,J,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,me,"f").bind(this)),__classPrivateFieldGet(this,q,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,Pe,"f").bind(this)),__classPrivateFieldGet(this,H,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,Se,"f").bind(this)),__classPrivateFieldGet(this,U,"f").addEventListener("pointerdown",__classPrivateFieldGet(this,ye,"f").bind(this)),document.addEventListener("pointerdown",__classPrivateFieldGet(this,we,"f").bind(this))},Ge=function _SmartGuide_removeListeners(){__classPrivateFieldGet(this,B,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,ge,"f")),__classPrivateFieldGet(this,V,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,fe,"f")),__classPrivateFieldGet(this,J,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,me,"f")),__classPrivateFieldGet(this,q,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,Pe,"f")),__classPrivateFieldGet(this,H,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,Se,"f")),__classPrivateFieldGet(this,U,"f").removeEventListener("pointerdown",__classPrivateFieldGet(this,ye,"f")),document.removeEventListener("pointerdown",__classPrivateFieldGet(this,we,"f"))};var xe,Ee=Object.freeze({__proto__:null,SmartGuide:SmartGuide});class DeferredPromise{constructor(){this.isFullFilled=!1,this.isPending=!0,this.promise=new Promise(((i,s)=>{this.reject=i=>__awaiter(this,void 0,void 0,(function*(){return this.isFullFilled=!0,this.isPending=!1,s(i)})),this.resolve=s=>__awaiter(this,void 0,void 0,(function*(){return this.isFullFilled=!0,this.isPending=!1,i(s)}))}))}}class PointerEventGrabber{constructor(i){this.prevent=i=>i.preventDefault(),xe.set(this,LoggerManager.getLogger("GRABBER")),this.pointerDownHandler=i=>{if(__classPrivateFieldGet(this,xe,"f").info("pointerDown",{evt:i}),0===i.button&&1===i.buttons&&(this.activePointerId=i.pointerId,this.onPointerDown)){const s=this.extractPoint(i);this.onPointerDown(i,s)}},this.pointerMoveHandler=i=>{if(__classPrivateFieldGet(this,xe,"f").info("pointerMove",{evt:i}),null!=this.activePointerId&&this.activePointerId===i.pointerId&&this.onPointerMove){const s=this.extractPoint(i);this.onPointerMove(i,s)}},this.pointerUpHandler=i=>{if(__classPrivateFieldGet(this,xe,"f").info("pointerUp",{evt:i}),null!=this.activePointerId&&this.activePointerId===i.pointerId&&(this.activePointerId=void 0,i.stopPropagation(),this.onPointerUp)){const s=this.extractPoint(i);this.onPointerUp(i,s)}},__classPrivateFieldGet(this,xe,"f").info("constructor",{configuration:i}),this.configuration=i}roundFloat(i,s){if(s>=0){const n=Math.pow(10,s);return Math.round(i/n)*n}return __classPrivateFieldGet(this,xe,"f").debug("roundFloat",{oneFloat:i,requestedFloatPrecision:s}),i}extractPoint(i){let s,n;({clientX:s,clientY:n}="changedTouches"in i?i.changedTouches[0]:i);const a=this.domElement.getBoundingClientRect(),l={x:this.roundFloat(s-a.left-this.domElement.clientLeft,this.configuration.xyFloatPrecision),y:this.roundFloat(n-a.top-this.domElement.clientTop,this.configuration.xyFloatPrecision),t:this.roundFloat(Date.now(),this.configuration.timestampFloatPrecision),p:i.pressure||1};return __classPrivateFieldGet(this,xe,"f").debug("extractPoint",{event:i,pointer:l}),l}attach(i){__classPrivateFieldGet(this,xe,"f").info("attach",{domElement:i}),this.domElement&&this.detach(),this.domElement=i,this.domElement.addEventListener("pointerdown",this.pointerDownHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointermove",this.pointerMoveHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointerup",this.pointerUpHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointerleave",this.pointerUpHandler,this.configuration.listenerOptions),this.domElement.addEventListener("pointercancel",this.pointerUpHandler,this.configuration.listenerOptions),this.domElement.addEventListener("touchmove",this.prevent),document.documentElement.addEventListener("pointerdown",(()=>{}))}detach(){var i,s,n,a,l,d;__classPrivateFieldGet(this,xe,"f").info("detach"),null===(i=this.domElement)||void 0===i||i.removeEventListener("pointerdown",this.pointerDownHandler,this.configuration.listenerOptions),null===(s=this.domElement)||void 0===s||s.removeEventListener("pointermove",this.pointerMoveHandler,this.configuration.listenerOptions),null===(n=this.domElement)||void 0===n||n.removeEventListener("pointerup",this.pointerUpHandler,this.configuration.listenerOptions),null===(a=this.domElement)||void 0===a||a.removeEventListener("pointerleave",this.pointerUpHandler,this.configuration.listenerOptions),null===(l=this.domElement)||void 0===l||l.removeEventListener("pointercancel",this.pointerUpHandler,this.configuration.listenerOptions),null===(d=this.domElement)||void 0===d||d.removeEventListener("touchmove",this.prevent),document.documentElement.removeEventListener("pointerdown",(()=>{}))}}xe=new WeakMap;const Ce={table:"table",shape:"shape",recognizedShape:"recognizedShape",ellipse:"ellipse",line:"line"};function phi(i){let s=(i+Math.PI)%(2*Math.PI)-Math.PI;return s<-Math.PI&&(s+=2*Math.PI),s}function drawArrowHead(i,s,n,a){const l=phi(n+Math.PI*(7/8)),d=phi(n-Math.PI*(7/8));i.save();try{i.fillStyle=i.strokeStyle,i.moveTo(s.x,s.y),i.beginPath(),i.lineTo(s.x+a*Math.cos(l),s.y+a*Math.sin(l)),i.lineTo(s.x+a*Math.cos(d),s.y+a*Math.sin(d)),i.lineTo(s.x,s.y),i.fill()}finally{i.restore()}}function drawShapeEllipse(i,s){const n=function drawEllipseArc(i,s){const{centerPoint:n,maxRadius:a,minRadius:l,orientation:d,startAngle:c,sweepAngle:h}=s;let v=Math.cos(d),u=Math.sin(d),p=v,_=u;v*=a,p*=l,u*=a,_*=l;const g=Math.floor(Math.abs(h)/.02),f=[];i.save();try{i.beginPath();for(let s=0;s<=g;s++){const d=c+s/g*h,m=Math.atan2(Math.sin(d)/l,Math.cos(d)/a),P=Math.cos(m),y=Math.sin(m),S=n.x+v*P-_*y,w=n.y+p*y+u*P;0===s?i.moveTo(S,w):i.lineTo(S,w),0!==s&&s!==g||f.push({x:S,y:w})}i.stroke()}finally{i.restore()}return f}(i,s);"ARROW_HEAD"===(null==s?void 0:s.beginDecoration)&&drawArrowHead(i,n[0],s.beginTangentAngle,12),"ARROW_HEAD"===(null==s?void 0:s.endDecoration)&&drawArrowHead(i,n[1],s.endTangentAngle,12)}function drawLine(i,s,n){i.save();try{i.beginPath(),i.moveTo(s.x,s.y),i.lineTo(n.x,n.y),i.stroke()}finally{i.restore()}}function drawShapeSymbol(i,s){i.save();try{if(i.lineWidth=s.style.width,i.strokeStyle=s.style.color,s.elementType)switch(s.elementType){case Ce.shape:{const n=s;drawShapeSymbol(i,n.candidates[n.selectedCandidateIndex]);break}case Ce.table:s.lines.forEach((s=>drawShapeSymbol(i,s)));break;case Ce.line:{const n=s;drawLine(i,n.data.p1,n.data.p2);break}}else switch(s.type){case Ce.ellipse:drawShapeEllipse(i,s);break;case Ce.line:!function drawShapeLine(i,s){drawLine(i,s.firstPoint,s.lastPoint),"ARROW_HEAD"===s.beginDecoration&&drawArrowHead(i,s.firstPoint,s.beginTangentAngle,12),"ARROW_HEAD"===s.endDecoration&&drawArrowHead(i,s.lastPoint,s.endTangentAngle,12)}(i,s);break;case Ce.recognizedShape:s.primitives.forEach((s=>drawShapeSymbol(i,s)));break}}finally{i.restore()}}var ke=Object.freeze({__proto__:null,ShapeSymbols:Ce,drawLine:drawLine,drawShapeSymbol:drawShapeSymbol});function drawStroke(i,s,n){n&&s&&"eraser"!==s.pointerType&&n.drawStroke(i,s)}var Me=Object.freeze({__proto__:null,drawStroke:drawStroke});const Te={inputCharacter:"inputCharacter",char:"char",string:"string",textLine:"textLine"};function drawTextLine(i,s){!function drawText(i,s,n){i.save();try{i.font=`${n.textHeight}px serif`,i.textAlign="CENTER"===n.justificationType?"center":"left",i.textBaseline="bottom",i.fillStyle=i.strokeStyle,i.fillText(s,n.topLeftPoint.x,n.topLeftPoint.y+n.height)}finally{i.restore()}}(i,s.label,s.data),s.underlineList.forEach((n=>{!function drawUnderline(i,s,n,a){const l=a.width/n.length;drawLine(i,{x:a.topLeftPoint.x+s.data.firstCharacter*l,y:a.topLeftPoint.y+a.height},{x:a.topLeftPoint.x+s.data.lastCharacter*l,y:a.topLeftPoint.y+a.height})}(i,n,s.label,s.data)}))}function drawTextSymbol(i,s){i.save();try{i.lineWidth=s.style.width,i.strokeStyle=s.style.color;if((s.elementType||s.type)===Te.textLine)drawTextLine(i,s);else console.info(`drawTextSymbol => ${s.elementType} not implemented`)}finally{i.restore()}}var Le=Object.freeze({__proto__:null,TextSymbols:Te,drawTextSymbol:drawTextSymbol});function computeLinksPoints(i,s,n){const a=i.p*n;return[{x:i.x-Math.sin(s)*a,y:i.y+Math.cos(s)*a},{x:i.x+Math.sin(s)*a,y:i.y-Math.cos(s)*a}]}function computeMiddlePoint(i,s){return{x:(s.x+i.x)/2,y:(s.y+i.y)/2,p:(s.p+i.p)/2,t:(s.t+i.t)/2}}function computeAxeAngle(i,s){return Math.atan2(s.y-i.y,s.x-i.x)}var Ie,De=Object.freeze({__proto__:null,computeLinksPoints:computeLinksPoints,computeMiddlePoint:computeMiddlePoint,computeAxeAngle:computeAxeAngle});class CanvasStroker{renderArc(i,s,n){i.arc(s.x,s.y,n,0,2*Math.PI,!0)}renderLine(i,s,n,a){const l=computeLinksPoints(s,computeAxeAngle(s,n),a),d=computeLinksPoints(n,computeAxeAngle(s,n),a);i.moveTo(l[0].x,l[0].y),i.lineTo(d[0].x,d[0].y),i.lineTo(d[1].x,d[1].y),i.lineTo(l[1].x,l[1].y)}renderFinal(i,s,n,a){const l=computeAxeAngle(s,n),d=computeLinksPoints(n,l,a);i.moveTo(d[0].x,d[0].y);for(let s=1;s<=6;s++){const d=l-s*Math.PI/6;i.lineTo(n.x-n.p*a*Math.sin(d),n.y+n.p*a*Math.cos(d))}}renderQuadratic(i,s,n,a,l){const d=computeLinksPoints(s,computeAxeAngle(s,a),l),c=computeLinksPoints(n,computeAxeAngle(a,n),l),h=computeLinksPoints(a,computeAxeAngle(s,n),l);i.moveTo(d[0].x,d[0].y),i.quadraticCurveTo(h[0].x,h[0].y,c[0].x,c[0].y),i.lineTo(c[1].x,c[1].y),i.quadraticCurveTo(h[1].x,h[1].y,d[1].x,d[1].y)}drawStroke(i,s){const n=s.pointers.length,a=n-2,l=s.style.width>0?s.style.width:i.lineWidth,d=s.style.color?s.style.color:i.strokeStyle,c=s.pointers[0];i.save();try{if(i.beginPath(),n<3)this.renderArc(i,c,.6*l);else{this.renderArc(i,c,l*c.p);const d=computeMiddlePoint(c,s.pointers[1]);this.renderLine(i,c,d,l);for(let n=0;n{var n;const a=s.parentNode,l=Math.max(this.config.minWidth,a.clientWidth),d=Math.max(this.config.minHeight,a.clientHeight);s.width=l*i,s.height=d*i,null===(n=s.getContext("2d"))||void 0===n||n.scale(i,i),s.style.width=`${l}px`,s.style.height=`${d}px`}))}drawSymbol(i,s){const n=s.elementType||s.type;"stroke"===n?drawStroke(i,s,this.stroker):Object.keys(Te).includes(n)?drawTextSymbol(i,s):Object.keys(Ce).includes(n)&&drawShapeSymbol(i,s)}init(i){__classPrivateFieldGet(this,Ie,"f").info("init",{element:i});const s=this.createCanvas("ms-rendering-canvas");i.appendChild(s);const n=this.createCanvas("ms-capture-canvas");i.appendChild(n),this.context={parent:i,renderingCanvas:s,renderingCanvasContext:s.getContext("2d"),capturingCanvas:n,capturingCanvasContext:n.getContext("2d")},this.resizeContent()}drawModel(i){var s;__classPrivateFieldGet(this,Ie,"f").info("drawModel",{model:i}),null===(s=this.context.renderingCanvasContext)||void 0===s||s.clearRect(0,0,this.context.renderingCanvas.width,this.context.renderingCanvas.height),i.rawStrokes.forEach((i=>this.drawSymbol(this.context.renderingCanvasContext,i))),this.context.capturingCanvasContext.clearRect(0,0,this.context.capturingCanvas.width,this.context.capturingCanvas.height)}drawPendingStroke(i){__classPrivateFieldGet(this,Ie,"f").info("drawPendingStroke",{stroke:i}),this.context.capturingCanvasContext.clearRect(0,0,this.context.capturingCanvas.width,this.context.capturingCanvas.height),i&&"eraser"!==(null==i?void 0:i.pointerType)&&this.stroker.drawStroke(this.context.capturingCanvasContext,i)}resize(i){__classPrivateFieldGet(this,Ie,"f").info("resize",{model:i}),this.resizeContent(),this.drawModel(i)}destroy(){__classPrivateFieldGet(this,Ie,"f").info("destroy"),this.context.parent&&(this.context.parent.innerHTML="")}}Ie=new WeakMap;"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function createCommonjsModule(i,s){return i(s={exports:{}},s.exports),s.exports}var Ae=createCommonjsModule((function(i,s){i.exports=function(i){function e(n){if(s[n])return s[n].exports;var a=s[n]={i:n,l:!1,exports:{}};return i[n].call(a.exports,a,a.exports,e),a.l=!0,a.exports}var s={};return e.m=i,e.c=s,e.i=function(i){return i},e.d=function(i,s,n){e.o(i,s)||Object.defineProperty(i,s,{configurable:!1,enumerable:!0,get:n})},e.n=function(i){var s=i&&i.__esModule?function(){return i.default}:function(){return i};return e.d(s,"a",s),s},e.o=function(i,s){return Object.prototype.hasOwnProperty.call(i,s)},e.p="",e(e.s=1)}([function(i,s,n){function o(i,s){if(!(i instanceof s))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(s,"__esModule",{value:!0});var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(i){return typeof i}:function(i){return i&&"function"==typeof Symbol&&i.constructor===Symbol&&i!==Symbol.prototype?"symbol":typeof i},l=function t(i){var s=this;o(this,t),this.toJSON=function(i){if("string"!=typeof i)return console.error("Need a CSS string but given ",void 0===i?"undefined":a(i),i),"Not a valid CSS..!";var n={},l=void 0,d=void 0,c=void 0;try{i.split("{").forEach((function(i){if(d=i.trim())if(-1===d.indexOf("}"))n[d]={},l=d;else{d.substring(0,d.indexOf("}")).split(";").forEach((function(i){(c=i.split(":"))&&2===c.length&&(n[l][c[0].trim().replace(/^\"|\"$/g,"")]=s._trimSemiColon(c[1].trim().replace(/^\"|\"$/g,"")))}));try{(l=d.split("}")[1].trim())&&(n[l]={})}catch(i){}}}))}catch(i){return"Not a valid CSS..!"}return n},this.toCSS=function(i){if("object"!==(void 0===i?"undefined":a(i)))return console.error("Need a JSON object but given ",void 0===i?"undefined":a(i),i),"Not a valid JSON..!";var s="";try{for(var n in i)if(i.hasOwnProperty(n)){for(var l in s+=n+" {\n",i[n])i[n].hasOwnProperty(l)&&(s+=l+": "+i[n][l]+";\n");s+="}\n"}}catch(i){return"Not a valid JSON..!"}return s},this._trimSemiColon=function(i){return";"===i.slice(-1)?i.slice(0,s.length-1):i}};s.default=l},function(i,s,n){i.exports=n(0).default}])})),Re=function unwrapExports(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}(Ae);Ae.JsonCSS;const Ne=new Re,Oe={themeToCSS:i=>Ne.toCSS(i),themeToJSON(i){const s=Ne.toJSON(i);return s[".text"]["font-size"]=Number(s[".text"]["font-size"]),s.ink["-myscript-pen-width"]=Number(s.ink["-myscript-pen-width"]),s.ink.width=Number(s.ink.width),s},penStyleToCSS(i){let s=Ne.toCSS({css:i});return s=s.substring(6,s.length-3),s},penStyleToJSON(i){const s=Ne.toJSON(`css {${i}}`).css;return s.width?s.width=Number(s.width):delete s.width,s["-myscript-pen-width"]?s["-myscript-pen-width"]=Number(s["-myscript-pen-width"]):delete s["-myscript-pen-width"],s},stringToJSON:i=>Ne.toJSON(`css {${i}}`).css,JSONToString:i=>Object.entries(i).map((([i,s])=>`${i}:${s}`)).join(";")};var We=createCommonjsModule((function(i,s){var n;i.exports=(n=n||function(i,s){var n=Object.create||function(){function F(){}return function(i){var s;return F.prototype=i,s=new F,F.prototype=null,s}}(),a={},l=a.lib={},d=l.Base={extend:function(i){var s=n(this);return i&&s.mixIn(i),s.hasOwnProperty("init")&&this.init!==s.init||(s.init=function(){s.$super.init.apply(this,arguments)}),s.init.prototype=s,s.$super=this,s},create:function(){var i=this.extend();return i.init.apply(i,arguments),i},init:function(){},mixIn:function(i){for(var s in i)i.hasOwnProperty(s)&&(this[s]=i[s]);i.hasOwnProperty("toString")&&(this.toString=i.toString)},clone:function(){return this.init.prototype.extend(this)}},c=l.WordArray=d.extend({init:function(i,n){i=this.words=i||[],this.sigBytes=n!=s?n:4*i.length},toString:function(i){return(i||v).stringify(this)},concat:function(i){var s=this.words,n=i.words,a=this.sigBytes,l=i.sigBytes;if(this.clamp(),a%4)for(var d=0;d>>2]>>>24-d%4*8&255;s[a+d>>>2]|=c<<24-(a+d)%4*8}else for(d=0;d>>2]=n[d>>>2];return this.sigBytes+=l,this},clamp:function(){var s=this.words,n=this.sigBytes;s[n>>>2]&=4294967295<<32-n%4*8,s.length=i.ceil(n/4)},clone:function(){var i=d.clone.call(this);return i.words=this.words.slice(0),i},random:function(s){for(var n,a=[],r=function(s){var n=987654321,a=4294967295;return function(){var l=((n=36969*(65535&n)+(n>>16)&a)<<16)+(s=18e3*(65535&s)+(s>>16)&a)&a;return l/=4294967296,(l+=.5)*(i.random()>.5?1:-1)}},l=0;l>>2]>>>24-l%4*8&255;a.push((d>>>4).toString(16)),a.push((15&d).toString(16))}return a.join("")},parse:function(i){for(var s=i.length,n=[],a=0;a>>3]|=parseInt(i.substr(a,2),16)<<24-a%8*4;return new c.init(n,s/2)}},u=h.Latin1={stringify:function(i){for(var s=i.words,n=i.sigBytes,a=[],l=0;l>>2]>>>24-l%4*8&255;a.push(String.fromCharCode(d))}return a.join("")},parse:function(i){for(var s=i.length,n=[],a=0;a>>2]|=(255&i.charCodeAt(a))<<24-a%4*8;return new c.init(n,s)}},p=h.Utf8={stringify:function(i){try{return decodeURIComponent(escape(u.stringify(i)))}catch(i){throw new Error("Malformed UTF-8 data")}},parse:function(i){return u.parse(unescape(encodeURIComponent(i)))}},_=l.BufferedBlockAlgorithm=d.extend({reset:function(){this._data=new c.init,this._nDataBytes=0},_append:function(i){"string"==typeof i&&(i=p.parse(i)),this._data.concat(i),this._nDataBytes+=i.sigBytes},_process:function(s){var n=this._data,a=n.words,l=n.sigBytes,d=this.blockSize,h=l/(4*d),v=(h=s?i.ceil(h):i.max((0|h)-this._minBufferSize,0))*d,u=i.min(4*v,l);if(v){for(var p=0;p>>1|ie<<31)^(te>>>8|ie<<24)^te>>>7,ne=(ie>>>1|te<<31)^(ie>>>8|te<<24)^(ie>>>7|te<<25),re=v[Y-2],oe=re.high,ae=re.low,le=(oe>>>19|ae<<13)^(oe<<3|ae>>>29)^oe>>>6,de=(ae>>>19|oe<<13)^(ae<<3|oe>>>29)^(ae>>>6|oe<<26),ce=v[Y-7],he=ce.high,ve=ce.low,ue=v[Y-16],pe=ue.high,_e=ue.low;K=(K=(K=se+he+((Q=ne+ve)>>>0>>0?1:0))+le+((Q+=de)>>>0>>0?1:0))+pe+((Q+=_e)>>>0<_e>>>0?1:0),Z.high=K,Z.low=Q}var ge,fe=H&X^~H&$,me=B&U^~B&V,Pe=D&R^D&O^R&O,ye=A&N^A&W^N&W,Se=(D>>>28|A<<4)^(D<<30|A>>>2)^(D<<25|A>>>7),we=(A>>>28|D<<4)^(A<<30|D>>>2)^(A<<25|D>>>7),Fe=(H>>>14|B<<18)^(H>>>18|B<<14)^(H<<23|B>>>9),Ge=(B>>>14|H<<18)^(B>>>18|H<<14)^(B<<23|H>>>9),be=h[Y],xe=be.high,Ee=be.low,Ce=J+Fe+((ge=q+Ge)>>>0>>0?1:0),ke=we+ye;J=$,q=V,$=X,V=U,X=H,U=B,H=z+(Ce=(Ce=(Ce=Ce+fe+((ge+=me)>>>0>>0?1:0))+xe+((ge+=Ee)>>>0>>0?1:0))+K+((ge+=Q)>>>0>>0?1:0))+((B=j+ge|0)>>>0>>0?1:0)|0,z=O,j=W,O=R,W=N,R=D,N=A,D=Ce+(Se+Pe+(ke>>>0>>0?1:0))+((A=ge+ke|0)>>>0>>0?1:0)|0}m=a.low=m+A,a.high=f+D+(m>>>0>>0?1:0),y=l.low=y+N,l.high=P+R+(y>>>0>>0?1:0),w=d.low=w+W,d.high=S+O+(w>>>0>>0?1:0),b=c.low=b+j,c.high=G+z+(b>>>0>>0?1:0),E=u.low=E+B,u.high=x+H+(E>>>0>>0?1:0),k=p.low=k+U,p.high=C+X+(k>>>0>>0?1:0),T=_.low=T+V,_.high=M+$+(T>>>0>>0?1:0),I=g.low=I+q,g.high=L+J+(I>>>0>>0?1:0)},_doFinalize:function(){var i=this._data,s=i.words,n=8*this._nDataBytes,a=8*i.sigBytes;return s[a>>>5]|=128<<24-a%32,s[30+(a+128>>>10<<5)]=Math.floor(n/4294967296),s[31+(a+128>>>10<<5)]=n,i.sigBytes=4*s.length,this._process(),this._hash.toX32()},clone:function(){var i=s.clone.call(this);return i._hash=this._hash.clone(),i},blockSize:32});i.SHA512=s._createHelper(u),i.HmacSHA512=s._createHmacHelper(u)}(),n.SHA512)})),createCommonjsModule((function(i,s){var n,a,l;i.exports=(a=(n=We).lib.Base,l=n.enc.Utf8,void(n.algo.HMAC=a.extend({init:function(i,s){i=this._hasher=new i.init,"string"==typeof s&&(s=l.parse(s));var n=i.blockSize,a=4*n;s.sigBytes>a&&(s=i.finalize(s)),s.clamp();for(var d=this._oKey=s.clone(),c=this._iKey=s.clone(),h=d.words,v=c.words,u=0;u{const n=i.split("."),a=s.split(".");for(let i=0;il)return!1;if(s{s.p.push(i.p),s.t.push(i.t),s.x.push(i.x),s.y.push(i.y)})),s}Be=new WeakMap;class RestRecognizer{constructor(i,s){Xe.set(this,LoggerManager.getLogger("RECOGNIZER")),__classPrivateFieldGet(this,Xe,"f").info("constructor",{serverConfig:i,recognitionConfig:s}),this.serverConfiguration=i,this.recognitionConfiguration=s}get url(){return`${this.serverConfiguration.scheme}://${this.serverConfiguration.host}/api/v4.0/iink/batch`}get postConfig(){switch(this.recognitionConfiguration.type){case"DIAGRAM":return{lang:this.recognitionConfiguration.lang,diagram:this.recognitionConfiguration.diagram,export:this.recognitionConfiguration.export};case"MATH":return{lang:this.recognitionConfiguration.lang,math:this.recognitionConfiguration.math,export:this.recognitionConfiguration.export};case"Raw Content":return{lang:this.recognitionConfiguration.lang,"raw-content":this.recognitionConfiguration["raw-content"],export:this.recognitionConfiguration.export};case"TEXT":return{lang:this.recognitionConfiguration.lang,text:this.recognitionConfiguration.text,export:this.recognitionConfiguration.export};default:throw new Error(`get postConfig error Recognition type unkow "${this.recognitionConfiguration.type}"`)}}buildData(i){__classPrivateFieldGet(this,Xe,"f").info("buildData",{model:i});const s=[];i.rawStrokes.forEach((i=>{const n=s.findIndex((s=>{return n=s.penStyle,a=i.style,n&&a&&n["-myscript-pen-fill-color"]===a["-myscript-pen-fill-color"]&&n["-myscript-pen-fill-style"]===a["-myscript-pen-fill-style"]&&n["-myscript-pen-width"]===a["-myscript-pen-width"]&&n.color===a.color&&n.width===a.width;var n,a}));n>-1?s[n].strokes.push(i):s.push({penStyle:i.style,strokes:[i]})}));const n=[];s.forEach((i=>{const s={penStyle:"{}"===JSON.stringify(i.penStyle)?void 0:Oe.penStyleToCSS(i.penStyle),strokes:i.strokes.map(convertStrokeToJSON)};n.push(s)}));const a="Raw Content"===this.recognitionConfiguration.type?"Raw Content":this.recognitionConfiguration.type.charAt(0).toUpperCase()+this.recognitionConfiguration.type.slice(1).toLowerCase(),l={configuration:this.postConfig,xDPI:96,yDPI:96,contentType:a,height:i.height,width:i.width,strokeGroups:n};return __classPrivateFieldGet(this,Xe,"f").debug("buildData",{data:l}),l}post(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Xe,"f").info("post",{data:i,mimeType:s});const n=new Headers;n.append("Accept","application/json,"+s),n.append("applicationKey",this.serverConfiguration.applicationKey),n.append("hmac",computeHmac(JSON.stringify(i),this.serverConfiguration.applicationKey,this.serverConfiguration.hmacKey)),n.append("Content-Type","application/json"),isVersionSuperiorOrEqual(this.serverConfiguration.version,"2.0.4")&&(n.append("myscript-client-name","iink-ts"),n.append("myscript-client-version","1.0.0-buildVersion"));const a={method:"POST",headers:n,body:JSON.stringify(i)},l=new Request(this.url,a),d=yield fetch(l);if(d.ok){const i=d.headers.get("content-type");let s;switch(i){case"application/vnd.openxmlformats-officedocument.presentationml.presentation":case"image/png":case"image/jpeg":s=yield d.blob();break;case"application/json":s=yield d.json();break;case"application/vnd.myscript.jiix":s=yield d.clone().json().catch((()=>__awaiter(this,void 0,void 0,(function*(){return yield d.text()}))));break;default:__classPrivateFieldGet(this,Xe,"f").warn("post default",{contentType:i}),s=yield d.text()}return __classPrivateFieldGet(this,Xe,"f").debug("post",{result:s}),s}{const i=yield d.json();throw __classPrivateFieldGet(this,Xe,"f").error("post",{err:i}),i}}))}tryFetch(i,s){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,Xe,"f").debug("tryFetch",{data:i,mimeType:s}),this.post(i,s).then((i=>{const n={};return n[s]=i,__classPrivateFieldGet(this,Xe,"f").debug("tryFetch",{exports:n}),n})).catch((n=>{__classPrivateFieldGet(this,Xe,"f").error("tryFetch",{data:i,mimeType:s,err:n});let a=n.message||S.UNKNOW;n.code?"access.not.granted"===n.code&&(a=S.WRONG_CREDENTIALS):a=S.CANT_ESTABLISH;throw new Error(a)}))}))}getMimeTypes(i){__classPrivateFieldGet(this,Xe,"f").info("getMimeTypes",{requestedMimeTypes:i});let s=i||[];if(!s.length)switch(this.recognitionConfiguration.type){case"DIAGRAM":s=this.recognitionConfiguration.diagram.mimeTypes;break;case"MATH":s=this.recognitionConfiguration.math.mimeTypes;break;case"Raw Content":s=["application/vnd.myscript.jiix"];break;case"TEXT":s=this.recognitionConfiguration.text.mimeTypes;break;default:throw new Error(`Recognition type "${this.recognitionConfiguration.type}" is unknown.\n Possible types are:\n -DIAGRAM\n -MATH\n -Raw Content\n -TEXT`)}return s}convert(i,s,n){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Xe,"f").info("convert",{model:i,conversionState:s,requestedMimeTypes:n});const a=i.getClone(),l=this.getMimeTypes(n),d=this.buildData(a);d.conversionState=s;const c=l.map((i=>this.tryFetch(d,i)));return(yield Promise.all(c)).forEach((i=>{a.mergeConvert(i)})),__classPrivateFieldGet(this,Xe,"f").debug("convert",{model:a}),a}))}export(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Xe,"f").info("export",{model:i,requestedMimeTypes:s});const n=i.getClone();if(0===n.rawStrokes.length)return Promise.resolve(n);const a=this.getMimeTypes(s);if(!a.length)return __classPrivateFieldGet(this,Xe,"f").error("export",{model:i,requestedMimeTypes:s,"Export failed, no mimeTypes define in recognition configuration":String}),Promise.reject(new Error("Export failed, no mimeTypes define in recognition configuration"));const l=a.filter((i=>!n.exports||!n.exports[i])),d=this.buildData(i);return(yield Promise.all(l.map((i=>this.tryFetch(d,i))))).forEach((i=>{n.mergeExport(i)})),__classPrivateFieldGet(this,Xe,"f").debug("export",{model:n}),n}))}resize(i){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,Xe,"f").info("resize",{model:i}),this.export(i)}))}}Xe=new WeakMap;class UndoRedoContext{constructor(i){this.stackIndex=0,this.possibleUndoCount=0,this.canRedo=!1,this.canUndo=!1,this.empty=!0,this.stack=[i.getClone()]}}class UndoRedoManager{constructor(i,s){Ue.set(this,LoggerManager.getLogger("UNDOREDO_MANAGER")),__classPrivateFieldGet(this,Ue,"f").info("constructor",{configuration:i,model:s}),this.configuration=i,this.context=new UndoRedoContext(s)}get internalEvent(){return InternalEvent.getInstance()}updateCanUndoRedo(){this.context.canRedo=this.context.stack.length-1>this.context.stackIndex,this.context.canUndo=this.context.stackIndex>0;const i=this.context.stack[this.context.stackIndex];this.context.empty=0===i.rawStrokes.length}addModelToStack(i){__classPrivateFieldGet(this,Ue,"f").info("addModelToStack",{model:i}),this.context.stackIndex+1this.configuration.maxStackSize&&(this.context.stack.shift(),this.context.stackIndex--),this.updateCanUndoRedo(),this.internalEvent.emitContextChange(this.context)}removeLastModelInStack(){__classPrivateFieldGet(this,Ue,"f").info("removeLastModelInStack"),this.context.stackIndex===this.context.stack.length-1&&this.context.stackIndex--,this.context.stack.pop(),this.updateCanUndoRedo()}updateModelInStack(i){__classPrivateFieldGet(this,Ue,"f").info("updateModelInStack",{model:i});const s=this.context.stack.findIndex((s=>s.modificationDate===i.modificationDate));s>-1&&this.context.stack.splice(s,1,i.getClone()),this.internalEvent.emitContextChange(this.context)}undo(){__classPrivateFieldGet(this,Ue,"f").info("undo"),this.context.canUndo&&(this.context.stackIndex--,this.updateCanUndoRedo(),this.internalEvent.emitContextChange(this.context));const i=this.context.stack[this.context.stackIndex].getClone();return __classPrivateFieldGet(this,Ue,"f").debug("undo",i),i}redo(){__classPrivateFieldGet(this,Ue,"f").info("redo"),this.context.canRedo&&(this.context.stackIndex++,this.updateCanUndoRedo(),this.internalEvent.emitContextChange(this.context));const i=this.context.stack[this.context.stackIndex].getClone();return __classPrivateFieldGet(this,Ue,"f").debug("redo",i),i}reset(i){__classPrivateFieldGet(this,Ue,"f").info("reset",{model:i}),this.context=new UndoRedoContext(i),this.internalEvent.emitContextChange(this.context)}}Ue=new WeakMap;const Ve={},Je={ink:{color:"#000000",width:1,"-myscript-pen-width":1,"-myscript-pen-fill-style":"none","-myscript-pen-fill-color":"#FFFFFF00"},".math":{"font-family":"STIXGeneral"},".math-solved":{"font-family":"STIXGeneral",color:"#A8A8A8FF"},".text":{"font-family":"MyScriptInter","font-size":10}};var qe,Ye,Ze,Ke,Qe;class StyleManager{constructor(i,s){qe.set(this,void 0),Ye.set(this,void 0),Ze.set(this,void 0),Ke.set(this,void 0),Qe.set(this,LoggerManager.getLogger("STYLEMANAGER")),__classPrivateFieldGet(this,Qe,"f").info("constructor",{penStyle:i,theme:s}),this.setTheme(s),this.setPenStyleClasses(),this.setPenStyle(i)}get currentPenStyle(){return __classPrivateFieldGet(this,Ke,"f")||__classPrivateFieldGet(this,qe,"f")}get penStyle(){return __classPrivateFieldGet(this,qe,"f")}setPenStyle(i){__classPrivateFieldGet(this,Qe,"f").info("setPenStyle",{style:i}),__classPrivateFieldSet(this,qe,mergeDeep(structuredClone(Ve),i||{}),"f"),__classPrivateFieldSet(this,Ke,i||this.theme[`.${__classPrivateFieldGet(this,Ze,"f")}`],"f"),__classPrivateFieldGet(this,Qe,"f").debug("setPenStyle",__classPrivateFieldGet(this,Ke,"f"))}get theme(){return __classPrivateFieldGet(this,Ye,"f")}setTheme(i){__classPrivateFieldGet(this,Qe,"f").info("setTheme",{theme:i}),__classPrivateFieldSet(this,Ye,mergeDeep(structuredClone(Je),i||{}),"f"),__classPrivateFieldGet(this,Qe,"f").debug("setTheme",__classPrivateFieldGet(this,Ye,"f"))}get penStyleClasses(){return __classPrivateFieldGet(this,Ze,"f")}setPenStyleClasses(i=""){__classPrivateFieldGet(this,Qe,"f").info("setPenStyleClasses",{penStyleClass:i}),__classPrivateFieldSet(this,Ze,i,"f"),__classPrivateFieldSet(this,Ke,this.theme[`.${__classPrivateFieldGet(this,Ze,"f")}`],"f"),__classPrivateFieldGet(this,Qe,"f").debug("setPenStyleClasses",__classPrivateFieldGet(this,Ke,"f"))}}function computeDistance(i,s){const n=Math.hypot(s.y-i.y,s.x-i.x);return isNaN(n)?0:n}qe=new WeakMap,Ye=new WeakMap,Ze=new WeakMap,Ke=new WeakMap,Qe=new WeakMap;var et,tt,it,st,nt,rt,ot,at,lt,dt,ct,ht,vt,ut,pt,_t,gt,ft,mt,Pt,yt=Object.freeze({__proto__:null,computeDistance:computeDistance});class Model{constructor(i=100,s=100,n=Date.now()){et.add(this),tt.set(this,LoggerManager.getLogger("MODEL")),__classPrivateFieldGet(this,tt,"f").info("constructor",{width:i,height:s,creationDate:n}),this.creationTime=n,this.modificationDate=n,this.width=i,this.height=s,this.rawStrokes=[],this.selectedStrokes=[],this.positions={lastSentPosition:0,lastReceivedPosition:0},this.idle=!0}mergeExport(i){__classPrivateFieldGet(this,tt,"f").info("mergeExport",{exports:i}),this.exports?Object.assign(this.exports,i):this.exports=i,__classPrivateFieldGet(this,tt,"f").debug("mergeExport",this.exports)}mergeConvert(i){__classPrivateFieldGet(this,tt,"f").info("mergeConvert",{converts:i}),this.converts?Object.assign(this.converts,i):this.converts=i,__classPrivateFieldGet(this,tt,"f").debug("mergeConvert",this.converts)}computePressure(i,s){let n=1;0===s?n=.5:i===s?n=1:i<10?n=.2+Math.pow(.1*i,.4):i>s-10&&(n=.2+Math.pow(.1*(s-i),.4));const a=n*Math.max(.1,1-.1*Math.sqrt(i));return isNaN(a)?.5:Math.round(100*a)/100}filterPointByAcquisitionDelta(i,s,n){const a=2+(i.style["-myscript-pen-width"]||0)/4;return!n||0===i.pointers.length||Math.abs(n.x-s.x)>=a||Math.abs(n.y-s.y)>=a}addPoint(i,s){__classPrivateFieldGet(this,tt,"f").debug("addPoint",{stroke:i,pointer:s});const n=i.pointers.at(-1)||{p:1,t:0,x:0,y:0};if(this.filterPointByAcquisitionDelta(i,s,n)){const a=computeDistance(s,n);i.length+=a,s.p=this.computePressure(a,i.length),i.pointers.push(s)}}addStroke(i){__classPrivateFieldGet(this,tt,"f").info("addStroke",{stroke:i}),this.rawStrokes.push(i)}extractUnsentStrokes(){return this.rawStrokes.slice(this.positions.lastSentPosition)}initCurrentStroke(i,s,n,a,l=96){if(__classPrivateFieldGet(this,tt,"f").info("initCurrentStroke",{point:i,pointerId:s,pointerType:n,style:a,dpi:l}),a["-myscript-pen-width"]){const i=a["-myscript-pen-width"]*l/25.4;a.width=i/2}this.modificationDate=Date.now(),this.exports=void 0,this.converts=void 0,this.currentStroke=new Stroke(a,s,n),__classPrivateFieldGet(this,tt,"f").debug("initCurrentStroke",this.currentStroke),this.addPoint(this.currentStroke,i)}appendToCurrentStroke(i){__classPrivateFieldGet(this,tt,"f").info("appendToCurrentStroke",{point:i}),this.currentStroke&&this.addPoint(this.currentStroke,i),__classPrivateFieldGet(this,tt,"f").debug("appendToCurrentStroke",this.currentStroke)}endCurrentStroke(i){__classPrivateFieldGet(this,tt,"f").info("endCurrentStroke",{point:i}),this.currentStroke&&(this.addPoint(this.currentStroke,i),this.addStroke(this.currentStroke),this.currentStroke=void 0),__classPrivateFieldGet(this,tt,"f").debug("endCurrentStroke",this.currentStroke)}resetSelectedStrokes(){this.selectedStrokes=[]}appendSelectedStrokesFromPoint(i){__classPrivateFieldGet(this,tt,"f").info("appendSelectedStrokesFromPoint",{point:i}),__classPrivateFieldGet(this,et,"m",it).call(this,i).forEach((i=>{this.selectedStrokes.includes(i)||this.selectedStrokes.push(i)}))}updateStroke(i){__classPrivateFieldGet(this,tt,"f").info("updateStroke",{updatedStroke:i});const s=this.rawStrokes.findIndex((s=>s.id===i.id));-1!==s&&this.rawStrokes.splice(s,1,i),__classPrivateFieldGet(this,tt,"f").debug("updateStroke",this.rawStrokes)}removeStroke(i){__classPrivateFieldGet(this,tt,"f").info("removeStroke",{id:i});const s=this.rawStrokes.findIndex((s=>s.id===i));-1!==s&&this.rawStrokes.splice(s,1),__classPrivateFieldGet(this,tt,"f").debug("removeStroke",this.rawStrokes)}removeStrokesFromPoint(i){__classPrivateFieldGet(this,tt,"f").info("removeStrokesFromPoint",{point:i});const s=__classPrivateFieldGet(this,et,"m",it).call(this,i);return s.forEach((i=>{this.removeStroke(i.id)})),__classPrivateFieldGet(this,tt,"f").debug("removeStrokesFromPoint",s.map((i=>i.id))),s.map((i=>i.id))}updatePositionSent(i=this.rawStrokes.length){__classPrivateFieldGet(this,tt,"f").info("updatePositionSent",{position:i}),this.positions.lastSentPosition=i,__classPrivateFieldGet(this,tt,"f").debug("updatePositionSent",this.positions.lastSentPosition)}updatePositionReceived(){__classPrivateFieldGet(this,tt,"f").info("updatePositionReceived"),this.positions.lastReceivedPosition=this.positions.lastSentPosition,__classPrivateFieldGet(this,tt,"f").debug("updatePositionReceived",this.positions.lastReceivedPosition)}getClone(){__classPrivateFieldGet(this,tt,"f").info("getClone");const i=new Model(this.width,this.height,this.creationTime);return i.modificationDate=JSON.parse(JSON.stringify(this.modificationDate)),i.currentStroke=this.currentStroke?JSON.parse(JSON.stringify(this.currentStroke)):void 0,i.rawStrokes=JSON.parse(JSON.stringify(this.rawStrokes)),i.positions=JSON.parse(JSON.stringify(this.positions)),i.exports=this.exports?JSON.parse(JSON.stringify(this.exports)):void 0,i.converts=this.converts?JSON.parse(JSON.stringify(this.converts)):void 0,i.idle=this.idle,__classPrivateFieldGet(this,tt,"f").debug("getClone",{clonedModel:i}),i}clear(){__classPrivateFieldGet(this,tt,"f").info("clear"),this.modificationDate=Date.now(),this.currentStroke=void 0,this.rawStrokes=[],this.positions.lastSentPosition=0,this.positions.lastReceivedPosition=0,this.exports=void 0,this.converts=void 0,this.idle=!0}}tt=new WeakMap,et=new WeakSet,it=function _Model_getStrokeFromPoint(i){__classPrivateFieldGet(this,tt,"f").info("getStrokeFromPoint",{point:i});const isBetween=(i,s,n)=>i>=s&&i<=n,s=[];return this.rawStrokes.forEach((n=>{for(let a=0;a0&&(this.model.endCurrentStroke(s),this.updateModelRendering().then((i=>Object.assign(this.model,i))).catch((i=>this.internalEvent.emitError(i))));break;case"write":this.model.initCurrentStroke(s,i.pointerId,a,l),this.drawCurrentStroke();break;default:__classPrivateFieldGet(this,rt,"f").warn(`onPointerDown intention unknow: "${this.intention}"`)}}onPointerMove(i,s){switch(__classPrivateFieldGet(this,rt,"f").info("onPointerMove",{intention:this.intention,point:s}),this.intention){case"erase":this.model.removeStrokesFromPoint(s).length>0&&(this.model.endCurrentStroke(s),this.updateModelRendering().then((i=>Object.assign(__classPrivateFieldGet(this,nt,"f"),i))).catch((i=>this.internalEvent.emitError(i))));break;case"write":this.model.appendToCurrentStroke(s),this.drawCurrentStroke();break;default:__classPrivateFieldGet(this,rt,"f").warn(`onPointerMove intention unknow: "${this.intention}"`)}}onPointerUp(i,s){switch(__classPrivateFieldGet(this,rt,"f").info("onPointerUp",{intention:this.intention,point:s}),this.intention){case"erase":this.model.removeStrokesFromPoint(s).length>0&&(this.model.endCurrentStroke(s),this.updateModelRendering().then((i=>Object.assign(__classPrivateFieldGet(this,nt,"f"),i))).catch((i=>this.internalEvent.emitError(i))));break;case"write":this.model.endCurrentStroke(s),this.updateModelRendering().then((i=>Object.assign(__classPrivateFieldGet(this,nt,"f"),i))).catch((i=>this.internalEvent.emitError(i)));break;default:__classPrivateFieldGet(this,rt,"f").warn(`onPointerUp intention unknow: "${this.intention}"`)}}drawCurrentStroke(){__classPrivateFieldGet(this,rt,"f").debug("drawCurrentStroke",{stroke:this.model.currentStroke}),this.renderer.drawPendingStroke(this.model.currentStroke)}updateModelRendering(){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,rt,"f").info("updateModelRendering"),this.renderer.drawModel(this.model);const i=new DeferredPromise;if(this.undoRedoManager.addModelToStack(this.model),"DEMAND"!==__classPrivateFieldGet(this,st,"f").triggers.exportContent){clearTimeout(__classPrivateFieldGet(this,at,"f"));let s=this.model.getClone();__classPrivateFieldSet(this,at,setTimeout((()=>__awaiter(this,void 0,void 0,(function*(){try{s=yield this.recognizer.export(s),this.undoRedoManager.updateModelInStack(s),this.model.modificationDate===s.modificationDate&&(this.model.exports=s.exports),i.resolve(this.model)}catch(s){__classPrivateFieldGet(this,rt,"f").error("updateModelRendering",{error:s}),i.reject(s)}}))),"QUIET_PERIOD"===__classPrivateFieldGet(this,st,"f").triggers.exportContent?__classPrivateFieldGet(this,st,"f").triggers.exportContentDelay:0),"f")}else i.resolve(this.model);return yield i.promise,this.internalEvent.emitExported(this.model.exports),__classPrivateFieldGet(this,rt,"f").debug("updateModelRendering",this.model.exports),i.promise}))}export(i){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,rt,"f").info("export",{mimeTypes:i});const s=yield this.recognizer.export(this.model.getClone(),i);return this.model.modificationDate===s.modificationDate&&this.model.mergeExport(s.exports),this.undoRedoManager.updateModelInStack(s),__classPrivateFieldGet(this,rt,"f").debug("export",this.model),this.model}))}convert(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,rt,"f").info("convert",{conversionState:i,requestedMimeTypes:s});const n=yield this.recognizer.convert(this.model,i,s);return Object.assign(__classPrivateFieldGet(this,nt,"f"),n),__classPrivateFieldGet(this,rt,"f").debug("convert",this.model),this.model}))}resize(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,rt,"f").info("resize",{height:i,width:s});const n=new DeferredPromise;this.model.height=i,this.model.width=s,this.renderer.resize(this.model),this.model.rawStrokes.length?(clearTimeout(__classPrivateFieldGet(this,ot,"f")),__classPrivateFieldSet(this,ot,setTimeout((()=>__awaiter(this,void 0,void 0,(function*(){const i=yield this.recognizer.resize(this.model);n.resolve(i)}))),__classPrivateFieldGet(this,st,"f").triggers.resizeTriggerDelay),"f")):n.resolve(this.model);const a=yield n.promise;return __classPrivateFieldGet(this,rt,"f").debug("resize",{newModel:a}),this.internalEvent.emitExported(a.exports),a}))}undo(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,rt,"f").info("undo"),__classPrivateFieldSet(this,nt,this.undoRedoManager.undo(),"f"),this.renderer.drawModel(__classPrivateFieldGet(this,nt,"f")),__classPrivateFieldSet(this,nt,yield this.recognizer.export(__classPrivateFieldGet(this,nt,"f")),"f"),this.undoRedoManager.updateModelInStack(__classPrivateFieldGet(this,nt,"f")),this.internalEvent.emitExported(__classPrivateFieldGet(this,nt,"f").exports),__classPrivateFieldGet(this,rt,"f").debug("undo",__classPrivateFieldGet(this,nt,"f")),__classPrivateFieldGet(this,nt,"f")}))}redo(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,rt,"f").info("redo"),__classPrivateFieldSet(this,nt,this.undoRedoManager.redo(),"f"),this.renderer.drawModel(__classPrivateFieldGet(this,nt,"f")),__classPrivateFieldSet(this,nt,yield this.recognizer.export(__classPrivateFieldGet(this,nt,"f")),"f"),this.undoRedoManager.updateModelInStack(__classPrivateFieldGet(this,nt,"f")),this.internalEvent.emitExported(__classPrivateFieldGet(this,nt,"f").exports),__classPrivateFieldGet(this,rt,"f").debug("redo",__classPrivateFieldGet(this,nt,"f")),__classPrivateFieldGet(this,nt,"f")}))}clear(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,rt,"f").info("clear"),this.model.clear(),this.undoRedoManager.addModelToStack(this.model),this.renderer.drawModel(this.model),this.internalEvent.emitExported(this.model.exports),__classPrivateFieldGet(this,rt,"f").debug("clear",this.model),this.model}))}destroy(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,rt,"f").info("destroy"),this.grabber.detach(),this.renderer.destroy(),Promise.resolve()}))}}st=new WeakMap,nt=new WeakMap,rt=new WeakMap,ot=new WeakMap,at=new WeakMap;class WSRecognizer{constructor(i,s){lt.set(this,LoggerManager.getLogger("RECOGNIZER")),this.pingCount=0,this.reconnectionCount=0,this.serverConfiguration=i,this.recognitionConfiguration=s;const n="https"===this.serverConfiguration.scheme?"wss":"ws";this.url=`${n}://${this.serverConfiguration.host}/api/v4.0/iink/document?applicationKey=${this.serverConfiguration.applicationKey}`,__classPrivateFieldGet(this,lt,"f").info("constructor",{serverConfig:i,recognitionConfig:s,url:this.url})}get mimeTypes(){switch(this.recognitionConfiguration.type.toLocaleLowerCase()){case"text":return this.recognitionConfiguration.text.mimeTypes;case"math":return this.recognitionConfiguration.math.mimeTypes;case"diagram":return this.recognitionConfiguration.diagram.mimeTypes;default:return[]}}get internalEvent(){return InternalEvent.getInstance()}infinitePing(){this.pingCount++,this.serverConfiguration.websocket.maxPingLostCount{this.socket.readyState<=1&&(this.socket.send(JSON.stringify({type:"ping"})),this.infinitePing())}),this.serverConfiguration.websocket.pingDelay)}openCallback(){var i;null===(i=this.connected)||void 0===i||i.resolve();const s={type:this.sessionId?"restoreIInkSession":"newContentPackage",iinkSessionId:this.sessionId,applicationKey:this.serverConfiguration.applicationKey,xDpi:96,yDpi:96,viewSizeHeight:this.viewSizeHeight,viewSizeWidth:this.viewSizeWidth};isVersionSuperiorOrEqual(this.serverConfiguration.version,"2.0.4")&&(s["myscript-client-name"]="iink-ts",s["myscript-client-version"]="1.0.0-buildVersion"),this.send(s)}rejectDeferredPending(i){var s,n,a,l,d,c,h,v,u,p,_,g,f,m,P,y,S,w,G,b;(null===(s=this.connected)||void 0===s?void 0:s.isPending)&&(null===(n=this.connected)||void 0===n||n.reject(i)),(null===(a=this.initialized)||void 0===a?void 0:a.isPending)&&(null===(l=this.initialized)||void 0===l||l.reject(i)),(null===(d=this.addStrokeDeferred)||void 0===d?void 0:d.isPending)&&(null===(c=this.addStrokeDeferred)||void 0===c||c.reject(i)),(null===(h=this.exportDeferred)||void 0===h?void 0:h.isPending)&&(null===(v=this.exportDeferred)||void 0===v||v.reject(i)),(null===(u=this.convertDeferred)||void 0===u?void 0:u.isPending)&&(null===(p=this.convertDeferred)||void 0===p||p.reject(i)),(null===(_=this.importDeferred)||void 0===_?void 0:_.isPending)&&(null===(g=this.importDeferred)||void 0===g||g.reject(i)),(null===(f=this.resizeDeferred)||void 0===f?void 0:f.isPending)&&(null===(m=this.resizeDeferred)||void 0===m||m.reject(i)),(null===(P=this.undoDeferred)||void 0===P?void 0:P.isPending)&&(null===(y=this.undoDeferred)||void 0===y||y.reject(i)),(null===(S=this.redoDeferred)||void 0===S?void 0:S.isPending)&&(null===(w=this.redoDeferred)||void 0===w||w.reject(i)),(null===(G=this.clearDeferred)||void 0===G?void 0:G.isPending)&&this.clearDeferred.reject(i),(null===(b=this.waitForIdleDeferred)||void 0===b?void 0:b.isPending)&&this.waitForIdleDeferred.reject(i)}closeCallback(i){let s="";if(!this.currentErrorCode)switch(i.code){case 1e3:break;case 1001:s=S.GOING_AWAY;break;case 1002:s=S.PROTOCOL_ERROR;break;case 1003:s=S.UNSUPPORTED_DATA;break;case 1006:s=S.ABNORMAL_CLOSURE;break;case 1007:s=S.INVALID_FRAME_PAULOAD;break;case 1008:s=S.POLICY_VIOLATION;break;case 1009:s=S.MESSAGE_TOO_BIG;break;case 1011:s=S.INTERNAL_ERROR;break;case 1012:s=S.SERVICE_RESTART;break;case 1013:s=S.TRY_AGAIN;break;case 1014:s=S.BAD_GATEWAY;break;case 1015:s=S.TLS_HANDSHAKE;break;default:__classPrivateFieldGet(this,lt,"f").warn("closeCallback unknow CloseEvent.code",{evt:i}),s=S.CANT_ESTABLISH}const n=new Error(s||i.reason);this.rejectDeferredPending(n),this.currentErrorCode||1e3===i.code||this.internalEvent.emitError(n)}manageHMACChallengeMessage(i){__classPrivateFieldGet(this,lt,"f").info("manageHMACChallengeMessage",{websocketMessage:i});const s=i;s.hmacChallenge&&this.send({type:"hmac",hmac:computeHmac(s.hmacChallenge,this.serverConfiguration.applicationKey,this.serverConfiguration.hmacKey)}),s.iinkSessionId&&(this.sessionId=s.iinkSessionId)}manageContentPackageDescriptionMessage(){this.reconnectionCount=0,__classPrivateFieldGet(this,lt,"f").info("manageContentPackageDescriptionMessage"),this.send(Object.assign(Object.assign({},this.recognitionConfiguration),{type:"configuration"})),this.currentPartId?this.send({type:"openContentPart",id:this.currentPartId,mimeTypes:this.mimeTypes}):this.send({type:"newContentPart",contentType:this.recognitionConfiguration.type,mimeTypes:this.mimeTypes})}managePartChangeMessage(i){var s;__classPrivateFieldGet(this,lt,"f").info("managePartChangeMessage",{websocketMessage:i});const n=i;this.currentPartId=n.partId,null===(s=this.initialized)||void 0===s||s.resolve()}manageExportMessage(i){var s,n,a,l,d,c,h,v,u;__classPrivateFieldGet(this,lt,"f").info("manageExportMessage",{websocketMessage:i});const p=i;p.exports["application/vnd.myscript.jiix"]&&(p.exports["application/vnd.myscript.jiix"]=JSON.parse(p.exports["application/vnd.myscript.jiix"].toString())),null===(s=this.initialized)||void 0===s||s.resolve(),null===(n=this.addStrokeDeferred)||void 0===n||n.resolve(p.exports),null===(a=this.exportDeferred)||void 0===a||a.resolve(p.exports),null===(l=this.convertDeferred)||void 0===l||l.resolve(p.exports),null===(d=this.importDeferred)||void 0===d||d.resolve(p.exports),null===(c=this.undoDeferred)||void 0===c||c.resolve(p.exports),null===(h=this.redoDeferred)||void 0===h||h.resolve(p.exports),null===(v=this.clearDeferred)||void 0===v||v.resolve(p.exports),null===(u=this.importPointEventsDeferred)||void 0===u||u.resolve(p.exports),this.internalEvent.emitExported(p.exports)}manageWaitForIdle(){var i;return __awaiter(this,void 0,void 0,(function*(){this.internalEvent.emitIdle(!0),null===(i=this.waitForIdleDeferred)||void 0===i||i.resolve()}))}manageErrorMessage(i){var s,n;const a=i;this.currentErrorCode=(null===(s=a.data)||void 0===s?void 0:s.code)||a.code;let l=(null===(n=a.data)||void 0===n?void 0:n.message)||a.message||S.UNKNOW;switch(this.currentErrorCode){case"no.activity":l=S.NO_ACTIVITY;break;case"access.not.granted":l=S.WRONG_CREDENTIALS;break;case"session.too.old":l=S.TOO_OLD}const d=new Error(l);this.rejectDeferredPending(d),this.internalEvent.emitError(d)}manageContentChangeMessage(i){__classPrivateFieldGet(this,lt,"f").info("manageContentChangeMessage",{websocketMessage:i});const s=i,n={canRedo:s.canRedo,canUndo:s.canUndo,empty:s.empty,stackIndex:s.undoStackIndex,possibleUndoCount:s.possibleUndoCount,stack:[]};this.internalEvent.emitContextChange(n)}manageSVGPatchMessage(i){var s;__classPrivateFieldGet(this,lt,"f").info("manageSVGPatchMessage",{websocketMessage:i}),null===(s=this.resizeDeferred)||void 0===s||s.resolve();const n=i;this.internalEvent.emitSVGPatch(n)}messageCallback(i){var s;__classPrivateFieldGet(this,lt,"f").debug("messageCallback",{message:i}),this.currentErrorCode=void 0;const n=JSON.parse(i.data);if("pong"!==n.type)switch(this.pingCount=0,n.type){case"ack":this.manageHMACChallengeMessage(n);break;case"contentPackageDescription":this.manageContentPackageDescriptionMessage();break;case"partChanged":this.managePartChangeMessage(n);break;case"newPart":null===(s=this.initialized)||void 0===s||s.resolve();break;case"contentChanged":this.manageContentChangeMessage(n);break;case"exported":this.manageExportMessage(n);break;case"svgPatch":this.manageSVGPatchMessage(n);break;case"error":this.manageErrorMessage(n);break;case"idle":this.manageWaitForIdle();break;default:__classPrivateFieldGet(this,lt,"f").warn("messageCallback",`Message type unknow: "${n.type}".`)}}init(i,s){var n,a;return __awaiter(this,void 0,void 0,(function*(){try{return __classPrivateFieldGet(this,lt,"f").info("init",{height:i,width:s}),this.destroy(),this.connected=new DeferredPromise,this.initialized=new DeferredPromise,this.viewSizeHeight=i,this.viewSizeWidth=s,this.pingCount=0,this.socket=new WebSocket(this.url),this.serverConfiguration.websocket.pingEnabled&&this.infinitePing(),this.socket.addEventListener("open",this.openCallback.bind(this)),this.socket.addEventListener("close",this.closeCallback.bind(this)),this.socket.addEventListener("message",this.messageCallback.bind(this)),this.initialized.promise}catch(i){const s=new Error(S.CANT_ESTABLISH);return this.internalEvent.emitError(s),null===(n=this.initialized)||void 0===n||n.reject(s),null===(a=this.initialized)||void 0===a?void 0:a.promise}}))}send(i){return __awaiter(this,void 0,void 0,(function*(){return this.connected?(yield this.connected.promise,this.socket.readyState===this.socket.OPEN?(__classPrivateFieldGet(this,lt,"f").debug("send",{message:i}),this.socket.send(JSON.stringify(i)),Promise.resolve()):this.socket.readyState!=this.socket.CONNECTING&&this.serverConfiguration.websocket.autoReconnect?(this.reconnectionCount++,this.serverConfiguration.websocket.maxRetryCount>=this.reconnectionCount?(__classPrivateFieldGet(this,lt,"f").debug("send",`try to reconnect number: ${this.reconnectionCount}.`),this.internalEvent.emitClearMessage(),yield this.init(this.viewSizeHeight,this.viewSizeWidth),yield this.setPenStyle(this.penStyle),yield this.setPenStyleClasses(this.penStyleClasses),yield this.setTheme(this.theme),this.send(i)):Promise.reject(new Error("Unable to send message. The maximum number of connection attempts has been reached."))):void 0):Promise.reject(new Error("Recognizer must be initilized"))}))}addStrokes(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,lt,"f").info("addStrokes",{strokes:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.addStrokeDeferred=new DeferredPromise,0===i.length?this.addStrokeDeferred.resolve({}):yield this.send({type:"addStrokes",strokes:i.map(convertStrokeToJSON)}),null===(n=this.addStrokeDeferred)||void 0===n?void 0:n.promise}))}setPenStyle(i){var s;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,lt,"f").info("setPenStyle",{penStyle:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.penStyle=i;const n={type:"setPenStyle",style:Oe.penStyleToCSS(i)};return this.send(n)}))}setPenStyleClasses(i){var s;return __awaiter(this,void 0,void 0,(function*(){yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.penStyleClasses=i,__classPrivateFieldGet(this,lt,"f").info("setPenStyleClasses",{penStyleClasses:i});const n={type:"setPenStyleClasses",styleClasses:i};return this.send(n)}))}setTheme(i){var s;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,lt,"f").info("setTheme",{theme:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.theme=i;const n={type:"setTheme",theme:Oe.themeToCSS(i)};return this.send(n)}))}export(i,s){var n,a;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,lt,"f").info("export",{model:i,requestedMimeTypes:s}),yield null===(n=this.initialized)||void 0===n?void 0:n.promise,this.exportDeferred=new DeferredPromise;const l=i.getClone();let d=s||[];if(!d.length)switch(this.recognitionConfiguration.type){case"DIAGRAM":d=this.recognitionConfiguration.diagram.mimeTypes;break;case"MATH":d=this.recognitionConfiguration.math.mimeTypes;break;case"Raw Content":d=["application/vnd.myscript.jiix"];break;case"TEXT":d=this.recognitionConfiguration.text.mimeTypes;break;default:throw new Error(`Recognition type "${this.recognitionConfiguration.type}" is unknown.\n Possible types are:\n -DIAGRAM\n -MATH\n -Raw Content\n -TEXT`)}if(!d.length)return Promise.reject(new Error(`Export failed, no mimeTypes define in recognition ${this.recognitionConfiguration.type} configuration`));const c={type:"export",partId:this.currentPartId,mimeTypes:d};yield this.send(c);const h=yield null===(a=this.exportDeferred)||void 0===a?void 0:a.promise;return l.updatePositionReceived(),l.mergeExport(h),__classPrivateFieldGet(this,lt,"f").debug("export",{model:l}),l}))}import(i,s,n){var a,l;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,lt,"f").info("import",{data:s,mimeType:n}),yield null===(a=this.initialized)||void 0===a?void 0:a.promise;const d=i.getClone(),c=this.serverConfiguration.websocket.fileChunkSize,h=Math.random().toString(10).substring(2,6);this.importDeferred=new DeferredPromise;const readBlob=i=>{const s=new FileReader;return new Promise(((n,a)=>{s.onloadend=i=>{var s;return n(null===(s=i.target)||void 0===s?void 0:s.result)},s.onerror=()=>a(),s.readAsText(i)}))},v={type:"importFile",importFileId:h,mimeType:n};yield this.send(v);for(let i=0;is.size};yield this.send(a)}const u=yield null===(l=this.importDeferred)||void 0===l?void 0:l.promise;return this.importDeferred=void 0,d.mergeExport(u),d}))}resize(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,lt,"f").info("resize",{model:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.resizeDeferred=new DeferredPromise;const a=i.getClone();this.viewSizeHeight=a.height,this.viewSizeWidth=a.width;const l={type:"changeViewSize",height:this.viewSizeHeight,width:this.viewSizeWidth};return yield this.send(l),yield null===(n=this.resizeDeferred)||void 0===n?void 0:n.promise,a}))}importPointEvents(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,lt,"f").info("importPointsEvents",{strokes:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise,this.importPointEventsDeferred=new DeferredPromise;const a={type:"pointerEvents",events:i.map(convertStrokeToJSON)};this.send(a);const l=yield null===(n=this.importPointEventsDeferred)||void 0===n?void 0:n.promise;return this.importPointEventsDeferred=void 0,__classPrivateFieldGet(this,lt,"f").debug("importPointEvents",{exportPoints:l}),l}))}convert(i,s){var n,a;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,lt,"f").info("convert",{model:i,conversionState:s}),yield null===(n=this.initialized)||void 0===n?void 0:n.promise,this.convertDeferred=new DeferredPromise;const l=i.getClone(),d={type:"convert",conversionState:s};yield this.send(d);const c=yield null===(a=this.convertDeferred)||void 0===a?void 0:a.promise;return l.updatePositionReceived(),l.mergeConvert(c),l.mergeExport(c),__classPrivateFieldGet(this,lt,"f").debug("convert",{model:l}),l}))}waitForIdle(){var i,s;return __awaiter(this,void 0,void 0,(function*(){yield null===(i=this.initialized)||void 0===i?void 0:i.promise,this.waitForIdleDeferred=new DeferredPromise;return yield this.send({type:"waitForIdle"}),null===(s=this.waitForIdleDeferred)||void 0===s?void 0:s.promise}))}undo(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,lt,"f").info("undo",{model:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise;const a=i.getClone();this.undoDeferred=new DeferredPromise;yield this.send({type:"undo"});const l=yield null===(n=this.undoDeferred)||void 0===n?void 0:n.promise;return a.updatePositionReceived(),a.mergeExport(l),__classPrivateFieldGet(this,lt,"f").debug("undo",{model:a}),this.undoDeferred=void 0,a}))}redo(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,lt,"f").info("redo",{model:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise;const a=i.getClone();this.redoDeferred=new DeferredPromise;yield this.send({type:"redo"});const l=yield null===(n=this.redoDeferred)||void 0===n?void 0:n.promise;return a.updatePositionReceived(),a.mergeExport(l),__classPrivateFieldGet(this,lt,"f").debug("redo",{model:l}),this.redoDeferred=void 0,a}))}clear(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,lt,"f").info("clear",{model:i}),yield null===(s=this.initialized)||void 0===s?void 0:s.promise;const a=i.getClone();a.modificationDate=Date.now(),this.clearDeferred=new DeferredPromise;yield this.send({type:"clear"});const l=yield null===(n=this.clearDeferred)||void 0===n?void 0:n.promise;return a.updatePositionReceived(),a.mergeExport(l),this.clearDeferred=void 0,__classPrivateFieldGet(this,lt,"f").info("clear",{model:a}),a}))}close(i,s){this.socket.readyState!==this.socket.OPEN&&this.socket.readyState!==this.socket.CONNECTING||(__classPrivateFieldGet(this,lt,"f").info("close",{code:i,reason:s}),this.socket.removeEventListener("close",this.closeCallback),this.socket.removeEventListener("message",this.messageCallback),this.socket.removeEventListener("open",this.openCallback),this.socket.close(i,s))}destroy(){__classPrivateFieldGet(this,lt,"f").info("destroy"),this.connected=void 0,this.initialized=void 0,this.addStrokeDeferred=void 0,this.exportDeferred=void 0,this.convertDeferred=void 0,this.importDeferred=void 0,this.resizeDeferred=void 0,this.undoDeferred=void 0,this.redoDeferred=void 0,this.clearDeferred=void 0,this.socket&&(this.socket.removeEventListener("close",this.closeCallback),this.socket.removeEventListener("message",this.messageCallback),this.socket.removeEventListener("open",this.openCallback),this.close(1e3,"Recognizer destroyed"))}}lt=new WeakMap;class SVGStroker{getArcPath(i,s){return[`M ${i.x},${i.y}`,`m ${-s},0`,`a ${s},${s} 0 1 0 ${2*s},0`,`a ${s},${s} 0 1 0 ${-2*s},0`].join(" ")}getLinePath(i,s,n){const a=computeLinksPoints(i,computeAxeAngle(i,s),n),l=computeLinksPoints(s,computeAxeAngle(i,s),n);return[`M ${a[0].x},${a[0].y}`,`L ${l[0].x},${l[0].y}`,`L ${l[1].x},${l[1].y}`,`L ${a[1].x},${a[1].y}`].join(" ")}getFinalPath(i,s,n){const a=computeAxeAngle(i,s),l=computeLinksPoints(s,a,n),d=[`M ${l[0].x},${l[0].y}`];for(let i=1;i<=6;i++){const l=a-i*(Math.PI/6);d.push(`L ${s.x-s.p*n*Math.sin(l)},${s.y+s.p*n*Math.cos(l)}`)}return d.join(" ")}getQuadraticPath(i,s,n,a){const l=computeLinksPoints(i,computeAxeAngle(i,n),a),d=computeLinksPoints(s,computeAxeAngle(n,s),a),c=computeLinksPoints(n,computeAxeAngle(i,s),a);return[`M ${l[0].x},${l[0].y}`,`Q ${c[0].x},${c[0].y} ${d[0].x},${d[0].y}`,`L ${d[1].x},${d[1].y}`,`Q ${c[1].x},${c[1].y} ${l[1].x},${l[1].y}`].join(" ")}buildSVGPath(i){const s=i.pointers.length,n=i.style.width,a=s-2,l=i.pointers[0],d=[];if(s<3)d.push(this.getArcPath(l,.6*n));else{d.push(this.getArcPath(l,n*l.p)),d.push(this.getLinePath(l,computeMiddlePoint(l,i.pointers[1]),n));for(let s=0;s{a.setAttribute(i.name,i.value)}));const l=this.buildSVGPath(s);a.setAttribute("d",`${l}Z`),i.appendChild(a)}}class WSSVGRenderer{constructor(i){dt.add(this),ct.set(this,LoggerManager.getLogger("RENDERER")),__classPrivateFieldGet(this,ct,"f").info("constructor",{config:i}),this.config=i,this.stroker=new SVGStroker}init(i){__classPrivateFieldGet(this,ct,"f").info("init",{element:i}),i.style.fontSize="10px",this.context={parent:i}}updateLayer(i,s){switch(__classPrivateFieldGet(this,ct,"f").info("updateLayer",{layerName:i,update:s}),s.type){case"REPLACE_ALL":__classPrivateFieldGet(this,dt,"m",vt).call(this,i,s);break;case"REPLACE_ELEMENT":__classPrivateFieldGet(this,dt,"m",ut).call(this,s);break;case"APPEND_CHILD":__classPrivateFieldGet(this,dt,"m",pt).call(this,i,s);break;case"REMOVE_ELEMENT":__classPrivateFieldGet(this,dt,"m",gt).call(this,s);break;case"REMOVE_CHILD":__classPrivateFieldGet(this,dt,"m",_t).call(this,s);break;case"INSERT_BEFORE":__classPrivateFieldGet(this,dt,"m",ft).call(this,s);break;case"SET_ATTRIBUTE":__classPrivateFieldGet(this,dt,"m",mt).call(this,s);break;case"REMOVE_ATTRIBUTE":__classPrivateFieldGet(this,dt,"m",Pt).call(this,s);break;default:__classPrivateFieldGet(this,ct,"f").warn("updateLayer Default",{layerName:i,update:s})}}updatesLayer(i,s){__classPrivateFieldGet(this,ct,"f").info("updatesLayer",{layerName:i,updates:s}),s.forEach((s=>this.updateLayer(i,s))),this.clearPendingStroke()}clearPendingStroke(){__classPrivateFieldGet(this,ct,"f").info("clearPendingStroke",{});const i=this.context.parent.querySelector("#pendingStrokes");i&&(i.innerHTML="")}drawPendingStroke(i){if(__classPrivateFieldGet(this,ct,"f").info("drawPendingStroke",{stroke:i}),i){const s=this.context.parent.querySelector("#pendingStrokes");if(s){const n=s.querySelector(`#${null==i?void 0:i.id}`);n&&n.remove(),__classPrivateFieldGet(this,dt,"m",ht).call(this,s,i)}}}clearErasingStrokes(){this.context.parent.querySelectorAll("[type=eraser]").forEach((i=>{i.remove()}))}resize(i){__classPrivateFieldGet(this,ct,"f").info("resize",{model:i});const s=this.context.parent.getBoundingClientRect(),n=this.context.parent.querySelectorAll("svg"),a=Math.max(s.width,i.width),l=Math.max(s.height,i.height);n.forEach((i=>{i.setAttribute("viewBox",`0 0 ${a}, ${l}`),i.setAttribute("width",`${a}px`),i.setAttribute("height",`${l}px`)}))}destroy(){var i;__classPrivateFieldGet(this,ct,"f").info("destroy",{context:this.context}),(null===(i=this.context)||void 0===i?void 0:i.parent)&&this.context.parent.querySelectorAll("svg").forEach((i=>i.remove()))}}ct=new WeakMap,dt=new WeakSet,ht=function _WSSVGRenderer_drawStroke(i,s){let n;"eraser"===s.pointerType?(s.style.width=20,n="fill:grey;stroke:transparent;shadowBlur:5;opacity:0.2;"):n=`fill:${s.style.color};stroke:transparent;`,this.stroker.drawStroke(i,s,[{name:"style",value:n}])},vt=function _WSSVGRenderer_replaceAll(i,s){const n=this.context.parent.querySelector(`svg[data-layer="${i}"]`);null==n||n.remove(),this.context.parent.insertAdjacentHTML("beforeend",s.svg);const a=this.context.parent.querySelector(`svg[data-layer="${i}"]`);if("MODEL"===i){const i=document.createElementNS("http://www.w3.org/2000/svg","g");i.id="pendingStrokes",a.appendChild(i)}},ut=function _WSSVGRenderer_replaceElement(i){const s=this.context.parent.querySelector(`#${i.id}`);if(s){const n=s.parentNode;null==s||s.remove(),null==n||n.insertAdjacentHTML("beforeend",i.svg)}},pt=function _WSSVGRenderer_appendChild(i,s){const n=s.parentId?`#${s.parentId}`:`svg[data-layer="${i}"]`,a=this.context.parent.querySelector(n);null==a||a.insertAdjacentHTML("beforeend",s.svg)},_t=function _WSSVGRenderer_removeChild(i){var s;null===(s=this.context.parent.querySelector(`#${i.parentId} > *:nth-child(${i.index+1})`))||void 0===s||s.remove()},gt=function _WSSVGRenderer_removeElement(i){const s=this.context.parent.querySelector(`#${i.id}`);s&&(i.id.includes("s")||i.id.includes("MODEL")?s.remove():(s.setAttribute("class","removed-stroke"),setTimeout((()=>{null==s||s.remove()}),100)))},ft=function _WSSVGRenderer_insertBefore(i){const s=this.context.parent.querySelector(`#${i.refId}`);null==s||s.insertAdjacentHTML("beforebegin",i.svg)},mt=function _WSSVGRenderer_setAttribute(i){const s=i.id?`#${i.id}`:"svg",n=this.context.parent.querySelector(s);null==n||n.setAttribute(i.name,i.value)},Pt=function _WSSVGRenderer_removeAttribute(i){const s=i.id?`#${i.id}`:"svg",n=this.context.parent.querySelector(s);null==n||n.removeAttribute(i.name)};var St,wt,Ft,Gt,bt=Object.freeze({__proto__:null,UndoRedoContext:UndoRedoContext,UndoRedoManager:UndoRedoManager});class WSBehaviors{constructor(i){this.name="WSBehaviors",St.set(this,void 0),wt.set(this,void 0),Ft.set(this,LoggerManager.getLogger("BEHAVIORS")),Gt.set(this,void 0),this.onSVGPatch=i=>{__classPrivateFieldGet(this,Ft,"f").info("onSVGPatch",{evt:i}),this.renderer.updatesLayer(i.layer,i.updates)},__classPrivateFieldGet(this,Ft,"f").info("constructor",{options:i}),this.options=i,__classPrivateFieldSet(this,St,new Configuration(null==i?void 0:i.configuration),"f"),this.styleManager=new StyleManager(i.penStyle,i.theme),this.grabber=new PointerEventGrabber(__classPrivateFieldGet(this,St,"f").grabber),this.renderer=new WSSVGRenderer(__classPrivateFieldGet(this,St,"f").rendering),this.recognizer=new WSRecognizer(__classPrivateFieldGet(this,St,"f").server,__classPrivateFieldGet(this,St,"f").recognition),this.intention="write",__classPrivateFieldSet(this,wt,new Model,"f"),this.undoRedoManager=new UndoRedoManager(__classPrivateFieldGet(this,St,"f")["undo-redo"],this.model)}get internalEvent(){return InternalEvent.getInstance()}get model(){return __classPrivateFieldGet(this,wt,"f")}get context(){return this.undoRedoManager.context}get configuration(){return __classPrivateFieldGet(this,St,"f")}get currentPenStyle(){return this.styleManager.currentPenStyle}get penStyle(){return this.styleManager.penStyle}setPenStyle(i){return __classPrivateFieldGet(this,Ft,"f").info("setPenStyle",{penStyle:i}),this.styleManager.setPenStyle(i),__classPrivateFieldGet(this,Ft,"f").debug("setPenStyle",this.styleManager.penStyle),this.recognizer.setPenStyle(this.styleManager.penStyle)}get penStyleClasses(){return this.styleManager.penStyleClasses}setPenStyleClasses(i){return __classPrivateFieldGet(this,Ft,"f").info("setPenStyleClasses",{penClass:i}),this.styleManager.setPenStyleClasses(i),__classPrivateFieldGet(this,Ft,"f").debug("setPenStyleClasses",this.styleManager.penStyleClasses),this.recognizer.setPenStyleClasses(this.styleManager.penStyleClasses)}get theme(){return this.styleManager.theme}setTheme(i){return __classPrivateFieldGet(this,Ft,"f").info("setTheme",{theme:i}),this.styleManager.setTheme(i),__classPrivateFieldGet(this,Ft,"f").debug("setTheme",this.styleManager.theme),this.recognizer.setTheme(this.styleManager.theme)}init(i){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Ft,"f").info("init",{domElement:i});const s=window.getComputedStyle(i);this.model.width=Math.max(parseInt(s.width.replace("px","")),__classPrivateFieldGet(this,St,"f").rendering.minWidth),this.model.height=Math.max(parseInt(s.height.replace("px","")),__classPrivateFieldGet(this,St,"f").rendering.minHeight),this.undoRedoManager.updateModelInStack(this.model),this.renderer.init(i),this.grabber.attach(i),this.grabber.onPointerDown=this.onPointerDown.bind(this),this.grabber.onPointerMove=this.onPointerMove.bind(this),this.grabber.onPointerUp=this.onPointerUp.bind(this),this.internalEvent.addSVGPatchListener(this.onSVGPatch),yield this.recognizer.init(this.model.height,this.model.width),yield this.setPenStyle(this.penStyle),yield this.setTheme(this.theme),yield this.setPenStyleClasses(this.penStyleClasses)}))}onPointerDown(i,s){var n;__classPrivateFieldGet(this,Ft,"f").info("onPointerDown",{intention:this.intention,evt:i,point:s});let{pointerType:a}=i;const l=Object.assign({},null===(n=this.theme)||void 0===n?void 0:n.ink,this.currentPenStyle);"erase"===this.intention&&(a="eraser"),this.model.initCurrentStroke(s,i.pointerId,a,l),this.drawCurrentStroke()}onPointerMove(i,s){__classPrivateFieldGet(this,Ft,"f").info("onPointerMove",{intention:this.intention,point:s}),this.model.appendToCurrentStroke(s),this.drawCurrentStroke()}onPointerUp(i,s){return __awaiter(this,void 0,void 0,(function*(){try{__classPrivateFieldGet(this,Ft,"f").info("onPointerUp",{intention:this.intention,point:s}),this.model.endCurrentStroke(s),yield this.updateModelRendering()}catch(i){this.internalEvent.emitError(i)}}))}drawCurrentStroke(){__classPrivateFieldGet(this,Ft,"f").debug("drawCurrentStroke",{stroke:this.model.currentStroke});const i=this.model.currentStroke;i&&this.renderer.drawPendingStroke(i)}updateModelRendering(){return __awaiter(this,void 0,void 0,(function*(){if(__classPrivateFieldGet(this,Ft,"f").info("updateModelRendering"),"DEMAND"!==__classPrivateFieldGet(this,St,"f").triggers.exportContent){const i=this.model.extractUnsentStrokes();this.model.updatePositionSent(),this.undoRedoManager.addModelToStack(this.model),this.renderer.clearErasingStrokes();const s=yield this.recognizer.addStrokes(i);this.model.mergeExport(s),this.undoRedoManager.updateModelInStack(this.model)}return __classPrivateFieldGet(this,Ft,"f").debug("updateModelRendering",this.model),this.model}))}waitForIdle(){return __awaiter(this,void 0,void 0,(function*(){return this.recognizer.waitForIdle()}))}importPointEvents(i){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Ft,"f").info("importPointEvents",{strokes:i});const s=yield this.recognizer.importPointEvents(i);return this.model.mergeExport(s),__classPrivateFieldGet(this,Ft,"f").debug("importPointEvents",this.model),this.model}))}export(i){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Ft,"f").info("export",{mimeTypes:i});try{if("DEMAND"===__classPrivateFieldGet(this,St,"f").triggers.exportContent){const i=this.model.extractUnsentStrokes();this.model.updatePositionSent();const s=yield this.recognizer.addStrokes(i);return this.model.updatePositionReceived(),this.model.mergeExport(s),__classPrivateFieldGet(this,Ft,"f").debug("export",this.model),this.model}return this.recognizer.export(this.model,i)}catch(i){return __classPrivateFieldGet(this,Ft,"f").error("export",{error:i}),this.internalEvent.emitError(i),Promise.reject(i)}}))}convert(i){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,Ft,"f").info("convert",{conversionState:i}),this.undoRedoManager.addModelToStack(this.model),this.context.stack.push(this.model.getClone()),__classPrivateFieldSet(this,wt,yield this.recognizer.convert(this.model,i),"f"),__classPrivateFieldGet(this,Ft,"f").debug("convert",this.model),this.undoRedoManager.addModelToStack(this.model),this.model}))}import(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Ft,"f").info("import",{data:i,mimeType:s}),this.context.stack.push(this.model.getClone());const n=yield this.recognizer.import(this.model,i,s);return this.undoRedoManager.addModelToStack(n),n}))}resize(i,s){return __awaiter(this,void 0,void 0,(function*(){__classPrivateFieldGet(this,Ft,"f").info("resize",{height:i,width:s});const n=new DeferredPromise;this.model.height=i,this.model.width=s;const a=this.model.getClone();return this.renderer.resize(a),clearTimeout(__classPrivateFieldGet(this,Gt,"f")),__classPrivateFieldSet(this,Gt,setTimeout((()=>__awaiter(this,void 0,void 0,(function*(){try{const i=yield this.recognizer.resize(a);n.resolve(i)}catch(a){__classPrivateFieldGet(this,Ft,"f").error("resize",{height:i,width:s,error:a}),n.reject(a)}}))),__classPrivateFieldGet(this,St,"f").triggers.resizeTriggerDelay),"f"),__classPrivateFieldSet(this,wt,yield n.promise,"f"),this.internalEvent.emitExported(this.model.exports),__classPrivateFieldGet(this,Ft,"f").debug("resize",this.model),this.model}))}undo(){return __awaiter(this,void 0,void 0,(function*(){if(__classPrivateFieldGet(this,Ft,"f").info("undo"),this.context.canUndo)return __classPrivateFieldSet(this,wt,this.undoRedoManager.undo(),"f"),this.recognizer.undo(this.model);throw new Error("Undo not allowed")}))}redo(){return __awaiter(this,void 0,void 0,(function*(){if(__classPrivateFieldGet(this,Ft,"f").info("redo"),this.context.canRedo)return __classPrivateFieldSet(this,wt,this.undoRedoManager.redo(),"f"),__classPrivateFieldGet(this,Ft,"f").debug("undo",__classPrivateFieldGet(this,wt,"f")),this.recognizer.redo(this.model);throw new Error("Redo not allowed")}))}clear(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,Ft,"f").info("clear"),this.model.clear(),this.undoRedoManager.addModelToStack(this.model),this.recognizer.clear(this.model)}))}destroy(){return __awaiter(this,void 0,void 0,(function*(){return __classPrivateFieldGet(this,Ft,"f").info("destroy"),this.grabber.detach(),this.renderer.destroy(),this.recognizer.destroy(),Promise.resolve()}))}}St=new WeakMap,wt=new WeakMap,Ft=new WeakMap,Gt=new WeakMap;var xt,Et,Ct,kt,Mt,Tt,Lt,It,Dt,At,Rt,Nt,Ot,Wt,zt,jt,Ht,Bt,Xt;!function styleInject(i,s){void 0===s&&(s={});var n=s.insertAt;if(i&&"undefined"!=typeof document){var a=document.head||document.getElementsByTagName("head")[0],l=document.createElement("style");l.type="text/css","top"===n&&a.firstChild?a.insertBefore(l,a.firstChild):a.appendChild(l),l.styleSheet?l.styleSheet.cssText=i:l.appendChild(document.createTextNode(i))}}('.ms-editor {\n position: relative;\n z-index: 10;\n color: #1A9FFF;\n font-family: sans-serif;\n}\n\n.ms-editor.erasing {\n cursor: url(\'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEsSURBVDiNrdO7SgNBFMbx/3fmCbQ1tunDIayFBvFSKxbxBfSdBPEBtLIWb3Ebl4R9AQWLkE70CWbHZl1Eg2iSr5vL+c1hhhFTMhwOdyX1gQ2gVU+PgTyldNHtdq+/1+jroCiKtpmdSupNO6ApkgZmdtzpdJ5+QGVZ9qqqugSWfkO+5F3SnrvnDVQURTuE8PgP5DNvkjJ3fzaAEMLJDAjAclVVZwCqL/ZqBqSJme2YpMN5EIAYY9+A9XkhST0DVuaFgJYtAAGoDJgsAJoYkM+rSHqwlNL5Ajq6EMBoNLoBtmbsZuDumwYQYzwCXmdw3oAjAAPIsuxF0kG98GdE0r67PzcQgLvnIYQ14P4PyF39WZuH0rRdZVluxxj7kjaA1Xp6nFLKzezc3W+/13wAItdV6XjME1AAAAAASUVORK5CYII=\') 10 10, auto;\n}\n\n.ms-editor canvas,\n.ms-editor svg {\n z-index: 20;\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n width: 100%;\n}\n\n.ms-editor canvas.ms-rendering-canvas {\n z-index: 9;\n pointer-events: none;\n background-image: linear-gradient(to right, #F5F6F7 1px, transparent 1px), linear-gradient(to bottom, #F5F6F7 1px, transparent 1px);\n background-size: 18px 18px;\n}\n\n.ms-editor .loader {\n z-index: 30;\n position: absolute;\n width: 120px;\n height: 120px;\n top: calc(50% - 60px);\n left: calc(50% - 60px);\n border: 16px solid #F5F6F7;\n border-radius: 50%;\n border-top-color: #1A9FFF;\n -webkit-animation: spin 2s linear infinite;\n animation: spin 2s linear infinite;\n}\n\n.ms-editor .message {\n z-index: 25;\n position: absolute;\n width: 300px;\n max-height: calc(25%);\n min-height: 200px;\n top: calc(50% - 100px);\n left: calc(50% - 150px);\n font-size: 16px;\n text-align: center;\n word-wrap: break-word;\n}\n\n.ms-editor .message.error-msg::before {\n content: url("data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCA3Ni41IDYxMiA0NTkiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWluIG1lZXQiPgogICAgPHBhdGggZmlsbD0iIzFBOUZGRiIgZD0iTTQ5NC43LDIyOS41Yy0xNy44NTEtODYuNy05NC4zNTEtMTUzLTE4OC43LTE1M2MtMzguMjUsMC03My45NSwxMC4yLTEwMiwzMC42bDM4LjI1LDM4LjI1IGMxNy44NS0xMi43NSw0MC44LTE3Ljg1LDYzLjc1LTE3Ljg1Yzc2LjUsMCwxNDAuMjUsNjMuNzUsMTQwLjI1LDE0MC4yNXYxMi43NWgzOC4yNWM0My4zNSwwLDc2LjUsMzMuMTUsNzYuNSw3Ni41IGMwLDI4LjA1LTE1LjMsNTMuNTUtNDAuOCw2Ni4zbDM4LjI1LDM4LjI1QzU5MS42LDQzOC42LDYxMiw0MDAuMzUsNjEyLDM1N0M2MTIsMjkwLjcsNTU4LjQ1LDIzNC42LDQ5NC43LDIyOS41eiBNNzYuNSwxMDkuNjUgbDcxLjQsNjguODVDNjYuMywxODMuNiwwLDI0OS45LDAsMzMxLjVjMCw4NC4xNSw2OC44NSwxNTMsMTUzLDE1M2gyOTguMzVsNTEsNTFsMzMuMTUtMzMuMTVMMTA5LjY1LDc2LjVMNzYuNSwxMDkuNjV6IE0xOTYuMzUsMjI5LjVsMjA0LDIwNEgxNTNjLTU2LjEsMC0xMDItNDUuOS0xMDItMTAyYzAtNTYuMSw0NS45LTEwMiwxMDItMTAySDE5Ni4zNXoiIC8+Cjwvc3ZnPgo=");\n}\n\n.ms-editor .message.info-msg::before {\n content: "";\n background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgdmlld0JveD0iMCAwIDI0IDI0IgogIGZpbGw9Im5vbmUiCiAgc3Ryb2tlPSIjMUE5RkZGIgogIHN0cm9rZS13aWR0aD0iMiIKICBzdHJva2UtbGluZWNhcD0icm91bmQiCiAgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIKPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIiAvPgogIDxsaW5lIHgxPSIxMiIgeTE9IjE2IiB4Mj0iMTIiIHkyPSIxMiIgLz4KICA8bGluZSB4MT0iMTIiIHkxPSI4IiB4Mj0iMTIuMDEiIHkyPSI4IiAvPgo8L3N2Zz4=");\n background-size: 100% 100%;\n display: block;\n margin: auto;\n padding-bottom: 10px;\n height: 25px;\n width: 25px;\n}\n\n.ms-editor .smartguide {\n position: absolute;\n z-index: 40;\n font-size: 16px;\n height: 48px;\n line-height: 48px;\n}\n\n.ms-editor .smartguide.smartguide-in {\n visibility: visible !important;\n transition: opacity 0.5s;\n opacity: 1;\n}\n\n.ms-editor .smartguide.smartguide-out {\n transition: opacity 1s, visibility 1s;\n visibility: hidden !important;\n opacity: 0;\n}\n\n.ms-editor .smartguide .tag-icon {\n padding: 0 18px;\n border: 1px solid #959DA6;\n font-weight: bold;\n font-size: large;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n position: absolute;\n z-index: 31;\n height: 100%;\n line-height: 48px;\n background-color: rgba(255, 255, 255, 0.9);\n color: #959DA6;\n}\n\n.ms-editor .smartguide .ellipsis {\n cursor: pointer;\n border-bottom: 1px solid #959DA6;\n position: absolute;\n z-index: 31;\n height: 48px;\n line-height: 38px;\n padding: 0 8px;\n font-weight: bold;\n font-size: x-large;\n background-color: rgba(255, 255, 255, 0.9);\n color: #959DA6;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .ellipsis:active {\n background-color: #e0e0e0;\n}\n\n.ms-editor .smartguide .prompter-container {\n background-color: rgba(255, 255, 255, 0.9);\n height: 48px;\n line-height: 48px;\n overflow: hidden;\n white-space: nowrap;\n display: block;\n text-align: left;\n border-bottom: 1px solid #959DA6;\n position: absolute;\n z-index: 30;\n color: #bfbfbf;\n -moz-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .prompter-container > div > span {\n cursor: pointer;\n display: inline-block;\n}\n\n.ms-editor .smartguide .prompter-container .prompter-text {\n margin-left: 12px;\n}\n\n.ms-editor .smartguide .prompter-container .prompter-text .added-word {\n animation: 0.1s linear word-added,\n 3s ease-in-out color-input;\n}\n\n.ms-editor .smartguide .prompter-container .prompter-text .modified-word {\n animation: 0.1s linear word-modified,\n 3s ease-in-out color-input;\n}\n\n.ms-editor .smartguide .candidates {\n color: black;\n flex-direction: column;\n text-align: center;\n line-height: 30px;\n border-radius: 3px;\n position: absolute;\n box-shadow: 2px 2px 12px #BDBDBD, -2px 2px 12px #BDBDBD;\n background-color: #F5F5F5;\n z-index: 100;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .candidates > span {\n cursor: pointer;\n padding: 2px 20px;\n}\n\n.ms-editor .smartguide .candidates > span:hover {\n background-color: #EEEEEE;\n}\n\n.ms-editor .smartguide .candidates > span:active {\n background-color: #E0E0E0;\n}\n\n.ms-editor .smartguide .candidates .selected-word {\n font-weight: bold;\n background-color: #E0E0E0;\n}\n\n.ms-editor .smartguide .more-menu {\n display: flex;\n flex-direction: column;\n margin-right: 12px;\n line-height: 30px;\n border-radius: 3px;\n position: absolute;\n z-index: 100;\n box-shadow: 2px 2px 12px #BDBDBD;\n background-color: #F5F5F5;\n overflow: hidden;\n transition: max-height 1s ease-out, opacity 1s, visibility 0.5s linear;\n}\n.ms-editor .smartguide .more-menu.open {\n max-height: 500px;\n visibility: visible;\n opacity: 1;\n}\n.ms-editor .smartguide .more-menu.close {\n max-height: 0;\n visibility: hidden;\n opacity: 0;\n}\n\n.ms-editor .smartguide .more-menu .options-label-button {\n color: black;\n font-size: 16px;\n cursor: pointer;\n box-sizing: border-box;\n background: transparent;\n border: none;\n padding: 0 24px;\n margin: 0;\n height: 40px;\n outline: none;\n -webkit-tap-highlight-color: transparent;\n}\n\n.ms-editor .smartguide .more-menu .options-label-button:hover {\n background-color: #EEEEEE;\n}\n\n.ms-editor .smartguide .more-menu .options-label-button:active {\n background-color: #E0E0E0;\n}\n\n.ms-editor .ps__rail-x {\n top: 32px !important;\n}\n\n.ms-editor #stroke-panel {\n position: fixed;\n bottom: 10px;\n left: 10px;\n right: 10px;\n background-color: white;\n border: solid black 2px;\n padding: 5px;\n word-wrap: break-word;\n overflow: auto;\n cursor: copy;\n max-height: 100px;\n z-index: 999;\n}\n\n/** Stroke **/\n\n.ms-editor .removed-stroke {\n opacity: 0;\n transition: opacity 0.1s ease-in-out;\n}\n\n.ms-editor .added-stroke {\n animation: 0.2s opacity-appear;\n}\n\n@keyframes color-input {\n 0% {\n color: black;\n }\n 100% {\n color: #bfbfbf;\n }\n}\n\n@keyframes word-added {\n 0% {\n transform: translate(5px, 0);\n }\n 100% {\n transform: none;\n }\n}\n\n@keyframes word-modified {\n 0% {\n transform: translate(0, 5px);\n }\n 100% {\n transform: none;\n }\n}\n\n@keyframes opacity-appear {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity : 1;\n }\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n@-webkit-keyframes spin {\n 0% {\n -webkit-transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n }\n}\n');Et=new WeakMap,Ct=new WeakMap,kt=new WeakMap,Mt=new WeakMap,Tt=new WeakMap,Lt=new WeakMap,jt=new WeakMap,Ht=new WeakMap,xt=new WeakSet,It=function _Editor_instantiateBehaviors(i){var s;if(this.logger.info("instantiateBehaviors",{options:i}),!(null==i?void 0:i.configuration))throw new Error("Configuration required");let n;InternalEvent.getInstance().removeAllListeners(),__classPrivateFieldGet(this,kt,"f")&&__classPrivateFieldGet(this,kt,"f").destroy(),n="REST"===(null===(s=i.configuration.server)||void 0===s?void 0:s.protocol)?new RestBehaviors(i):new WSBehaviors(i),__classPrivateFieldSet(this,kt,Object.assign(n,i.behaviors),"f"),this.logger.debug("instantiateBehaviors",__classPrivateFieldGet(this,kt,"f"))},Dt=function _Editor_initializeBehaviors(){return __awaiter(this,void 0,void 0,(function*(){return this.logger.info("initializeBehaviors start"),__classPrivateFieldSet(this,Tt,new DeferredPromise,"f"),__classPrivateFieldGet(this,Et,"f").style.display="initial",__classPrivateFieldGet(this,xt,"m",Rt).call(this),this.logger.debug("initializeBehaviors",this.wrapperHTML),this.behaviors.init(this.wrapperHTML).then((()=>__awaiter(this,void 0,void 0,(function*(){this.logger.info("initializeBehaviors then"),this.wrapperHTML.editor=this,__classPrivateFieldGet(this,Tt,"f").resolve(),this.events.emitLoaded(),this.logger.debug("initializeBehaviors",this.wrapperHTML)})))).catch((i=>{this.logger.error("initializeBehaviors catch",{error:i}),__classPrivateFieldGet(this,Tt,"f").reject(i),__classPrivateFieldGet(this,xt,"m",Nt).call(this,i)})).finally((()=>(this.logger.info("initializeBehaviors finally",{}),__classPrivateFieldGet(this,Et,"f").style.display="none",__classPrivateFieldGet(this,Tt,"f").promise)))}))},At=function _Editor_initializeSmartGuide(){var i;if(null===(i=__classPrivateFieldGet(this,Mt,"f"))||void 0===i||i.destroy(),this.logger.info("initializeSmartGuide",{smartGuide:this.configuration.rendering.smartGuide}),this.configuration.rendering.smartGuide.enable){let i;switch(__classPrivateFieldSet(this,Mt,new SmartGuide,"f"),this.configuration.recognition.type){case"TEXT":i=this.configuration.recognition.text.margin;break;case"MATH":i=this.configuration.recognition.math.margin;break;default:this.logger.warn("initializeSmartGuide default",this.configuration.recognition.type),i={top:20,left:10,right:10,bottom:10}}__classPrivateFieldGet(this,Mt,"f").init(this.wrapperHTML,i,this.configuration.rendering)}},Rt=function _Editor_cleanMessage(){this.logger.debug("cleanMessage",__classPrivateFieldGet(this,Ct,"f")),__classPrivateFieldGet(this,Ct,"f").style.display="none",__classPrivateFieldGet(this,Ct,"f").innerHTML="",this.logger.debug("cleanMessage",__classPrivateFieldGet(this,Ct,"f"))},Nt=function _Editor_showError(i){this.logger.debug("showError",__classPrivateFieldGet(this,Ct,"f")),__classPrivateFieldGet(this,Ct,"f").style.display="initial",__classPrivateFieldGet(this,Ct,"f").classList.add("error-msg"),__classPrivateFieldGet(this,Ct,"f").classList.remove("info-msg"),__classPrivateFieldGet(this,Ct,"f").innerText=i.message,this.logger.debug("showError",__classPrivateFieldGet(this,Ct,"f"))},Ot=function _Editor_showNotif(i){this.logger.debug("showNotif",__classPrivateFieldGet(this,Ct,"f")),__classPrivateFieldGet(this,Ct,"f").style.display="initial",__classPrivateFieldGet(this,Ct,"f").classList.add("info-msg"),__classPrivateFieldGet(this,Ct,"f").classList.remove("error-msg"),__classPrivateFieldGet(this,Ct,"f").innerText=i.message,setTimeout((()=>{__classPrivateFieldGet(this,xt,"m",Rt).call(this)}),i.timeout||2500),this.logger.debug("showNotif",__classPrivateFieldGet(this,Ct,"f"))},Wt=function _Editor_showStrokesIfDebug(){if(this.showStrokesPan){let i=document.getElementById("stroke-panel");const s=JSON.stringify(this.model.rawStrokes.map((i=>({pointerType:i.pointerType,pointerId:i.pointerId,pointers:i.pointers}))));i||(i=document.createElement("div"),i.id="stroke-panel",i.addEventListener("click",(s=>{s.preventDefault(),s.stopPropagation(),navigator.clipboard.writeText(null==i?void 0:i.innerText),__classPrivateFieldGet(this,xt,"m",Ot).call(this,{message:"strokes copied to clipboard!",timeout:1500})})),this.wrapperHTML.appendChild(i)),i.innerText=s}},zt=function _Editor_addListeners(){InternalEvent.getInstance().addConvertListener(this.convert.bind(this)),InternalEvent.getInstance().addClearListener(this.clear.bind(this)),InternalEvent.getInstance().addErrorListener(__classPrivateFieldGet(this,xt,"m",Nt).bind(this)),InternalEvent.getInstance().addImportJIIXListener(__classPrivateFieldGet(this,xt,"m",Xt).bind(this)),InternalEvent.getInstance().addExportedListener(__classPrivateFieldGet(this,xt,"m",Bt).bind(this)),InternalEvent.getInstance().addNotifListener(__classPrivateFieldGet(this,xt,"m",Ot).bind(this)),InternalEvent.getInstance().addClearMessageListener(__classPrivateFieldGet(this,xt,"m",Rt).bind(this)),InternalEvent.getInstance().addContextChangeListener(__classPrivateFieldGet(this,jt,"f").bind(this)),InternalEvent.getInstance().addIdleListener(__classPrivateFieldGet(this,Ht,"f").bind(this))},Bt=function _Editor_onExport(i){var s;if(this.logger.info("onExport",{exports:i}),this.model.mergeExport(i),this.configuration.rendering.smartGuide.enable&&i&&i["application/vnd.myscript.jiix"]){const n=i["application/vnd.myscript.jiix"];null===(s=__classPrivateFieldGet(this,Mt,"f"))||void 0===s||s.update(n)}__classPrivateFieldGet(this,xt,"m",Wt).call(this),this.events.emitExported(i)},Xt=function _Editor_onImportJIIX(i){this.logger.info("onImportJIIX",{jiix:i}),this.import(new Blob([JSON.stringify(i)],{type:"application/vnd.myscript.jiix"}),"application/vnd.myscript.jiix")};var Ut=Object.freeze({__proto__:null,geometric:yt,version:$e,crypto:He,DeferredPromise:DeferredPromise,getAvailableFontList:function getAvailableFontList(i){var s,n,a;return __awaiter(this,void 0,void 0,(function*(){if(!(null===(s=null==i?void 0:i.server)||void 0===s?void 0:s.scheme)&&!(null===(n=null==i?void 0:i.server)||void 0===n?void 0:n.host))return Promise.reject("Failed to get fonts: configuration.server.scheme & configuration.server.host are required!");if(!(null===(a=null==i?void 0:i.recognition)||void 0===a?void 0:a.lang))return Promise.reject("Failed to get fonts: configuration.recognition.lang is required!");const l=i.server,d=yield fetch(`${l.scheme}://${l.host}/api/v4.0/iink/font/google/language/`+i.recognition.lang),{result:c}=yield d.json();return c.sort()}))},getAvailableLanguageList:function getAvailableLanguageList(i){var s,n;return __awaiter(this,void 0,void 0,(function*(){if((null===(s=null==i?void 0:i.server)||void 0===s?void 0:s.scheme)&&(null===(n=null==i?void 0:i.server)||void 0===n?void 0:n.host)){const s=i.server;return(yield fetch(`${s.scheme}://${s.host}/api/v4.0/iink/availableLanguageList`)).json()}return Promise.reject("Failed to get languages: configuration.server.scheme & configuration.server.host are required!")}))}}),$t=Object.freeze({__proto__:null,RestBehaviors:RestBehaviors,WSBehaviors:WSBehaviors}),Vt=Object.freeze({__proto__:null,RestRecognizer:RestRecognizer,WSRecognizer:WSRecognizer}),Jt=Object.freeze({__proto__:null,quadradicsUtils:De,CanvasRenderer:CanvasRenderer,CanvasStroker:CanvasStroker,canvasRendererShape:ke,canvasRendererStroke:Me,canvasRendererText:Le,SVGStroker:SVGStroker,WSSVGRenderer:WSSVGRenderer}),qt=Object.freeze({__proto__:null,PointerEventGrabber:PointerEventGrabber}),Yt=Object.freeze({__proto__:null,DefaultPenStyle:Ve,DefaultTheme:Je,StyleHelper:Oe,StyleManager:StyleManager}),Zt=Object.freeze({__proto__:null,Model:Model,Stroke:Stroke,convertStrokeToJSON:convertStrokeToJSON}),Kt=Object.freeze({__proto__:null,InternalEvent:InternalEvent,PublicEvent:PublicEvent});i.Editor=class Editor{constructor(i,s,n="ms-editor"){xt.add(this),Et.set(this,void 0),Ct.set(this,void 0),kt.set(this,void 0),Mt.set(this,void 0),Tt.set(this,void 0),Lt.set(this,void 0),this.showStrokesPan=!1,jt.set(this,(i=>{this.events.emitChanged(i)})),Ht.set(this,(i=>{this.events.emitIdle(i)})),__classPrivateFieldSet(this,Lt,Object.assign({},u,s.logger),"f"),this.logger=LoggerManager.getLogger("EDITOR"),this.logger.info("constructor",{wrapperHTML:i,options:s,globalClassCss:n}),__classPrivateFieldSet(this,Tt,new DeferredPromise,"f"),this.wrapperHTML=i,this.wrapperHTML.classList.add(n),this.events.setElement(this.wrapperHTML),__classPrivateFieldSet(this,Et,document.createElement("div"),"f"),__classPrivateFieldGet(this,Et,"f").classList.add("loader"),__classPrivateFieldGet(this,Et,"f").style.display="none",this.wrapperHTML.appendChild(__classPrivateFieldGet(this,Et,"f")),__classPrivateFieldSet(this,Ct,document.createElement("div"),"f"),__classPrivateFieldGet(this,Ct,"f").classList.add("message"),__classPrivateFieldGet(this,Ct,"f").style.display="none",this.wrapperHTML.appendChild(__classPrivateFieldGet(this,Ct,"f")),__classPrivateFieldGet(this,xt,"m",It).call(this,s)}get loggerConfiguration(){return __classPrivateFieldGet(this,Lt,"f")}set loggerConfiguration(i){__classPrivateFieldSet(this,Lt,i,"f"),LoggerManager.setLoggerLevel(i)}get initializationPromise(){return __classPrivateFieldGet(this,Tt,"f").promise}get model(){return this.behaviors.model}get behaviors(){return __classPrivateFieldGet(this,kt,"f")}get configuration(){return this.behaviors.configuration}set configuration(i){this.logger.info("set configuration",{configuration:i}),__classPrivateFieldGet(this,xt,"m",It).call(this,{configuration:i}),this.initialize()}get intention(){return this.behaviors.intention}set intention(i){if(this.logger.info("set intention",{m:i}),this.behaviors.intention=i,"erase"===this.behaviors.intention)this.wrapperHTML.classList.add("erasing"),this.wrapperHTML.classList.remove("selecting");else this.logger.warn("set intention default",{m:i}),document.body.style.cursor="initial",this.wrapperHTML.classList.remove("erasing"),this.wrapperHTML.classList.remove("selecting");this.logger.debug("set intention",this.wrapperHTML)}get events(){return PublicEvent.getInstance()}get context(){return this.behaviors.context}get grabber(){return this.behaviors.grabber}get currentPenStyle(){return this.behaviors.currentPenStyle}get penStyle(){return this.behaviors.penStyle}set penStyle(i){this.logger.info("set penStyle",{ps:i}),this.behaviors.setPenStyle(i)}get theme(){return this.behaviors.theme}set theme(i){this.logger.info("set theme",{t:i}),this.behaviors.setTheme(i)}get penStyleClasses(){return this.behaviors.penStyleClasses}set penStyleClasses(i){this.logger.info("set penStyleClasses",{psc:i}),this.behaviors.setPenStyleClasses(i)}initialize(){return __awaiter(this,void 0,void 0,(function*(){this.logger.info("initialize"),yield __classPrivateFieldGet(this,xt,"m",Dt).call(this),__classPrivateFieldGet(this,xt,"m",At).call(this),__classPrivateFieldGet(this,xt,"m",zt).call(this)}))}waitForIdle(){return __awaiter(this,void 0,void 0,(function*(){if(this.behaviors.waitForIdle)return this.behaviors.waitForIdle()}))}undo(){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("undo",this.model),this.logger.info("undo",{}),yield __classPrivateFieldGet(this,Tt,"f").promise,yield this.behaviors.undo(),__classPrivateFieldGet(this,xt,"m",Wt).call(this),this.logger.debug("undo",this.model),this.model}))}redo(){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("redo",this.model),this.logger.info("redo"),yield __classPrivateFieldGet(this,Tt,"f").promise,yield this.behaviors.redo(),__classPrivateFieldGet(this,xt,"m",Wt).call(this),this.logger.debug("redo",this.model),this.model}))}clear(){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("clear",this.model),this.logger.info("clear"),yield __classPrivateFieldGet(this,Tt,"f").promise,yield this.behaviors.clear(),this.events.emitCleared(this.model),__classPrivateFieldGet(this,xt,"m",Wt).call(this),this.logger.debug("clear",this.model),this.model}))}resize(){var i;return __awaiter(this,void 0,void 0,(function*(){this.logger.debug("resize",this.model),this.logger.info("resize"),yield __classPrivateFieldGet(this,Tt,"f").promise,this.configuration.rendering.smartGuide.enable&&(null===(i=__classPrivateFieldGet(this,Mt,"f"))||void 0===i||i.resize());const s=window.getComputedStyle(this.wrapperHTML),n=Math.max(parseInt(s.height.replace("px","")),this.configuration.rendering.minHeight),a=Math.max(parseInt(s.width.replace("px","")),this.configuration.rendering.minWidth);return yield this.behaviors.resize(n,a),this.logger.debug("resize",this.model),this.model}))}export(i){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("export",this.model),this.logger.info("export",{mimeTypes:i}),yield __classPrivateFieldGet(this,Tt,"f").promise,yield this.behaviors.export(i),this.logger.debug("export",this.model),this.model}))}convert(i){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("convert",this.model),this.logger.info("export",{params:i}),yield __classPrivateFieldGet(this,Tt,"f").promise,yield this.behaviors.convert(null==i?void 0:i.conversionState,null==i?void 0:i.mimeTypes),this.events.emitConverted(this.model.converts),this.logger.debug("convert",this.model),this.model}))}import(i,s){return __awaiter(this,void 0,void 0,(function*(){if(this.logger.debug("import",this.model),this.logger.info("import",{data:i,mimeType:s}),yield __classPrivateFieldGet(this,Tt,"f").promise,this.behaviors.import){let n;return n=i instanceof Blob?i:"string"==typeof i?new Blob([i]):new Blob([JSON.stringify(i)]),yield this.behaviors.import(n,s),this.events.emitImported(this.model.exports),this.logger.debug("import",this.model),this.model}return Promise.reject("Import impossible, behaviors has no import function")}))}importPointEvents(i){return __awaiter(this,void 0,void 0,(function*(){return this.logger.debug("importPointEvents",this.model),this.logger.info("importPointEvents",{strokes:i}),yield __classPrivateFieldGet(this,Tt,"f").promise,this.behaviors.importPointEvents?(yield this.behaviors.importPointEvents(i),this.events.emitImported(this.model.exports),this.logger.debug("importPointEvents",this.model),this.model):Promise.reject("Import impossible, behaviors has no importPointEvents function")}))}},i.behaviors=$t,i.configuration=y,i.constants=be,i.event=Kt,i.grabber=qt,i.logger=f,i.model=Zt,i.recognizer=Vt,i.renderer=Jt,i.smartguide=Ee,i.style=Yt,i.undoredo=bt,i.utils=Ut,Object.defineProperty(i,"__esModule",{value:!0})})); +//# sourceMappingURL=iink.min.js.map diff --git a/dist/iink.min.js.map b/dist/iink.min.js.map new file mode 100644 index 000000000..15e43e81b --- /dev/null +++ b/dist/iink.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"iink.min.js","sources":["../node_modules/tslib/tslib.es6.mjs","../src/configuration/DefaultConfiguration.ts","../src/utils/MergeHelper.ts","../src/logger/logger.ts","../src/logger/loggerManager.ts","../src/configuration/Configuration.ts","../src/@types/configuration/LoggerConfiguration.ts","../src/Constants.ts","../src/event/PublicEvent.ts","../src/event/InternalEvent.ts","../src/smartguide/SmartGuide.ts","../src/utils/DeferredPromise.ts","../src/grabber/PointerEventGrabber.ts","../src/renderer/canvas/CanvasRendererShapeSymbol.ts","../src/renderer/canvas/CanvasRendererStrokeSymbol.ts","../src/renderer/canvas/CanvasRendererTextSymbol.ts","../src/renderer/QuadraticUtils.ts","../src/renderer/canvas/CanvasStroker.ts","../src/renderer/canvas/CanvasRenderer.ts","../node_modules/json-css/lib/jsoncss.min.js","../src/style/StyleHelper.ts","../node_modules/crypto-js/core.js","../node_modules/crypto-js/enc-hex.js","../node_modules/crypto-js/x64-core.js","../node_modules/crypto-js/sha512.js","../node_modules/crypto-js/hmac.js","../node_modules/crypto-js/hmac-sha512.js","../src/utils/CryptoHelper.ts","../src/utils/version.ts","../src/model/Stroke.ts","../src/recognizer/RestRecognizer.ts","../src/undo-redo/UndoRedoContext.ts","../src/undo-redo/UndoRedoManager.ts","../src/style/DefaultPenStyle.ts","../src/style/DefaultTheme.ts","../src/style/StyleManager.ts","../src/utils/geometric.ts","../src/model/Model.ts","../src/behaviors/RestBehaviors.ts","../src/recognizer/WSRecognizer.ts","../src/renderer/svg/SVGStroker.ts","../src/renderer/svg/WSSVGRenderer.ts","../src/behaviors/WSBehaviors.ts","../node_modules/style-inject/dist/style-inject.es.js","../src/Editor.ts","../src/utils/font.ts","../src/utils/language.ts"],"sourcesContent":["/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n};\n","import { TConfiguration } from \"../@types/configuration\"\nimport { TGrabberConfiguration } from \"../@types/configuration/GrabberConfiguration\"\nimport { TRenderingConfiguration } from \"../@types/configuration/RenderingConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TTriggerConfiguration } from \"../@types/configuration/TriggerConfiguration\"\nimport { TEventConfiguration } from \"../@types/configuration/EventConfiguration\"\nimport { TUndoRedoConfiguration } from \"../@types/configuration/UndoRedoConfiguration\"\nimport { TLoggerConfiguration, LoggerClass, LoggerLevel } from \"../@types/configuration/LoggerConfiguration\"\n\nexport const DefaultServerConfiguration: TServerConfiguration = {\n protocol: \"WEBSOCKET\",\n scheme: \"https\",\n host: \"cloud.myscript.com\",\n applicationKey: \"\",\n hmacKey: \"\",\n version: \"2.1.0\",\n useWindowLocation: false,\n websocket: {\n pingEnabled: true,\n pingDelay: 30000,\n maxPingLostCount: 10,\n autoReconnect: true,\n maxRetryCount: 2,\n fileChunkSize: 300000\n }\n}\n\nexport const DefaultRecognitionConfiguration: TRecognitionConfiguration = {\n type: \"TEXT\",\n alwaysConnected: true,\n lang: \"en_US\",\n gesture: {\n enable: true\n },\n export: {\n \"image-resolution\": 300,\n jiix: {\n \"bounding-box\": false,\n strokes: false,\n text: {\n chars: false,\n words: true\n }\n },\n },\n renderer: {\n debug: {\n \"draw-text-boxes\": false,\n \"draw-image-boxes\": false\n }\n },\n math: {\n mimeTypes: [\"application/vnd.myscript.jiix\"], // \"application/mathml+xml\", \"application/x-latex\" ,\n solver: {\n enable: true,\n \"fractional-part-digits\": 3,\n \"decimal-separator\": \".\",\n \"rounding-mode\": \"half up\",\n \"angle-unit\": \"deg\"\n },\n margin: {\n bottom: 10,\n left: 15,\n right: 15,\n top: 10\n },\n eraser: {\n \"erase-precisely\": false\n },\n \"undo-redo\": {\n mode: \"stroke\"\n }\n },\n text: {\n guides: {\n enable: true\n },\n mimeTypes: [\"application/vnd.myscript.jiix\"], // \"text/plain\"\n margin: {\n top: 20,\n left: 10,\n right: 10,\n bottom: 10\n },\n eraser: {\n \"erase-precisely\": false\n }\n },\n diagram: {\n mimeTypes: [\"application/vnd.myscript.jiix\"], // \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n eraser: {\n \"erase-precisely\": false\n },\n convert: {\n \"match-text-size\": true\n }\n },\n \"raw-content\": {\n recognition: {\n text: true,\n shape: true\n },\n eraser: {\n \"erase-precisely\": false\n }\n }\n}\n\nexport const DefaultGrabberConfiguration: TGrabberConfiguration = {\n listenerOptions: {\n capture: false,\n passive: true\n },\n xyFloatPrecision: 0,\n timestampFloatPrecision: 0\n}\n\nexport const DefaultRenderingConfiguration: TRenderingConfiguration = {\n minHeight: 100,\n minWidth: 100,\n smartGuide: {\n enable: true,\n fadeOut: {\n enable: false,\n duration: 5000\n }\n },\n guides: {\n enable: true,\n gap: 50\n }\n}\n\nexport const DefaultTriggerConfiguration: TTriggerConfiguration = {\n exportContent: \"POINTER_UP\",\n exportContentDelay: 1000,\n resizeTriggerDelay: 100\n}\n\nexport const DefaultEventsConfiguration: TEventConfiguration = {\n processDelay: 10\n}\n\nexport const DefaultUndoRedoConfiguration: TUndoRedoConfiguration = {\n maxStackSize: 100\n}\n\nexport const DefaultConfiguration: TConfiguration = {\n server: DefaultServerConfiguration,\n recognition: DefaultRecognitionConfiguration,\n grabber: DefaultGrabberConfiguration,\n rendering: DefaultRenderingConfiguration,\n triggers: DefaultTriggerConfiguration,\n events: DefaultEventsConfiguration,\n \"undo-redo\": DefaultUndoRedoConfiguration\n}\n\nexport const DefaultLoggerConfiguration: TLoggerConfiguration = {\n [LoggerClass.EDITOR]: LoggerLevel.ERROR,\n [LoggerClass.BEHAVIORS]: LoggerLevel.ERROR,\n [LoggerClass.RECOGNIZER]: LoggerLevel.ERROR,\n [LoggerClass.GRABBER]: LoggerLevel.ERROR,\n [LoggerClass.RENDERER]: LoggerLevel.ERROR,\n [LoggerClass.CONFIGURATION]: LoggerLevel.ERROR,\n [LoggerClass.PUBLIC_EVENT]: LoggerLevel.ERROR,\n [LoggerClass.INTERNALEVENT]: LoggerLevel.ERROR,\n [LoggerClass.MODEL]: LoggerLevel.ERROR,\n [LoggerClass.STROKE]: LoggerLevel.ERROR,\n [LoggerClass.SMARTGUIDE]: LoggerLevel.ERROR,\n [LoggerClass.STYLEMANAGER]: LoggerLevel.ERROR,\n [LoggerClass.UNDOREDO_MANAGER]: LoggerLevel.ERROR,\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const mergeDeep = (target: any, ...sources: any[]): any =>\n {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const isObject = (item: any) =>\n {\n return (item && typeof item === \"object\" && !Array.isArray(item))\n }\n if (!sources.length) return target\n const source = sources.shift()\n\n if (isObject(target) && isObject(source)) {\n for (const key in source) {\n if (isObject(source[key])) {\n if (!target[key]) {\n Object.assign(target, { [key]: {} })\n }\n mergeDeep(target[key], source[key])\n } else {\n Object.assign(target, { [key]: source[key] })\n }\n }\n }\n\n return mergeDeep(target, ...sources)\n }\n","import { LoggerClass, LoggerLevel } from \"../@types\"\n\nexport class Logger\n{\n instanceName: LoggerClass\n level: LoggerLevel\n\n constructor(instanceName: LoggerClass, level: LoggerLevel)\n {\n this.instanceName = instanceName\n this.level = level\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n debug(...data: any)\n {\n if (LoggerLevel.DEBUG >= this.level) {\n const dataLog = {\n from: this.instanceName,\n message: data,\n }\n console.debug(dataLog)\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n info(...data: any)\n {\n if (LoggerLevel.INFO >= this.level) {\n const dataLog = {\n from: this.instanceName,\n message: data,\n }\n console.info(dataLog)\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n warn(...data: any)\n {\n if (LoggerLevel.WARN >= this.level) {\n const dataLog = {\n from: this.instanceName,\n message: data,\n }\n console.warn(dataLog)\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error(...error: any)\n {\n const dataLog = {\n from: this.instanceName,\n error,\n }\n console.error(dataLog)\n }\n}\n","import { TLoggerConfiguration } from \"../@types\"\nimport { LoggerClass, LoggerLevel } from \"../Constants\"\nimport { Logger } from \"./logger\"\n\nexport class LoggerManager\n{\n static #loggerMap: Map = new Map()\n static getLogger(name: LoggerClass): Logger {\n if(!this.#loggerMap.has(name))\n {\n this.#loggerMap.set(name, new Logger(name, LoggerLevel.ERROR))\n }\n return this.#loggerMap.get(name) as Logger\n }\n\n static setLoggerLevel(config: TLoggerConfiguration)\n {\n\n Object.keys(config).forEach((lc) => {\n LoggerManager.getLogger(lc as LoggerClass).level = config[lc as LoggerClass]\n })\n }\n}\n","\nimport { TConfiguration, TConfigurationClient } from \"../@types/configuration\"\nimport { TEventConfiguration } from \"../@types/configuration/EventConfiguration\"\nimport { TGrabberConfiguration } from \"../@types/configuration/GrabberConfiguration\"\nimport { TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TRenderingConfiguration } from \"../@types/configuration/RenderingConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { TTriggerConfiguration } from \"../@types/configuration/TriggerConfiguration\"\nimport { TUndoRedoConfiguration } from \"../@types/configuration/UndoRedoConfiguration\"\nimport { DefaultConfiguration } from \"./DefaultConfiguration\"\nimport { mergeDeep } from \"../utils/MergeHelper\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class Configuration implements TConfiguration\n{\n events: TEventConfiguration\n grabber: TGrabberConfiguration\n recognition: TRecognitionConfiguration\n rendering: TRenderingConfiguration\n server: TServerConfiguration\n triggers: TTriggerConfiguration\n \"undo-redo\": TUndoRedoConfiguration\n #logger = LoggerManager.getLogger(LoggerClass.CONFIGURATION)\n\n constructor(configuration?: TConfigurationClient)\n {\n this.#logger.info(\"constructor\", { configuration })\n this.events = JSON.parse(JSON.stringify(DefaultConfiguration.events))\n this.grabber = JSON.parse(JSON.stringify(DefaultConfiguration.grabber))\n this.recognition = JSON.parse(JSON.stringify(DefaultConfiguration.recognition))\n this.rendering = JSON.parse(JSON.stringify(DefaultConfiguration.rendering))\n this.server = JSON.parse(JSON.stringify(DefaultConfiguration.server))\n this.triggers = JSON.parse(JSON.stringify(DefaultConfiguration.triggers))\n\n this.overrideDefaultConfiguration(configuration)\n }\n\n overrideDefaultConfiguration(configuration?: TConfigurationClient): void\n {\n this.#logger.info(\"overrideDefaultConfiguration\", { configuration })\n const defaultConf = JSON.parse(JSON.stringify(DefaultConfiguration))\n this.events = mergeDeep({}, defaultConf.events, configuration?.events)\n this.grabber = mergeDeep({}, defaultConf.grabber, configuration?.grabber)\n this.recognition = mergeDeep({}, defaultConf.recognition, configuration?.recognition)\n this.rendering = mergeDeep({}, defaultConf.rendering, configuration?.rendering)\n this.server = mergeDeep({}, defaultConf.server, configuration?.server)\n this.triggers = mergeDeep({}, defaultConf.triggers, configuration?.triggers)\n this[\"undo-redo\"] = mergeDeep({}, defaultConf[\"undo-redo\"], configuration?.[\"undo-redo\"])\n\n this.recognition.text.mimeTypes = configuration?.recognition?.text?.mimeTypes || defaultConf.recognition.text.mimeTypes\n this.recognition.math.mimeTypes = configuration?.recognition?.math?.mimeTypes || defaultConf.recognition.math.mimeTypes\n this.recognition.diagram.mimeTypes = configuration?.recognition?.diagram?.mimeTypes || defaultConf.recognition.diagram.mimeTypes\n\n if (this.server?.useWindowLocation) {\n this.server.scheme = window.location.protocol.indexOf(\"s\") > -1 ? \"https\" : \"http\"\n this.server.host = window.location.host\n }\n\n if (\n this.server.protocol === \"REST\" &&\n this.triggers.exportContent === \"POINTER_UP\"\n ) {\n this.triggers.exportContent = \"QUIET_PERIOD\"\n this.triggers.exportContentDelay = Math.max(this.triggers.exportContentDelay, 50)\n }\n\n if (\n this.server.protocol === \"WEBSOCKET\" &&\n this.recognition.type === \"TEXT\"\n ) {\n if (\n this.rendering.smartGuide.enable &&\n !this.recognition.text.mimeTypes.includes(\"application/vnd.myscript.jiix\")\n ) {\n // mimeType required for smartGuide\n this.recognition.text.mimeTypes.push(\"application/vnd.myscript.jiix\")\n }\n } else {\n // smartGuide enable only on websocket text\n this.rendering.smartGuide.enable = false\n }\n this.#logger.debug(\"overrideDefaultConfiguration\", { configuration: this })\n }\n}\n","\n/**\n * @group Logger\n */\nexport const enum LoggerLevel {\n DEBUG = \"1\",\n INFO = \"2\",\n WARN = \"3\",\n ERROR = \"4\"\n }\n\n/**\n * @group Logger\n */\n export const enum LoggerClass {\n EDITOR = \"EDITOR\",\n RECOGNIZER = \"RECOGNIZER\",\n GRABBER = \"GRABBER\",\n BEHAVIORS = \"BEHAVIORS\",\n CONFIGURATION = \"CONFIGURATION\",\n PUBLIC_EVENT = \"PUBLIC_EVENT\",\n MODEL = \"MODEL\",\n RENDERER = \"RENDERER\",\n SMARTGUIDE = \"SMARTGUIDE\",\n STYLEMANAGER = \"STYLEMANAGER\",\n UNDOREDO_MANAGER = \"UNDOREDO_MANAGER\",\n STROKE = \"STROKE\",\n INTERNALEVENT = \"INTERNALEVENT\"\n }\n\n export type TLoggerConfiguration = {\n [key in keyof typeof LoggerClass]: LoggerLevel\n }\n","/**\n * @group Error\n * @remarks List all errors generated by the backend with their descriptions\n */\nexport const Error = {\n NO_ACTIVITY: \"Session closed due to no activity.\",\n WRONG_CREDENTIALS: \"Application credentials are invalid. Please check or regenerate your application key and hmackey.\",\n TOO_OLD: \"Session is too old. Max Session Duration Reached.\",\n UNKNOW: \"An unknown error has occurred.\",\n ABNORMAL_CLOSURE: \"MyScript recognition server is not reachable.\",\n CANT_ESTABLISH: \"Unable to establish a connection to MyScript recognition server. Check the host and your connectivity.\",\n GOING_AWAY: \"MyScript recognition server is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection.\",\n PROTOCOL_ERROR: \"MyScript recognition server terminated the connection due to a protocol error.\",\n UNSUPPORTED_DATA: \"MyScript recognition server terminated the connection because the endpoint received data of a type it cannot accept. (For example, a text-only endpoint received binary data.)\",\n INVALID_FRAME_PAULOAD: \"MyScript recognition server terminated the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message).\",\n POLICY_VIOLATION: \"MyScript recognition server terminated the connection because it received a message that violates its policy.\",\n MESSAGE_TOO_BIG: \"MyScript recognition server terminated the connection because a data frame was received that is too large.\",\n INTERNAL_ERROR: \"MyScript recognition server terminated the connection because it encountered an unexpected condition that prevented it from fulfilling the request.\",\n SERVICE_RESTART: \"MyScript recognition server terminated the connection because it is restarting.\",\n TRY_AGAIN: \"MyScript recognition server terminated the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients.\",\n BAD_GATEWAY: \"MyScript recognition server was acting as a gateway or proxy and received an invalid response from the upstream server.\",\n TLS_HANDSHAKE: \"MyScript recognition server connection was closed due to a failure to perform a TLS handshake\"\n} as const\n\n/**\n * @event\n * @remarks Lists all events that can be listened to on the editor or DOM element\n */\nexport const EventType = {\n /**\n * @event\n * event emitted when history has changed i.e. the context of undo-redo\n */\n CHANGED: \"changed\",\n /**\n * @event\n * event emitted when clearing is complete\n */\n CLEARED: \"cleared\",\n /**\n * @event\n * event emitted after the conversion is complete\n */\n CONVERTED: \"converted\",\n /**\n * @event\n * event emitted when the editor encounters an error\n */\n ERROR: \"error\",\n /**\n * @event\n * event emitted on click on pointer events\n */\n POINTEREVENTS: \"pointer_events\",\n /**\n * @event\n * event emitted after the end of the export\n */\n EXPORTED: \"exported\",\n /**\n * @event\n * event emitted after the end of the import\n */\n IMPORTED: \"imported\",\n /**\n * @event\n * event emitted when the server is idle after a job\n */\n IDLE: \"idle\",\n /**\n * @event\n * event emitted after full editor initialization\n */\n LOADED: \"loaded\",\n} as const\n\n/**\n * @event\n * @internal\n * @remarks Lists all internal library events\n */\nexport const InternalEventType = {\n SVG_PATCH: \"internal_svg_patch\",\n EXPORTED: \"internal_exported\",\n CLEAR_MESSAGE: \"internal_clear_message\",\n ERROR: \"internal_error\",\n NOTIF: \"internal_notif\",\n IMPORT_JIIX: \"internal_import_jiix\",\n CONVERT: \"internal_convert\",\n CLEAR: \"internal_clear\",\n CONTEXT_CHANGE: \"internal_context_change\",\n IDLE: \"internal_idle\",\n WS_CLOSED: \"internal_websocket_closed\",\n} as const\n\n/**\n * @group Export\n * @remarks List all supported MIME types for export. Attention, the MIME types supported depend on the {@link TRecognitionType | type of recognition}\n */\nexport const enum ExportType {\n JIIX = \"application/vnd.myscript.jiix\",\n TEXT = \"text/plain\",\n LATEX = \"application/x-latex\",\n MATHML = \"application/mathml+xml\",\n SVG = \"image/svg+xml\",\n OFFICE_DOCUMENT = \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"\n}\n\n/**\n * @group Editor\n * @remarks List the possibilities of interactions\n */\nexport const enum Intention\n{\n Write = \"write\",\n Erase = \"erase\",\n // Selecting = \"selecting\"\n}\n\n/**\n * @group Logger\n */\nexport { LoggerClass, LoggerLevel } from \"./@types/configuration/LoggerConfiguration\"\n","import { IModel, TExport } from \"../@types/model/Model\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { EventType } from \"../Constants\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class PublicEvent extends EventTarget\n{\n static #instance: PublicEvent\n #element?: HTMLElement\n #logger = LoggerManager.getLogger(LoggerClass.PUBLIC_EVENT)\n\n private constructor()\n {\n super()\n }\n\n public static getInstance(): PublicEvent\n {\n if (!PublicEvent.#instance) {\n PublicEvent.#instance = new PublicEvent()\n }\n\n return PublicEvent.#instance\n }\n\n setElement(el: HTMLElement)\n {\n this.#logger.info(\"setElement\", { el })\n this.#element = el\n }\n\n #emit(type: string, data?: unknown): void\n {\n const evt = new CustomEvent(type, Object.assign({ bubbles: true, composed: true }, data ? { detail: data } : undefined))\n this.dispatchEvent(evt)\n this.#element?.dispatchEvent(evt)\n }\n\n emitLoaded(): void\n {\n this.#logger.info(\"emitLoaded\")\n this.#emit(EventType.LOADED)\n }\n\n emitExported(exports: TExport): void\n {\n this.#logger.info(\"emitExported\", { exports })\n this.#emit(EventType.EXPORTED, exports)\n }\n\n emitChanged(undoRedoContext: TUndoRedoContext): void\n {\n this.#logger.info(\"emitChanged\", { undoRedoContext })\n this.#emit(EventType.CHANGED, {\n ...undoRedoContext,\n canClear: !undoRedoContext.empty\n })\n }\n\n emitIdle(idle: boolean): void\n {\n this.#logger.info(\"emitIdle\", { idle })\n this.#emit(EventType.IDLE, idle)\n }\n\n emitCleared(model?: IModel): void\n {\n this.#logger.info(\"emitCleared\", { model })\n this.#emit(EventType.CLEARED, model)\n }\n\n emitConverted(exports: TExport): void\n {\n this.#logger.info(\"emitConverted\", { exports })\n this.#emit(EventType.CONVERTED, exports)\n }\n\n emitImported(exports: TExport): void\n {\n this.#logger.info(\"emitImported\", { exports })\n this.#emit(EventType.IMPORTED, exports)\n }\n}\n","import { TConverstionState } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TExport, TJIIXExport } from \"../@types/model/Model\"\nimport { TWebSocketSVGPatchEvent } from \"../@types/recognizer/WSRecognizer\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { InternalEventType } from \"../Constants\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class InternalEvent extends EventTarget\n{\n static #instance: InternalEvent\n #abortController: AbortController\n #logger = LoggerManager.getLogger(LoggerClass.INTERNALEVENT)\n\n private constructor()\n {\n super()\n this.#logger.info(\"constructor\")\n this.#abortController = new AbortController()\n }\n\n public static getInstance(): InternalEvent\n {\n if (!InternalEvent.#instance) {\n InternalEvent.#instance = new InternalEvent()\n }\n\n return InternalEvent.#instance\n }\n\n removeAllListeners(): void\n {\n this.#logger.info(\"removeAllListeners\")\n this.#abortController.abort()\n this.#abortController = new AbortController()\n }\n\n #emit(type: string, data?: unknown): void\n {\n this.dispatchEvent(new CustomEvent(type, Object.assign({ bubbles: true, composed: true }, data ? { detail: data } : undefined)))\n }\n\n emitSVGPatch(patchChange: TWebSocketSVGPatchEvent): void\n {\n this.#logger.info(\"emitSVGPatch\", { patchChange })\n this.#emit(InternalEventType.SVG_PATCH, patchChange)\n }\n addSVGPatchListener(callback: (contentChange: TWebSocketSVGPatchEvent) => void): void\n {\n this.#logger.info(\"addSVGPatchListener\", { callback })\n this.addEventListener(InternalEventType.SVG_PATCH, (evt: unknown) => callback(((evt as CustomEvent).detail as TWebSocketSVGPatchEvent)), { signal: this.#abortController.signal })\n }\n\n emitExported(exports: TExport): void\n {\n this.#logger.info(\"emitExported\", { exports })\n this.#emit(InternalEventType.EXPORTED, exports)\n }\n addExportedListener(callback: (exports: TExport) => void): void\n {\n this.#logger.info(\"addExportedListener\", { callback })\n this.addEventListener(InternalEventType.EXPORTED, (evt: unknown) => callback(((evt as CustomEvent).detail as TExport)), { signal: this.#abortController.signal })\n }\n\n emitClearMessage(): void\n {\n this.#logger.info(\"emitClearMessage\", { })\n this.#emit(InternalEventType.CLEAR_MESSAGE)\n }\n addClearMessageListener(callback: () => void): void\n {\n this.#logger.info(\"addClearMessageListener\", { callback })\n this.addEventListener(InternalEventType.CLEAR_MESSAGE, () => callback(), { signal: this.#abortController.signal })\n }\n\n emitError(err: Error): void\n {\n this.#logger.info(\"emitError\", { err })\n this.#emit(InternalEventType.ERROR, err)\n }\n\n addErrorListener(callback: (err: Error) => void): void\n {\n this.#logger.info(\"addErrorListener\", { callback })\n this.addEventListener(InternalEventType.ERROR, (evt: unknown) => callback(((evt as CustomEvent).detail as Error)), { signal: this.#abortController.signal })\n }\n\n emitWSClosed(): void\n {\n this.#logger.info(\"emitWSClosed\", { })\n this.#emit(InternalEventType.WS_CLOSED)\n }\n addWSClosedListener(callback: () => void): void\n {\n this.#logger.info(\"addWSClosedListener\", { callback })\n this.addEventListener(InternalEventType.WS_CLOSED, () => callback(), { signal: this.#abortController.signal })\n }\n\n emitNotif(notif: { message: string, timeout?: number }): void\n {\n this.#logger.info(\"emitWNotif\", { notif })\n this.#emit(InternalEventType.NOTIF, notif)\n }\n addNotifListener(callback: (notif: { message: string, timeout?: number }) => void): void\n {\n this.#logger.info(\"addNotifListener\", { callback })\n this.addEventListener(InternalEventType.NOTIF, (evt: unknown) => callback(((evt as CustomEvent).detail as { message: string, timeout?: number })), { signal: this.#abortController.signal })\n }\n\n emitImportJIIX(jiix: TJIIXExport): void\n {\n this.#logger.info(\"emitImportJIIX\", { jiix })\n this.#emit(InternalEventType.IMPORT_JIIX, jiix)\n }\n addImportJIIXListener(callback: (jiix: TJIIXExport) => void): void\n {\n this.#logger.info(\"addImportJIIXListener\", { callback })\n this.addEventListener(InternalEventType.IMPORT_JIIX, (evt: unknown) => callback(((evt as CustomEvent).detail as TJIIXExport)), { signal: this.#abortController.signal })\n }\n\n emitConvert(conversionState: TConverstionState = \"DIGITAL_EDIT\"): void\n {\n this.#logger.info(\"emitConvert\", { conversionState })\n this.#emit(InternalEventType.CONVERT, conversionState)\n }\n addConvertListener(callback: (params?: { conversionState?: TConverstionState, mimeTypes?: string[] }) => void): void\n {\n this.#logger.info(\"addConvertListener\", { callback })\n this.addEventListener(InternalEventType.CONVERT, (evt: unknown) => callback(((evt as CustomEvent).detail as { conversionState?: TConverstionState, mimeTypes?: string[] })), { signal: this.#abortController.signal })\n }\n\n emitClear(): void\n {\n this.#logger.info(\"emitClear\")\n this.#emit(InternalEventType.CLEAR)\n }\n addClearListener(callback: () => void): void\n {\n this.#logger.info(\"addClearListener\", { callback })\n this.addEventListener(InternalEventType.CLEAR, () => callback(), { signal: this.#abortController.signal })\n }\n\n emitContextChange(context: TUndoRedoContext): void\n {\n this.#logger.info(\"emitContextChange\", { context })\n this.#emit(InternalEventType.CONTEXT_CHANGE, context)\n }\n addContextChangeListener(callback: (context: TUndoRedoContext) => void): void\n {\n this.#logger.info(\"addContextChangeListener\", { callback })\n this.addEventListener(InternalEventType.CONTEXT_CHANGE, (evt: unknown) => callback(((evt as CustomEvent).detail as TUndoRedoContext)), { signal: this.#abortController.signal })\n }\n\n emitIdle(idle: boolean): void\n {\n this.#logger.info(\"emitIdle\", { idle })\n this.#emit(InternalEventType.IDLE, idle)\n }\n addIdleListener(callback: (idle: boolean) => void): void\n {\n this.#logger.info(\"addIdleListener\", { callback })\n this.addEventListener(InternalEventType.IDLE, (evt: unknown) => callback(((evt as CustomEvent).detail as boolean)), { signal: this.#abortController.signal })\n }\n}\n","import { TMarginConfiguration } from \"../@types/configuration/recognition/MarginConfiguration\"\nimport { TRenderingConfiguration } from \"../@types/configuration/RenderingConfiguration\"\nimport { TJIIXExport, TWordExport } from \"../@types/model/Model\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class SmartGuide {\n uuid: string\n #smartGuideElement!: HTMLDivElement\n #prompterContainerElement!: HTMLDivElement\n #prompterTextElement!: HTMLDivElement\n #ellipsisElement!: HTMLDivElement\n #tagElement!: HTMLDivElement\n #candidatesElement!: HTMLDivElement\n #menuElement!: HTMLDivElement\n #convertElement!: HTMLButtonElement\n #copyElement!: HTMLButtonElement\n #deleteElement!: HTMLButtonElement\n #fadeOutTimout?: ReturnType\n #isMenuOpen!: boolean\n margin: TMarginConfiguration\n renderingConfiguration!: TRenderingConfiguration\n jiix?: TJIIXExport\n lastWord?: TWordExport\n wordToChange?: TWordExport\n #logger = LoggerManager.getLogger(LoggerClass.SMARTGUIDE)\n\n constructor() {\n this.#logger.info(\"constructor\", { })\n this.uuid = Math.random().toString(10).substring(2, 12)\n this.margin = {\n bottom: 0,\n left: 0,\n right: 0,\n top: 0\n }\n this.#createWrapperElement()\n this.#createPrompterContainerElement()\n this.#createPrompterTextElement()\n this.#createEllipsisElement()\n this.#createTagElement()\n this.#createCandidatesElement()\n this.#createMoreMenuElement()\n this.#createConvertElement()\n this.#createCopyElement()\n this.#createDeleteElement()\n }\n\n get internalEvent(): InternalEvent {\n return InternalEvent.getInstance()\n }\n\n #createWrapperElement(): void {\n this.#smartGuideElement = document.createElement(\"div\")\n this.#smartGuideElement.id = `smartguide-${this.uuid}`\n this.#smartGuideElement.classList.add(\"smartguide\")\n }\n\n #createPrompterContainerElement(): void {\n this.#prompterContainerElement = document.createElement(\"div\")\n this.#prompterContainerElement.id = `prompter-container-${this.uuid}`\n this.#prompterContainerElement.classList.add(\"prompter-container\")\n // this.#prompterContainerElement.appendChild(textElement)\n }\n\n #createPrompterTextElement(): void {\n this.#prompterTextElement = document.createElement(\"div\")\n this.#prompterTextElement.id = `prompter-text-${this.uuid}`\n this.#prompterTextElement.classList.add(\"prompter-text\")\n this.#prompterTextElement.setAttribute(\"touch-action\", \"none\")\n }\n\n #createEllipsisElement(): void {\n this.#ellipsisElement = document.createElement(\"div\")\n this.#ellipsisElement.id = `ellipsis-${this.uuid}`\n this.#ellipsisElement.classList.add(\"ellipsis\")\n this.#ellipsisElement.innerHTML = \"...\"\n }\n\n #createTagElement(): void {\n this.#tagElement = document.createElement(\"div\")\n this.#tagElement.id = `tag-icon-${this.uuid}`\n this.#tagElement.classList.add(\"tag-icon\")\n this.#tagElement.innerHTML = \"¶\"\n }\n\n #createCandidatesElement(): void {\n this.#candidatesElement = document.createElement(\"div\")\n this.#candidatesElement.id = `candidates-${this.uuid}`\n this.#candidatesElement.classList.add(\"candidates\")\n }\n\n #createMoreMenuElement(): void {\n this.#menuElement = document.createElement(\"div\")\n this.#menuElement.id = `more-menu-${this.uuid}`\n this.#menuElement.classList.add(\"more-menu\")\n }\n\n #createConvertElement(): void {\n this.#convertElement = document.createElement(\"button\")\n this.#convertElement.id = `convert-${this.uuid}`\n this.#convertElement.classList.add(\"options-label-button\")\n this.#convertElement.innerHTML = \"Convert\"\n }\n\n #createCopyElement(): void {\n this.#copyElement = document.createElement(\"button\")\n this.#copyElement.id = `copy-${this.uuid}`\n this.#copyElement.classList.add(\"options-label-button\")\n this.#copyElement.innerHTML = \"Copy\"\n }\n\n #createDeleteElement(): void {\n this.#deleteElement = document.createElement(\"button\")\n this.#deleteElement.id = `delete-${this.uuid}`\n this.#deleteElement.classList.add(\"options-label-button\")\n this.#deleteElement.innerHTML = \"Delete\"\n }\n\n init(domElement: HTMLElement, margin: TMarginConfiguration, renderingConfiguration: TRenderingConfiguration): void {\n this.#logger.info(\"init\", { domElement, margin, renderingConfiguration })\n domElement.appendChild(this.#smartGuideElement)\n this.#smartGuideElement.appendChild(this.#tagElement)\n\n this.#prompterContainerElement.appendChild(this.#prompterTextElement)\n this.#smartGuideElement.appendChild(this.#prompterContainerElement)\n\n this.#smartGuideElement.appendChild(this.#ellipsisElement)\n\n this.#menuElement.appendChild(this.#convertElement)\n this.#menuElement.appendChild(this.#copyElement)\n this.#menuElement.appendChild(this.#deleteElement)\n this.#smartGuideElement.appendChild(this.#menuElement)\n this.#menuElement.classList.add(\"close\")\n this.#isMenuOpen = false\n\n this.#smartGuideElement.appendChild(this.#candidatesElement)\n this.#candidatesElement.style.display = \"none\"\n this.margin = margin\n this.renderingConfiguration = renderingConfiguration\n this.#addListeners()\n\n this.#show()\n if (this.renderingConfiguration.smartGuide.fadeOut.enable) {\n this.#initFadeOutObserver(this.renderingConfiguration.smartGuide.fadeOut.duration)\n }\n\n this.resize()\n }\n\n #initFadeOutObserver(duration = 3000): void {\n const observer = new MutationObserver(() => {\n clearTimeout(this.#fadeOutTimout)\n if (\n !this.#smartGuideElement.classList.contains(\"smartguide-out\") &&\n this.#candidatesElement.style.display === \"none\" &&\n !this.#isMenuOpen\n ) {\n this.#fadeOutTimout = setTimeout(() => {\n this.#hide()\n }, duration)\n }\n })\n observer.observe(this.#smartGuideElement, { childList: true, subtree: true, attributes: true })\n }\n\n #show(): void {\n this.#smartGuideElement.classList.remove(\"smartguide-out\")\n this.#smartGuideElement.classList.add(\"smartguide-in\")\n }\n #hide(): void {\n this.#smartGuideElement.classList.add(\"smartguide-out\")\n this.#smartGuideElement.classList.remove(\"smartguide-in\")\n }\n\n #showCandidates = (target: HTMLElement) => {\n this.#logger.info(\"showCandidates\", { target })\n const wordId = parseInt(target.id.replace(\"word-\", \"\").replace(this.uuid, \"\"))\n const words = this.jiix?.words as TWordExport[]\n this.wordToChange = words[wordId]\n if (this.wordToChange) {\n this.wordToChange.id = wordId.toString()\n this.#candidatesElement.innerHTML = \"\"\n if (this.wordToChange?.candidates) {\n this.#candidatesElement.style.display = \"flex\"\n this.wordToChange.candidates.forEach((word, index) => {\n if (this.wordToChange?.label === word) {\n this.#candidatesElement.innerHTML += `${word}`\n } else {\n this.#candidatesElement.innerHTML += `${word}`\n }\n })\n const top = 48\n const left = target.getBoundingClientRect().left - 60\n this.#candidatesElement.style.top = `${top}px`\n this.#candidatesElement.style.left = `${left}px`\n\n const parent = target.parentNode?.parentNode?.parentNode\n if (parent) {\n parent.insertBefore(this.#candidatesElement, target.parentNode?.parentNode)\n }\n }\n }\n }\n #hideCandidates(): void {\n this.#candidatesElement.style.display = \"none\"\n }\n\n #openMenu(): void {\n this.#menuElement.classList.add(\"open\")\n this.#menuElement.classList.remove(\"close\")\n this.#isMenuOpen = true\n }\n #closeMenu(): void {\n this.#menuElement.classList.add(\"close\")\n this.#menuElement.classList.remove(\"open\")\n this.#isMenuOpen = false\n }\n\n #onClickEllipsis = (evt: Event) => {\n this.#logger.info(\"onClickEllipsis\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n this.#isMenuOpen ? this.#closeMenu() : this.#openMenu()\n this.#hideCandidates()\n }\n\n #onClickConvert = (evt: Event) => {\n this.#logger.info(\"onClickConvert\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n this.internalEvent.emitConvert()\n this.#closeMenu()\n }\n\n #onClickCopy = async (evt: Event): Promise => {\n this.#logger.info(\"onClickCopy\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n try {\n this.#closeMenu()\n let message = \"Nothing to copy\"\n if (this.#prompterTextElement.innerText) {\n message = `\"${this.#prompterTextElement.innerText}\" copied to clipboard`\n if (/iPad|iPhone|iPod/.test(navigator.userAgent)) {\n const permissionName = \"clipboard-write\" as PermissionName;\n const permissionStatus = await navigator.permissions.query({ name: permissionName });\n if (permissionStatus.state === \"granted\") {\n await navigator.clipboard.writeText(this.#prompterTextElement.innerText)\n }\n } else {\n await navigator.clipboard.writeText(this.#prompterTextElement.innerText)\n }\n }\n this.internalEvent.emitNotif({ message, timeout: 1500 })\n } catch (err) {\n this.#logger.error(\"onClickCopy\", { err })\n this.internalEvent.emitError(err as Error)\n }\n }\n\n #onClickDelete = (evt: Event) => {\n this.#logger.info(\"onClickDelete\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n this.internalEvent.emitClear()\n this.#closeMenu()\n }\n\n #onClickCandidate = (evt: Event) => {\n this.#logger.info(\"onClickCandidate\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n const target = evt.target as HTMLElement\n const candidate = target.innerText\n if (this.jiix && candidate !== this.wordToChange?.label && this.wordToChange?.candidates?.includes(candidate)) {\n this.jiix.words[parseInt(this.wordToChange?.id as string)].label = candidate\n this.internalEvent.emitImportJIIX(this.jiix)\n }\n this.#candidatesElement.style.display = \"none\"\n }\n\n #onClickPrompter = (evt: Event): void => {\n this.#logger.info(\"onClickPrompter\", { evt })\n evt.preventDefault()\n evt.stopPropagation()\n this.#closeMenu()\n const target = evt.target as HTMLElement\n if (target.id !== this.#prompterTextElement.id) {\n this.#showCandidates(target)\n } else {\n this.#hideCandidates()\n }\n\n }\n\n #onClickOutSide = () => {\n this.#hideCandidates()\n this.#closeMenu()\n }\n\n #addListeners(): void {\n this.#ellipsisElement.addEventListener(\"pointerdown\", this.#onClickEllipsis.bind(this))\n this.#convertElement.addEventListener(\"pointerdown\", this.#onClickConvert.bind(this))\n this.#copyElement.addEventListener(\"pointerdown\", this.#onClickCopy.bind(this))\n this.#deleteElement.addEventListener(\"pointerdown\", this.#onClickDelete.bind(this))\n this.#prompterTextElement.addEventListener(\"pointerdown\", this.#onClickPrompter.bind(this))\n this.#candidatesElement.addEventListener(\"pointerdown\", this.#onClickCandidate.bind(this))\n document.addEventListener(\"pointerdown\", this.#onClickOutSide.bind(this))\n }\n\n #removeListeners(): void {\n this.#ellipsisElement.removeEventListener(\"pointerdown\", this.#onClickEllipsis)\n this.#convertElement.removeEventListener(\"pointerdown\", this.#onClickConvert)\n this.#copyElement.removeEventListener(\"pointerdown\", this.#onClickCopy)\n this.#deleteElement.removeEventListener(\"pointerdown\", this.#onClickDelete)\n this.#prompterTextElement.removeEventListener(\"pointerdown\", this.#onClickPrompter)\n this.#candidatesElement.removeEventListener(\"pointerdown\", this.#onClickCandidate)\n document.removeEventListener(\"pointerdown\", this.#onClickOutSide)\n }\n\n resize(): void {\n this.#logger.info(\"resize\")\n const mmToPixels = 3.779527559\n const marginTop = this.margin.top * mmToPixels\n const marginLeft = this.margin.left * mmToPixels\n const marginRight = this.margin.right * mmToPixels\n // 12 is the space between line in mm\n const top = marginTop - (12 * mmToPixels)\n\n this.#smartGuideElement.style.top = `${top}px`\n this.#smartGuideElement.style.left = `${marginLeft}px`\n this.#smartGuideElement.style.right = `${marginRight}px`\n\n let left = this.#tagElement.offsetWidth\n this.#prompterContainerElement.style.marginLeft = `${left}px`\n this.#prompterContainerElement.style.width = `${this.#smartGuideElement.clientWidth - this.#tagElement.offsetWidth - this.#ellipsisElement.offsetHeight}px`\n left += this.#prompterContainerElement.offsetWidth\n this.#menuElement.style.left = `${left - this.#menuElement.offsetWidth + this.#ellipsisElement.offsetWidth}px`\n this.#menuElement.style.top = `${this.#ellipsisElement.offsetHeight}px`\n this.#ellipsisElement.style.left = `${left}px`\n }\n\n update(exports: TJIIXExport): void {\n this.#logger.info(\"update\", { exports })\n this.jiix = exports\n const createWordSpan = (index: number, word?: TWordExport) => {\n const span = document.createElement(\"span\")\n span.id = `word-${index}${this.uuid}`\n if (word) {\n span.textContent = word.label\n } else {\n span.innerHTML = \" \"\n }\n this.#logger.debug(\"update\", { span })\n return span\n }\n\n const populatePrompter = () => {\n this.#logger.info(\"populatePrompter\", { })\n this.#prompterTextElement.innerHTML = \"\"\n if (this.jiix?.words) {\n const words = this.jiix.words as TWordExport[]\n const myFragment = document.createDocumentFragment()\n words.forEach((word, index) => {\n if (word.label === \" \" || word.label.includes(\"\\n\")) {\n myFragment.appendChild(createWordSpan(index))\n } else if (index !== words.length - 1) {\n myFragment.appendChild(createWordSpan(index, word))\n } else {\n this.#prompterTextElement.appendChild(myFragment)\n if (this.lastWord) {\n this.lastWord = word\n }\n const span = createWordSpan(index, word)\n // This is used to scroll to last word if last word is modified\n\n if ((this.lastWord?.candidates !== word.candidates) && (this.lastWord?.label !== word.label)) {\n this.lastWord = word\n }\n if(this.wordToChange?.id === index.toString())\n {\n span.classList.add(\"modified-word\")\n this.wordToChange = undefined\n }\n else\n {\n span.classList.add(\"added-word\")\n }\n this.#prompterTextElement.appendChild(span)\n this.#prompterContainerElement.scrollLeft = span.offsetLeft\n this.#logger.debug(\"update => populatePrompter\", { span })\n this.#logger.debug(\"update => populatePrompter\", this.lastWord)\n }\n })\n }\n }\n populatePrompter()\n if (this.jiix?.words?.length) {\n this.#show()\n }\n }\n\n clear(): void {\n this.#logger.info(\"clear\")\n this.#prompterTextElement.innerHTML = \"\"\n this.#candidatesElement.innerHTML = \"\"\n this.#hide()\n }\n\n destroy(): void {\n this.#logger.info(\"destroy\")\n this.#removeListeners()\n this.#smartGuideElement.remove()\n }\n}\n","\nexport class DeferredPromise {\n promise: Promise\n resolve!: (value: T) => void\n reject!: (value: Error) => void\n\n isFullFilled: boolean\n isPending: boolean\n\n\n constructor()\n {\n this.isFullFilled = false\n this.isPending = true\n\n this.promise = new Promise((resolve, reject) =>\n {\n this.reject = async (v: unknown) =>\n {\n this.isFullFilled = true\n this.isPending = false\n return reject(v)\n }\n this.resolve = async (v: unknown) =>\n {\n this.isFullFilled = true\n this.isPending = false\n return resolve(v as T)\n }\n })\n }\n}\n","import { IGrabber } from \"../@types/grabber/Grabber\"\nimport { TGrabberConfiguration } from \"../@types/configuration/GrabberConfiguration\"\nimport { TPointer } from \"../@types/geometry\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class PointerEventGrabber implements IGrabber\n{\n private configuration: TGrabberConfiguration\n\n private domElement!: HTMLElement\n\n private activePointerId?: number\n\n private prevent = (e: Event) => e.preventDefault()\n #logger = LoggerManager.getLogger(LoggerClass.GRABBER)\n\n onPointerDown!: (evt: PointerEvent, point: TPointer) => void\n onPointerMove!: (evt: PointerEvent, point: TPointer) => void\n onPointerUp!: (evt: PointerEvent, point: TPointer) => void\n\n constructor(configuration: TGrabberConfiguration)\n {\n this.#logger.info(\"constructor\", { configuration })\n this.configuration = configuration\n }\n\n private roundFloat(oneFloat: number, requestedFloatPrecision: number): number\n {\n if (requestedFloatPrecision >= 0) {\n const floatPrecision: number = Math.pow(10, requestedFloatPrecision)\n return Math.round(oneFloat / floatPrecision) * floatPrecision\n }\n this.#logger.debug(\"roundFloat\", { oneFloat, requestedFloatPrecision })\n return oneFloat\n }\n\n private extractPoint(event: MouseEvent | TouchEvent): TPointer\n {\n let clientX: number, clientY: number\n if (\"changedTouches\" in event) {\n ({ clientX, clientY } = event.changedTouches[0])\n } else {\n ({ clientX, clientY } = event)\n }\n const rect: DOMRect = this.domElement.getBoundingClientRect()\n const pointer = {\n x: this.roundFloat(clientX - rect.left - this.domElement.clientLeft, this.configuration.xyFloatPrecision),\n y: this.roundFloat(clientY - rect.top - this.domElement.clientTop, this.configuration.xyFloatPrecision),\n t: this.roundFloat(Date.now(), this.configuration.timestampFloatPrecision),\n p: (event as PointerEvent).pressure || 1,\n }\n this.#logger.debug(\"extractPoint\", { event, pointer })\n return pointer\n }\n\n private pointerDownHandler = (evt: PointerEvent) =>\n {\n this.#logger.info(\"pointerDown\", { evt })\n // exit if not a left click or multi-touch\n if (evt.button !== 0 || evt.buttons !== 1) {\n return\n }\n\n this.activePointerId = evt.pointerId\n\n if (this.onPointerDown) {\n const point = this.extractPoint(evt)\n this.onPointerDown(evt, point)\n }\n }\n\n private pointerMoveHandler = (evt: PointerEvent) =>\n {\n this.#logger.info(\"pointerMove\", { evt })\n if (this.activePointerId != undefined && this.activePointerId === evt.pointerId) {\n if (this.onPointerMove) {\n const point = this.extractPoint(evt)\n this.onPointerMove(evt, point)\n }\n }\n }\n\n private pointerUpHandler = (evt: PointerEvent) =>\n {\n this.#logger.info(\"pointerUp\", { evt })\n if (this.activePointerId != undefined && this.activePointerId === evt.pointerId) {\n this.activePointerId = undefined\n evt.stopPropagation()\n if (this.onPointerUp) {\n const point = this.extractPoint(evt)\n this.onPointerUp(evt, point)\n }\n }\n }\n\n attach(domElement: HTMLElement)\n {\n this.#logger.info(\"attach\", { domElement })\n if (this.domElement) {\n this.detach()\n }\n this.domElement = domElement\n this.domElement.addEventListener(\"pointerdown\", this.pointerDownHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointermove\", this.pointerMoveHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointerup\", this.pointerUpHandler, this.configuration.listenerOptions)\n // this.domElement.addEventListener(\"pointerout\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointerleave\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement.addEventListener(\"pointercancel\", this.pointerUpHandler, this.configuration.listenerOptions)\n\n this.domElement.addEventListener(\"touchmove\", this.prevent)\n\n // FIXME investigate why this is needed for iOS devices\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n document.documentElement.addEventListener(\"pointerdown\", () => { })\n }\n\n detach()\n {\n this.#logger.info(\"detach\")\n this.domElement?.removeEventListener(\"pointerdown\", this.pointerDownHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointermove\", this.pointerMoveHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointerup\", this.pointerUpHandler, this.configuration.listenerOptions)\n // this.domElement?.removeEventListener(\"pointerout\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointerleave\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"pointercancel\", this.pointerUpHandler, this.configuration.listenerOptions)\n this.domElement?.removeEventListener(\"touchmove\", this.prevent)\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n document.documentElement.removeEventListener(\"pointerdown\", () => { })\n }\n}\n","\nimport { TPoint } from \"../../@types/geometry\"\nimport { TSymbol, TShapeEllipseSymbol, TShapeLineSymbol, TShapeSymbol, TShapeTableSymbol, TLineSymbol, TShapeRecognizedSymbol } from \"../../@types/renderer/Symbol\"\n\nexport const ShapeSymbols = {\n table: \"table\",\n shape: \"shape\",\n recognizedShape: \"recognizedShape\",\n ellipse: \"ellipse\",\n line: \"line\"\n}\n\nfunction phi(angle: number): number\n{\n let returnedAngle = ((angle + Math.PI) % (Math.PI * 2)) - Math.PI\n if (returnedAngle < -Math.PI) {\n returnedAngle += Math.PI * 2\n }\n return returnedAngle\n}\n\nfunction drawEllipseArc(context2D: CanvasRenderingContext2D, shapeEllipse: TShapeEllipseSymbol): TPoint[]\n{\n const { centerPoint, maxRadius, minRadius, orientation, startAngle, sweepAngle } = shapeEllipse\n const angleStep = 0.02 // angle delta between interpolated\n\n let z1 = Math.cos(orientation)\n let z3 = Math.sin(orientation)\n let z2 = z1\n let z4 = z3\n z1 *= maxRadius\n z2 *= minRadius\n z3 *= maxRadius\n z4 *= minRadius\n\n const n = Math.floor(Math.abs(sweepAngle) / angleStep)\n\n const boundariesPoints = []\n\n context2D.save()\n try {\n context2D.beginPath()\n\n for (let i = 0; i <= n; i++) {\n const angle = startAngle + ((i / n) * sweepAngle) // points on the arc, in radian\n const alpha = Math.atan2(Math.sin(angle) / minRadius, Math.cos(angle) / maxRadius)\n\n const cosAlpha = Math.cos(alpha)\n const sinAlpha = Math.sin(alpha)\n\n // current point\n const x = (centerPoint.x + (z1 * cosAlpha)) - (z4 * sinAlpha)\n const y = (centerPoint.y + (z2 * sinAlpha)) + (z3 * cosAlpha)\n if (i === 0) {\n context2D.moveTo(x, y)\n } else {\n context2D.lineTo(x, y)\n }\n\n if (i === 0 || i === n) {\n boundariesPoints.push({ x, y })\n }\n }\n\n context2D.stroke()\n } finally {\n context2D.restore()\n }\n\n return boundariesPoints\n}\n\nfunction drawArrowHead(context2D: CanvasRenderingContext2D, headPoint: TPoint, angle: number, length: number)\n{\n const alpha = phi(angle + (Math.PI * (7 / 8)))\n const beta = phi(angle - (Math.PI * (7 / 8)))\n context2D.save()\n try {\n context2D.fillStyle = context2D.strokeStyle\n\n context2D.moveTo(headPoint.x, headPoint.y)\n context2D.beginPath()\n context2D.lineTo(headPoint.x + (length * Math.cos(alpha)), headPoint.y + (length * Math.sin(alpha)))\n context2D.lineTo(headPoint.x + (length * Math.cos(beta)), headPoint.y + (length * Math.sin(beta)))\n context2D.lineTo(headPoint.x, headPoint.y)\n context2D.fill()\n } finally {\n context2D.restore()\n }\n}\n\nfunction drawShapeEllipse(context2D: CanvasRenderingContext2D, shapeEllipse: TShapeEllipseSymbol)\n{\n const points = drawEllipseArc(context2D, shapeEllipse)\n\n if (shapeEllipse?.beginDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, points[0], shapeEllipse.beginTangentAngle, 12.0)\n }\n if (shapeEllipse?.endDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, points[1], shapeEllipse.endTangentAngle, 12.0)\n }\n}\n\n/**\n * Draw a line\n * @param {Object} context2D Current rendering context2D\n * @param {{x: Number, y: Number}} p1 Origin point\n * @param {{x: Number, y: Number}} p2 Destination point\n */\nexport function drawLine(context2D: CanvasRenderingContext2D, p1: TPoint, p2: TPoint)\n{\n context2D.save()\n try {\n context2D.beginPath()\n context2D.moveTo(p1.x, p1.y)\n context2D.lineTo(p2.x, p2.y)\n context2D.stroke()\n } finally {\n context2D.restore()\n }\n}\n\nfunction drawShapeLine(context2D: CanvasRenderingContext2D, shapeLine: TShapeLineSymbol)\n{\n drawLine(context2D, shapeLine.firstPoint, shapeLine.lastPoint)\n if (shapeLine.beginDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, shapeLine.firstPoint, shapeLine.beginTangentAngle, 12.0)\n }\n if (shapeLine.endDecoration === \"ARROW_HEAD\") {\n drawArrowHead(context2D, shapeLine.lastPoint, shapeLine.endTangentAngle, 12.0)\n }\n}\n\n/**\n * Draw a shape symbol\n * @param {Object} context2D Current rendering context2D\n * @param {Object} symbol Symbol to draw\n */\nexport function drawShapeSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol)\n{\n context2D.save()\n try {\n context2D.lineWidth = symbol.style.width as number\n context2D.strokeStyle = symbol.style.color as string\n\n if (symbol.elementType) {\n switch (symbol.elementType) {\n case ShapeSymbols.shape: {\n const shapeSymbol = symbol as TShapeSymbol\n drawShapeSymbol(context2D, shapeSymbol.candidates[shapeSymbol.selectedCandidateIndex])\n break\n }\n case ShapeSymbols.table:{\n const tableSymbols = symbol as TShapeTableSymbol\n tableSymbols.lines.forEach(line => drawShapeSymbol(context2D, line))\n break\n }\n case ShapeSymbols.line: {\n const lineSymbol = symbol as TLineSymbol\n drawLine(context2D, lineSymbol.data.p1, lineSymbol.data.p2)\n break\n }\n default:\n // logger.error(`${ symbol.elementType } not implemented`)\n break\n }\n } else {\n switch (symbol.type) {\n case ShapeSymbols.ellipse: {\n drawShapeEllipse(context2D, symbol as TShapeEllipseSymbol)\n break\n }\n case ShapeSymbols.line: {\n drawShapeLine(context2D, symbol as TShapeLineSymbol)\n break\n }\n case ShapeSymbols.recognizedShape: {\n const recognizedShape = symbol as TShapeRecognizedSymbol\n recognizedShape.primitives.forEach(primitive => drawShapeSymbol(context2D, primitive))\n break\n }\n default:\n // logger.error(`${ symbol.type } not implemented`)\n break\n }\n }\n } finally {\n context2D.restore()\n }\n}\n","import { TStroke } from \"../../@types/model/Stroke\"\nimport { CanvasStroker } from \"./CanvasStroker\"\n\nexport function drawStroke (context2D: CanvasRenderingContext2D, stroke: TStroke, stroker: CanvasStroker) {\n if (stroker && stroke && stroke.pointerType !== \"eraser\") {\n stroker.drawStroke(context2D, stroke)\n }\n}\n","import { TPoint } from \"../../@types/geometry\"\nimport { drawLine } from \"./CanvasRendererShapeSymbol\"\nimport { TSymbol, TTextUnderlineDataSymbol, TTextUnderlineSymbol, TUnderLineSymbol } from \"../../@types/renderer/Symbol\"\n\nexport const TextSymbols = {\n inputCharacter: \"inputCharacter\",\n char: \"char\",\n string: \"string\",\n textLine: \"textLine\"\n}\n\nfunction drawUnderline(context2D: CanvasRenderingContext2D, underline: TUnderLineSymbol, label: string, data: TTextUnderlineDataSymbol)\n{\n const delta = data.width / label.length\n const p1: TPoint = {\n x: data.topLeftPoint.x + (underline.data.firstCharacter * delta),\n y: data.topLeftPoint.y + data.height\n }\n const p2: TPoint = {\n x: data.topLeftPoint.x + (underline.data.lastCharacter * delta),\n y: data.topLeftPoint.y + data.height\n }\n drawLine(context2D, p1, p2)\n}\n\nfunction drawText(context2D: CanvasRenderingContext2D, label: string, data: TTextUnderlineDataSymbol)\n{\n context2D.save()\n try {\n context2D.font = `${ data.textHeight }px serif`\n context2D.textAlign = (data.justificationType === \"CENTER\") ? \"center\" : \"left\"\n context2D.textBaseline = \"bottom\"\n context2D.fillStyle = context2D.strokeStyle\n context2D.fillText(label, data.topLeftPoint.x, (data.topLeftPoint.y + data.height))\n } finally {\n context2D.restore()\n }\n}\n\nfunction drawTextLine(context2D: CanvasRenderingContext2D, textLine: TTextUnderlineSymbol)\n{\n drawText(context2D, textLine.label, textLine.data)\n textLine.underlineList.forEach((underline) =>\n {\n drawUnderline(context2D, underline, textLine.label, textLine.data)\n })\n}\n\n/**\n * Draw a text symbol\n * @param {Object} context Current rendering context\n * @param {Object} symbol Symbol to draw\n */\nexport function drawTextSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol)\n{\n context2D.save()\n try {\n context2D.lineWidth = (symbol.style.width as number)\n context2D.strokeStyle = (symbol.style.color as string)\n const type: string = symbol.elementType || symbol.type\n\n switch (type) {\n case TextSymbols.textLine:\n drawTextLine(context2D, symbol as TTextUnderlineSymbol)\n break\n default:\n console.info(`drawTextSymbol => ${symbol.elementType} not implemented`)\n break\n }\n\n } finally {\n context2D.restore()\n }\n}\n","import { TPoint, TPointer } from \"../@types/geometry\"\n\nexport function computeLinksPoints(point: TPointer, angle: number, width: number): TPoint[]\n{\n const radius = point.p * width\n return [\n {\n x: (point.x - (Math.sin(angle) * radius)),\n y: (point.y + (Math.cos(angle) * radius))\n },\n {\n x: (point.x + (Math.sin(angle) * radius)),\n y: (point.y - (Math.cos(angle) * radius))\n }\n ]\n}\n\nexport function computeMiddlePoint(point1: TPointer, point2: TPointer): TPointer\n{\n return {\n x: ((point2.x + point1.x) / 2),\n y: ((point2.y + point1.y) / 2),\n p: ((point2.p + point1.p) / 2),\n t: ((point2.t + point1.t) / 2)\n }\n}\n\nexport function computeAxeAngle(begin: TPointer, end: TPointer): number\n{\n return Math.atan2(end.y - begin.y, end.x - begin.x)\n}\n","import { TPointer } from \"../../@types/geometry\"\nimport { TStroke } from \"../../@types/model/Stroke\"\nimport { computeAxeAngle, computeLinksPoints, computeMiddlePoint } from \"../QuadraticUtils\"\n\nexport class CanvasStroker\n{\n\n private renderArc(context2d: CanvasRenderingContext2D, center: TPointer, radius: number): void\n {\n context2d.arc(center.x, center.y, radius, 0, Math.PI * 2, true)\n }\n\n private renderLine(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, width: number): void\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, end), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(begin, end), width)\n\n context2d.moveTo(linkPoints1[0].x, linkPoints1[0].y)\n context2d.lineTo(linkPoints2[0].x, linkPoints2[0].y)\n context2d.lineTo(linkPoints2[1].x, linkPoints2[1].y)\n context2d.lineTo(linkPoints1[1].x, linkPoints1[1].y)\n }\n\n private renderFinal(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, width: number): void\n {\n const ARCSPLIT = 6\n const angle = computeAxeAngle(begin, end)\n const linkPoints = computeLinksPoints(end, angle, width)\n context2d.moveTo(linkPoints[0].x, linkPoints[0].y)\n for (let i = 1; i <= ARCSPLIT; i++) {\n const newAngle = angle - ((i * Math.PI) / ARCSPLIT)\n context2d.lineTo(end.x - ((end.p * width) * Math.sin(newAngle)), end.y + (end.p * width * Math.cos(newAngle)))\n }\n }\n\n private renderQuadratic(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, ctrl: TPointer, width: number): void\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, ctrl), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(ctrl, end), width)\n const linkPoints3 = computeLinksPoints(ctrl, computeAxeAngle(begin, end), width)\n\n context2d.moveTo(linkPoints1[0].x, linkPoints1[0].y)\n context2d.quadraticCurveTo(linkPoints3[0].x, linkPoints3[0].y, linkPoints2[0].x, linkPoints2[0].y)\n context2d.lineTo(linkPoints2[1].x, linkPoints2[1].y)\n context2d.quadraticCurveTo(linkPoints3[1].x, linkPoints3[1].y, linkPoints1[1].x, linkPoints1[1].y)\n }\n\n drawStroke(context2d: CanvasRenderingContext2D, stroke: TStroke): void\n {\n const NUMBER_POINTS = stroke.pointers.length\n const NUMBER_QUADRATICS = NUMBER_POINTS - 2\n const width = (stroke.style.width as number) > 0 ? (stroke.style.width as number) : context2d.lineWidth\n const color = (stroke.style.color as string) ? (stroke.style.color as string) : context2d.strokeStyle\n const firstPoint = stroke.pointers[0] as TPointer\n\n context2d.save()\n try {\n context2d.beginPath()\n if (NUMBER_POINTS < 3) {\n this.renderArc(context2d, firstPoint, width * 0.6)\n } else {\n this.renderArc(context2d, firstPoint, width * firstPoint.p)\n const secondPoint: TPointer = computeMiddlePoint(firstPoint, stroke.pointers[1])\n this.renderLine(context2d, firstPoint, secondPoint, width)\n\n // Possibility to try this (the start looks better when the ink is large)\n // var first = computeMiddlePoint(stroke.pointers[0], stroke.pointers[1]);\n // context2d.arc(first.x, first.y, width * first.p, 0, Math.PI * 2, true);\n\n for (let i = 0; i < NUMBER_QUADRATICS; i++) {\n const begin: TPointer = computeMiddlePoint(stroke.pointers[i], stroke.pointers[i + 1])\n const end: TPointer = computeMiddlePoint(stroke.pointers[i + 1], stroke.pointers[i + 2])\n const ctrl: TPointer = stroke.pointers[i + 1]\n this.renderQuadratic(context2d, begin, end, ctrl, width)\n }\n const beginLine: TPointer = computeMiddlePoint(stroke.pointers[NUMBER_POINTS - 2], stroke.pointers[NUMBER_POINTS - 1])\n const endLine: TPointer = stroke.pointers[NUMBER_POINTS - 1]\n this.renderLine(context2d, beginLine, endLine, width)\n\n const beginFinal: TPointer = stroke.pointers[NUMBER_POINTS - 2]\n const endFinal: TPointer = stroke.pointers[NUMBER_POINTS - 1]\n this.renderFinal(context2d, beginFinal, endFinal, width)\n }\n context2d.closePath()\n if (color !== undefined) {\n context2d.fillStyle = color\n context2d.fill()\n }\n context2d.save()\n }\n finally {\n context2d.restore()\n }\n }\n}\n","import { TStroke } from \"../../@types/model/Stroke\"\nimport { TRenderingConfiguration } from \"../../@types/configuration/RenderingConfiguration\"\nimport { IModel } from \"../../@types/model/Model\"\nimport { TSymbol } from \"../../@types/renderer/Symbol\"\n\nimport { drawShapeSymbol, ShapeSymbols } from \"./CanvasRendererShapeSymbol\"\nimport { drawStroke } from \"./CanvasRendererStrokeSymbol\"\nimport { drawTextSymbol, TextSymbols } from \"./CanvasRendererTextSymbol\"\nimport { CanvasStroker } from \"./CanvasStroker\"\nimport { LoggerManager } from \"../../logger\"\nimport { LoggerClass } from \"../../Constants\"\n\nexport class CanvasRenderer\n{\n config: TRenderingConfiguration\n stroker: CanvasStroker\n context!: {\n parent: HTMLElement\n renderingCanvas: HTMLCanvasElement\n renderingCanvasContext: CanvasRenderingContext2D\n capturingCanvas: HTMLCanvasElement\n capturingCanvasContext: CanvasRenderingContext2D\n }\n #logger = LoggerManager.getLogger(LoggerClass.RENDERER)\n\n constructor(config: TRenderingConfiguration)\n {\n this.#logger.info(\"constructor\", { config })\n this.config = config\n this.stroker = new CanvasStroker()\n }\n\n private createCanvas(type: string): HTMLCanvasElement\n {\n this.#logger.debug(\"createCanvas\", { type })\n const canvas: HTMLCanvasElement = document.createElement(\"canvas\")\n canvas.id = type\n canvas.classList.add(type)\n canvas.classList.add(\"ms-canvas\")\n return canvas\n }\n\n private resizeContent(): void\n {\n const pixelRatio: number = window.devicePixelRatio\n const elements: HTMLCanvasElement[] = [this.context.renderingCanvas, this.context.capturingCanvas]\n elements.forEach((canvas) =>\n {\n const domElement = canvas.parentNode as HTMLElement\n const width = Math.max(this.config.minWidth, domElement.clientWidth)\n const height = Math.max(this.config.minHeight, domElement.clientHeight)\n canvas.width = width * pixelRatio\n canvas.height = height * pixelRatio\n canvas.getContext(\"2d\")?.scale(pixelRatio, pixelRatio)\n canvas.style.width = `${ width }px`\n canvas.style.height = `${ height }px`\n })\n }\n\n private drawSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol)\n {\n const type = symbol.elementType || symbol.type\n if (type === \"stroke\") {\n drawStroke(context2D, symbol as TStroke, this.stroker)\n } else if (Object.keys(TextSymbols).includes(type)) {\n drawTextSymbol(context2D, symbol)\n } else if (Object.keys(ShapeSymbols).includes(type)) {\n drawShapeSymbol(context2D, symbol)\n }\n }\n\n init(element: HTMLElement): void\n {\n this.#logger.info(\"init\", { element })\n const renderingCanvas: HTMLCanvasElement = this.createCanvas(\"ms-rendering-canvas\")\n element.appendChild(renderingCanvas)\n\n const capturingCanvas: HTMLCanvasElement = this.createCanvas(\"ms-capture-canvas\")\n element.appendChild(capturingCanvas)\n\n this.context = {\n parent: element,\n renderingCanvas,\n renderingCanvasContext: renderingCanvas.getContext(\"2d\") as CanvasRenderingContext2D,\n capturingCanvas,\n capturingCanvasContext: capturingCanvas.getContext(\"2d\") as CanvasRenderingContext2D\n }\n\n this.resizeContent()\n }\n\n drawModel(model: IModel): void\n {\n this.#logger.info(\"drawModel\", { model })\n this.context.renderingCanvasContext?.clearRect(0, 0, this.context.renderingCanvas.width, this.context.renderingCanvas.height)\n model.rawStrokes.forEach(symbol => this.drawSymbol(this.context.renderingCanvasContext, symbol))\n this.context.capturingCanvasContext.clearRect(0, 0, this.context.capturingCanvas.width, this.context.capturingCanvas.height)\n }\n\n drawPendingStroke(stroke: TStroke | undefined): void\n {\n this.#logger.info(\"drawPendingStroke\", { stroke })\n this.context.capturingCanvasContext.clearRect(0, 0, this.context.capturingCanvas.width, this.context.capturingCanvas.height)\n if (stroke && stroke?.pointerType !== \"eraser\") {\n this.stroker.drawStroke(this.context.capturingCanvasContext, stroke)\n }\n }\n\n resize(model: IModel): void\n {\n this.#logger.info(\"resize\", { model })\n this.resizeContent()\n this.drawModel(model)\n }\n\n destroy(): void\n {\n this.#logger.info(\"destroy\")\n if (this.context.parent) {\n this.context.parent.innerHTML = \"\"\n }\n }\n}\n","!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.JsonCSS=e():t.JsonCSS=e()}(this,function(){return function(t){function e(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,o){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,\"a\",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p=\"\",e(e.s=1)}([function(t,e,n){\"use strict\";function o(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(e,\"__esModule\",{value:!0});var r=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},i=function t(e){var n=this;o(this,t),this.toJSON=function(t){if(\"string\"!=typeof t)return console.error(\"Need a CSS string but given \",void 0===t?\"undefined\":r(t),t),\"Not a valid CSS..!\";var e={},o=void 0,i=void 0,u=void 0;try{t.split(\"{\").forEach(function(t){if(i=t.trim())if(-1===i.indexOf(\"}\"))e[i]={},o=i;else{i.substring(0,i.indexOf(\"}\")).split(\";\").forEach(function(t){(u=t.split(\":\"))&&2===u.length&&(e[o][u[0].trim().replace(/^\\\"|\\\"$/g,\"\")]=n._trimSemiColon(u[1].trim().replace(/^\\\"|\\\"$/g,\"\")))});try{o=i.split(\"}\")[1].trim(),o&&(e[o]={})}catch(t){}}})}catch(t){return\"Not a valid CSS..!\"}return e},this.toCSS=function(t){if(\"object\"!==(void 0===t?\"undefined\":r(t)))return console.error(\"Need a JSON object but given \",void 0===t?\"undefined\":r(t),t),\"Not a valid JSON..!\";var e=\"\";try{for(var n in t)if(t.hasOwnProperty(n)){e+=n+\" {\\n\";for(var o in t[n])t[n].hasOwnProperty(o)&&(e+=o+\": \"+t[n][o]+\";\\n\");e+=\"}\\n\"}}catch(t){return\"Not a valid JSON..!\"}return e},this._trimSemiColon=function(t){return\";\"===t.slice(-1)?t.slice(0,n.length-1):t}};e.default=i},function(t,e,n){\"use strict\";t.exports=n(0).default}])});","import JsonCSS from \"json-css\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TTheme } from \"../@types/style/Theme\"\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst parser: any = new JsonCSS()\n\nexport const StyleHelper = {\n themeToCSS(json: TTheme): string\n {\n return parser.toCSS(json) as string\n // css = css.replace( /[\\r\\n]+/gm, \"\" )\n // return css\n },\n themeToJSON(style: string): TTheme\n {\n const theme = parser.toJSON(style) as TTheme\n theme[\".text\"][\"font-size\"] = Number(theme[\".text\"][\"font-size\"])\n theme.ink[\"-myscript-pen-width\"] = Number(theme.ink[\"-myscript-pen-width\"])\n theme.ink.width = Number(theme.ink.width)\n return theme\n },\n penStyleToCSS (penStyle: TPenStyle): string {\n let css = parser.toCSS({ css: penStyle }) as string\n css = css.substring(6, css.length - 3)\n return css\n },\n penStyleToJSON (penStyleString: string): TPenStyle {\n const penStyle = parser.toJSON(`css {${penStyleString}}`).css as TPenStyle\n if (penStyle.width) {\n penStyle.width = Number(penStyle.width)\n } else {\n delete penStyle.width\n }\n if (penStyle[\"-myscript-pen-width\"]) {\n penStyle[\"-myscript-pen-width\"] = Number(penStyle[\"-myscript-pen-width\"])\n } else {\n delete penStyle[\"-myscript-pen-width\"]\n }\n return penStyle\n },\n\n stringToJSON(style: string): {[key: string]: string}\n {\n return parser.toJSON(`css {${style}}`).css\n },\n JSONToString(style: {[key: string]: string}): string\n {\n return Object.entries(style).map(([k, v]) => `${k}:${v}`).join(\";\")\n }\n}\n",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory();\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\troot.CryptoJS = factory();\n\t}\n}(this, function () {\n\n\t/**\n\t * CryptoJS core components.\n\t */\n\tvar CryptoJS = CryptoJS || (function (Math, undefined) {\n\t /*\n\t * Local polyfil of Object.create\n\t */\n\t var create = Object.create || (function () {\n\t function F() {};\n\n\t return function (obj) {\n\t var subtype;\n\n\t F.prototype = obj;\n\n\t subtype = new F();\n\n\t F.prototype = null;\n\n\t return subtype;\n\t };\n\t }())\n\n\t /**\n\t * CryptoJS namespace.\n\t */\n\t var C = {};\n\n\t /**\n\t * Library namespace.\n\t */\n\t var C_lib = C.lib = {};\n\n\t /**\n\t * Base object for prototypal inheritance.\n\t */\n\t var Base = C_lib.Base = (function () {\n\n\n\t return {\n\t /**\n\t * Creates a new object that inherits from this object.\n\t *\n\t * @param {Object} overrides Properties to copy into the new object.\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * field: 'value',\n\t *\n\t * method: function () {\n\t * }\n\t * });\n\t */\n\t extend: function (overrides) {\n\t // Spawn\n\t var subtype = create(this);\n\n\t // Augment\n\t if (overrides) {\n\t subtype.mixIn(overrides);\n\t }\n\n\t // Create default initializer\n\t if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\n\t subtype.init = function () {\n\t subtype.$super.init.apply(this, arguments);\n\t };\n\t }\n\n\t // Initializer's prototype is the subtype object\n\t subtype.init.prototype = subtype;\n\n\t // Reference supertype\n\t subtype.$super = this;\n\n\t return subtype;\n\t },\n\n\t /**\n\t * Extends this object and runs the init method.\n\t * Arguments to create() will be passed to init().\n\t *\n\t * @return {Object} The new object.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var instance = MyType.create();\n\t */\n\t create: function () {\n\t var instance = this.extend();\n\t instance.init.apply(instance, arguments);\n\n\t return instance;\n\t },\n\n\t /**\n\t * Initializes a newly created object.\n\t * Override this method to add some logic when your objects are created.\n\t *\n\t * @example\n\t *\n\t * var MyType = CryptoJS.lib.Base.extend({\n\t * init: function () {\n\t * // ...\n\t * }\n\t * });\n\t */\n\t init: function () {\n\t },\n\n\t /**\n\t * Copies properties into this object.\n\t *\n\t * @param {Object} properties The properties to mix in.\n\t *\n\t * @example\n\t *\n\t * MyType.mixIn({\n\t * field: 'value'\n\t * });\n\t */\n\t mixIn: function (properties) {\n\t for (var propertyName in properties) {\n\t if (properties.hasOwnProperty(propertyName)) {\n\t this[propertyName] = properties[propertyName];\n\t }\n\t }\n\n\t // IE won't copy toString using the loop above\n\t if (properties.hasOwnProperty('toString')) {\n\t this.toString = properties.toString;\n\t }\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = instance.clone();\n\t */\n\t clone: function () {\n\t return this.init.prototype.extend(this);\n\t }\n\t };\n\t }());\n\n\t /**\n\t * An array of 32-bit words.\n\t *\n\t * @property {Array} words The array of 32-bit words.\n\t * @property {number} sigBytes The number of significant bytes in this word array.\n\t */\n\t var WordArray = C_lib.WordArray = Base.extend({\n\t /**\n\t * Initializes a newly created word array.\n\t *\n\t * @param {Array} words (Optional) An array of 32-bit words.\n\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.create();\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n\t * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n\t */\n\t init: function (words, sigBytes) {\n\t words = this.words = words || [];\n\n\t if (sigBytes != undefined) {\n\t this.sigBytes = sigBytes;\n\t } else {\n\t this.sigBytes = words.length * 4;\n\t }\n\t },\n\n\t /**\n\t * Converts this word array to a string.\n\t *\n\t * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n\t *\n\t * @return {string} The stringified word array.\n\t *\n\t * @example\n\t *\n\t * var string = wordArray + '';\n\t * var string = wordArray.toString();\n\t * var string = wordArray.toString(CryptoJS.enc.Utf8);\n\t */\n\t toString: function (encoder) {\n\t return (encoder || Hex).stringify(this);\n\t },\n\n\t /**\n\t * Concatenates a word array to this word array.\n\t *\n\t * @param {WordArray} wordArray The word array to append.\n\t *\n\t * @return {WordArray} This word array.\n\t *\n\t * @example\n\t *\n\t * wordArray1.concat(wordArray2);\n\t */\n\t concat: function (wordArray) {\n\t // Shortcuts\n\t var thisWords = this.words;\n\t var thatWords = wordArray.words;\n\t var thisSigBytes = this.sigBytes;\n\t var thatSigBytes = wordArray.sigBytes;\n\n\t // Clamp excess bits\n\t this.clamp();\n\n\t // Concat\n\t if (thisSigBytes % 4) {\n\t // Copy one byte at a time\n\t for (var i = 0; i < thatSigBytes; i++) {\n\t var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n\t }\n\t } else {\n\t // Copy one word at a time\n\t for (var i = 0; i < thatSigBytes; i += 4) {\n\t thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\n\t }\n\t }\n\t this.sigBytes += thatSigBytes;\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Removes insignificant bits.\n\t *\n\t * @example\n\t *\n\t * wordArray.clamp();\n\t */\n\t clamp: function () {\n\t // Shortcuts\n\t var words = this.words;\n\t var sigBytes = this.sigBytes;\n\n\t // Clamp\n\t words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n\t words.length = Math.ceil(sigBytes / 4);\n\t },\n\n\t /**\n\t * Creates a copy of this word array.\n\t *\n\t * @return {WordArray} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = wordArray.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone.words = this.words.slice(0);\n\n\t return clone;\n\t },\n\n\t /**\n\t * Creates a word array filled with random bytes.\n\t *\n\t * @param {number} nBytes The number of random bytes to generate.\n\t *\n\t * @return {WordArray} The random word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.lib.WordArray.random(16);\n\t */\n\t random: function (nBytes) {\n\t var words = [];\n\n\t var r = (function (m_w) {\n\t var m_w = m_w;\n\t var m_z = 0x3ade68b1;\n\t var mask = 0xffffffff;\n\n\t return function () {\n\t m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;\n\t m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;\n\t var result = ((m_z << 0x10) + m_w) & mask;\n\t result /= 0x100000000;\n\t result += 0.5;\n\t return result * (Math.random() > .5 ? 1 : -1);\n\t }\n\t });\n\n\t for (var i = 0, rcache; i < nBytes; i += 4) {\n\t var _r = r((rcache || Math.random()) * 0x100000000);\n\n\t rcache = _r() * 0x3ade67b7;\n\t words.push((_r() * 0x100000000) | 0);\n\t }\n\n\t return new WordArray.init(words, nBytes);\n\t }\n\t });\n\n\t /**\n\t * Encoder namespace.\n\t */\n\t var C_enc = C.enc = {};\n\n\t /**\n\t * Hex encoding strategy.\n\t */\n\t var Hex = C_enc.Hex = {\n\t /**\n\t * Converts a word array to a hex string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The hex string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var hexChars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t hexChars.push((bite >>> 4).toString(16));\n\t hexChars.push((bite & 0x0f).toString(16));\n\t }\n\n\t return hexChars.join('');\n\t },\n\n\t /**\n\t * Converts a hex string to a word array.\n\t *\n\t * @param {string} hexStr The hex string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Hex.parse(hexString);\n\t */\n\t parse: function (hexStr) {\n\t // Shortcut\n\t var hexStrLength = hexStr.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < hexStrLength; i += 2) {\n\t words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n\t }\n\n\t return new WordArray.init(words, hexStrLength / 2);\n\t }\n\t };\n\n\t /**\n\t * Latin1 encoding strategy.\n\t */\n\t var Latin1 = C_enc.Latin1 = {\n\t /**\n\t * Converts a word array to a Latin1 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The Latin1 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t // Shortcuts\n\t var words = wordArray.words;\n\t var sigBytes = wordArray.sigBytes;\n\n\t // Convert\n\t var latin1Chars = [];\n\t for (var i = 0; i < sigBytes; i++) {\n\t var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t latin1Chars.push(String.fromCharCode(bite));\n\t }\n\n\t return latin1Chars.join('');\n\t },\n\n\t /**\n\t * Converts a Latin1 string to a word array.\n\t *\n\t * @param {string} latin1Str The Latin1 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n\t */\n\t parse: function (latin1Str) {\n\t // Shortcut\n\t var latin1StrLength = latin1Str.length;\n\n\t // Convert\n\t var words = [];\n\t for (var i = 0; i < latin1StrLength; i++) {\n\t words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n\t }\n\n\t return new WordArray.init(words, latin1StrLength);\n\t }\n\t };\n\n\t /**\n\t * UTF-8 encoding strategy.\n\t */\n\t var Utf8 = C_enc.Utf8 = {\n\t /**\n\t * Converts a word array to a UTF-8 string.\n\t *\n\t * @param {WordArray} wordArray The word array.\n\t *\n\t * @return {string} The UTF-8 string.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n\t */\n\t stringify: function (wordArray) {\n\t try {\n\t return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n\t } catch (e) {\n\t throw new Error('Malformed UTF-8 data');\n\t }\n\t },\n\n\t /**\n\t * Converts a UTF-8 string to a word array.\n\t *\n\t * @param {string} utf8Str The UTF-8 string.\n\t *\n\t * @return {WordArray} The word array.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n\t */\n\t parse: function (utf8Str) {\n\t return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n\t }\n\t };\n\n\t /**\n\t * Abstract buffered block algorithm template.\n\t *\n\t * The property blockSize must be implemented in a concrete subtype.\n\t *\n\t * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n\t */\n\t var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\n\t /**\n\t * Resets this block algorithm's data buffer to its initial state.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm.reset();\n\t */\n\t reset: function () {\n\t // Initial values\n\t this._data = new WordArray.init();\n\t this._nDataBytes = 0;\n\t },\n\n\t /**\n\t * Adds new data to this block algorithm's buffer.\n\t *\n\t * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n\t *\n\t * @example\n\t *\n\t * bufferedBlockAlgorithm._append('data');\n\t * bufferedBlockAlgorithm._append(wordArray);\n\t */\n\t _append: function (data) {\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof data == 'string') {\n\t data = Utf8.parse(data);\n\t }\n\n\t // Append\n\t this._data.concat(data);\n\t this._nDataBytes += data.sigBytes;\n\t },\n\n\t /**\n\t * Processes available data blocks.\n\t *\n\t * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n\t *\n\t * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n\t *\n\t * @return {WordArray} The processed data.\n\t *\n\t * @example\n\t *\n\t * var processedData = bufferedBlockAlgorithm._process();\n\t * var processedData = bufferedBlockAlgorithm._process(!!'flush');\n\t */\n\t _process: function (doFlush) {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\t var dataSigBytes = data.sigBytes;\n\t var blockSize = this.blockSize;\n\t var blockSizeBytes = blockSize * 4;\n\n\t // Count blocks ready\n\t var nBlocksReady = dataSigBytes / blockSizeBytes;\n\t if (doFlush) {\n\t // Round up to include partial blocks\n\t nBlocksReady = Math.ceil(nBlocksReady);\n\t } else {\n\t // Round down to include only full blocks,\n\t // less the number of blocks that must remain in the buffer\n\t nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n\t }\n\n\t // Count words ready\n\t var nWordsReady = nBlocksReady * blockSize;\n\n\t // Count bytes ready\n\t var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n\t // Process blocks\n\t if (nWordsReady) {\n\t for (var offset = 0; offset < nWordsReady; offset += blockSize) {\n\t // Perform concrete-algorithm logic\n\t this._doProcessBlock(dataWords, offset);\n\t }\n\n\t // Remove processed words\n\t var processedWords = dataWords.splice(0, nWordsReady);\n\t data.sigBytes -= nBytesReady;\n\t }\n\n\t // Return processed words\n\t return new WordArray.init(processedWords, nBytesReady);\n\t },\n\n\t /**\n\t * Creates a copy of this object.\n\t *\n\t * @return {Object} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = bufferedBlockAlgorithm.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\t clone._data = this._data.clone();\n\n\t return clone;\n\t },\n\n\t _minBufferSize: 0\n\t });\n\n\t /**\n\t * Abstract hasher template.\n\t *\n\t * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n\t */\n\t var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\n\t /**\n\t * Configuration options.\n\t */\n\t cfg: Base.extend(),\n\n\t /**\n\t * Initializes a newly created hasher.\n\t *\n\t * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n\t *\n\t * @example\n\t *\n\t * var hasher = CryptoJS.algo.SHA256.create();\n\t */\n\t init: function (cfg) {\n\t // Apply config defaults\n\t this.cfg = this.cfg.extend(cfg);\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this hasher to its initial state.\n\t *\n\t * @example\n\t *\n\t * hasher.reset();\n\t */\n\t reset: function () {\n\t // Reset data buffer\n\t BufferedBlockAlgorithm.reset.call(this);\n\n\t // Perform concrete-hasher logic\n\t this._doReset();\n\t },\n\n\t /**\n\t * Updates this hasher with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {Hasher} This hasher.\n\t *\n\t * @example\n\t *\n\t * hasher.update('message');\n\t * hasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t // Append\n\t this._append(messageUpdate);\n\n\t // Update the hash\n\t this._process();\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the hash computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @example\n\t *\n\t * var hash = hasher.finalize();\n\t * var hash = hasher.finalize('message');\n\t * var hash = hasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Final message update\n\t if (messageUpdate) {\n\t this._append(messageUpdate);\n\t }\n\n\t // Perform concrete-hasher logic\n\t var hash = this._doFinalize();\n\n\t return hash;\n\t },\n\n\t blockSize: 512/32,\n\n\t /**\n\t * Creates a shortcut function to a hasher's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to create a helper for.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHelper: function (hasher) {\n\t return function (message, cfg) {\n\t return new hasher.init(cfg).finalize(message);\n\t };\n\t },\n\n\t /**\n\t * Creates a shortcut function to the HMAC's object interface.\n\t *\n\t * @param {Hasher} hasher The hasher to use in this HMAC helper.\n\t *\n\t * @return {Function} The shortcut function.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n\t */\n\t _createHmacHelper: function (hasher) {\n\t return function (message, key) {\n\t return new C_algo.HMAC.init(hasher, key).finalize(message);\n\t };\n\t }\n\t });\n\n\t /**\n\t * Algorithm namespace.\n\t */\n\t var C_algo = C.algo = {};\n\n\t return C;\n\t}(Math));\n\n\n\treturn CryptoJS;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.enc.Hex;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (undefined) {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var X32WordArray = C_lib.WordArray;\n\n\t /**\n\t * x64 namespace.\n\t */\n\t var C_x64 = C.x64 = {};\n\n\t /**\n\t * A 64-bit word.\n\t */\n\t var X64Word = C_x64.Word = Base.extend({\n\t /**\n\t * Initializes a newly created 64-bit word.\n\t *\n\t * @param {number} high The high 32 bits.\n\t * @param {number} low The low 32 bits.\n\t *\n\t * @example\n\t *\n\t * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);\n\t */\n\t init: function (high, low) {\n\t this.high = high;\n\t this.low = low;\n\t }\n\n\t /**\n\t * Bitwise NOTs this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after negating.\n\t *\n\t * @example\n\t *\n\t * var negated = x64Word.not();\n\t */\n\t // not: function () {\n\t // var high = ~this.high;\n\t // var low = ~this.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise ANDs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to AND with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after ANDing.\n\t *\n\t * @example\n\t *\n\t * var anded = x64Word.and(anotherX64Word);\n\t */\n\t // and: function (word) {\n\t // var high = this.high & word.high;\n\t // var low = this.low & word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise ORs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to OR with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after ORing.\n\t *\n\t * @example\n\t *\n\t * var ored = x64Word.or(anotherX64Word);\n\t */\n\t // or: function (word) {\n\t // var high = this.high | word.high;\n\t // var low = this.low | word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Bitwise XORs this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to XOR with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after XORing.\n\t *\n\t * @example\n\t *\n\t * var xored = x64Word.xor(anotherX64Word);\n\t */\n\t // xor: function (word) {\n\t // var high = this.high ^ word.high;\n\t // var low = this.low ^ word.low;\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Shifts this word n bits to the left.\n\t *\n\t * @param {number} n The number of bits to shift.\n\t *\n\t * @return {X64Word} A new x64-Word object after shifting.\n\t *\n\t * @example\n\t *\n\t * var shifted = x64Word.shiftL(25);\n\t */\n\t // shiftL: function (n) {\n\t // if (n < 32) {\n\t // var high = (this.high << n) | (this.low >>> (32 - n));\n\t // var low = this.low << n;\n\t // } else {\n\t // var high = this.low << (n - 32);\n\t // var low = 0;\n\t // }\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Shifts this word n bits to the right.\n\t *\n\t * @param {number} n The number of bits to shift.\n\t *\n\t * @return {X64Word} A new x64-Word object after shifting.\n\t *\n\t * @example\n\t *\n\t * var shifted = x64Word.shiftR(7);\n\t */\n\t // shiftR: function (n) {\n\t // if (n < 32) {\n\t // var low = (this.low >>> n) | (this.high << (32 - n));\n\t // var high = this.high >>> n;\n\t // } else {\n\t // var low = this.high >>> (n - 32);\n\t // var high = 0;\n\t // }\n\n\t // return X64Word.create(high, low);\n\t // },\n\n\t /**\n\t * Rotates this word n bits to the left.\n\t *\n\t * @param {number} n The number of bits to rotate.\n\t *\n\t * @return {X64Word} A new x64-Word object after rotating.\n\t *\n\t * @example\n\t *\n\t * var rotated = x64Word.rotL(25);\n\t */\n\t // rotL: function (n) {\n\t // return this.shiftL(n).or(this.shiftR(64 - n));\n\t // },\n\n\t /**\n\t * Rotates this word n bits to the right.\n\t *\n\t * @param {number} n The number of bits to rotate.\n\t *\n\t * @return {X64Word} A new x64-Word object after rotating.\n\t *\n\t * @example\n\t *\n\t * var rotated = x64Word.rotR(7);\n\t */\n\t // rotR: function (n) {\n\t // return this.shiftR(n).or(this.shiftL(64 - n));\n\t // },\n\n\t /**\n\t * Adds this word with the passed word.\n\t *\n\t * @param {X64Word} word The x64-Word to add with this word.\n\t *\n\t * @return {X64Word} A new x64-Word object after adding.\n\t *\n\t * @example\n\t *\n\t * var added = x64Word.add(anotherX64Word);\n\t */\n\t // add: function (word) {\n\t // var low = (this.low + word.low) | 0;\n\t // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;\n\t // var high = (this.high + word.high + carry) | 0;\n\n\t // return X64Word.create(high, low);\n\t // }\n\t });\n\n\t /**\n\t * An array of 64-bit words.\n\t *\n\t * @property {Array} words The array of CryptoJS.x64.Word objects.\n\t * @property {number} sigBytes The number of significant bytes in this word array.\n\t */\n\t var X64WordArray = C_x64.WordArray = Base.extend({\n\t /**\n\t * Initializes a newly created word array.\n\t *\n\t * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.\n\t * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t *\n\t * @example\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create();\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create([\n\t * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t * ]);\n\t *\n\t * var wordArray = CryptoJS.x64.WordArray.create([\n\t * CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t * ], 10);\n\t */\n\t init: function (words, sigBytes) {\n\t words = this.words = words || [];\n\n\t if (sigBytes != undefined) {\n\t this.sigBytes = sigBytes;\n\t } else {\n\t this.sigBytes = words.length * 8;\n\t }\n\t },\n\n\t /**\n\t * Converts this 64-bit word array to a 32-bit word array.\n\t *\n\t * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.\n\t *\n\t * @example\n\t *\n\t * var x32WordArray = x64WordArray.toX32();\n\t */\n\t toX32: function () {\n\t // Shortcuts\n\t var x64Words = this.words;\n\t var x64WordsLength = x64Words.length;\n\n\t // Convert\n\t var x32Words = [];\n\t for (var i = 0; i < x64WordsLength; i++) {\n\t var x64Word = x64Words[i];\n\t x32Words.push(x64Word.high);\n\t x32Words.push(x64Word.low);\n\t }\n\n\t return X32WordArray.create(x32Words, this.sigBytes);\n\t },\n\n\t /**\n\t * Creates a copy of this word array.\n\t *\n\t * @return {X64WordArray} The clone.\n\t *\n\t * @example\n\t *\n\t * var clone = x64WordArray.clone();\n\t */\n\t clone: function () {\n\t var clone = Base.clone.call(this);\n\n\t // Clone \"words\" array\n\t var words = clone.words = this.words.slice(0);\n\n\t // Clone each X64Word object\n\t var wordsLength = words.length;\n\t for (var i = 0; i < wordsLength; i++) {\n\t words[i] = words[i].clone();\n\t }\n\n\t return clone;\n\t }\n\t });\n\t}());\n\n\n\treturn CryptoJS;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./x64-core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Hasher = C_lib.Hasher;\n\t var C_x64 = C.x64;\n\t var X64Word = C_x64.Word;\n\t var X64WordArray = C_x64.WordArray;\n\t var C_algo = C.algo;\n\n\t function X64Word_create() {\n\t return X64Word.create.apply(X64Word, arguments);\n\t }\n\n\t // Constants\n\t var K = [\n\t X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),\n\t X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),\n\t X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),\n\t X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),\n\t X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),\n\t X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),\n\t X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),\n\t X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),\n\t X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),\n\t X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),\n\t X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),\n\t X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),\n\t X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),\n\t X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),\n\t X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),\n\t X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),\n\t X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),\n\t X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),\n\t X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),\n\t X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),\n\t X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),\n\t X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),\n\t X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),\n\t X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),\n\t X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),\n\t X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),\n\t X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),\n\t X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),\n\t X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),\n\t X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),\n\t X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),\n\t X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),\n\t X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),\n\t X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),\n\t X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),\n\t X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),\n\t X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),\n\t X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),\n\t X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),\n\t X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)\n\t ];\n\n\t // Reusable objects\n\t var W = [];\n\t (function () {\n\t for (var i = 0; i < 80; i++) {\n\t W[i] = X64Word_create();\n\t }\n\t }());\n\n\t /**\n\t * SHA-512 hash algorithm.\n\t */\n\t var SHA512 = C_algo.SHA512 = Hasher.extend({\n\t _doReset: function () {\n\t this._hash = new X64WordArray.init([\n\t new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),\n\t new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),\n\t new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),\n\t new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)\n\t ]);\n\t },\n\n\t _doProcessBlock: function (M, offset) {\n\t // Shortcuts\n\t var H = this._hash.words;\n\n\t var H0 = H[0];\n\t var H1 = H[1];\n\t var H2 = H[2];\n\t var H3 = H[3];\n\t var H4 = H[4];\n\t var H5 = H[5];\n\t var H6 = H[6];\n\t var H7 = H[7];\n\n\t var H0h = H0.high;\n\t var H0l = H0.low;\n\t var H1h = H1.high;\n\t var H1l = H1.low;\n\t var H2h = H2.high;\n\t var H2l = H2.low;\n\t var H3h = H3.high;\n\t var H3l = H3.low;\n\t var H4h = H4.high;\n\t var H4l = H4.low;\n\t var H5h = H5.high;\n\t var H5l = H5.low;\n\t var H6h = H6.high;\n\t var H6l = H6.low;\n\t var H7h = H7.high;\n\t var H7l = H7.low;\n\n\t // Working variables\n\t var ah = H0h;\n\t var al = H0l;\n\t var bh = H1h;\n\t var bl = H1l;\n\t var ch = H2h;\n\t var cl = H2l;\n\t var dh = H3h;\n\t var dl = H3l;\n\t var eh = H4h;\n\t var el = H4l;\n\t var fh = H5h;\n\t var fl = H5l;\n\t var gh = H6h;\n\t var gl = H6l;\n\t var hh = H7h;\n\t var hl = H7l;\n\n\t // Rounds\n\t for (var i = 0; i < 80; i++) {\n\t // Shortcut\n\t var Wi = W[i];\n\n\t // Extend message\n\t if (i < 16) {\n\t var Wih = Wi.high = M[offset + i * 2] | 0;\n\t var Wil = Wi.low = M[offset + i * 2 + 1] | 0;\n\t } else {\n\t // Gamma0\n\t var gamma0x = W[i - 15];\n\t var gamma0xh = gamma0x.high;\n\t var gamma0xl = gamma0x.low;\n\t var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);\n\t var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));\n\n\t // Gamma1\n\t var gamma1x = W[i - 2];\n\t var gamma1xh = gamma1x.high;\n\t var gamma1xl = gamma1x.low;\n\t var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);\n\t var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));\n\n\t // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]\n\t var Wi7 = W[i - 7];\n\t var Wi7h = Wi7.high;\n\t var Wi7l = Wi7.low;\n\n\t var Wi16 = W[i - 16];\n\t var Wi16h = Wi16.high;\n\t var Wi16l = Wi16.low;\n\n\t var Wil = gamma0l + Wi7l;\n\t var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);\n\t var Wil = Wil + gamma1l;\n\t var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);\n\t var Wil = Wil + Wi16l;\n\t var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);\n\n\t Wi.high = Wih;\n\t Wi.low = Wil;\n\t }\n\n\t var chh = (eh & fh) ^ (~eh & gh);\n\t var chl = (el & fl) ^ (~el & gl);\n\t var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);\n\t var majl = (al & bl) ^ (al & cl) ^ (bl & cl);\n\n\t var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));\n\t var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));\n\t var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));\n\t var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));\n\n\t // t1 = h + sigma1 + ch + K[i] + W[i]\n\t var Ki = K[i];\n\t var Kih = Ki.high;\n\t var Kil = Ki.low;\n\n\t var t1l = hl + sigma1l;\n\t var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);\n\t var t1l = t1l + chl;\n\t var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);\n\t var t1l = t1l + Kil;\n\t var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);\n\t var t1l = t1l + Wil;\n\t var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);\n\n\t // t2 = sigma0 + maj\n\t var t2l = sigma0l + majl;\n\t var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);\n\n\t // Update working variables\n\t hh = gh;\n\t hl = gl;\n\t gh = fh;\n\t gl = fl;\n\t fh = eh;\n\t fl = el;\n\t el = (dl + t1l) | 0;\n\t eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;\n\t dh = ch;\n\t dl = cl;\n\t ch = bh;\n\t cl = bl;\n\t bh = ah;\n\t bl = al;\n\t al = (t1l + t2l) | 0;\n\t ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;\n\t }\n\n\t // Intermediate hash value\n\t H0l = H0.low = (H0l + al);\n\t H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));\n\t H1l = H1.low = (H1l + bl);\n\t H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));\n\t H2l = H2.low = (H2l + cl);\n\t H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));\n\t H3l = H3.low = (H3l + dl);\n\t H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));\n\t H4l = H4.low = (H4l + el);\n\t H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));\n\t H5l = H5.low = (H5l + fl);\n\t H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));\n\t H6l = H6.low = (H6l + gl);\n\t H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));\n\t H7l = H7.low = (H7l + hl);\n\t H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));\n\t },\n\n\t _doFinalize: function () {\n\t // Shortcuts\n\t var data = this._data;\n\t var dataWords = data.words;\n\n\t var nBitsTotal = this._nDataBytes * 8;\n\t var nBitsLeft = data.sigBytes * 8;\n\n\t // Add padding\n\t dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);\n\t dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;\n\t data.sigBytes = dataWords.length * 4;\n\n\t // Hash final blocks\n\t this._process();\n\n\t // Convert hash to 32-bit word array before returning\n\t var hash = this._hash.toX32();\n\n\t // Return final computed hash\n\t return hash;\n\t },\n\n\t clone: function () {\n\t var clone = Hasher.clone.call(this);\n\t clone._hash = this._hash.clone();\n\n\t return clone;\n\t },\n\n\t blockSize: 1024/32\n\t });\n\n\t /**\n\t * Shortcut function to the hasher's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t *\n\t * @return {WordArray} The hash.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hash = CryptoJS.SHA512('message');\n\t * var hash = CryptoJS.SHA512(wordArray);\n\t */\n\t C.SHA512 = Hasher._createHelper(SHA512);\n\n\t /**\n\t * Shortcut function to the HMAC's object interface.\n\t *\n\t * @param {WordArray|string} message The message to hash.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @static\n\t *\n\t * @example\n\t *\n\t * var hmac = CryptoJS.HmacSHA512(message, key);\n\t */\n\t C.HmacSHA512 = Hasher._createHmacHelper(SHA512);\n\t}());\n\n\n\treturn CryptoJS.SHA512;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t // Shortcuts\n\t var C = CryptoJS;\n\t var C_lib = C.lib;\n\t var Base = C_lib.Base;\n\t var C_enc = C.enc;\n\t var Utf8 = C_enc.Utf8;\n\t var C_algo = C.algo;\n\n\t /**\n\t * HMAC algorithm.\n\t */\n\t var HMAC = C_algo.HMAC = Base.extend({\n\t /**\n\t * Initializes a newly created HMAC.\n\t *\n\t * @param {Hasher} hasher The hash algorithm to use.\n\t * @param {WordArray|string} key The secret key.\n\t *\n\t * @example\n\t *\n\t * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n\t */\n\t init: function (hasher, key) {\n\t // Init hasher\n\t hasher = this._hasher = new hasher.init();\n\n\t // Convert string to WordArray, else assume WordArray already\n\t if (typeof key == 'string') {\n\t key = Utf8.parse(key);\n\t }\n\n\t // Shortcuts\n\t var hasherBlockSize = hasher.blockSize;\n\t var hasherBlockSizeBytes = hasherBlockSize * 4;\n\n\t // Allow arbitrary length keys\n\t if (key.sigBytes > hasherBlockSizeBytes) {\n\t key = hasher.finalize(key);\n\t }\n\n\t // Clamp excess bits\n\t key.clamp();\n\n\t // Clone key for inner and outer pads\n\t var oKey = this._oKey = key.clone();\n\t var iKey = this._iKey = key.clone();\n\n\t // Shortcuts\n\t var oKeyWords = oKey.words;\n\t var iKeyWords = iKey.words;\n\n\t // XOR keys with pad constants\n\t for (var i = 0; i < hasherBlockSize; i++) {\n\t oKeyWords[i] ^= 0x5c5c5c5c;\n\t iKeyWords[i] ^= 0x36363636;\n\t }\n\t oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\n\n\t // Set initial values\n\t this.reset();\n\t },\n\n\t /**\n\t * Resets this HMAC to its initial state.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.reset();\n\t */\n\t reset: function () {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Reset\n\t hasher.reset();\n\t hasher.update(this._iKey);\n\t },\n\n\t /**\n\t * Updates this HMAC with a message.\n\t *\n\t * @param {WordArray|string} messageUpdate The message to append.\n\t *\n\t * @return {HMAC} This HMAC instance.\n\t *\n\t * @example\n\t *\n\t * hmacHasher.update('message');\n\t * hmacHasher.update(wordArray);\n\t */\n\t update: function (messageUpdate) {\n\t this._hasher.update(messageUpdate);\n\n\t // Chainable\n\t return this;\n\t },\n\n\t /**\n\t * Finalizes the HMAC computation.\n\t * Note that the finalize operation is effectively a destructive, read-once operation.\n\t *\n\t * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t *\n\t * @return {WordArray} The HMAC.\n\t *\n\t * @example\n\t *\n\t * var hmac = hmacHasher.finalize();\n\t * var hmac = hmacHasher.finalize('message');\n\t * var hmac = hmacHasher.finalize(wordArray);\n\t */\n\t finalize: function (messageUpdate) {\n\t // Shortcut\n\t var hasher = this._hasher;\n\n\t // Compute HMAC\n\t var innerHash = hasher.finalize(messageUpdate);\n\t hasher.reset();\n\t var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n\t return hmac;\n\t }\n\t });\n\t}());\n\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"), require(\"./sha512\"), require(\"./hmac\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./x64-core\", \"./sha512\", \"./hmac\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.HmacSHA512;\n\n}));","import Hex from \"crypto-js/enc-hex\"\nimport HmacSHA512 from \"crypto-js/hmac-sha512\"\n\nexport function computeHmac (message: string, applicationKey: string, hmacKey: string): string {\n const hmac = new HmacSHA512(message, applicationKey + hmacKey)\n return hmac.toString(Hex) as string\n}\n","\nexport const isVersionSuperiorOrEqual = (source: string, target: string): boolean =>\n{\n const sourceParts = source.split(\".\")\n const targetParts = target.split(\".\")\n\n for (let i = 0; i < targetParts.length; i++) {\n const a = Number(targetParts[i])\n const b = Number(sourceParts[i])\n if (a > b) return false\n if (a < b) return true\n }\n return true\n}\n","import { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TStroke, TStrokeJSON } from \"../@types/model/Stroke\"\nimport { TPointer } from \"../@types/geometry\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class Stroke implements TStroke\n{\n id: string\n type: string\n pointerId: number\n pointerType: string\n elementType?: string\n pointers: TPointer[]\n length: number\n style: TPenStyle\n #logger = LoggerManager.getLogger(LoggerClass.STROKE)\n\n constructor(style: TPenStyle, pointerId: number, pointerType = \"pen\")\n {\n this.#logger.info(\"constructor\", { style, pointerId, pointerType })\n this.id = `${pointerType}-${Date.now().toString()}`\n this.type = \"stroke\"\n this.pointerId = pointerId\n this.pointerType = pointerType\n this.pointers = []\n this.length = 0\n this.style = style\n }\n}\n\nexport function convertStrokeToJSON(stroke: TStroke): TStrokeJSON\n{\n const json: TStrokeJSON = {\n id: stroke.id,\n pointerType: stroke.pointerType,\n p: [],\n t: [],\n x: [],\n y: []\n }\n stroke.pointers.forEach(p => {\n json.p.push(p.p)\n json.t.push(p.t)\n json.x.push(p.x)\n json.y.push(p.y)\n })\n return json\n}\n","\nimport { IRecognizer } from \"../@types/recognizer/Recognizer\"\nimport { TRestPostConfiguration, TRestPostData } from \"../@types/recognizer/RestRecognizer\"\nimport { TStrokeGroup, TStrokeGroupJSON } from \"../@types/model/Stroke\"\nimport { TConverstionState, TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { IModel, TExport, TJIIXExport } from \"../@types/model/Model\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\n\nimport { Error as ErrorConst } from \"../Constants\"\nimport { StyleHelper } from \"../style/StyleHelper\"\nimport { computeHmac } from \"../utils/CryptoHelper\"\nimport { isVersionSuperiorOrEqual } from \"../utils/version\"\nimport { convertStrokeToJSON } from \"../model/Stroke\"\n\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\ntype ApiError = {\n code?: string\n message: string\n}\n\nexport class RestRecognizer implements IRecognizer\n{\n protected serverConfiguration: TServerConfiguration\n protected recognitionConfiguration: TRecognitionConfiguration\n #logger = LoggerManager.getLogger(LoggerClass.RECOGNIZER)\n\n constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration)\n {\n this.#logger.info(\"constructor\", { serverConfig, recognitionConfig })\n this.serverConfiguration = serverConfig\n this.recognitionConfiguration = recognitionConfig\n }\n\n get url()\n {\n return `${ this.serverConfiguration.scheme }://${ this.serverConfiguration.host }/api/v4.0/iink/batch`\n }\n\n get postConfig(): TRestPostConfiguration\n {\n switch (this.recognitionConfiguration.type) {\n case \"DIAGRAM\":\n return {\n lang: this.recognitionConfiguration.lang,\n diagram: this.recognitionConfiguration.diagram,\n export: this.recognitionConfiguration.export\n }\n case \"MATH\":\n return {\n lang: this.recognitionConfiguration.lang,\n math: this.recognitionConfiguration.math,\n export: this.recognitionConfiguration.export\n }\n case \"Raw Content\":\n return {\n lang: this.recognitionConfiguration.lang,\n \"raw-content\": this.recognitionConfiguration[\"raw-content\"],\n export: this.recognitionConfiguration.export\n }\n case \"TEXT\":\n return {\n lang: this.recognitionConfiguration.lang,\n text: this.recognitionConfiguration.text,\n export: this.recognitionConfiguration.export\n }\n default:\n throw new Error(`get postConfig error Recognition type unkow \"${ this.recognitionConfiguration.type }\"`)\n break\n }\n }\n\n private buildData(model: IModel): TRestPostData\n {\n this.#logger.info(\"buildData\", { model })\n const isPenStyleEqual = (ps1: TPenStyle, ps2: TPenStyle) =>\n {\n return ps1 && ps2 && ps1[\"-myscript-pen-fill-color\"] === ps2[\"-myscript-pen-fill-color\"] &&\n ps1[\"-myscript-pen-fill-style\"] === ps2[\"-myscript-pen-fill-style\"] &&\n ps1[\"-myscript-pen-width\"] === ps2[\"-myscript-pen-width\"] &&\n ps1.color === ps2.color &&\n ps1.width === ps2.width\n }\n\n const strokeGroupByPenStyle: TStrokeGroup[] = []\n model.rawStrokes.forEach((s) => {\n const groupIndex = strokeGroupByPenStyle.findIndex(sg => isPenStyleEqual(sg.penStyle, s.style))\n if (groupIndex > -1) {\n strokeGroupByPenStyle[groupIndex].strokes.push(s)\n } else {\n strokeGroupByPenStyle.push({\n penStyle: s.style,\n strokes: [s]\n })\n }\n })\n\n const strokeGroupsToSend: TStrokeGroupJSON[] = []\n strokeGroupByPenStyle.forEach((group: TStrokeGroup) =>\n {\n const newPenStyle = JSON.stringify(group.penStyle) === \"{}\" ? undefined : StyleHelper.penStyleToCSS(group.penStyle as TPenStyle)\n const newGroup = {\n penStyle: newPenStyle,\n strokes: group.strokes.map(convertStrokeToJSON)\n }\n strokeGroupsToSend.push(newGroup)\n })\n\n const contentType: string = this.recognitionConfiguration.type === \"Raw Content\" ?\n \"Raw Content\" :\n this.recognitionConfiguration.type.charAt(0).toUpperCase() + this.recognitionConfiguration.type.slice(1).toLowerCase()\n\n const data = {\n configuration: this.postConfig,\n xDPI: 96,\n yDPI: 96,\n contentType,\n // theme: StyleHelper.themeToCSS(),\n height: model.height,\n width: model.width,\n strokeGroups: strokeGroupsToSend\n }\n this.#logger.debug(\"buildData\", { data })\n return data\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private async post(data: any, mimeType: string): Promise\n {\n this.#logger.info(\"post\", { data, mimeType })\n const headers = new Headers()\n headers.append(\"Accept\", \"application/json,\" + mimeType)\n headers.append(\"applicationKey\", this.serverConfiguration.applicationKey)\n headers.append(\"hmac\", computeHmac(JSON.stringify(data), this.serverConfiguration.applicationKey, this.serverConfiguration.hmacKey))\n headers.append(\"Content-Type\", \"application/json\")\n\n if (isVersionSuperiorOrEqual(this.serverConfiguration.version, \"2.0.4\")) {\n headers.append(\"myscript-client-name\", \"iink-ts\")\n headers.append(\"myscript-client-version\", \"1.0.0-buildVersion\")\n }\n\n const reqInit: RequestInit = {\n method: \"POST\",\n headers,\n body: JSON.stringify(data)\n }\n const request = new Request(this.url, reqInit)\n const response: Response = await fetch(request)\n if (response.ok) {\n const contentType = response.headers.get(\"content-type\")\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let result: any\n switch (contentType) {\n case \"application/vnd.openxmlformats-officedocument.presentationml.presentation\":\n case \"image/png\":\n case \"image/jpeg\":\n result = await response.blob()\n break\n case \"application/json\":\n result = await response.json()\n break\n case \"application/vnd.myscript.jiix\":\n result = await response.clone().json().catch(async () => await response.text())\n break\n default:\n this.#logger.warn(\"post default\", { contentType })\n result = await response.text()\n break\n }\n this.#logger.debug(\"post\", { result })\n return result\n } else {\n const err = await response.json() as ApiError\n this.#logger.error(\"post\", { err })\n throw err\n }\n }\n\n private async tryFetch(data: unknown, mimeType: string): Promise\n {\n this.#logger.debug(\"tryFetch\", { data, mimeType })\n return this.post(data, mimeType)\n .then((res) =>\n {\n const exports: TExport = {}\n exports[mimeType] = res as TJIIXExport | string | Blob\n this.#logger.debug(\"tryFetch\", { exports })\n return exports\n })\n .catch((err) =>\n {\n this.#logger.error(\"tryFetch\", { data, mimeType, err })\n let message = err.message || ErrorConst.UNKNOW\n if (!err.code) {\n message = ErrorConst.CANT_ESTABLISH\n } else if (err.code === \"access.not.granted\") {\n message = ErrorConst.WRONG_CREDENTIALS\n }\n const error = new Error(message)\n throw error\n })\n }\n\n private getMimeTypes(requestedMimeTypes?: string[]): string[]\n {\n this.#logger.info(\"getMimeTypes\", { requestedMimeTypes })\n let mimeTypes: string[] = requestedMimeTypes || []\n if (!mimeTypes.length) {\n switch (this.recognitionConfiguration.type) {\n case \"DIAGRAM\":\n mimeTypes = this.recognitionConfiguration.diagram.mimeTypes\n break\n case \"MATH\":\n mimeTypes = this.recognitionConfiguration.math.mimeTypes\n break\n case \"Raw Content\":\n mimeTypes = [\"application/vnd.myscript.jiix\"]\n break\n case \"TEXT\":\n mimeTypes = this.recognitionConfiguration.text.mimeTypes\n break\n default:\n throw new Error(`Recognition type \"${ this.recognitionConfiguration.type }\" is unknown.\\n Possible types are:\\n -DIAGRAM\\n -MATH\\n -Raw Content\\n -TEXT`)\n break\n }\n }\n return mimeTypes\n }\n\n async convert(model: IModel, conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise\n {\n this.#logger.info(\"convert\", { model, conversionState, requestedMimeTypes })\n const myModel = model.getClone()\n const mimeTypes = this.getMimeTypes(requestedMimeTypes)\n const dataToConcert = this.buildData(myModel)\n dataToConcert.conversionState = conversionState\n const promises = mimeTypes.map(mt => this.tryFetch(dataToConcert, mt))\n const converts: TExport[] = await Promise.all(promises)\n converts.forEach(c =>\n {\n myModel.mergeConvert(c)\n })\n this.#logger.debug(\"convert\", { model: myModel })\n return myModel\n }\n\n async export(model: IModel, requestedMimeTypes?: string[]): Promise\n {\n this.#logger.info(\"export\", { model, requestedMimeTypes })\n const myModel = model.getClone()\n if (myModel.rawStrokes.length === 0) {\n return Promise.resolve(myModel)\n }\n const mimeTypes = this.getMimeTypes(requestedMimeTypes)\n if (!mimeTypes.length) {\n this.#logger.error(\"export\", { model, requestedMimeTypes, \"Export failed, no mimeTypes define in recognition configuration\": String })\n return Promise.reject(new Error(\"Export failed, no mimeTypes define in recognition configuration\"))\n }\n const mimeTypesRequiringExport: string[] = mimeTypes.filter(m => !myModel.exports || !myModel.exports[m])\n const data = this.buildData(model)\n const exports: TExport[] = await Promise.all(mimeTypesRequiringExport.map(mimeType => this.tryFetch(data, mimeType)))\n exports.forEach(e =>\n {\n myModel.mergeExport(e)\n })\n this.#logger.debug(\"export\", { model: myModel })\n return myModel\n }\n\n async resize(model: IModel): Promise\n {\n this.#logger.info(\"resize\", { model })\n return this.export(model)\n }\n\n}\n","import { IModel } from \"../@types/model/Model\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\n\nexport class UndoRedoContext implements TUndoRedoContext\n{\n canUndo: boolean\n canRedo: boolean\n empty: boolean\n stackIndex: number\n possibleUndoCount: number\n stack: IModel[]\n\n constructor(model: IModel)\n {\n this.stackIndex = 0\n this.possibleUndoCount = 0\n this.canRedo = false\n this.canUndo = false\n this.empty = true\n this.stack = [model.getClone()]\n }\n}\n","import { TUndoRedoConfiguration } from \"../@types/configuration/UndoRedoConfiguration\"\nimport { IModel } from \"../@types/model/Model\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { UndoRedoContext } from \"./UndoRedoContext\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class UndoRedoManager\n{\n context: UndoRedoContext\n configuration: TUndoRedoConfiguration\n #logger = LoggerManager.getLogger(LoggerClass.UNDOREDO_MANAGER)\n\n constructor(configuration: TUndoRedoConfiguration, model: IModel)\n {\n this.#logger.info(\"constructor\", { configuration, model })\n this.configuration = configuration\n this.context = new UndoRedoContext(model)\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n private updateCanUndoRedo(): void\n {\n this.context.canRedo = this.context.stack.length - 1 > this.context.stackIndex\n this.context.canUndo = this.context.stackIndex > 0\n const currentModel = this.context.stack[this.context.stackIndex]\n this.context.empty = currentModel.rawStrokes.length === 0\n }\n\n addModelToStack(model: IModel): void\n {\n this.#logger.info(\"addModelToStack\", { model })\n if (this.context.stackIndex + 1 < this.context.stack.length) {\n this.context.stack.splice(this.context.stackIndex + 1)\n }\n\n this.context.stack.push(model.getClone())\n this.context.stackIndex = this.context.stack.length - 1\n\n if (this.context.stack.length > this.configuration.maxStackSize) {\n this.context.stack.shift()\n this.context.stackIndex--\n }\n\n this.updateCanUndoRedo()\n this.internalEvent.emitContextChange(this.context)\n }\n\n removeLastModelInStack(): void\n {\n this.#logger.info(\"removeLastModelInStack\")\n if (this.context.stackIndex === this.context.stack.length - 1) {\n this.context.stackIndex--\n }\n this.context.stack.pop()\n this.updateCanUndoRedo()\n }\n\n updateModelInStack(model: IModel): void\n {\n this.#logger.info(\"updateModelInStack\", { model })\n const index = this.context.stack.findIndex(m => m.modificationDate === model.modificationDate)\n if (index > -1) {\n this.context.stack.splice(index, 1, model.getClone())\n }\n this.internalEvent.emitContextChange(this.context)\n }\n\n undo(): IModel\n {\n this.#logger.info(\"undo\")\n if (this.context.canUndo) {\n this.context.stackIndex--\n this.updateCanUndoRedo()\n this.internalEvent.emitContextChange(this.context)\n }\n const previousModel = this.context.stack[this.context.stackIndex].getClone()\n this.#logger.debug(\"undo\", previousModel)\n return previousModel\n }\n\n redo(): IModel\n {\n this.#logger.info(\"redo\")\n if (this.context.canRedo) {\n this.context.stackIndex++\n this.updateCanUndoRedo()\n this.internalEvent.emitContextChange(this.context)\n }\n const nextModel = this.context.stack[this.context.stackIndex].getClone()\n this.#logger.debug(\"redo\", nextModel)\n return nextModel\n }\n\n reset(model: IModel): void\n {\n this.#logger.info(\"reset\", { model })\n this.context = new UndoRedoContext(model)\n this.internalEvent.emitContextChange(this.context)\n }\n\n}\n","import { TPenStyle } from \"../@types/style/PenStyle\"\n\nexport const DefaultPenStyle: TPenStyle = {}","import { TTheme } from \"../@types/style/Theme\"\n\nexport const DefaultTheme: TTheme = {\n ink: {\n color: \"#000000\",\n width: 1,\n \"-myscript-pen-width\": 1,\n \"-myscript-pen-fill-style\": \"none\",\n \"-myscript-pen-fill-color\": \"#FFFFFF00\"\n },\n \".math\": {\n \"font-family\": \"STIXGeneral\"\n },\n \".math-solved\": {\n \"font-family\": \"STIXGeneral\",\n color: \"#A8A8A8FF\"\n },\n \".text\": {\n \"font-family\": \"MyScriptInter\",\n \"font-size\": 10\n }\n}\n","import { TTheme } from \"../@types/style/Theme\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\n\nimport { mergeDeep } from \"../utils/MergeHelper\"\n\nimport { DefaultPenStyle } from \"./DefaultPenStyle\"\nimport { DefaultTheme } from \"./DefaultTheme\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class StyleManager\n{\n #penStyle!: TPenStyle\n #theme!: TTheme\n #penStyleClasses!: string\n #currentPenStyle!: TPenStyle\n #logger = LoggerManager.getLogger(LoggerClass.STYLEMANAGER)\n\n constructor(penStyle?: TPenStyle, theme?: TTheme)\n {\n this.#logger.info(\"constructor\", { penStyle, theme })\n this.setTheme(theme)\n this.setPenStyleClasses()\n this.setPenStyle(penStyle)\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.#currentPenStyle || this.#penStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.#penStyle\n }\n setPenStyle(style?: TPenStyle)\n {\n this.#logger.info(\"setPenStyle\", { style })\n this.#penStyle = mergeDeep(structuredClone(DefaultPenStyle), style || {}) as TPenStyle\n this.#currentPenStyle = style || (this.theme[`.${ this.#penStyleClasses }`]) as TPenStyle\n this.#logger.debug(\"setPenStyle\", this.#currentPenStyle)\n }\n\n get theme(): TTheme\n {\n return this.#theme\n }\n setTheme(theme?: TTheme)\n {\n this.#logger.info(\"setTheme\", { theme })\n this.#theme = mergeDeep(structuredClone(DefaultTheme), theme || {}) as TTheme\n this.#logger.debug(\"setTheme\", this.#theme)\n }\n\n get penStyleClasses(): string\n {\n return this.#penStyleClasses\n }\n setPenStyleClasses(penStyleClass = \"\")\n {\n this.#logger.info(\"setPenStyleClasses\", { penStyleClass })\n this.#penStyleClasses = penStyleClass\n this.#currentPenStyle = (this.theme[`.${ this.#penStyleClasses }`]) as TPenStyle\n this.#logger.debug(\"setPenStyleClasses\", this.#currentPenStyle)\n }\n\n}\n","import { TPoint } from \"../@types/geometry\"\n\nexport function computeDistance(p1: TPoint, p2: TPoint): number\n{\n const distance = Math.hypot(p2.y - p1.y, p2.x - p1.x)\n return isNaN(distance) ? 0 : distance\n}\n","import { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TPoint, TPointer } from \"../@types/geometry\"\nimport { TStroke } from \"../@types/model/Stroke\"\nimport { IModel, TExport } from \"../@types/model/Model\"\nimport { TRecognitionPositions } from \"../@types/model/RecognitionPositions\"\n\nimport { computeDistance } from \"../utils/geometric\"\nimport { Stroke } from \"./Stroke\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class Model implements IModel\n{\n readonly creationTime: number\n modificationDate: number\n currentStroke?: TStroke\n positions: TRecognitionPositions\n rawStrokes: TStroke[]\n selectedStrokes: TStroke[]\n exports?: TExport\n converts?: TExport\n width: number\n height: number\n idle: boolean\n #logger = LoggerManager.getLogger(LoggerClass.MODEL)\n\n constructor(width = 100, height = 100, creationDate: number = Date.now())\n {\n this.#logger.info(\"constructor\", { width, height, creationDate })\n this.creationTime = creationDate\n this.modificationDate = creationDate\n this.width = width\n this.height = height\n this.rawStrokes = []\n this.selectedStrokes = []\n this.positions = {\n lastSentPosition: 0,\n lastReceivedPosition: 0\n }\n this.idle = true\n }\n\n mergeExport(exports: TExport)\n {\n this.#logger.info(\"mergeExport\", { exports })\n if (this.exports) {\n Object.assign(this.exports, exports)\n } else {\n this.exports = exports\n }\n this.#logger.debug(\"mergeExport\", this.exports)\n }\n\n mergeConvert(converts: TExport)\n {\n this.#logger.info(\"mergeConvert\", { converts })\n if (this.converts) {\n Object.assign(this.converts, converts)\n } else {\n this.converts = converts\n }\n this.#logger.debug(\"mergeConvert\", this.converts)\n }\n\n private computePressure(distance: number, globalDistance: number): number\n {\n let ratio = 1.0\n if (globalDistance === 0) {\n ratio = 0.5\n } else if (distance === globalDistance) {\n ratio = 1.0\n } else if (distance < 10) {\n ratio = 0.2 + Math.pow(0.1 * distance, 0.4)\n } else if (distance > globalDistance - 10) {\n ratio = 0.2 + Math.pow(0.1 * (globalDistance - distance), 0.4)\n }\n const pressure = ratio * Math.max(0.1, 1.0 - (0.1 * Math.sqrt(distance)))\n return isNaN(pressure) ? 0.5 : Math.round(pressure * 100) / 100\n }\n\n private filterPointByAcquisitionDelta(stroke: TStroke, point: TPointer, lastPointer: TPointer): boolean\n {\n const delta: number = (2 + ((stroke.style[\"-myscript-pen-width\"] || 0) / 4))\n return !lastPointer ||\n stroke.pointers.length === 0 ||\n Math.abs(lastPointer.x - point.x) >= delta ||\n Math.abs(lastPointer.y - point.y) >= delta\n }\n\n addPoint(stroke: TStroke, pointer: TPointer): void\n {\n this.#logger.debug(\"addPoint\", { stroke, pointer })\n const lastPointer: TPointer = stroke.pointers.at(-1) || { p: 1, t: 0, x: 0, y: 0 }\n if (this.filterPointByAcquisitionDelta(stroke, pointer, lastPointer)) {\n const distance = computeDistance(pointer, lastPointer)\n stroke.length += distance\n pointer.p = this.computePressure(distance, stroke.length)\n stroke.pointers.push(pointer)\n }\n }\n\n addStroke(stroke: TStroke): void\n {\n this.#logger.info(\"addStroke\", { stroke })\n this.rawStrokes.push(stroke)\n }\n\n extractUnsentStrokes(): TStroke[]\n {\n return this.rawStrokes.slice(this.positions.lastSentPosition)\n }\n\n initCurrentStroke(point: TPointer, pointerId: number, pointerType: string, style: TPenStyle, dpi = 96): void\n {\n this.#logger.info(\"initCurrentStroke\", { point, pointerId, pointerType, style, dpi })\n if (style[\"-myscript-pen-width\"]) {\n const pxWidth = (style[\"-myscript-pen-width\"] * dpi) / 25.4\n style.width = pxWidth / 2\n }\n this.modificationDate = Date.now()\n this.exports = undefined\n this.converts = undefined\n this.currentStroke = new Stroke(style, pointerId, pointerType)\n this.#logger.debug(\"initCurrentStroke\", this.currentStroke)\n this.addPoint(this.currentStroke, point)\n }\n\n appendToCurrentStroke(point: TPointer): void\n {\n this.#logger.info(\"appendToCurrentStroke\", { point })\n if (this.currentStroke) {\n this.addPoint(this.currentStroke, point)\n }\n this.#logger.debug(\"appendToCurrentStroke\", this.currentStroke)\n }\n\n endCurrentStroke(point: TPointer): void\n {\n this.#logger.info(\"endCurrentStroke\", { point })\n if (this.currentStroke) {\n this.addPoint(this.currentStroke, point)\n this.addStroke(this.currentStroke)\n this.currentStroke = undefined\n }\n this.#logger.debug(\"endCurrentStroke\", this.currentStroke)\n }\n\n #getStrokeFromPoint(point: TPoint): TStroke[]\n {\n this.#logger.info(\"getStrokeFromPoint\", { point })\n const isBetween = (val: number, min: number, max: number): boolean => (val >= min && val <= max)\n\n const _strokeList: TStroke[] = []\n this.rawStrokes.forEach((stroke) =>\n {\n for (let i = 0; i < stroke.pointers.length; i++) {\n const strokePointer = stroke.pointers[i]\n if (\n isBetween(strokePointer.x, point.x - 5, point.x + 5) &&\n isBetween(strokePointer.y, point.y - 5, point.y + 5)\n ) {\n _strokeList.push(stroke)\n break\n }\n else {\n if (computeDistance(point, strokePointer) < 10) {\n _strokeList.push(stroke)\n break\n }\n }\n }\n })\n this.#logger.debug(\"getStrokeFromPoint\", { strokes: _strokeList })\n return _strokeList\n }\n\n resetSelectedStrokes(): void\n {\n this.selectedStrokes = []\n }\n\n appendSelectedStrokesFromPoint(point: TPoint): void\n {\n this.#logger.info(\"appendSelectedStrokesFromPoint\", { point })\n this.#getStrokeFromPoint(point)\n .forEach(s =>\n {\n if (!this.selectedStrokes.includes(s)) {\n this.selectedStrokes.push(s)\n }\n })\n }\n\n updateStroke(updatedStroke: TStroke): void\n {\n this.#logger.info(\"updateStroke\", { updatedStroke })\n const strokeIndex = this.rawStrokes.findIndex((s: TStroke): boolean => s.id === updatedStroke.id)\n if (strokeIndex !== -1) {\n this.rawStrokes.splice(strokeIndex, 1, updatedStroke)\n }\n this.#logger.debug(\"updateStroke\", this.rawStrokes)\n }\n\n removeStroke(id: string): void\n {\n this.#logger.info(\"removeStroke\", { id })\n const strokeIndex = this.rawStrokes.findIndex((s: TStroke): boolean => s.id === id)\n if (strokeIndex !== -1) {\n this.rawStrokes.splice(strokeIndex, 1)\n }\n this.#logger.debug(\"removeStroke\", this.rawStrokes)\n }\n\n removeStrokesFromPoint(point: TPoint): string[]\n {\n this.#logger.info(\"removeStrokesFromPoint\", { point })\n const strokes = this.#getStrokeFromPoint(point)\n strokes.forEach(strokeToRemove =>\n {\n this.removeStroke(strokeToRemove.id)\n })\n this.#logger.debug(\"removeStrokesFromPoint\", strokes.map(s => s.id))\n return strokes.map(s => s.id)\n }\n\n updatePositionSent(position: number = this.rawStrokes.length): void\n {\n this.#logger.info(\"updatePositionSent\", { position })\n this.positions.lastSentPosition = position\n this.#logger.debug(\"updatePositionSent\", this.positions.lastSentPosition)\n }\n\n updatePositionReceived(): void\n {\n this.#logger.info(\"updatePositionReceived\")\n this.positions.lastReceivedPosition = this.positions.lastSentPosition\n this.#logger.debug(\"updatePositionReceived\", this.positions.lastReceivedPosition)\n }\n\n getClone(): IModel\n {\n this.#logger.info(\"getClone\")\n const clonedModel = new Model(this.width, this.height, this.creationTime)\n clonedModel.modificationDate = JSON.parse(JSON.stringify(this.modificationDate))\n clonedModel.currentStroke = this.currentStroke ? JSON.parse(JSON.stringify(this.currentStroke)) : undefined\n clonedModel.rawStrokes = JSON.parse(JSON.stringify(this.rawStrokes))\n clonedModel.positions = JSON.parse(JSON.stringify(this.positions))\n clonedModel.exports = this.exports ? JSON.parse(JSON.stringify(this.exports)) : undefined\n clonedModel.converts = this.converts ? JSON.parse(JSON.stringify(this.converts)) : undefined\n clonedModel.idle = this.idle\n this.#logger.debug(\"getClone\", { clonedModel })\n return clonedModel\n }\n\n clear(): void\n {\n this.#logger.info(\"clear\")\n this.modificationDate = Date.now()\n this.currentStroke = undefined\n this.rawStrokes = []\n this.positions.lastSentPosition = 0\n this.positions.lastReceivedPosition = 0\n this.exports = undefined\n this.converts = undefined\n this.idle = true\n }\n}\n","import { IBehaviors, TBehaviorOptions } from \"../@types/Behaviors\"\nimport { IModel, TExport } from \"../@types/model/Model\"\nimport { TConfiguration } from \"../@types/configuration\"\nimport { TConverstionState } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TTheme } from \"../@types/style/Theme\"\nimport { TPointer } from \"../@types/geometry\"\n\nimport { PointerEventGrabber } from \"../grabber/PointerEventGrabber\"\nimport { CanvasRenderer } from \"../renderer/canvas/CanvasRenderer\"\nimport { RestRecognizer } from \"../recognizer/RestRecognizer\"\nimport { DeferredPromise } from \"../utils/DeferredPromise\"\nimport { UndoRedoManager } from \"../undo-redo/UndoRedoManager\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { StyleManager } from \"../style/StyleManager\"\nimport { Configuration } from \"../configuration/Configuration\"\nimport { Model } from \"../model/Model\"\nimport { Intention, LoggerClass } from \"../Constants\"\nimport { LoggerManager } from \"../logger\"\n\nexport class RestBehaviors implements IBehaviors\n{\n name = \"RestBehaviors\"\n options: TBehaviorOptions\n grabber: PointerEventGrabber\n renderer: CanvasRenderer\n recognizer: RestRecognizer\n undoRedoManager: UndoRedoManager\n styleManager: StyleManager\n #configuration: TConfiguration\n #model: IModel\n intention: Intention\n #logger = LoggerManager.getLogger(LoggerClass.BEHAVIORS)\n\n #resizeTimer?: ReturnType\n #exportTimer?: ReturnType\n\n constructor(options: TBehaviorOptions)\n {\n this.#logger.info(\"constructor\", { options })\n this.options = options\n this.#configuration = new Configuration(options?.configuration)\n this.styleManager = new StyleManager(options.penStyle, options.theme)\n\n this.grabber = new PointerEventGrabber(this.#configuration.grabber)\n this.renderer = new CanvasRenderer(this.#configuration.rendering)\n this.recognizer = new RestRecognizer(this.#configuration.server, this.#configuration.recognition)\n\n this.intention = Intention.Write\n this.#model = new Model()\n this.undoRedoManager = new UndoRedoManager(this.#configuration[\"undo-redo\"], this.model)\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n get model(): IModel\n {\n return this.#model\n }\n\n get context(): TUndoRedoContext\n {\n return this.undoRedoManager.context\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.styleManager.currentPenStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.styleManager.penStyle\n }\n setPenStyle(style?: TPenStyle)\n {\n this.#logger.info(\"setPenStyle\", { style })\n this.styleManager.setPenStyle(style)\n }\n\n get penStyleClasses(): string\n {\n return this.styleManager.penStyleClasses\n }\n setPenStyleClasses(penClass?: string)\n {\n this.#logger.info(\"setPenStyleClasses\", { penClass })\n this.styleManager.setPenStyleClasses(penClass)\n }\n\n get theme(): TTheme\n {\n return this.styleManager.theme\n }\n setTheme(theme?: TTheme)\n {\n this.#logger.info(\"setTheme\", { theme })\n this.styleManager.setTheme(theme)\n }\n\n get configuration(): TConfiguration\n {\n return this.#configuration\n }\n\n async init(domElement: HTMLElement): Promise\n {\n this.#logger.info(\"init\", { domElement })\n this.model.width = Math.max(domElement.clientWidth, this.#configuration.rendering.minWidth)\n this.model.height = Math.max(domElement.clientHeight, this.#configuration.rendering.minHeight)\n this.undoRedoManager.updateModelInStack(this.model)\n\n this.renderer.init(domElement)\n\n this.grabber.attach(domElement)\n this.grabber.onPointerDown = this.onPointerDown.bind(this)\n this.grabber.onPointerMove = this.onPointerMove.bind(this)\n this.grabber.onPointerUp = this.onPointerUp.bind(this)\n }\n\n private onPointerDown(evt: PointerEvent, point: TPointer): void\n {\n this.#logger.info(\"onPointerDown\", { intention: this.intention, evt, point })\n const { pointerType } = evt\n const style: TPenStyle = Object.assign({}, this.theme?.ink, this.currentPenStyle)\n switch (this.intention) {\n case Intention.Erase:\n if (this.model.removeStrokesFromPoint(point).length > 0) {\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(model => Object.assign(this.model, model))\n .catch(error => this.internalEvent.emitError(error as Error))\n }\n break\n case Intention.Write:\n this.model.initCurrentStroke(point, evt.pointerId, pointerType, style)\n this.drawCurrentStroke()\n break\n default:\n this.#logger.warn(`onPointerDown intention unknow: \"${this.intention}\"`)\n break\n }\n }\n\n private onPointerMove(_evt: PointerEvent, point: TPointer): void\n {\n this.#logger.info(\"onPointerMove\", { intention: this.intention, point })\n switch (this.intention) {\n case Intention.Erase:\n if (this.model.removeStrokesFromPoint(point).length > 0) {\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(newModel => Object.assign(this.#model, newModel))\n .catch(error => this.internalEvent.emitError(error as Error))\n }\n break\n case Intention.Write:\n this.model.appendToCurrentStroke(point)\n this.drawCurrentStroke()\n break\n default:\n this.#logger.warn(`onPointerMove intention unknow: \"${this.intention}\"`)\n break\n }\n }\n\n private onPointerUp(_evt: PointerEvent, point: TPointer): void\n {\n this.#logger.info(\"onPointerUp\", { intention: this.intention, point })\n switch (this.intention) {\n case Intention.Erase:\n if (this.model.removeStrokesFromPoint(point).length > 0) {\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(newModel => Object.assign(this.#model, newModel))\n .catch(error => this.internalEvent.emitError(error as Error))\n }\n break\n case Intention.Write:\n this.model.endCurrentStroke(point)\n this.updateModelRendering()\n .then(newModel => Object.assign(this.#model, newModel))\n .catch(error => this.internalEvent.emitError(error as Error))\n break\n default:\n this.#logger.warn(`onPointerUp intention unknow: \"${this.intention}\"`)\n break\n }\n }\n\n drawCurrentStroke(): void\n {\n this.#logger.debug(\"drawCurrentStroke\", { stroke: this.model.currentStroke })\n this.renderer.drawPendingStroke(this.model.currentStroke)\n }\n\n async updateModelRendering(): Promise\n {\n this.#logger.info(\"updateModelRendering\")\n this.renderer.drawModel(this.model)\n const deferred = new DeferredPromise()\n this.undoRedoManager.addModelToStack(this.model)\n if (this.#configuration.triggers.exportContent !== \"DEMAND\") {\n clearTimeout(this.#exportTimer)\n let currentModel = this.model.getClone()\n this.#exportTimer = setTimeout(async () =>\n {\n try {\n currentModel = await this.recognizer.export(currentModel)\n this.undoRedoManager.updateModelInStack(currentModel)\n if (this.model.modificationDate === currentModel.modificationDate) {\n this.model.exports = currentModel.exports\n }\n deferred.resolve(this.model)\n } catch (error) {\n this.#logger.error(\"updateModelRendering\", { error })\n deferred.reject(error as Error)\n }\n }, this.#configuration.triggers.exportContent === \"QUIET_PERIOD\" ? this.#configuration.triggers.exportContentDelay : 0)\n } else {\n deferred.resolve(this.model)\n }\n await deferred.promise\n this.internalEvent.emitExported(this.model.exports as TExport)\n this.#logger.debug(\"updateModelRendering\", this.model.exports)\n return deferred.promise\n }\n\n async export(mimeTypes?: string[]): Promise\n {\n this.#logger.info(\"export\", { mimeTypes })\n const newModel = await this.recognizer.export(this.model.getClone(), mimeTypes)\n if (this.model.modificationDate === newModel.modificationDate) {\n this.model.mergeExport(newModel.exports as TExport)\n }\n this.undoRedoManager.updateModelInStack(newModel)\n this.#logger.debug(\"export\", this.model)\n return this.model\n }\n\n async convert(conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise\n {\n this.#logger.info(\"convert\", { conversionState, requestedMimeTypes })\n const newModel = await this.recognizer.convert(this.model, conversionState, requestedMimeTypes)\n Object.assign(this.#model, newModel)\n this.#logger.debug(\"convert\", this.model)\n return this.model\n }\n\n async resize(height: number, width: number): Promise\n {\n this.#logger.info(\"resize\", { height, width })\n const deferredResize = new DeferredPromise()\n this.model.height = height\n this.model.width = width\n this.renderer.resize(this.model)\n if (this.model.rawStrokes.length) {\n clearTimeout(this.#resizeTimer)\n this.#resizeTimer = setTimeout(async () =>\n {\n const resizeModel = await this.recognizer.resize(this.model)\n deferredResize.resolve(resizeModel)\n }, this.#configuration.triggers.resizeTriggerDelay)\n } else {\n deferredResize.resolve(this.model)\n }\n const newModel = await deferredResize.promise\n this.#logger.debug(\"resize\", { newModel })\n this.internalEvent.emitExported(newModel.exports as TExport)\n return newModel\n }\n\n async undo(): Promise\n {\n this.#logger.info(\"undo\")\n this.#model = this.undoRedoManager.undo()\n this.renderer.drawModel(this.#model)\n this.#model = await this.recognizer.export(this.#model)\n this.undoRedoManager.updateModelInStack(this.#model)\n this.internalEvent.emitExported(this.#model.exports as TExport)\n this.#logger.debug(\"undo\", this.#model)\n return this.#model\n }\n\n async redo(): Promise\n {\n this.#logger.info(\"redo\")\n this.#model = this.undoRedoManager.redo()\n this.renderer.drawModel(this.#model)\n this.#model = await this.recognizer.export(this.#model)\n this.undoRedoManager.updateModelInStack(this.#model)\n this.internalEvent.emitExported(this.#model.exports as TExport)\n this.#logger.debug(\"redo\", this.#model)\n return this.#model\n }\n\n async clear(): Promise\n {\n this.#logger.info(\"clear\")\n this.model.clear()\n this.undoRedoManager.addModelToStack(this.model)\n this.renderer.drawModel(this.model)\n this.internalEvent.emitExported(this.model.exports as TExport)\n this.#logger.debug(\"clear\", this.model)\n return this.model\n }\n\n async destroy(): Promise\n {\n this.#logger.info(\"destroy\")\n this.grabber.detach()\n this.renderer.destroy()\n return Promise.resolve()\n }\n}\n","\nimport { IRecognizer } from \"../@types/recognizer/Recognizer\"\nimport { TConverstionState, TRecognitionConfiguration } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TServerConfiguration } from \"../@types/configuration/ServerConfiguration\"\nimport { IModel, TExport, TJIIXExport } from \"../@types/model/Model\"\nimport { TWebSocketContentChangeEvent, TWebSocketErrorEvent, TWebSocketEvent, TWebSocketExportEvent, TWebSocketHMACChallengeEvent, TWebSocketPartChangeEvent, TWebSocketSVGPatchEvent } from \"../@types/recognizer/WSRecognizer\"\nimport { TStroke } from \"../@types/model/Stroke\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TTheme } from \"../@types/style/Theme\"\nimport { LoggerClass } from \"../@types/configuration/LoggerConfiguration\"\n\nimport { Error as ErrorConst } from \"../Constants\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { computeHmac } from \"../utils/CryptoHelper\"\nimport { StyleHelper } from \"../style/StyleHelper\"\nimport { DeferredPromise } from \"../utils/DeferredPromise\"\nimport { isVersionSuperiorOrEqual } from \"../utils/version\"\nimport { convertStrokeToJSON } from \"../model/Stroke\"\nimport { LoggerManager } from \"../logger\"\n\n/**\n * A websocket dialog have this sequence :\n * --------------------------- Client --------------------------------------------------- Server ----------------------------------\n * init: send newContentPackage or restoreIInkSession ==================>\n * <================== hmacChallenge\n * answer hmacChallenge: send the hmac ==================>\n * <================== contentPackageDescription\n * answer contentPackageDescription:\n * send the configuration ==================>\n * send newContentPart or openContentPart ==================>\n * <================== partChanged\n * <================== contentChanged\n * <================== newPart\n * <================== svgPatch\n *\n * setPenStyle (send the parameters) ==================>\n * setTheme (send the parameters) ==================>\n * setPenStyleClasses (send the parameters) ==================>\n * <================== svgPatch\n * addStrokes (send the strokes ) ============>\n * <================== update\n */\nexport class WSRecognizer implements IRecognizer\n{\n #logger = LoggerManager.getLogger(LoggerClass.RECOGNIZER)\n protected serverConfiguration: TServerConfiguration\n protected recognitionConfiguration: TRecognitionConfiguration\n\n protected socket!: WebSocket\n protected pingCount = 0\n protected reconnectionCount = 0\n protected viewSizeHeight!: number\n protected viewSizeWidth!: number\n // contentPartCount = 0\n protected sessionId?: string\n protected currentPartId?: string\n protected currentErrorCode?: string | number\n\n protected penStyle?: TPenStyle\n protected penStyleClasses?: string\n protected theme?: TTheme\n\n protected connected?: DeferredPromise\n protected initialized?: DeferredPromise\n protected addStrokeDeferred?: DeferredPromise\n protected exportDeferred?: DeferredPromise\n protected convertDeferred?: DeferredPromise\n protected importDeferred?: DeferredPromise\n protected resizeDeferred?: DeferredPromise\n protected undoDeferred?: DeferredPromise\n protected redoDeferred?: DeferredPromise\n protected clearDeferred?: DeferredPromise\n protected importPointEventsDeferred?: DeferredPromise\n protected waitForIdleDeferred?: DeferredPromise\n\n url: string\n\n constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration)\n {\n this.serverConfiguration = serverConfig\n this.recognitionConfiguration = recognitionConfig\n const scheme = (this.serverConfiguration.scheme === \"https\") ? \"wss\" : \"ws\"\n this.url = `${ scheme }://${ this.serverConfiguration.host }/api/v4.0/iink/document?applicationKey=${ this.serverConfiguration.applicationKey }`\n this.#logger.info(\"constructor\", { serverConfig, recognitionConfig, url: this.url })\n }\n\n get mimeTypes(): string[]\n {\n switch (this.recognitionConfiguration.type.toLocaleLowerCase()) {\n case \"text\":\n return this.recognitionConfiguration.text.mimeTypes\n case \"math\":\n return this.recognitionConfiguration.math.mimeTypes\n case \"diagram\":\n return this.recognitionConfiguration.diagram.mimeTypes\n default:\n //\"raw-content\"\n return []\n }\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n protected infinitePing(): void\n {\n this.pingCount++\n if (this.serverConfiguration.websocket.maxPingLostCount < this.pingCount) {\n this.socket.close(1000, \"PING_LOST\")\n } else if (this.socket.readyState <= 1) {\n setTimeout(() =>\n {\n if (this.socket.readyState <= 1) {\n this.socket.send(JSON.stringify({ type: \"ping\" }))\n this.infinitePing()\n }\n }, this.serverConfiguration.websocket.pingDelay)\n }\n }\n\n protected openCallback(): void\n {\n this.connected?.resolve()\n const params: TWebSocketEvent = {\n type: this.sessionId ? \"restoreIInkSession\" : \"newContentPackage\",\n iinkSessionId: this.sessionId,\n applicationKey: this.serverConfiguration.applicationKey,\n xDpi: 96,\n yDpi: 96,\n viewSizeHeight: this.viewSizeHeight,\n viewSizeWidth: this.viewSizeWidth\n }\n if (isVersionSuperiorOrEqual(this.serverConfiguration.version, \"2.0.4\")) {\n params[\"myscript-client-name\"] = \"iink-ts\"\n params[\"myscript-client-version\"] = \"1.0.0-buildVersion\"\n }\n this.send(params)\n }\n\n protected rejectDeferredPending(error: Error): void\n {\n if (this.connected?.isPending) {\n this.connected?.reject(error)\n }\n if (this.initialized?.isPending) {\n this.initialized?.reject(error)\n }\n if (this.addStrokeDeferred?.isPending) {\n this.addStrokeDeferred?.reject(error)\n }\n if (this.exportDeferred?.isPending) {\n this.exportDeferred?.reject(error)\n }\n if (this.convertDeferred?.isPending) {\n this.convertDeferred?.reject(error)\n }\n if (this.importDeferred?.isPending) {\n this.importDeferred?.reject(error)\n }\n if (this.resizeDeferred?.isPending) {\n this.resizeDeferred?.reject(error)\n }\n if (this.undoDeferred?.isPending) {\n this.undoDeferred?.reject(error)\n }\n if (this.redoDeferred?.isPending) {\n this.redoDeferred?.reject(error)\n }\n if (this.clearDeferred?.isPending) {\n this.clearDeferred.reject(error)\n }\n if (this.waitForIdleDeferred?.isPending) {\n this.waitForIdleDeferred.reject(error)\n }\n }\n\n protected closeCallback(evt: CloseEvent): void\n {\n let message = \"\"\n if (!this.currentErrorCode) {\n switch (evt.code) {\n case 1000:\n // Normal Closure\n break\n case 1001:\n message = ErrorConst.GOING_AWAY\n break\n case 1002:\n message = ErrorConst.PROTOCOL_ERROR\n break\n case 1003:\n message = ErrorConst.UNSUPPORTED_DATA\n break\n case 1006:\n message = ErrorConst.ABNORMAL_CLOSURE\n break\n case 1007:\n message = ErrorConst.INVALID_FRAME_PAULOAD\n break\n case 1008:\n message = ErrorConst.POLICY_VIOLATION\n break\n case 1009:\n message = ErrorConst.MESSAGE_TOO_BIG\n break\n case 1011:\n message = ErrorConst.INTERNAL_ERROR\n break\n case 1012:\n message = ErrorConst.SERVICE_RESTART\n break\n case 1013:\n message = ErrorConst.TRY_AGAIN\n break\n case 1014:\n message = ErrorConst.BAD_GATEWAY\n break\n case 1015:\n message = ErrorConst.TLS_HANDSHAKE\n break\n default:\n this.#logger.warn(\"closeCallback unknow CloseEvent.code\", { evt })\n message = ErrorConst.CANT_ESTABLISH\n break\n }\n }\n const error = new Error(message || evt.reason)\n\n this.rejectDeferredPending(error)\n\n if (!this.currentErrorCode && evt.code !== 1000) {\n this.internalEvent.emitError(error)\n }\n }\n\n protected manageHMACChallengeMessage(websocketMessage: TWebSocketEvent): void\n {\n this.#logger.info(\"manageHMACChallengeMessage\", { websocketMessage })\n const hmacChallengeMessage = websocketMessage as TWebSocketHMACChallengeEvent\n if (hmacChallengeMessage.hmacChallenge) {\n this.send({\n type: \"hmac\",\n hmac: computeHmac(hmacChallengeMessage.hmacChallenge, this.serverConfiguration.applicationKey, this.serverConfiguration.hmacKey)\n })\n }\n if (hmacChallengeMessage.iinkSessionId) {\n this.sessionId = hmacChallengeMessage.iinkSessionId\n }\n }\n\n protected manageContentPackageDescriptionMessage(): void\n {\n this.reconnectionCount = 0\n this.#logger.info(\"manageContentPackageDescriptionMessage\")\n\n this.send({ ...this.recognitionConfiguration, type: \"configuration\" })\n\n if (this.currentPartId) {\n this.send({ type: \"openContentPart\", id: this.currentPartId, mimeTypes: this.mimeTypes })\n }\n else {\n this.send({ type: \"newContentPart\", contentType: this.recognitionConfiguration.type, mimeTypes: this.mimeTypes })\n }\n }\n\n protected managePartChangeMessage(websocketMessage: TWebSocketEvent): void\n {\n this.#logger.info(\"managePartChangeMessage\", { websocketMessage })\n const partChangeMessage = websocketMessage as TWebSocketPartChangeEvent\n this.currentPartId = partChangeMessage.partId\n this.initialized?.resolve()\n }\n\n protected manageExportMessage(websocketMessage: TWebSocketEvent): void\n {\n this.#logger.info(\"manageExportMessage\", { websocketMessage })\n const exportMessage = websocketMessage as TWebSocketExportEvent\n if (exportMessage.exports[\"application/vnd.myscript.jiix\"]) {\n exportMessage.exports[\"application/vnd.myscript.jiix\"] = JSON.parse(exportMessage.exports[\"application/vnd.myscript.jiix\"].toString()) as TJIIXExport\n }\n this.initialized?.resolve()\n this.addStrokeDeferred?.resolve(exportMessage.exports)\n this.exportDeferred?.resolve(exportMessage.exports)\n this.convertDeferred?.resolve(exportMessage.exports)\n this.importDeferred?.resolve(exportMessage.exports)\n this.undoDeferred?.resolve(exportMessage.exports)\n this.redoDeferred?.resolve(exportMessage.exports)\n this.clearDeferred?.resolve(exportMessage.exports)\n this.importPointEventsDeferred?.resolve(exportMessage.exports)\n this.internalEvent.emitExported(exportMessage.exports)\n }\n\n protected async manageWaitForIdle(): Promise {\n this.internalEvent.emitIdle(true)\n this.waitForIdleDeferred?.resolve()\n }\n\n protected manageErrorMessage(websocketMessage: TWebSocketEvent): void\n {\n const err = websocketMessage as TWebSocketErrorEvent\n this.currentErrorCode = err.data?.code || err.code\n let message = err.data?.message || err.message || ErrorConst.UNKNOW\n\n switch (this.currentErrorCode) {\n case \"no.activity\":\n message = ErrorConst.NO_ACTIVITY\n break\n case \"access.not.granted\":\n message = ErrorConst.WRONG_CREDENTIALS\n break\n case \"session.too.old\":\n message = ErrorConst.TOO_OLD\n break\n }\n const error = new Error(message)\n this.rejectDeferredPending(error)\n this.internalEvent.emitError(error)\n }\n\n protected manageContentChangeMessage(websocketMessage: TWebSocketEvent): void\n {\n this.#logger.info(\"manageContentChangeMessage\", { websocketMessage })\n const contentChangeMessage = websocketMessage as TWebSocketContentChangeEvent\n const context: TUndoRedoContext = {\n canRedo: contentChangeMessage.canRedo,\n canUndo: contentChangeMessage.canUndo,\n empty: contentChangeMessage.empty,\n stackIndex: contentChangeMessage.undoStackIndex,\n possibleUndoCount: contentChangeMessage.possibleUndoCount,\n stack: []\n }\n this.internalEvent.emitContextChange(context)\n }\n\n protected manageSVGPatchMessage(websocketMessage: TWebSocketEvent): void\n {\n this.#logger.info(\"manageSVGPatchMessage\", { websocketMessage })\n this.resizeDeferred?.resolve()\n const svgPatchMessage = websocketMessage as TWebSocketSVGPatchEvent\n this.internalEvent.emitSVGPatch(svgPatchMessage)\n }\n\n protected messageCallback(message: MessageEvent): void\n {\n this.#logger.debug(\"messageCallback\", { message })\n this.currentErrorCode = undefined\n const websocketMessage: TWebSocketEvent = JSON.parse(message.data)\n if (websocketMessage.type !== \"pong\") {\n this.pingCount = 0\n switch (websocketMessage.type) {\n case \"ack\":\n this.manageHMACChallengeMessage(websocketMessage)\n break\n case \"contentPackageDescription\":\n this.manageContentPackageDescriptionMessage()\n break\n case \"partChanged\":\n this.managePartChangeMessage(websocketMessage)\n break\n case \"newPart\":\n this.initialized?.resolve()\n break\n case \"contentChanged\":\n this.manageContentChangeMessage(websocketMessage)\n break\n case \"exported\":\n this.manageExportMessage(websocketMessage)\n break\n case \"svgPatch\":\n this.manageSVGPatchMessage(websocketMessage)\n break\n case \"error\":\n this.manageErrorMessage(websocketMessage)\n break\n case \"idle\":\n this.manageWaitForIdle()\n break\n default :\n this.#logger.warn(\"messageCallback\", `Message type unknow: \"${websocketMessage.type}\".`)\n }\n }\n }\n\n async init(height: number, width: number): Promise\n {\n try {\n this.#logger.info(\"init\", { height, width })\n this.destroy()\n this.connected = new DeferredPromise()\n this.initialized = new DeferredPromise()\n this.viewSizeHeight = height\n this.viewSizeWidth = width\n this.pingCount = 0\n this.socket = new WebSocket(this.url)\n\n if (this.serverConfiguration.websocket.pingEnabled) {\n this.infinitePing()\n }\n\n this.socket.addEventListener(\"open\", this.openCallback.bind(this))\n this.socket.addEventListener(\"close\", this.closeCallback.bind(this))\n this.socket.addEventListener(\"message\", this.messageCallback.bind(this))\n\n return this.initialized.promise\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (err: any) {\n const error = new Error(ErrorConst.CANT_ESTABLISH)\n this.internalEvent.emitError(error)\n this.initialized?.reject(error)\n return this.initialized?.promise\n }\n }\n\n async send(message: TWebSocketEvent): Promise\n {\n if (!this.connected) {\n return Promise.reject(new Error(\"Recognizer must be initilized\"))\n }\n await this.connected.promise\n if (this.socket.readyState === this.socket.OPEN) {\n this.#logger.debug(\"send\", { message })\n this.socket.send(JSON.stringify(message))\n return Promise.resolve()\n } else {\n if (this.socket.readyState != this.socket.CONNECTING && this.serverConfiguration.websocket.autoReconnect) {\n this.reconnectionCount++\n if (this.serverConfiguration.websocket.maxRetryCount >= this.reconnectionCount) {\n this.#logger.debug(\"send\", `try to reconnect number: ${this.reconnectionCount}.`)\n this.internalEvent.emitClearMessage()\n await this.init(this.viewSizeHeight, this.viewSizeWidth)\n await this.setPenStyle(this.penStyle as TPenStyle)\n await this.setPenStyleClasses(this.penStyleClasses as string)\n await this.setTheme(this.theme as TTheme)\n return this.send(message)\n }\n else {\n return Promise.reject(new Error(\"Unable to send message. The maximum number of connection attempts has been reached.\"))\n }\n }\n }\n }\n\n async addStrokes(strokes: TStroke[]): Promise\n {\n this.#logger.info(\"addStrokes\", { strokes })\n await this.initialized?.promise\n this.addStrokeDeferred = new DeferredPromise()\n if (strokes.length === 0) {\n this.addStrokeDeferred.resolve({} as TExport)\n }\n else {\n await this.send({\n type: \"addStrokes\",\n strokes: strokes.map(convertStrokeToJSON)\n })\n }\n return this.addStrokeDeferred?.promise\n }\n\n async setPenStyle(penStyle: TPenStyle): Promise\n {\n this.#logger.info(\"setPenStyle\", { penStyle })\n await this.initialized?.promise\n this.penStyle = penStyle\n const message: TWebSocketEvent = {\n type: \"setPenStyle\",\n style: StyleHelper.penStyleToCSS(penStyle)\n }\n return this.send(message)\n }\n\n async setPenStyleClasses(penStyleClasses: string): Promise\n {\n await this.initialized?.promise\n this.penStyleClasses = penStyleClasses\n this.#logger.info(\"setPenStyleClasses\", { penStyleClasses })\n const message: TWebSocketEvent = {\n type: \"setPenStyleClasses\",\n styleClasses: penStyleClasses\n }\n return this.send(message)\n }\n\n async setTheme(theme: TTheme): Promise\n {\n this.#logger.info(\"setTheme\", { theme })\n await this.initialized?.promise\n this.theme = theme\n const message: TWebSocketEvent = {\n type: \"setTheme\",\n theme: StyleHelper.themeToCSS(theme)\n }\n return this.send(message)\n }\n\n async export(model: IModel, requestedMimeTypes?: string[]): Promise\n {\n this.#logger.info(\"export\", { model, requestedMimeTypes })\n await this.initialized?.promise\n this.exportDeferred = new DeferredPromise()\n const localModel = model.getClone()\n let mimeTypes: string[] = requestedMimeTypes || []\n if (!mimeTypes.length) {\n switch (this.recognitionConfiguration.type) {\n case \"DIAGRAM\":\n mimeTypes = this.recognitionConfiguration.diagram.mimeTypes\n break\n case \"MATH\":\n mimeTypes = this.recognitionConfiguration.math.mimeTypes\n break\n case \"Raw Content\":\n mimeTypes = [\"application/vnd.myscript.jiix\"]\n break\n case \"TEXT\":\n mimeTypes = this.recognitionConfiguration.text.mimeTypes\n break\n default:\n throw new Error(`Recognition type \"${ this.recognitionConfiguration.type }\" is unknown.\\n Possible types are:\\n -DIAGRAM\\n -MATH\\n -Raw Content\\n -TEXT`)\n }\n }\n\n if (!mimeTypes.length) {\n return Promise.reject(new Error(`Export failed, no mimeTypes define in recognition ${ this.recognitionConfiguration.type } configuration`))\n }\n\n const message: TWebSocketEvent = {\n type: \"export\",\n partId: this.currentPartId,\n mimeTypes\n }\n await this.send(message)\n const exports: TExport = await this.exportDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(exports)\n this.#logger.debug(\"export\", { model: localModel })\n return localModel\n }\n\n async import(model: IModel, data: Blob, mimeType?: string): Promise\n {\n this.#logger.info(\"import\", { data, mimeType })\n await this.initialized?.promise\n const localModel = model.getClone()\n const chunkSize = this.serverConfiguration.websocket.fileChunkSize\n const importFileId = Math.random().toString(10).substring(2, 6)\n this.importDeferred = new DeferredPromise()\n const readBlob = (blob: Blob): Promise =>\n {\n const fileReader = new FileReader()\n return new Promise((resolve, reject) =>\n {\n fileReader.onloadend = (ev) => resolve(ev.target?.result as string)\n fileReader.onerror = () => reject()\n fileReader.readAsText(blob)\n })\n }\n\n const importFileMessage: TWebSocketEvent = {\n type: \"importFile\",\n importFileId,\n mimeType\n }\n await this.send(importFileMessage)\n for (let i = 0; i < data.size; i += chunkSize) {\n const blobPart = data.slice(i, i + chunkSize, data.type)\n const partFileString = await readBlob(blobPart)\n const fileChuckMessage: TWebSocketEvent = {\n type: \"fileChunk\",\n importFileId,\n data: partFileString,\n lastChunk: i + chunkSize > data.size\n }\n await this.send(fileChuckMessage)\n }\n const exports = await this.importDeferred?.promise\n this.importDeferred = undefined\n localModel.mergeExport(exports)\n return localModel\n }\n\n async resize(model: IModel): Promise\n {\n this.#logger.info(\"resize\", { model })\n await this.initialized?.promise\n this.resizeDeferred = new DeferredPromise()\n const localModel = model.getClone()\n this.viewSizeHeight = localModel.height\n this.viewSizeWidth = localModel.width\n const message: TWebSocketEvent = {\n type: \"changeViewSize\",\n height: this.viewSizeHeight,\n width: this.viewSizeWidth,\n }\n await this.send(message)\n await this.resizeDeferred?.promise\n return localModel\n }\n\n async importPointEvents(strokes: TStroke[]): Promise\n {\n this.#logger.info(\"importPointsEvents\", { strokes })\n await this.initialized?.promise\n this.importPointEventsDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"pointerEvents\",\n events: strokes.map(convertStrokeToJSON)\n }\n this.send(message)\n const exportPoints = await this.importPointEventsDeferred?.promise\n this.importPointEventsDeferred = undefined\n this.#logger.debug(\"importPointEvents\", { exportPoints })\n return exportPoints as TExport\n }\n\n async convert(model: IModel, conversionState?: TConverstionState): Promise\n {\n this.#logger.info(\"convert\", { model, conversionState })\n await this.initialized?.promise\n this.convertDeferred = new DeferredPromise()\n const localModel = model.getClone()\n const message: TWebSocketEvent = {\n type: \"convert\",\n conversionState\n }\n await this.send(message)\n const myExportConverted: TExport = await this.convertDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeConvert(myExportConverted)\n localModel.mergeExport(myExportConverted)\n this.#logger.debug(\"convert\", { model: localModel })\n return localModel\n }\n\n async waitForIdle(): Promise\n {\n await this.initialized?.promise\n this.waitForIdleDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"waitForIdle\",\n }\n await this.send(message)\n return this.waitForIdleDeferred?.promise\n }\n\n async undo(model: IModel): Promise\n {\n this.#logger.info(\"undo\", { model })\n await this.initialized?.promise\n const localModel = model.getClone()\n this.undoDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"undo\",\n }\n await this.send(message)\n const undoExports = await this.undoDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(undoExports)\n this.#logger.debug(\"undo\", { model: localModel })\n this.undoDeferred = undefined\n return localModel\n }\n\n async redo(model: IModel): Promise\n {\n this.#logger.info(\"redo\", { model })\n await this.initialized?.promise\n const localModel = model.getClone()\n this.redoDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"redo\",\n }\n await this.send(message)\n const redoExports = await this.redoDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(redoExports)\n this.#logger.debug(\"redo\", { model: redoExports })\n this.redoDeferred = undefined\n return localModel\n }\n\n async clear(model: IModel): Promise\n {\n this.#logger.info(\"clear\", { model })\n await this.initialized?.promise\n const localModel = model.getClone()\n localModel.modificationDate = Date.now()\n this.clearDeferred = new DeferredPromise()\n const message: TWebSocketEvent = {\n type: \"clear\",\n }\n await this.send(message)\n const clearExports = await this.clearDeferred?.promise\n localModel.updatePositionReceived()\n localModel.mergeExport(clearExports)\n this.clearDeferred = undefined\n this.#logger.info(\"clear\", { model: localModel })\n return localModel\n }\n\n close(code: number, reason: string): void\n {\n if (this.socket.readyState === this.socket.OPEN || this.socket.readyState === this.socket.CONNECTING) {\n this.#logger.info(\"close\", { code, reason })\n this.socket.removeEventListener(\"close\", this.closeCallback)\n this.socket.removeEventListener(\"message\", this.messageCallback)\n this.socket.removeEventListener(\"open\", this.openCallback)\n this.socket.close(code, reason)\n }\n }\n\n destroy(): void\n {\n this.#logger.info(\"destroy\")\n this.connected = undefined\n this.initialized = undefined\n this.addStrokeDeferred = undefined\n this.exportDeferred = undefined\n this.convertDeferred = undefined\n this.importDeferred = undefined\n this.resizeDeferred = undefined\n this.undoDeferred = undefined\n this.redoDeferred = undefined\n this.clearDeferred = undefined\n if (this.socket) {\n this.socket.removeEventListener(\"close\", this.closeCallback)\n this.socket.removeEventListener(\"message\", this.messageCallback)\n this.socket.removeEventListener(\"open\", this.openCallback)\n this.close(1000, \"Recognizer destroyed\")\n }\n }\n}\n","import { TPointer } from \"../../@types/geometry\"\nimport { TStroke } from \"../../@types/model/Stroke\"\nimport { computeAxeAngle, computeLinksPoints, computeMiddlePoint } from \"../QuadraticUtils\"\n\nexport class SVGStroker\n{\n\n private getArcPath(center: TPointer, radius: number): string\n {\n const svgPath = [\n `M ${ center.x },${ center.y }`,\n `m ${ -radius },0`,\n `a ${ radius },${ radius } 0 1 0 ${ radius * 2 },0`,\n `a ${ radius },${ radius } 0 1 0 ${ -(radius * 2) },0`\n ].join(\" \")\n return svgPath\n }\n\n private getLinePath(begin: TPointer, end: TPointer, width: number): string\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, end), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(begin, end), width)\n const svgPath = [\n `M ${ linkPoints1[0].x },${ linkPoints1[0].y }`,\n `L ${ linkPoints2[0].x },${ linkPoints2[0].y }`,\n `L ${ linkPoints2[1].x },${ linkPoints2[1].y }`,\n `L ${ linkPoints1[1].x },${ linkPoints1[1].y }`\n ].join(\" \")\n return svgPath\n }\n\n private getFinalPath(begin: TPointer, end: TPointer, width: number): string\n {\n const ARCSPLIT = 6\n const angle = computeAxeAngle(begin, end)\n const linkPoints = computeLinksPoints(end, angle, width)\n const parts = [`M ${ linkPoints[0].x },${ linkPoints[0].y }`]\n for (let i = 1; i <= ARCSPLIT; i++) {\n const newAngle = angle - (i * (Math.PI / ARCSPLIT))\n parts.push(`L ${ end.x - (end.p * width * Math.sin(newAngle)) },${ end.y + (end.p * width * Math.cos(newAngle)) }`)\n }\n const svgPath = parts.join(\" \")\n return svgPath\n }\n\n private getQuadraticPath(begin: TPointer, end: TPointer, central: TPointer, width: number): string\n {\n const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, central), width)\n const linkPoints2 = computeLinksPoints(end, computeAxeAngle(central, end), width)\n const linkPoints3 = computeLinksPoints(central, computeAxeAngle(begin, end), width)\n const svgPath = [\n `M ${ linkPoints1[0].x },${ linkPoints1[0].y }`,\n `Q ${ linkPoints3[0].x },${ linkPoints3[0].y } ${ linkPoints2[0].x },${ linkPoints2[0].y }`,\n `L ${ linkPoints2[1].x },${ linkPoints2[1].y }`,\n `Q ${ linkPoints3[1].x },${ linkPoints3[1].y } ${ linkPoints1[1].x },${ linkPoints1[1].y }`\n ].join(\" \")\n return svgPath\n }\n\n private buildSVGPath(stroke: TStroke): string\n {\n const STROKE_LENGTH = stroke.pointers.length\n const STROKE_WIDTH = (stroke.style.width as number)\n const NB_QUADRATICS = STROKE_LENGTH - 2\n const firstPoint = stroke.pointers[0]\n\n const parts = []\n if (STROKE_LENGTH < 3) {\n parts.push(this.getArcPath(firstPoint, STROKE_WIDTH * 0.6))\n } else {\n parts.push(this.getArcPath(firstPoint, STROKE_WIDTH * firstPoint.p))\n parts.push(this.getLinePath(firstPoint, computeMiddlePoint(firstPoint, stroke.pointers[1]), STROKE_WIDTH))\n\n for (let i = 0; i < NB_QUADRATICS; i++) {\n const begin = computeMiddlePoint(stroke.pointers[i], stroke.pointers[i + 1])\n const end = computeMiddlePoint(stroke.pointers[i + 1], stroke.pointers[i + 2])\n const central = stroke.pointers[i + 1]\n parts.push(this.getQuadraticPath(begin, end, central, STROKE_WIDTH)\n )\n }\n const beforeLastPoint = stroke.pointers[STROKE_LENGTH - 2]\n const lastPoint = stroke.pointers[STROKE_LENGTH - 1]\n parts.push(this.getLinePath(computeMiddlePoint(beforeLastPoint, lastPoint), lastPoint, STROKE_WIDTH))\n parts.push(this.getFinalPath(beforeLastPoint, lastPoint, STROKE_WIDTH))\n }\n return parts.join(\" \")\n }\n\n drawStroke(svgElement: SVGElement, stroke: TStroke, attrs?: { name: string, value: string }[]): void\n {\n const svgPathElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\")\n svgPathElement.classList.add(\"pending-stroke\")\n svgPathElement.setAttribute(\"id\", stroke.id)\n svgPathElement.setAttribute(\"type\", stroke.pointerType)\n attrs?.forEach(a =>\n {\n svgPathElement.setAttribute(a.name, a.value)\n })\n const svgPath = this.buildSVGPath(stroke)\n svgPathElement.setAttribute(\"d\", `${ svgPath }Z`)\n svgElement.appendChild(svgPathElement)\n }\n}\n","import { TRenderingConfiguration } from \"../../@types/configuration/RenderingConfiguration\"\nimport { IModel } from \"../../@types/model/Model\"\nimport { TUpdatePatch, TUpdatePatchAppendChild, TUpdatePatchInsertBefore, TUpdatePatchRemoveAttribut, TUpdatePatchRemoveChild, TUpdatePatchRemoveElement, TUpdatePatchReplaceAll, TUpdatePatchReplaceELement, TUpdatePatchSetAttribut } from \"../../@types/recognizer/WSRecognizer\"\nimport { TStroke } from \"../../@types/model/Stroke\"\nimport { SVGStroker } from \"./SVGStroker\"\nimport { LoggerManager } from \"../../logger\"\nimport { LoggerClass } from \"../../Constants\"\n\nexport class WSSVGRenderer\n{\n config: TRenderingConfiguration\n stroker: SVGStroker\n context!: {\n parent: HTMLElement\n }\n #logger = LoggerManager.getLogger(LoggerClass.RENDERER)\n\n constructor(config: TRenderingConfiguration)\n {\n this.#logger.info(\"constructor\", { config })\n this.config = config\n this.stroker = new SVGStroker()\n }\n\n init(element: HTMLElement): void\n {\n this.#logger.info(\"init\", { element })\n element.style.fontSize = \"10px\"\n this.context = {\n parent: element\n }\n }\n\n #drawStroke(svgElement: SVGElement, stroke: TStroke)\n {\n let style: string\n if (stroke.pointerType === \"eraser\") {\n stroke.style.width = 20\n style = \"fill:grey;stroke:transparent;shadowBlur:5;opacity:0.2;\"\n } else {\n style = `fill:${ stroke.style.color };stroke:transparent;`\n }\n this.stroker.drawStroke(svgElement, stroke, [{ name: \"style\", value: style }])\n }\n\n #replaceAll(layerName: string, update: TUpdatePatchReplaceAll): void\n {\n const oldLayer = this.context.parent.querySelector(`svg[data-layer=\"${ layerName }\"]`) as SVGElement | null\n oldLayer?.remove()\n this.context.parent.insertAdjacentHTML(\"beforeend\", update.svg)\n const layer = this.context.parent.querySelector(`svg[data-layer=\"${ layerName }\"]`) as SVGElement\n if (layerName === \"MODEL\") {\n const pendingStrokesGroup = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\")\n pendingStrokesGroup.id = \"pendingStrokes\"\n layer.appendChild(pendingStrokesGroup)\n }\n }\n\n #replaceElement(update: TUpdatePatchReplaceELement): void\n {\n const elementToRemove = this.context.parent.querySelector(`#${ update.id }`) as HTMLElement | null\n if (elementToRemove) {\n const parent = elementToRemove.parentNode as HTMLElement | null | undefined\n elementToRemove?.remove()\n parent?.insertAdjacentHTML(\"beforeend\", update.svg)\n }\n }\n\n #appendChild(layerName: string, update: TUpdatePatchAppendChild): void\n {\n const parentSelector = update.parentId ? `#${ update.parentId }` : `svg[data-layer=\"${ layerName }\"]`\n const parent = this.context.parent.querySelector(parentSelector) as HTMLElement\n parent?.insertAdjacentHTML(\"beforeend\", update.svg)\n }\n\n #removeChild(update: TUpdatePatchRemoveChild): void\n {\n this.context.parent.querySelector(`#${ update.parentId } > *:nth-child(${ update.index + 1 })`)?.remove()\n }\n\n #removeElement(update: TUpdatePatchRemoveElement): void\n {\n const elementToRemove = this.context.parent.querySelector(`#${ update.id }`)\n if (elementToRemove) {\n if (update.id.includes(\"s\") || update.id.includes(\"MODEL\")) {\n elementToRemove.remove()\n } else {\n elementToRemove.setAttribute(\"class\", \"removed-stroke\")\n setTimeout(() =>\n {\n elementToRemove?.remove()\n }, 100)\n }\n }\n }\n\n #insertBefore(update: TUpdatePatchInsertBefore): void\n {\n const parent = this.context.parent.querySelector(`#${ update.refId }`) as HTMLElement | null\n parent?.insertAdjacentHTML(\"beforebegin\", update.svg)\n }\n\n #setAttribute(update: TUpdatePatchSetAttribut): void\n {\n const selector = update.id ? `#${ update.id }` : \"svg\"\n const element = this.context.parent.querySelector(selector) as HTMLElement | null\n element?.setAttribute(update.name, update.value)\n }\n\n #removeAttribute(update: TUpdatePatchRemoveAttribut): void\n {\n const selector = update.id ? `#${ update.id }` : \"svg\"\n const element = this.context.parent.querySelector(selector) as HTMLElement | null\n element?.removeAttribute(update.name)\n }\n\n updateLayer(layerName: string, update: TUpdatePatch): void\n {\n this.#logger.info(\"updateLayer\", { layerName, update })\n switch (update.type) {\n case \"REPLACE_ALL\":\n this.#replaceAll(layerName, update as TUpdatePatchReplaceAll)\n break\n case \"REPLACE_ELEMENT\":\n this.#replaceElement(update as TUpdatePatchReplaceELement)\n break\n case \"APPEND_CHILD\":\n this.#appendChild(layerName, update as TUpdatePatchAppendChild)\n break\n case \"REMOVE_ELEMENT\":\n this.#removeElement(update as TUpdatePatchRemoveElement)\n break\n case \"REMOVE_CHILD\":\n this.#removeChild(update as TUpdatePatchRemoveChild)\n break\n case \"INSERT_BEFORE\":\n this.#insertBefore(update as TUpdatePatchInsertBefore)\n break\n case \"SET_ATTRIBUTE\":\n this.#setAttribute(update as TUpdatePatchSetAttribut)\n break\n case \"REMOVE_ATTRIBUTE\":\n this.#removeAttribute(update as TUpdatePatchRemoveAttribut)\n break\n default:\n this.#logger.warn(\"updateLayer Default\", {layerName, update})\n break\n }\n }\n\n updatesLayer(layerName: string, updates: TUpdatePatch[]): void\n {\n this.#logger.info(\"updatesLayer\", { layerName, updates })\n updates.forEach(u => this.updateLayer(layerName, u))\n this.clearPendingStroke()\n }\n\n clearPendingStroke(): void\n {\n this.#logger.info(\"clearPendingStroke\", { })\n const pendingStrokeGroup = this.context.parent.querySelector(\"#pendingStrokes\") as SVGElement\n if (pendingStrokeGroup) {\n pendingStrokeGroup.innerHTML = \"\"\n }\n }\n\n drawPendingStroke(stroke: TStroke): void\n {\n this.#logger.info(\"drawPendingStroke\", { stroke })\n if (stroke) {\n const pendingStrokeGroup = this.context.parent.querySelector(\"#pendingStrokes\") as SVGElement\n if (pendingStrokeGroup) {\n const oldStroke = pendingStrokeGroup.querySelector(`#${ stroke?.id }`)\n if (oldStroke) {\n oldStroke.remove()\n }\n this.#drawStroke(pendingStrokeGroup, stroke)\n }\n }\n }\n\n clearErasingStrokes(): void\n {\n const erasingStrokeList = this.context.parent.querySelectorAll(\"[type=eraser]\") as NodeListOf\n erasingStrokeList.forEach(erasingStroke => {\n erasingStroke.remove()\n })\n }\n\n resize(model: IModel): void\n {\n this.#logger.info(\"resize\", { model })\n const rect = this.context.parent.getBoundingClientRect()\n const svgList = this.context.parent.querySelectorAll(\"svg\")\n const width = Math.max(rect.width, model.width)\n const height = Math.max(rect.height, model.height)\n svgList.forEach(svg =>\n {\n svg.setAttribute(\"viewBox\", `0 0 ${ width }, ${ height }`)\n svg.setAttribute(\"width\", `${ width }px`)\n svg.setAttribute(\"height\", `${ height }px`)\n })\n }\n\n destroy(): void\n {\n this.#logger.info(\"destroy\", { context: this.context })\n if (this.context?.parent) {\n this.context.parent.querySelectorAll(\"svg\").forEach(n => n.remove())\n }\n }\n}\n","import { IBehaviors, TBehaviorOptions } from \"../@types/Behaviors\"\nimport { TConfiguration } from \"../@types/configuration\"\nimport { IModel, TExport } from \"../@types/model/Model\"\nimport { TWebSocketSVGPatchEvent } from \"../@types/recognizer/WSRecognizer\"\nimport { TStroke } from \"../@types/model/Stroke\"\nimport { TConverstionState } from \"../@types/configuration/RecognitionConfiguration\"\nimport { TUndoRedoContext } from \"../@types/undo-redo/UndoRedoContext\"\nimport { TTheme } from \"../@types/style/Theme\"\nimport { TPenStyle } from \"../@types/style/PenStyle\"\nimport { TPointer } from \"../@types/geometry\"\n\nimport { PointerEventGrabber } from \"../grabber/PointerEventGrabber\"\nimport { WSRecognizer } from \"../recognizer/WSRecognizer\"\nimport { Intention } from \"../Constants\"\nimport { InternalEvent } from \"../event/InternalEvent\"\nimport { DeferredPromise } from \"../utils/DeferredPromise\"\nimport { WSSVGRenderer } from \"../renderer/svg/WSSVGRenderer\"\nimport { StyleManager } from \"../style/StyleManager\"\nimport { Configuration } from \"../configuration/Configuration\"\nimport { Model } from \"../model/Model\"\nimport { UndoRedoManager } from \"../undo-redo\"\nimport { LoggerManager } from \"../logger\"\nimport { LoggerClass } from \"../Constants\"\n\nexport class WSBehaviors implements IBehaviors\n{\n name = \"WSBehaviors\"\n options: TBehaviorOptions\n grabber: PointerEventGrabber\n renderer: WSSVGRenderer\n recognizer: WSRecognizer\n undoRedoManager: UndoRedoManager\n styleManager: StyleManager\n #configuration: TConfiguration\n #model: IModel\n intention: Intention\n #logger = LoggerManager.getLogger(LoggerClass.BEHAVIORS)\n\n #resizeTimer?: ReturnType\n\n constructor(options: TBehaviorOptions)\n {\n this.#logger.info(\"constructor\", { options })\n this.options = options\n this.#configuration = new Configuration(options?.configuration)\n this.styleManager = new StyleManager(options.penStyle, options.theme)\n\n this.grabber = new PointerEventGrabber(this.#configuration.grabber)\n this.renderer = new WSSVGRenderer(this.#configuration.rendering)\n this.recognizer = new WSRecognizer(this.#configuration.server, this.#configuration.recognition)\n\n this.intention = Intention.Write\n this.#model = new Model()\n this.undoRedoManager = new UndoRedoManager(this.#configuration[\"undo-redo\"], this.model)\n }\n\n get internalEvent(): InternalEvent\n {\n return InternalEvent.getInstance()\n }\n\n get model(): IModel\n {\n return this.#model\n }\n\n get context(): TUndoRedoContext\n {\n return this.undoRedoManager.context\n }\n\n get configuration(): TConfiguration\n {\n return this.#configuration\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.styleManager.currentPenStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.styleManager.penStyle\n }\n setPenStyle(penStyle?: TPenStyle): Promise\n {\n this.#logger.info(\"setPenStyle\", { penStyle })\n this.styleManager.setPenStyle(penStyle)\n this.#logger.debug(\"setPenStyle\", this.styleManager.penStyle)\n return this.recognizer.setPenStyle(this.styleManager.penStyle)\n }\n\n get penStyleClasses(): string\n {\n return this.styleManager.penStyleClasses\n }\n setPenStyleClasses(penClass?: string): Promise\n {\n this.#logger.info(\"setPenStyleClasses\", { penClass })\n this.styleManager.setPenStyleClasses(penClass)\n this.#logger.debug(\"setPenStyleClasses\", this.styleManager.penStyleClasses)\n return this.recognizer.setPenStyleClasses(this.styleManager.penStyleClasses)\n }\n\n get theme(): TTheme\n {\n return this.styleManager.theme\n }\n setTheme(theme: TTheme): Promise\n {\n this.#logger.info(\"setTheme\", { theme })\n this.styleManager.setTheme(theme)\n this.#logger.debug(\"setTheme\", this.styleManager.theme)\n return this.recognizer.setTheme(this.styleManager.theme)\n }\n\n async init(domElement: HTMLElement): Promise\n {\n this.#logger.info(\"init\", { domElement })\n const compStyles = window.getComputedStyle(domElement);\n this.model.width = Math.max(parseInt(compStyles.width.replace(\"px\",\"\")), this.#configuration.rendering.minWidth)\n this.model.height = Math.max(parseInt(compStyles.height.replace(\"px\",\"\")), this.#configuration.rendering.minHeight)\n this.undoRedoManager.updateModelInStack(this.model)\n\n this.renderer.init(domElement)\n\n this.grabber.attach(domElement)\n this.grabber.onPointerDown = this.onPointerDown.bind(this)\n this.grabber.onPointerMove = this.onPointerMove.bind(this)\n this.grabber.onPointerUp = this.onPointerUp.bind(this)\n\n this.internalEvent.addSVGPatchListener(this.onSVGPatch)\n\n await this.recognizer.init(this.model.height, this.model.width)\n await this.setPenStyle(this.penStyle)\n await this.setTheme(this.theme)\n await this.setPenStyleClasses(this.penStyleClasses)\n }\n\n private onPointerDown(evt: PointerEvent, point: TPointer): void\n {\n this.#logger.info(\"onPointerDown\", { intention: this.intention, evt, point })\n let { pointerType } = evt\n const style: TPenStyle = Object.assign({}, this.theme?.ink, this.currentPenStyle)\n if (this.intention === Intention.Erase) {\n pointerType = \"eraser\"\n }\n this.model.initCurrentStroke(point, evt.pointerId, pointerType, style)\n this.drawCurrentStroke()\n }\n\n private onPointerMove(_evt: PointerEvent, point: TPointer): void\n {\n this.#logger.info(\"onPointerMove\", { intention: this.intention, point })\n this.model.appendToCurrentStroke(point)\n this.drawCurrentStroke()\n }\n\n private async onPointerUp(_evt: PointerEvent, point: TPointer): Promise\n {\n try {\n this.#logger.info(\"onPointerUp\", { intention: this.intention, point })\n this.model.endCurrentStroke(point)\n await this.updateModelRendering()\n } catch (error) {\n this.internalEvent.emitError(error as Error)\n }\n }\n\n private onSVGPatch = (evt: TWebSocketSVGPatchEvent) =>\n {\n this.#logger.info(\"onSVGPatch\", { evt })\n this.renderer.updatesLayer(evt.layer, evt.updates)\n }\n\n drawCurrentStroke(): void\n {\n this.#logger.debug(\"drawCurrentStroke\", { stroke: this.model.currentStroke })\n const currentStroke = this.model.currentStroke as TStroke\n if (currentStroke) {\n this.renderer.drawPendingStroke(currentStroke)\n }\n }\n\n async updateModelRendering(): Promise\n {\n this.#logger.info(\"updateModelRendering\")\n if (this.#configuration.triggers.exportContent !== \"DEMAND\") {\n const unsentStrokes = this.model.extractUnsentStrokes()\n this.model.updatePositionSent()\n this.undoRedoManager.addModelToStack(this.model)\n this.renderer.clearErasingStrokes()\n const exports = await this.recognizer.addStrokes(unsentStrokes)\n this.model.mergeExport(exports)\n this.undoRedoManager.updateModelInStack(this.model)\n }\n this.#logger.debug(\"updateModelRendering\", this.model)\n return this.model\n }\n\n async waitForIdle(): Promise\n {\n return this.recognizer.waitForIdle()\n }\n\n async importPointEvents(strokes: TStroke[]): Promise\n {\n this.#logger.info(\"importPointEvents\", { strokes })\n const exportPoints = await this.recognizer.importPointEvents(strokes)\n this.model.mergeExport(exportPoints)\n this.#logger.debug(\"importPointEvents\", this.model)\n return this.model\n }\n\n async export(mimeTypes?: string[]): Promise\n {\n this.#logger.info(\"export\", { mimeTypes })\n try {\n if (this.#configuration.triggers.exportContent === \"DEMAND\") {\n const unsentStrokes = this.model.extractUnsentStrokes()\n this.model.updatePositionSent()\n const exports = await this.recognizer.addStrokes(unsentStrokes)\n this.model.updatePositionReceived()\n this.model.mergeExport(exports)\n this.#logger.debug(\"export\", this.model)\n return this.model\n } else {\n return this.recognizer.export(this.model, mimeTypes)\n }\n } catch (error) {\n this.#logger.error(\"export\", { error } )\n this.internalEvent.emitError(error as Error)\n return Promise.reject(error)\n }\n }\n\n async convert(conversionState?: TConverstionState): Promise\n {\n this.#logger.info(\"convert\", { conversionState })\n this.undoRedoManager.addModelToStack(this.model)\n this.context.stack.push(this.model.getClone())\n this.#model = await this.recognizer.convert(this.model, conversionState)\n this.#logger.debug(\"convert\", this.model)\n this.undoRedoManager.addModelToStack(this.model)\n return this.model\n }\n\n async import(data: Blob, mimeType?: string): Promise\n {\n this.#logger.info(\"import\", { data, mimeType })\n this.context.stack.push(this.model.getClone())\n const m = await this.recognizer.import(this.model, data, mimeType)\n this.undoRedoManager.addModelToStack(m)\n return m\n }\n\n async resize(height: number, width: number): Promise\n {\n this.#logger.info(\"resize\", { height, width })\n const deferredResize = new DeferredPromise()\n this.model.height = height\n this.model.width = width\n const clonedModel = this.model.getClone()\n this.renderer.resize(clonedModel)\n clearTimeout(this.#resizeTimer)\n this.#resizeTimer = setTimeout(async () =>\n {\n try {\n const resizeModel = await this.recognizer.resize(clonedModel)\n deferredResize.resolve(resizeModel)\n } catch (error) {\n this.#logger.error(\"resize\", { height, width, error } )\n deferredResize.reject(error as Error)\n }\n }, this.#configuration.triggers.resizeTriggerDelay)\n\n this.#model = await deferredResize.promise\n this.internalEvent.emitExported(this.model.exports as TExport)\n this.#logger.debug(\"resize\", this.model)\n return this.model\n }\n\n async undo(): Promise\n {\n this.#logger.info(\"undo\")\n if (this.context.canUndo) {\n this.#model = this.undoRedoManager.undo()\n return this.recognizer.undo(this.model)\n }\n else {\n throw new Error(\"Undo not allowed\")\n }\n }\n\n async redo(): Promise\n {\n this.#logger.info(\"redo\")\n if (this.context.canRedo) {\n this.#model = this.undoRedoManager.redo()\n this.#logger.debug(\"undo\", this.#model)\n return this.recognizer.redo(this.model)\n }\n else {\n throw new Error(\"Redo not allowed\")\n }\n }\n\n async clear(): Promise\n {\n this.#logger.info(\"clear\")\n this.model.clear()\n this.undoRedoManager.addModelToStack(this.model)\n return this.recognizer.clear(this.model)\n }\n\n async destroy(): Promise\n {\n this.#logger.info(\"destroy\")\n this.grabber.detach()\n this.renderer.destroy()\n this.recognizer.destroy()\n return Promise.resolve()\n }\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { TConfiguration } from \"./@types/configuration\"\nimport { IGrabber } from \"./@types/grabber/Grabber\"\nimport { TStroke } from \"./@types/model/Stroke\"\nimport { IModel, TExport, TJIIXExport } from \"./@types/model/Model\"\nimport { TPenStyle } from \"./@types/style/PenStyle\"\nimport { TTheme } from \"./@types/style/Theme\"\nimport { IBehaviors, TBehaviorOptions } from \"./@types/Behaviors\"\nimport { TConverstionState } from \"./@types/configuration/RecognitionConfiguration\"\nimport { TMarginConfiguration } from \"./@types/configuration/recognition/MarginConfiguration\"\nimport { TUndoRedoContext } from \"./@types/undo-redo/UndoRedoContext\"\nimport { LoggerClass, TLoggerConfiguration } from \"./@types/configuration/LoggerConfiguration\"\n\nimport { ExportType, Intention } from \"./Constants\"\nimport { DefaultLoggerConfiguration } from \"./configuration\"\nimport { PublicEvent } from \"./event/PublicEvent\"\nimport { InternalEvent } from \"./event/InternalEvent\"\nimport { SmartGuide } from \"./smartguide/SmartGuide\"\nimport { DeferredPromise } from \"./utils/DeferredPromise\"\nimport { RestBehaviors } from \"./behaviors/RestBehaviors\"\nimport { WSBehaviors } from \"./behaviors/WSBehaviors\"\nimport { LoggerManager, Logger } from \"./logger\"\n\nimport \"./iink.css\"\n\nexport type HTMLEditorElement = HTMLElement &\n{\n editor: Editor\n}\n\nexport class Editor\n{\n wrapperHTML: HTMLEditorElement\n #loaderHTML: HTMLDivElement\n #messageHTML: HTMLDivElement\n #behaviors!: IBehaviors\n #smartGuide?: SmartGuide\n #initializationDeferred: DeferredPromise\n\n logger: Logger\n #loggerConfiguration: TLoggerConfiguration\n showStrokesPan = false\n\n constructor(wrapperHTML: HTMLElement, options: TBehaviorOptions, globalClassCss = \"ms-editor\")\n {\n this.#loggerConfiguration = Object.assign({}, DefaultLoggerConfiguration, options.logger)\n\n this.logger = LoggerManager.getLogger(LoggerClass.EDITOR)\n this.logger.info(\"constructor\", { wrapperHTML, options, globalClassCss })\n this.#initializationDeferred = new DeferredPromise()\n\n this.wrapperHTML = wrapperHTML as HTMLEditorElement\n this.wrapperHTML.classList.add(globalClassCss)\n this.events.setElement(this.wrapperHTML)\n\n this.#loaderHTML = document.createElement(\"div\")\n this.#loaderHTML.classList.add(\"loader\")\n this.#loaderHTML.style.display = \"none\"\n this.wrapperHTML.appendChild(this.#loaderHTML)\n\n this.#messageHTML = document.createElement(\"div\")\n this.#messageHTML.classList.add(\"message\")\n this.#messageHTML.style.display = \"none\"\n this.wrapperHTML.appendChild(this.#messageHTML)\n\n this.#instantiateBehaviors(options)\n }\n\n get loggerConfiguration(): TLoggerConfiguration\n {\n return this.#loggerConfiguration\n }\n\n set loggerConfiguration(loggerConfig: TLoggerConfiguration)\n {\n this.#loggerConfiguration = loggerConfig\n LoggerManager.setLoggerLevel(loggerConfig)\n }\n\n get initializationPromise(): Promise\n {\n return this.#initializationDeferred.promise\n }\n\n get model(): IModel\n {\n return this.behaviors.model\n }\n\n get behaviors(): IBehaviors\n {\n return this.#behaviors\n }\n\n get configuration(): TConfiguration\n {\n return this.behaviors.configuration\n }\n set configuration(configuration: TConfiguration)\n {\n this.logger.info(\"set configuration\", { configuration })\n this.#instantiateBehaviors({ configuration })\n this.initialize()\n }\n\n get intention(): Intention\n {\n return this.behaviors.intention\n }\n set intention(m: Intention)\n {\n this.logger.info(\"set intention\", { m })\n this.behaviors.intention = m\n switch (this.behaviors.intention) {\n case Intention.Erase:\n this.wrapperHTML.classList.add(\"erasing\")\n this.wrapperHTML.classList.remove(\"selecting\")\n break\n // case Intention.Selecting:\n // this.model.resetSelectedStrokes()\n // this.wrapperHTML.classList.remove(\"erasing\")\n // this.wrapperHTML.classList.add(\"selecting\")\n // break;\n default:\n this.logger.warn(\"set intention default\", { m })\n document.body.style.cursor = \"initial\"\n this.wrapperHTML.classList.remove(\"erasing\")\n this.wrapperHTML.classList.remove(\"selecting\")\n break\n }\n this.logger.debug(\"set intention\", this.wrapperHTML)\n }\n\n get events(): PublicEvent\n {\n return PublicEvent.getInstance()\n }\n\n get context(): TUndoRedoContext\n {\n return this.behaviors.context\n }\n\n get grabber(): IGrabber\n {\n return this.behaviors.grabber\n }\n\n get currentPenStyle(): TPenStyle\n {\n return this.behaviors.currentPenStyle\n }\n\n get penStyle(): TPenStyle\n {\n return this.behaviors.penStyle\n }\n set penStyle(ps: TPenStyle)\n {\n this.logger.info(\"set penStyle\", { ps })\n this.behaviors.setPenStyle(ps)\n }\n\n get theme(): TTheme\n {\n return this.behaviors.theme\n }\n set theme(t: TTheme)\n {\n this.logger.info(\"set theme\", { t })\n this.behaviors.setTheme(t)\n }\n\n get penStyleClasses(): string\n {\n return this.behaviors.penStyleClasses\n }\n set penStyleClasses(psc: string)\n {\n this.logger.info(\"set penStyleClasses\", { psc })\n this.behaviors.setPenStyleClasses(psc)\n }\n\n #instantiateBehaviors(options: TBehaviorOptions)\n {\n this.logger.info(\"instantiateBehaviors\", { options })\n if (!options?.configuration) {\n throw new Error(\"Configuration required\")\n }\n InternalEvent.getInstance().removeAllListeners()\n if (this.#behaviors) {\n this.#behaviors.destroy()\n }\n let defaultBehaviors: IBehaviors\n if (options.configuration.server?.protocol === \"REST\") {\n defaultBehaviors = new RestBehaviors(options)\n } else {\n defaultBehaviors = new WSBehaviors(options)\n }\n this.#behaviors = Object.assign(defaultBehaviors, options.behaviors)\n this.logger.debug(\"instantiateBehaviors\", this.#behaviors)\n }\n\n async #initializeBehaviors(): Promise\n {\n this.logger.info(\"initializeBehaviors start\")\n this.#initializationDeferred = new DeferredPromise()\n this.#loaderHTML.style.display = \"initial\"\n this.#cleanMessage()\n this.logger.debug(\"initializeBehaviors\", this.wrapperHTML)\n return this.behaviors.init(this.wrapperHTML)\n .then(async () =>\n {\n this.logger.info(\"initializeBehaviors then\")\n this.wrapperHTML.editor = this\n this.#initializationDeferred.resolve()\n this.events.emitLoaded()\n this.logger.debug(\"initializeBehaviors\", this.wrapperHTML)\n })\n .catch((error: Error) =>\n {\n this.logger.error(\"initializeBehaviors catch\", { error })\n this.#initializationDeferred.reject(error)\n this.#showError(error)\n })\n .finally(() =>\n {\n this.logger.info(\"initializeBehaviors finally\", { })\n this.#loaderHTML.style.display = \"none\"\n return this.#initializationDeferred.promise\n })\n }\n\n #initializeSmartGuide(): void\n {\n this.#smartGuide?.destroy()\n this.logger.info(\"initializeSmartGuide\", { smartGuide: this.configuration.rendering.smartGuide })\n if (this.configuration.rendering.smartGuide.enable) {\n this.#smartGuide = new SmartGuide()\n let margin: TMarginConfiguration\n switch (this.configuration.recognition.type) {\n case \"TEXT\":\n margin = this.configuration.recognition.text.margin\n break\n case \"MATH\":\n margin = this.configuration.recognition.math.margin\n break\n default:\n this.logger.warn(\"initializeSmartGuide default\", this.configuration.recognition.type)\n margin = {\n top: 20,\n left: 10,\n right: 10,\n bottom: 10\n }\n break\n }\n this.#smartGuide.init(this.wrapperHTML, margin, this.configuration.rendering)\n }\n }\n\n #cleanMessage()\n {\n this.logger.debug(\"cleanMessage\", this.#messageHTML)\n this.#messageHTML.style.display = \"none\"\n this.#messageHTML.innerHTML = \"\"\n this.logger.debug(\"cleanMessage\", this.#messageHTML)\n }\n\n #showError(err: Error)\n {\n this.logger.debug(\"showError\", this.#messageHTML)\n this.#messageHTML.style.display = \"initial\"\n this.#messageHTML.classList.add(\"error-msg\")\n this.#messageHTML.classList.remove(\"info-msg\")\n this.#messageHTML.innerText = err.message\n this.logger.debug(\"showError\", this.#messageHTML)\n }\n\n #showNotif(notif: { message: string, timeout?: number })\n {\n this.logger.debug(\"showNotif\", this.#messageHTML)\n this.#messageHTML.style.display = \"initial\"\n this.#messageHTML.classList.add(\"info-msg\")\n this.#messageHTML.classList.remove(\"error-msg\")\n this.#messageHTML.innerText = notif.message\n setTimeout(() =>\n {\n this.#cleanMessage()\n }, notif.timeout || 2500)\n this.logger.debug(\"showNotif\", this.#messageHTML)\n }\n\n #showStrokesIfDebug(): void\n {\n if (this.showStrokesPan) {\n let panel = document.getElementById(\"stroke-panel\")\n const text = JSON.stringify(this.model.rawStrokes.map((s: TStroke) => ({ pointerType: s.pointerType, pointerId: s.pointerId, pointers: s.pointers })))\n if (!panel) {\n panel = document.createElement(\"div\")\n panel.id = \"stroke-panel\"\n panel.addEventListener(\"click\", (e) =>\n {\n e.preventDefault()\n e.stopPropagation()\n navigator.clipboard.writeText(panel?.innerText as string)\n this.#showNotif({ message: \"strokes copied to clipboard!\", timeout: 1500 })\n })\n this.wrapperHTML.appendChild(panel)\n }\n panel.innerText = text\n }\n }\n\n #addListeners(): void\n {\n InternalEvent.getInstance().addConvertListener(this.convert.bind(this))\n InternalEvent.getInstance().addClearListener(this.clear.bind(this))\n InternalEvent.getInstance().addErrorListener(this.#showError.bind(this))\n InternalEvent.getInstance().addImportJIIXListener(this.#onImportJIIX.bind(this))\n InternalEvent.getInstance().addExportedListener(this.#onExport.bind(this))\n InternalEvent.getInstance().addNotifListener(this.#showNotif.bind(this))\n InternalEvent.getInstance().addClearMessageListener(this.#cleanMessage.bind(this))\n InternalEvent.getInstance().addContextChangeListener(this.#onContextChange.bind(this))\n InternalEvent.getInstance().addIdleListener(this.#onIdleChange.bind(this))\n }\n\n #onContextChange = (context: TUndoRedoContext) =>\n {\n this.events.emitChanged(context)\n }\n\n #onIdleChange = (idle: boolean) =>\n {\n this.events.emitIdle(idle)\n }\n\n #onExport(exports: TExport): void\n {\n this.logger.info(\"onExport\", { exports })\n this.model.mergeExport(exports)\n if (this.configuration.rendering.smartGuide.enable) {\n if (exports && exports[\"application/vnd.myscript.jiix\"]) {\n const jjix = exports[\"application/vnd.myscript.jiix\"] as TJIIXExport\n this.#smartGuide?.update(jjix)\n }\n }\n this.#showStrokesIfDebug()\n this.events.emitExported(exports)\n }\n\n #onImportJIIX(jiix: TJIIXExport): void\n {\n this.logger.info(\"onImportJIIX\", { jiix })\n this.import(new Blob([JSON.stringify(jiix)], { type: ExportType.JIIX }), ExportType.JIIX)\n }\n\n async initialize(): Promise\n {\n this.logger.info(\"initialize\")\n await this.#initializeBehaviors()\n this.#initializeSmartGuide()\n this.#addListeners()\n }\n\n async waitForIdle(): Promise\n {\n if (this.behaviors.waitForIdle)\n {\n return this.behaviors.waitForIdle()\n }\n return\n }\n\n async undo(): Promise\n {\n this.logger.debug(\"undo\", this.model)\n this.logger.info(\"undo\", { })\n await this.#initializationDeferred.promise\n await this.behaviors.undo()\n this.#showStrokesIfDebug()\n this.logger.debug(\"undo\", this.model)\n return this.model\n }\n\n async redo(): Promise\n {\n this.logger.debug(\"redo\", this.model)\n this.logger.info(\"redo\")\n await this.#initializationDeferred.promise\n await this.behaviors.redo()\n this.#showStrokesIfDebug()\n this.logger.debug(\"redo\", this.model)\n return this.model\n }\n\n async clear(): Promise\n {\n this.logger.debug(\"clear\", this.model)\n this.logger.info(\"clear\")\n await this.#initializationDeferred.promise\n await this.behaviors.clear()\n this.events.emitCleared(this.model)\n this.#showStrokesIfDebug()\n this.logger.debug(\"clear\", this.model)\n return this.model\n }\n\n async resize(): Promise\n {\n this.logger.debug(\"resize\", this.model)\n this.logger.info(\"resize\")\n await this.#initializationDeferred.promise\n if (this.configuration.rendering.smartGuide.enable) {\n this.#smartGuide?.resize()\n }\n const compStyles = window.getComputedStyle(this.wrapperHTML)\n const height = Math.max(parseInt(compStyles.height.replace(\"px\",\"\")), this.configuration.rendering.minHeight)\n const width = Math.max(parseInt(compStyles.width.replace(\"px\",\"\")), this.configuration.rendering.minWidth)\n await this.behaviors.resize(height, width)\n this.logger.debug(\"resize\", this.model)\n return this.model\n }\n\n async export(mimeTypes?: string[]): Promise\n {\n this.logger.debug(\"export\", this.model)\n this.logger.info(\"export\", { mimeTypes })\n await this.#initializationDeferred.promise\n await this.behaviors.export(mimeTypes)\n this.logger.debug(\"export\", this.model)\n return this.model\n }\n\n async convert(params?: { conversionState?: TConverstionState, mimeTypes?: string[] }): Promise\n {\n this.logger.debug(\"convert\", this.model)\n this.logger.info(\"export\", { params })\n await this.#initializationDeferred.promise\n await this.behaviors.convert(params?.conversionState, params?.mimeTypes)\n this.events.emitConverted(this.model.converts as TExport)\n this.logger.debug(\"convert\", this.model)\n return this.model\n }\n\n async import(data: Blob | string | TJIIXExport, mimeType?: string): Promise\n {\n this.logger.debug(\"import\", this.model)\n this.logger.info(\"import\", { data, mimeType })\n await this.#initializationDeferred.promise\n if (this.behaviors.import) {\n let blobToImport: Blob\n if (data instanceof Blob) {\n blobToImport = data\n }\n else if (typeof data === \"string\") {\n blobToImport = new Blob([data])\n }\n else {\n blobToImport = new Blob([JSON.stringify(data)])\n }\n await this.behaviors.import(blobToImport, mimeType)\n this.events.emitImported(this.model.exports as TExport)\n this.logger.debug(\"import\", this.model)\n return this.model\n }\n return Promise.reject(\"Import impossible, behaviors has no import function\")\n }\n\n async importPointEvents(strokes: TStroke[]): Promise\n {\n this.logger.debug(\"importPointEvents\", this.model)\n this.logger.info(\"importPointEvents\", { strokes })\n await this.#initializationDeferred.promise\n if (this.behaviors.importPointEvents) {\n await this.behaviors.importPointEvents(strokes)\n this.events.emitImported(this.model.exports as TExport)\n this.logger.debug(\"importPointEvents\", this.model)\n return this.model\n }\n return Promise.reject(\"Import impossible, behaviors has no importPointEvents function\")\n }\n\n}\n","import { TConfigurationClient } from \"../@types/configuration\"\n\nexport async function getAvailableFontList(configuration: TConfigurationClient): Promise>\n{\n if (!configuration?.server?.scheme && !configuration?.server?.host) {\n return Promise.reject(\"Failed to get fonts: configuration.server.scheme & configuration.server.host are required!\")\n }\n if (!configuration?.recognition?.lang) {\n return Promise.reject(\"Failed to get fonts: configuration.recognition.lang is required!\")\n }\n const serverConfig = configuration.server\n const response = await fetch(`${ serverConfig.scheme }://${ serverConfig.host }/api/v4.0/iink/font/google/language/` + configuration.recognition.lang)\n const { result } = await response.json()\n return result.sort()\n}\n","import { TConfigurationClient } from \"../@types/configuration\"\n\nexport async function getAvailableLanguageList(configuration: TConfigurationClient): Promise>>\n{\n if (configuration?.server?.scheme && configuration?.server?.host) {\n const serverConfig = configuration.server\n const response = await fetch(`${ serverConfig.scheme }://${ serverConfig.host }/api/v4.0/iink/availableLanguageList`)\n return response.json()\n } else {\n return Promise.reject(\"Failed to get languages: configuration.server.scheme & configuration.server.host are required!\")\n }\n}\n"],"names":["__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","adopt","then","apply","__classPrivateFieldGet","receiver","state","kind","f","TypeError","has","call","get","__classPrivateFieldSet","set","DefaultServerConfiguration","protocol","scheme","host","applicationKey","hmacKey","version","useWindowLocation","websocket","pingEnabled","pingDelay","maxPingLostCount","autoReconnect","maxRetryCount","fileChunkSize","DefaultRecognitionConfiguration","type","alwaysConnected","lang","gesture","enable","export","jiix","strokes","text","chars","words","renderer","debug","math","mimeTypes","solver","margin","bottom","left","right","top","eraser","mode","guides","diagram","convert","recognition","shape","DefaultGrabberConfiguration","listenerOptions","capture","passive","xyFloatPrecision","timestampFloatPrecision","DefaultRenderingConfiguration","minHeight","minWidth","smartGuide","fadeOut","duration","gap","DefaultTriggerConfiguration","exportContent","exportContentDelay","resizeTriggerDelay","DefaultEventsConfiguration","processDelay","DefaultUndoRedoConfiguration","maxStackSize","DefaultConfiguration","server","grabber","rendering","triggers","events","DefaultLoggerConfiguration","EDITOR","BEHAVIORS","RECOGNIZER","GRABBER","RENDERER","CONFIGURATION","PUBLIC_EVENT","INTERNALEVENT","MODEL","STROKE","SMARTGUIDE","STYLEMANAGER","UNDOREDO_MANAGER","mergeDeep","target","sources","isObject","item","Array","isArray","length","source","shift","key","Object","assign","Logger","constructor","instanceName","level","this","data","dataLog","from","message","console","info","warn","error","LoggerManager","static","name","_a","_LoggerManager_loggerMap","config","keys","forEach","lc","getLogger","Map","Configuration","configuration","_Configuration_logger","JSON","parse","stringify","overrideDefaultConfiguration","defaultConf","_b","_d","_c","_f","_e","_g","window","location","indexOf","Math","max","includes","push","LoggerLevel","LoggerClass","Error","NO_ACTIVITY","WRONG_CREDENTIALS","TOO_OLD","UNKNOW","ABNORMAL_CLOSURE","CANT_ESTABLISH","GOING_AWAY","PROTOCOL_ERROR","UNSUPPORTED_DATA","INVALID_FRAME_PAULOAD","POLICY_VIOLATION","MESSAGE_TOO_BIG","INTERNAL_ERROR","SERVICE_RESTART","TRY_AGAIN","BAD_GATEWAY","TLS_HANDSHAKE","EventType","CHANGED","CLEARED","CONVERTED","ERROR","POINTEREVENTS","EXPORTED","IMPORTED","IDLE","LOADED","InternalEventType","SVG_PATCH","CLEAR_MESSAGE","NOTIF","IMPORT_JIIX","CONVERT","CLEAR","CONTEXT_CHANGE","WS_CLOSED","ExportType","Intention","PublicEvent","EventTarget","super","_PublicEvent_element","_PublicEvent_logger","_PublicEvent_instance","setElement","el","emitLoaded","emitExported","exports","_PublicEvent_instances","_PublicEvent_emit","emitChanged","undoRedoContext","canClear","empty","emitIdle","idle","emitCleared","model","emitConverted","emitImported","WeakMap","WeakSet","evt","CustomEvent","bubbles","composed","detail","undefined","dispatchEvent","InternalEvent","_InternalEvent_abortController","_InternalEvent_logger","AbortController","_InternalEvent_instance","removeAllListeners","abort","emitSVGPatch","patchChange","_InternalEvent_instances","_InternalEvent_emit","addSVGPatchListener","callback","addEventListener","signal","addExportedListener","emitClearMessage","addClearMessageListener","emitError","err","addErrorListener","emitWSClosed","addWSClosedListener","emitNotif","notif","addNotifListener","emitImportJIIX","addImportJIIXListener","emitConvert","conversionState","addConvertListener","emitClear","addClearListener","emitContextChange","context","addContextChangeListener","addIdleListener","SmartGuide","_SmartGuide_smartGuideElement","_SmartGuide_prompterContainerElement","_SmartGuide_prompterTextElement","_SmartGuide_ellipsisElement","_SmartGuide_tagElement","_SmartGuide_candidatesElement","_SmartGuide_menuElement","_SmartGuide_convertElement","_SmartGuide_copyElement","_SmartGuide_deleteElement","_SmartGuide_fadeOutTimout","_SmartGuide_isMenuOpen","_SmartGuide_logger","_SmartGuide_showCandidates","wordId","parseInt","id","replace","uuid","wordToChange","toString","innerHTML","candidates","style","display","word","index","label","getBoundingClientRect","parent","parentNode","insertBefore","_SmartGuide_onClickEllipsis","preventDefault","stopPropagation","_SmartGuide_instances","_SmartGuide_hideCandidates","_SmartGuide_onClickConvert","internalEvent","_SmartGuide_closeMenu","_SmartGuide_onClickCopy","innerText","test","navigator","userAgent","permissionName","permissions","query","clipboard","writeText","timeout","_SmartGuide_onClickDelete","_SmartGuide_onClickCandidate","candidate","_SmartGuide_onClickPrompter","_SmartGuide_onClickOutSide","random","substring","_SmartGuide_createWrapperElement","_SmartGuide_createPrompterContainerElement","_SmartGuide_createPrompterTextElement","_SmartGuide_createEllipsisElement","_SmartGuide_createTagElement","_SmartGuide_createCandidatesElement","_SmartGuide_createMoreMenuElement","_SmartGuide_createConvertElement","_SmartGuide_createCopyElement","_SmartGuide_createDeleteElement","getInstance","init","domElement","renderingConfiguration","appendChild","classList","add","_SmartGuide_addListeners","_SmartGuide_show","_SmartGuide_initFadeOutObserver","resize","mmToPixels","marginTop","marginLeft","marginRight","offsetWidth","width","clientWidth","offsetHeight","update","createWordSpan","span","document","createElement","textContent","myFragment","createDocumentFragment","lastWord","scrollLeft","offsetLeft","populatePrompter","clear","_SmartGuide_hide","destroy","_SmartGuide_removeListeners","remove","setAttribute","MutationObserver","clearTimeout","contains","setTimeout","observe","childList","subtree","attributes","_SmartGuide_openMenu","bind","removeEventListener","DeferredPromise","isFullFilled","isPending","promise","v","PointerEventGrabber","prevent","_PointerEventGrabber_logger","pointerDownHandler","button","buttons","activePointerId","pointerId","onPointerDown","point","extractPoint","pointerMoveHandler","onPointerMove","pointerUpHandler","onPointerUp","roundFloat","oneFloat","requestedFloatPrecision","floatPrecision","pow","round","event","clientX","clientY","changedTouches","rect","pointer","x","clientLeft","y","clientTop","t","Date","now","p","pressure","attach","detach","documentElement","ShapeSymbols","table","recognizedShape","ellipse","line","phi","angle","returnedAngle","PI","drawArrowHead","context2D","headPoint","alpha","beta","save","fillStyle","strokeStyle","moveTo","beginPath","lineTo","cos","sin","fill","restore","drawShapeEllipse","shapeEllipse","points","drawEllipseArc","centerPoint","maxRadius","minRadius","orientation","startAngle","sweepAngle","z1","z3","z2","z4","n","floor","abs","boundariesPoints","i","atan2","cosAlpha","sinAlpha","stroke","beginDecoration","beginTangentAngle","endDecoration","endTangentAngle","drawLine","p1","p2","drawShapeSymbol","symbol","lineWidth","color","elementType","shapeSymbol","selectedCandidateIndex","lines","lineSymbol","drawShapeLine","shapeLine","firstPoint","lastPoint","primitives","primitive","drawStroke","stroker","pointerType","TextSymbols","inputCharacter","char","string","textLine","drawTextLine","drawText","font","textHeight","textAlign","justificationType","textBaseline","fillText","topLeftPoint","height","underlineList","underline","drawUnderline","delta","firstCharacter","lastCharacter","drawTextSymbol","computeLinksPoints","radius","computeMiddlePoint","point1","point2","computeAxeAngle","begin","end","CanvasStroker","renderArc","context2d","center","arc","renderLine","linkPoints1","linkPoints2","renderFinal","linkPoints","newAngle","renderQuadratic","ctrl","linkPoints3","quadraticCurveTo","NUMBER_POINTS","pointers","NUMBER_QUADRATICS","secondPoint","beginLine","endLine","beginFinal","endFinal","closePath","CanvasRenderer","_CanvasRenderer_logger","createCanvas","canvas","resizeContent","pixelRatio","devicePixelRatio","renderingCanvas","capturingCanvas","clientHeight","getContext","scale","drawSymbol","element","renderingCanvasContext","capturingCanvasContext","drawModel","clearRect","rawStrokes","drawPendingStroke","module","o","r","l","m","c","d","defineProperty","configurable","enumerable","__esModule","default","prototype","hasOwnProperty","s","Symbol","iterator","toJSON","u","split","trim","_trimSemiColon","toCSS","slice","parser","JsonCSS","StyleHelper","themeToCSS","json","themeToJSON","theme","Number","ink","penStyleToCSS","penStyle","css","penStyleToJSON","penStyleString","stringToJSON","JSONToString","entries","map","k","join","CryptoJS","create","F","obj","subtype","C","C_lib","lib","Base","extend","overrides","mixIn","$super","arguments","instance","properties","propertyName","clone","WordArray","sigBytes","encoder","Hex","concat","wordArray","thisWords","thatWords","thisSigBytes","thatSigBytes","clamp","thatByte","ceil","nBytes","rcache","m_w","m_z","mask","_r","C_enc","enc","hexChars","bite","hexStr","hexStrLength","substr","Latin1","latin1Chars","String","fromCharCode","latin1Str","latin1StrLength","charCodeAt","Utf8","decodeURIComponent","escape","utf8Str","unescape","encodeURIComponent","BufferedBlockAlgorithm","reset","_data","_nDataBytes","_append","_process","doFlush","dataWords","dataSigBytes","blockSize","nBlocksReady","nWordsReady","_minBufferSize","nBytesReady","min","offset","_doProcessBlock","processedWords","splice","Hasher","cfg","_doReset","messageUpdate","finalize","_doFinalize","_createHelper","hasher","_createHmacHelper","C_algo","HMAC","algo","require$$0","X32WordArray","C_x64","x64","Word","high","low","toX32","x64Words","x64WordsLength","x32Words","x64Word","wordsLength","X64Word","X64WordArray","X64Word_create","K","W","SHA512","_hash","M","H","H0","H1","H2","H3","H4","H5","H6","H7","H0h","H0l","H1h","H1l","H2h","H2l","H3h","H3l","H4h","H4l","H5h","H5l","H6h","H6l","H7h","H7l","ah","al","bh","bl","ch","cl","dh","dl","eh","fh","fl","gh","gl","hh","hl","Wi","Wih","Wil","gamma0x","gamma0xh","gamma0xl","gamma0h","gamma0l","gamma1x","gamma1xh","gamma1xl","gamma1h","gamma1l","Wi7","Wi7h","Wi7l","Wi16","Wi16h","Wi16l","t1l","chh","chl","majh","majl","sigma0h","sigma0l","sigma1h","sigma1l","Ki","Kih","Kil","t1h","t2l","nBitsTotal","nBitsLeft","HmacSHA512","_hasher","hasherBlockSize","hasherBlockSizeBytes","oKey","_oKey","iKey","_iKey","oKeyWords","iKeyWords","innerHash","computeHmac","isVersionSuperiorOrEqual","sourceParts","targetParts","a","b","Stroke","_Stroke_logger","convertStrokeToJSON","RestRecognizer","serverConfig","recognitionConfig","_RestRecognizer_logger","serverConfiguration","recognitionConfiguration","url","postConfig","buildData","strokeGroupByPenStyle","groupIndex","findIndex","sg","isPenStyleEqual","ps1","ps2","strokeGroupsToSend","group","newGroup","contentType","charAt","toUpperCase","toLowerCase","xDPI","yDPI","strokeGroups","post","mimeType","headers","Headers","append","reqInit","method","body","request","Request","response","fetch","ok","blob","catch","tryFetch","res","ErrorConst","code","getMimeTypes","requestedMimeTypes","myModel","getClone","dataToConcert","promises","mt","all","mergeConvert","mimeTypesRequiringExport","filter","mergeExport","UndoRedoContext","stackIndex","possibleUndoCount","canRedo","canUndo","stack","UndoRedoManager","_UndoRedoManager_logger","updateCanUndoRedo","currentModel","addModelToStack","removeLastModelInStack","pop","updateModelInStack","modificationDate","undo","previousModel","redo","nextModel","DefaultPenStyle","DefaultTheme","StyleManager","_StyleManager_penStyle","_StyleManager_theme","_StyleManager_penStyleClasses","_StyleManager_currentPenStyle","_StyleManager_logger","setTheme","setPenStyleClasses","setPenStyle","currentPenStyle","structuredClone","penStyleClasses","penStyleClass","computeDistance","distance","hypot","isNaN","Model","creationDate","_Model_logger","creationTime","selectedStrokes","positions","lastSentPosition","lastReceivedPosition","converts","computePressure","globalDistance","ratio","sqrt","filterPointByAcquisitionDelta","lastPointer","addPoint","at","addStroke","extractUnsentStrokes","initCurrentStroke","dpi","pxWidth","currentStroke","appendToCurrentStroke","endCurrentStroke","resetSelectedStrokes","appendSelectedStrokesFromPoint","_Model_instances","_Model_getStrokeFromPoint","updateStroke","updatedStroke","strokeIndex","removeStroke","removeStrokesFromPoint","strokeToRemove","updatePositionSent","position","updatePositionReceived","clonedModel","isBetween","val","_strokeList","strokePointer","RestBehaviors","options","_RestBehaviors_configuration","_RestBehaviors_model","_RestBehaviors_logger","_RestBehaviors_resizeTimer","_RestBehaviors_exportTimer","styleManager","recognizer","intention","undoRedoManager","penClass","updateModelRendering","drawCurrentStroke","_evt","newModel","deferred","deferredResize","resizeModel","WSRecognizer","_WSRecognizer_logger","pingCount","reconnectionCount","toLocaleLowerCase","infinitePing","socket","close","readyState","send","openCallback","connected","params","sessionId","iinkSessionId","xDpi","yDpi","viewSizeHeight","viewSizeWidth","rejectDeferredPending","initialized","addStrokeDeferred","exportDeferred","_h","convertDeferred","_j","_k","importDeferred","_l","_m","resizeDeferred","_o","_p","undoDeferred","_q","redoDeferred","_s","_t","clearDeferred","_u","waitForIdleDeferred","_v","closeCallback","currentErrorCode","reason","manageHMACChallengeMessage","websocketMessage","hmacChallengeMessage","hmacChallenge","hmac","manageContentPackageDescriptionMessage","currentPartId","managePartChangeMessage","partChangeMessage","partId","manageExportMessage","exportMessage","importPointEventsDeferred","manageWaitForIdle","manageErrorMessage","manageContentChangeMessage","contentChangeMessage","undoStackIndex","manageSVGPatchMessage","svgPatchMessage","messageCallback","WebSocket","OPEN","CONNECTING","addStrokes","styleClasses","localModel","import","chunkSize","importFileId","readBlob","fileReader","FileReader","onloadend","ev","onerror","readAsText","importFileMessage","size","blobPart","fileChuckMessage","lastChunk","importPointEvents","exportPoints","myExportConverted","waitForIdle","undoExports","redoExports","clearExports","SVGStroker","getArcPath","getLinePath","getFinalPath","parts","getQuadraticPath","central","buildSVGPath","STROKE_LENGTH","STROKE_WIDTH","NB_QUADRATICS","beforeLastPoint","svgElement","attrs","svgPathElement","createElementNS","svgPath","WSSVGRenderer","_WSSVGRenderer_logger","fontSize","updateLayer","layerName","_WSSVGRenderer_instances","_WSSVGRenderer_replaceElement","_WSSVGRenderer_removeElement","_WSSVGRenderer_removeChild","_WSSVGRenderer_insertBefore","_WSSVGRenderer_setAttribute","_WSSVGRenderer_removeAttribute","updatesLayer","updates","clearPendingStroke","pendingStrokeGroup","querySelector","oldStroke","clearErasingStrokes","querySelectorAll","erasingStroke","svgList","svg","_WSSVGRenderer_drawStroke","_WSSVGRenderer_replaceAll","oldLayer","insertAdjacentHTML","layer","pendingStrokesGroup","elementToRemove","_WSSVGRenderer_appendChild","parentSelector","parentId","refId","selector","removeAttribute","WSBehaviors","_WSBehaviors_configuration","_WSBehaviors_model","_WSBehaviors_logger","_WSBehaviors_resizeTimer","onSVGPatch","compStyles","getComputedStyle","unsentStrokes","styleInject","ref","insertAt","head","getElementsByTagName","firstChild","styleSheet","cssText","createTextNode","logger","defaultBehaviors","_Editor_behaviors","behaviors","_Editor_initializeBehaviors","_Editor_initializationDeferred","_Editor_instances","_Editor_cleanMessage","wrapperHTML","editor","_Editor_showError","finally","_Editor_smartGuide","_Editor_messageHTML","_Editor_showStrokesIfDebug","showStrokesPan","panel","getElementById","_Editor_showNotif","_Editor_addListeners","_Editor_onImportJIIX","_Editor_onExport","_Editor_onContextChange","_Editor_onIdleChange","jjix","Blob","getAvailableFontList","sort","getAvailableLanguageList","Editor","globalClassCss","_Editor_loaderHTML","_Editor_loggerConfiguration","_Editor_instantiateBehaviors","loggerConfiguration","loggerConfig","setLoggerLevel","initializationPromise","initialize","cursor","ps","psc","_Editor_initializeSmartGuide","blobToImport"],"mappings":"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"} \ No newline at end of file diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 000000000..e2ac6616a --- /dev/null +++ b/docs/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/typedoc.css b/docs/assets/custom.css similarity index 100% rename from typedoc.css rename to docs/assets/custom.css diff --git a/docs/assets/highlight.css b/docs/assets/highlight.css new file mode 100644 index 000000000..4ae00dadd --- /dev/null +++ b/docs/assets/highlight.css @@ -0,0 +1,113 @@ +:root { + --light-hl-0: #795E26; + --dark-hl-0: #DCDCAA; + --light-hl-1: #000000; + --dark-hl-1: #D4D4D4; + --light-hl-2: #A31515; + --dark-hl-2: #CE9178; + --light-hl-3: #800000; + --dark-hl-3: #808080; + --light-hl-4: #800000; + --dark-hl-4: #569CD6; + --light-hl-5: #000000FF; + --dark-hl-5: #D4D4D4; + --light-hl-6: #E50000; + --dark-hl-6: #9CDCFE; + --light-hl-7: #0000FF; + --dark-hl-7: #CE9178; + --light-hl-8: #800000; + --dark-hl-8: #D7BA7D; + --light-hl-9: #098658; + --dark-hl-9: #B5CEA8; + --light-hl-10: #0000FF; + --dark-hl-10: #569CD6; + --light-hl-11: #0070C1; + --dark-hl-11: #4FC1FF; + --light-hl-12: #001080; + --dark-hl-12: #9CDCFE; + --light-code-background: #FFFFFF; + --dark-code-background: #1E1E1E; +} + +@media (prefers-color-scheme: light) { :root { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); + --hl-11: var(--light-hl-11); + --hl-12: var(--light-hl-12); + --code-background: var(--light-code-background); +} } + +@media (prefers-color-scheme: dark) { :root { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); + --hl-11: var(--dark-hl-11); + --hl-12: var(--dark-hl-12); + --code-background: var(--dark-code-background); +} } + +:root[data-theme='light'] { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); + --hl-11: var(--light-hl-11); + --hl-12: var(--light-hl-12); + --code-background: var(--light-code-background); +} + +:root[data-theme='dark'] { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); + --hl-11: var(--dark-hl-11); + --hl-12: var(--dark-hl-12); + --code-background: var(--dark-code-background); +} + +.hl-0 { color: var(--hl-0); } +.hl-1 { color: var(--hl-1); } +.hl-2 { color: var(--hl-2); } +.hl-3 { color: var(--hl-3); } +.hl-4 { color: var(--hl-4); } +.hl-5 { color: var(--hl-5); } +.hl-6 { color: var(--hl-6); } +.hl-7 { color: var(--hl-7); } +.hl-8 { color: var(--hl-8); } +.hl-9 { color: var(--hl-9); } +.hl-10 { color: var(--hl-10); } +.hl-11 { color: var(--hl-11); } +.hl-12 { color: var(--hl-12); } +pre, code { background: var(--code-background); } diff --git a/docs/assets/main.js b/docs/assets/main.js new file mode 100644 index 000000000..d0aa8d5f9 --- /dev/null +++ b/docs/assets/main.js @@ -0,0 +1,59 @@ +"use strict"; +"use strict";(()=>{var Pe=Object.create;var ne=Object.defineProperty;var Ie=Object.getOwnPropertyDescriptor;var Oe=Object.getOwnPropertyNames;var _e=Object.getPrototypeOf,Re=Object.prototype.hasOwnProperty;var Me=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Fe=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Oe(e))!Re.call(t,i)&&i!==n&&ne(t,i,{get:()=>e[i],enumerable:!(r=Ie(e,i))||r.enumerable});return t};var De=(t,e,n)=>(n=t!=null?Pe(_e(t)):{},Fe(e||!t||!t.__esModule?ne(n,"default",{value:t,enumerable:!0}):n,t));var ae=Me((se,oe)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,u],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(n+=r[u+1]*i[d+1],u+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),v=s.str.charAt(1),f;v in s.node.edges?f=s.node.edges[v]:(f=new t.TokenSet,s.node.edges[v]=f),s.str.length==1&&(f.final=!0),i.push({node:f,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof se=="object"?oe.exports=n():e.lunr=n()}(this,function(){return t})})()});var re=[];function G(t,e){re.push({selector:e,constructor:t})}var U=class{constructor(){this.alwaysVisibleMember=null;this.createComponents(document.body),this.ensureActivePageVisible(),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible())}createComponents(e){re.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r}}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(n&&n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let r=document.createElement("p");r.classList.add("warning"),r.textContent="This member is normally hidden due to your filter settings.",n.prepend(r)}}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent="Copied!",e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent="Copy"},100)},1e3)})})}};var ie=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var de=De(ae());async function le(t,e){if(!window.searchData)return;let n=await fetch(window.searchData),r=new Blob([await n.arrayBuffer()]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();t.data=i,t.index=de.Index.load(i.index),e.classList.remove("loading"),e.classList.add("ready")}function he(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:t.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{le(e,t)}),le(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");let s=!1;i.addEventListener("mousedown",()=>s=!0),i.addEventListener("mouseup",()=>{s=!1,t.classList.remove("has-focus")}),r.addEventListener("focus",()=>t.classList.add("has-focus")),r.addEventListener("blur",()=>{s||(s=!1,t.classList.remove("has-focus"))}),Ae(t,i,r,e)}function Ae(t,e,n,r){n.addEventListener("input",ie(()=>{Ne(t,e,n,r)},200));let i=!1;n.addEventListener("keydown",s=>{i=!0,s.key=="Enter"?Ve(e,n):s.key=="Escape"?n.blur():s.key=="ArrowUp"?ue(e,-1):s.key==="ArrowDown"?ue(e,1):i=!1}),n.addEventListener("keypress",s=>{i&&s.preventDefault()}),document.body.addEventListener("keydown",s=>{s.altKey||s.ctrlKey||s.metaKey||!n.matches(":focus")&&s.key==="/"&&(n.focus(),s.preventDefault())})}function Ne(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=ce(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` + ${ce(l.parent,i)}.${d}`);let v=document.createElement("li");v.classList.value=l.classes??"";let f=document.createElement("a");f.href=r.base+l.url,f.innerHTML=u+d,v.append(f),e.appendChild(v)}}function ue(t,e){let n=t.querySelector(".current");if(!n)n=t.querySelector(e==1?"li:first-child":"li:last-child"),n&&n.classList.add("current");else{let r=n;if(e===1)do r=r.nextElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);else do r=r.previousElementSibling??void 0;while(r instanceof HTMLElement&&r.offsetParent==null);r&&(n.classList.remove("current"),r.classList.add("current"))}}function Ve(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),e.blur()}}function ce(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(K(t.substring(s,o)),`${K(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(K(t.substring(s))),i.join("")}var Be={"&":"&","<":"<",">":">","'":"'",'"':"""};function K(t){return t.replace(/[&<>"'"]/g,e=>Be[e])}var C=class{constructor(e){this.el=e.el,this.app=e.app}};var F="mousedown",pe="mousemove",B="mouseup",J={x:0,y:0},fe=!1,ee=!1,He=!1,D=!1,me=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(me?"is-mobile":"not-mobile");me&&"ontouchstart"in document.documentElement&&(He=!0,F="touchstart",pe="touchmove",B="touchend");document.addEventListener(F,t=>{ee=!0,D=!1;let e=F=="touchstart"?t.targetTouches[0]:t;J.y=e.pageY||0,J.x=e.pageX||0});document.addEventListener(pe,t=>{if(ee&&!D){let e=F=="touchstart"?t.targetTouches[0]:t,n=J.x-(e.pageX||0),r=J.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(B,()=>{ee=!1});document.addEventListener("click",t=>{fe&&(t.preventDefault(),t.stopImmediatePropagation(),fe=!1)});var X=class extends C{constructor(n){super(n);this.className=this.el.dataset.toggle||"",this.el.addEventListener(B,r=>this.onPointerUp(r)),this.el.addEventListener("click",r=>r.preventDefault()),document.addEventListener(F,r=>this.onDocumentPointerDown(r)),document.addEventListener(B,r=>this.onDocumentPointerUp(r))}setActive(n){if(this.active==n)return;this.active=n,document.documentElement.classList.toggle("has-"+this.className,n),this.el.classList.toggle("active",n);let r=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(r),setTimeout(()=>document.documentElement.classList.remove(r),500)}onPointerUp(n){D||(this.setActive(!0),n.preventDefault())}onDocumentPointerDown(n){if(this.active){if(n.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(n){if(!D&&this.active&&n.target.closest(".col-sidebar")){let r=n.target.closest("a");if(r){let i=window.location.href;i.indexOf("#")!=-1&&(i=i.substring(0,i.indexOf("#"))),r.href.substring(0,i.length)==i&&setTimeout(()=>this.setActive(!1),250)}}}};var te;try{te=localStorage}catch{te={getItem(){return null},setItem(){}}}var Q=te;var ve=document.head.appendChild(document.createElement("style"));ve.dataset.for="filters";var Y=class extends C{constructor(n){super(n);this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),ve.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`}fromLocalStorage(){let n=Q.getItem(this.key);return n?n==="true":this.el.checked}setLocalStorage(n){Q.setItem(this.key,n.toString()),this.value=n,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),document.querySelectorAll(".tsd-index-section").forEach(n=>{n.style.display="block";let r=Array.from(n.querySelectorAll(".tsd-index-link")).every(i=>i.offsetParent==null);n.style.display=r?"none":"block"})}};var Z=class extends C{constructor(n){super(n);this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.dataset.key??this.summary.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`;let r=Q.getItem(this.key);this.el.open=r?r==="true":this.el.open,this.el.addEventListener("toggle",()=>this.update());let i=this.summary.querySelector("a");i&&i.addEventListener("click",()=>{location.assign(i.href)}),this.update()}update(){this.icon.style.transform=`rotate(${this.el.open?0:-90}deg)`,Q.setItem(this.key,this.el.open.toString())}};function ge(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,ye(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),ye(t.value)})}function ye(t){document.documentElement.dataset.theme=t}var Le;function be(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",xe),xe())}async function xe(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let n=await(await fetch(window.navigationData)).arrayBuffer(),r=new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();Le=t.dataset.base+"/",t.innerHTML="";for(let s of i)we(s,t,[]);window.app.createComponents(t),window.app.ensureActivePageVisible()}function we(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-index-accordion`:"tsd-index-accordion",s.dataset.key=i.join("$");let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.innerHTML='',Ee(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let u of t.children)we(u,l,i)}else Ee(t,r,t.class)}function Ee(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=Le+t.path,n&&(r.className=n),location.href===r.href&&r.classList.add("current"),t.kind&&(r.innerHTML=``),r.appendChild(document.createElement("span")).textContent=t.text}else e.appendChild(document.createElement("span")).textContent=t.text}G(X,"a[data-toggle]");G(Z,".tsd-index-accordion");G(Y,".tsd-filter-item input[type=checkbox]");var Se=document.getElementById("tsd-theme");Se&&ge(Se);var je=new U;Object.defineProperty(window,"app",{value:je});he();be();})(); +/*! Bundled license information: + +lunr/lunr.js: + (** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + *) + (*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + *) + (*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + *) +*/ diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js new file mode 100644 index 000000000..2e40bc2bb --- /dev/null +++ b/docs/assets/navigation.js @@ -0,0 +1 @@ +window.navigationData = "data:application/octet-stream;base64,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" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js new file mode 100644 index 000000000..dcb325cae --- /dev/null +++ b/docs/assets/search.js @@ -0,0 +1 @@ +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/docs/assets/style.css b/docs/assets/style.css new file mode 100644 index 000000000..108428c3f --- /dev/null +++ b/docs/assets/style.css @@ -0,0 +1,1383 @@ +:root { + /* Light */ + --light-color-background: #f2f4f8; + --light-color-background-secondary: #eff0f1; + --light-color-warning-text: #222; + --light-color-background-warning: #e6e600; + --light-color-icon-background: var(--light-color-background); + --light-color-accent: #c5c7c9; + --light-color-active-menu-item: var(--light-color-accent); + --light-color-text: #222; + --light-color-text-aside: #6e6e6e; + --light-color-link: #1f70c2; + + --light-color-ts-project: #b111c9; + --light-color-ts-module: var(--light-color-ts-project); + --light-color-ts-namespace: var(--light-color-ts-project); + --light-color-ts-enum: #7e6f15; + --light-color-ts-enum-member: var(--light-color-ts-enum); + --light-color-ts-variable: #4760ec; + --light-color-ts-function: #572be7; + --light-color-ts-class: #1f70c2; + --light-color-ts-interface: #108024; + --light-color-ts-constructor: var(--light-color-ts-class); + --light-color-ts-property: var(--light-color-ts-variable); + --light-color-ts-method: var(--light-color-ts-function); + --light-color-ts-call-signature: var(--light-color-ts-method); + --light-color-ts-index-signature: var(--light-color-ts-property); + --light-color-ts-constructor-signature: var(--light-color-ts-constructor); + --light-color-ts-parameter: var(--light-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --light-color-ts-type-parameter: var(--light-color-ts-type-alias); + --light-color-ts-accessor: var(--light-color-ts-property); + --light-color-ts-get-signature: var(--light-color-ts-accessor); + --light-color-ts-set-signature: var(--light-color-ts-accessor); + --light-color-ts-type-alias: #d51270; + /* reference not included as links will be colored with the kind that it points to */ + + --light-external-icon: url("data:image/svg+xml;utf8,"); + --light-color-scheme: light; + + /* Dark */ + --dark-color-background: #2b2e33; + --dark-color-background-secondary: #1e2024; + --dark-color-background-warning: #bebe00; + --dark-color-warning-text: #222; + --dark-color-icon-background: var(--dark-color-background-secondary); + --dark-color-accent: #9096a2; + --dark-color-active-menu-item: #5d5d6a; + --dark-color-text: #f5f5f5; + --dark-color-text-aside: #dddddd; + --dark-color-link: #00aff4; + + --dark-color-ts-project: #e358ff; + --dark-color-ts-module: var(--dark-color-ts-project); + --dark-color-ts-namespace: var(--dark-color-ts-project); + --dark-color-ts-enum: #f4d93e; + --dark-color-ts-enum-member: var(--dark-color-ts-enum); + --dark-color-ts-variable: #798dff; + --dark-color-ts-function: #a280ff; + --dark-color-ts-class: #8ac4ff; + --dark-color-ts-interface: #6cff87; + --dark-color-ts-constructor: var(--dark-color-ts-class); + --dark-color-ts-property: var(--dark-color-ts-variable); + --dark-color-ts-method: var(--dark-color-ts-function); + --dark-color-ts-call-signature: var(--dark-color-ts-method); + --dark-color-ts-index-signature: var(--dark-color-ts-property); + --dark-color-ts-constructor-signature: var(--dark-color-ts-constructor); + --dark-color-ts-parameter: var(--dark-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --dark-color-ts-type-parameter: var(--dark-color-ts-type-alias); + --dark-color-ts-accessor: var(--dark-color-ts-property); + --dark-color-ts-get-signature: var(--dark-color-ts-accessor); + --dark-color-ts-set-signature: var(--dark-color-ts-accessor); + --dark-color-ts-type-alias: #ff6492; + /* reference not included as links will be colored with the kind that it points to */ + + --dark-external-icon: url("data:image/svg+xml;utf8,"); + --dark-color-scheme: dark; +} + +@media (prefers-color-scheme: light) { + :root { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-icon-background: var(--light-color-icon-background); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-link: var(--light-color-link); + + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-icon-background: var(--dark-color-icon-background); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-link: var(--dark-color-link); + + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } +} + +html { + color-scheme: var(--color-scheme); +} + +body { + margin: 0; +} + +:root[data-theme="light"] { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-icon-background: var(--light-color-icon-background); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-link: var(--light-color-link); + + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); +} + +:root[data-theme="dark"] { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-icon-background: var(--dark-color-icon-background); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-link: var(--dark-color-link); + + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); +} + +.always-visible, +.always-visible .tsd-signatures { + display: inherit !important; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + line-height: 1.2; +} + +h1 > a, +h2 > a, +h3 > a, +h4 > a, +h5 > a, +h6 > a { + text-decoration: none; + color: var(--color-text); +} + +h1 { + font-size: 1.875rem; + margin: 0.67rem 0; +} + +h2 { + font-size: 1.5rem; + margin: 0.83rem 0; +} + +h3 { + font-size: 1.25rem; + margin: 1rem 0; +} + +h4 { + font-size: 1.05rem; + margin: 1.33rem 0; +} + +h5 { + font-size: 1rem; + margin: 1.5rem 0; +} + +h6 { + font-size: 0.875rem; + margin: 2.33rem 0; +} + +.uppercase { + text-transform: uppercase; +} + +dl, +menu, +ol, +ul { + margin: 1em 0; +} + +dd { + margin: 0 0 0 40px; +} + +.container { + max-width: 1700px; + padding: 0 2rem; +} + +/* Footer */ +.tsd-generator { + border-top: 1px solid var(--color-accent); + padding-top: 1rem; + padding-bottom: 1rem; + max-height: 3.5rem; +} + +.tsd-generator > p { + margin-top: 0; + margin-bottom: 0; + padding: 0 1rem; +} + +.container-main { + margin: 0 auto; + /* toolbar, footer, margin */ + min-height: calc(100vh - 41px - 56px - 4rem); +} + +@keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +@keyframes fade-out { + from { + opacity: 1; + visibility: visible; + } + to { + opacity: 0; + } +} +@keyframes fade-in-delayed { + 0% { + opacity: 0; + } + 33% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes fade-out-delayed { + 0% { + opacity: 1; + visibility: visible; + } + 66% { + opacity: 0; + } + 100% { + opacity: 0; + } +} +@keyframes pop-in-from-right { + from { + transform: translate(100%, 0); + } + to { + transform: translate(0, 0); + } +} +@keyframes pop-out-to-right { + from { + transform: translate(0, 0); + visibility: visible; + } + to { + transform: translate(100%, 0); + } +} +body { + background: var(--color-background); + font-family: "Segoe UI", sans-serif; + font-size: 16px; + color: var(--color-text); +} + +a { + color: var(--color-link); + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +a.external[target="_blank"] { + background-image: var(--external-icon); + background-position: top 3px right; + background-repeat: no-repeat; + padding-right: 13px; +} + +code, +pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 0.875rem; + border-radius: 0.8em; +} + +pre { + position: relative; + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; + padding: 10px; + border: 1px solid var(--color-accent); +} +pre code { + padding: 0; + font-size: 100%; +} +pre > button { + position: absolute; + top: 10px; + right: 10px; + opacity: 0; + transition: opacity 0.1s; + box-sizing: border-box; +} +pre:hover > button, +pre > button.visible { + opacity: 1; +} + +blockquote { + margin: 1em 0; + padding-left: 1em; + border-left: 4px solid gray; +} + +.tsd-typography { + line-height: 1.333em; +} +.tsd-typography ul { + list-style: square; + padding: 0 0 0 20px; + margin: 0; +} +.tsd-typography .tsd-index-panel h3, +.tsd-index-panel .tsd-typography h3, +.tsd-typography h4, +.tsd-typography h5, +.tsd-typography h6 { + font-size: 1em; +} +.tsd-typography h5, +.tsd-typography h6 { + font-weight: normal; +} +.tsd-typography p, +.tsd-typography ul, +.tsd-typography ol { + margin: 1em 0; +} +.tsd-typography table { + border-collapse: collapse; + border: none; +} +.tsd-typography td, +.tsd-typography th { + padding: 6px 13px; + border: 1px solid var(--color-accent); +} +.tsd-typography thead, +.tsd-typography tr:nth-child(even) { + background-color: var(--color-background-secondary); +} + +.tsd-breadcrumb { + margin: 0; + padding: 0; + color: var(--color-text-aside); +} +.tsd-breadcrumb a { + color: var(--color-text-aside); + text-decoration: none; +} +.tsd-breadcrumb a:hover { + text-decoration: underline; +} +.tsd-breadcrumb li { + display: inline; +} +.tsd-breadcrumb li:after { + content: " / "; +} + +.tsd-comment-tags { + display: flex; + flex-direction: column; +} +dl.tsd-comment-tag-group { + display: flex; + align-items: center; + overflow: hidden; + margin: 0.5em 0; +} +dl.tsd-comment-tag-group dt { + display: flex; + margin-right: 0.5em; + font-size: 0.875em; + font-weight: normal; +} +dl.tsd-comment-tag-group dd { + margin: 0; +} +code.tsd-tag { + padding: 0.25em 0.4em; + border: 0.1em solid var(--color-accent); + margin-right: 0.25em; + font-size: 70%; +} +h1 code.tsd-tag:first-of-type { + margin-left: 0.25em; +} + +dl.tsd-comment-tag-group dd:before, +dl.tsd-comment-tag-group dd:after { + content: " "; +} +dl.tsd-comment-tag-group dd pre, +dl.tsd-comment-tag-group dd:after { + clear: both; +} +dl.tsd-comment-tag-group p { + margin: 0; +} + +.tsd-panel.tsd-comment .lead { + font-size: 1.1em; + line-height: 1.333em; + margin-bottom: 2em; +} +.tsd-panel.tsd-comment .lead:last-child { + margin-bottom: 0; +} + +.tsd-filter-visibility h4 { + font-size: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.5rem; + margin: 0; +} +.tsd-filter-item:not(:last-child) { + margin-bottom: 0.5rem; +} +.tsd-filter-input { + display: flex; + width: fit-content; + width: -moz-fit-content; + align-items: center; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + cursor: pointer; +} +.tsd-filter-input input[type="checkbox"] { + cursor: pointer; + position: absolute; + width: 1.5em; + height: 1.5em; + opacity: 0; +} +.tsd-filter-input input[type="checkbox"]:disabled { + pointer-events: none; +} +.tsd-filter-input svg { + cursor: pointer; + width: 1.5em; + height: 1.5em; + margin-right: 0.5em; + border-radius: 0.33em; + /* Leaving this at full opacity breaks event listeners on Firefox. + Don't remove unless you know what you're doing. */ + opacity: 0.99; +} +.tsd-filter-input input[type="checkbox"]:focus + svg { + transform: scale(0.95); +} +.tsd-filter-input input[type="checkbox"]:focus:not(:focus-visible) + svg { + transform: scale(1); +} +.tsd-checkbox-background { + fill: var(--color-accent); +} +input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { + stroke: var(--color-text); +} +.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background { + fill: var(--color-background); + stroke: var(--color-accent); + stroke-width: 0.25rem; +} +.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark { + stroke: var(--color-accent); +} + +.tsd-theme-toggle { + padding-top: 0.75rem; +} +.tsd-theme-toggle > h4 { + display: inline; + vertical-align: middle; + margin-right: 0.75rem; +} + +.tsd-hierarchy { + list-style: square; + margin: 0; +} +.tsd-hierarchy .target { + font-weight: bold; +} + +.tsd-panel-group.tsd-index-group { + margin-bottom: 0; +} +.tsd-index-panel .tsd-index-list { + list-style: none; + line-height: 1.333em; + margin: 0; + padding: 0.25rem 0 0 0; + overflow: hidden; + display: grid; + grid-template-columns: repeat(3, 1fr); + column-gap: 1rem; + grid-template-rows: auto; +} +@media (max-width: 1024px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(2, 1fr); + } +} +@media (max-width: 768px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(1, 1fr); + } +} +.tsd-index-panel .tsd-index-list li { + -webkit-page-break-inside: avoid; + -moz-page-break-inside: avoid; + -ms-page-break-inside: avoid; + -o-page-break-inside: avoid; + page-break-inside: avoid; +} + +.tsd-flag { + display: inline-block; + padding: 0.25em 0.4em; + border-radius: 4px; + color: var(--color-comment-tag-text); + background-color: var(--color-comment-tag); + text-indent: 0; + font-size: 75%; + line-height: 1; + font-weight: normal; +} + +.tsd-anchor { + position: relative; + top: -100px; +} + +.tsd-member { + position: relative; +} +.tsd-member .tsd-anchor + h3 { + display: flex; + align-items: center; + margin-top: 0; + margin-bottom: 0; + border-bottom: none; +} + +.tsd-navigation.settings { + margin: 1rem 0; +} +.tsd-navigation > a, +.tsd-navigation .tsd-accordion-summary { + width: calc(100% - 0.5rem); +} +.tsd-navigation a, +.tsd-navigation summary > span, +.tsd-page-navigation a { + display: inline-flex; + align-items: center; + padding: 0.25rem; + color: var(--color-text); + text-decoration: none; + box-sizing: border-box; +} +.tsd-navigation a.current, +.tsd-page-navigation a.current { + background: var(--color-active-menu-item); +} +.tsd-navigation a:hover, +.tsd-page-navigation a:hover { + text-decoration: underline; +} +.tsd-navigation ul, +.tsd-page-navigation ul { + margin-top: 0; + margin-bottom: 0; + padding: 0; + list-style: none; +} +.tsd-navigation li, +.tsd-page-navigation li { + padding: 0; + max-width: 100%; +} +.tsd-nested-navigation { + margin-left: 3rem; +} +.tsd-nested-navigation > li > details { + margin-left: -1.5rem; +} +.tsd-small-nested-navigation { + margin-left: 1.5rem; +} +.tsd-small-nested-navigation > li > details { + margin-left: -1.5rem; +} + +.tsd-nested-navigation > li > a, +.tsd-nested-navigation > li > span { + width: calc(100% - 1.75rem - 0.5rem); +} + +.tsd-page-navigation ul { + padding-left: 1.75rem; +} + +#tsd-sidebar-links a { + margin-top: 0; + margin-bottom: 0.5rem; + line-height: 1.25rem; +} +#tsd-sidebar-links a:last-of-type { + margin-bottom: 0; +} + +a.tsd-index-link { + padding: 0.25rem 0 !important; + font-size: 1rem; + line-height: 1.25rem; + display: inline-flex; + align-items: center; + color: var(--color-text); +} +.tsd-accordion-summary { + list-style-type: none; /* hide marker on non-safari */ + outline: none; /* broken on safari, so just hide it */ +} +.tsd-accordion-summary::-webkit-details-marker { + display: none; /* hide marker on safari */ +} +.tsd-accordion-summary, +.tsd-accordion-summary a { + user-select: none; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + + cursor: pointer; +} +.tsd-accordion-summary a { + width: calc(100% - 1.5rem); +} +.tsd-accordion-summary > * { + margin-top: 0; + margin-bottom: 0; + padding-top: 0; + padding-bottom: 0; +} +.tsd-index-accordion .tsd-accordion-summary > svg { + margin-left: 0.25rem; +} +.tsd-index-content > :not(:first-child) { + margin-top: 0.75rem; +} +.tsd-index-heading { + margin-top: 1.5rem; + margin-bottom: 0.75rem; +} + +.tsd-kind-icon { + margin-right: 0.5rem; + width: 1.25rem; + height: 1.25rem; + min-width: 1.25rem; + min-height: 1.25rem; +} +.tsd-kind-icon path { + transform-origin: center; + transform: scale(1.1); +} +.tsd-signature > .tsd-kind-icon { + margin-right: 0.8rem; +} + +.tsd-panel { + margin-bottom: 2.5rem; +} +.tsd-panel.tsd-member { + margin-bottom: 4rem; +} +.tsd-panel:empty { + display: none; +} +.tsd-panel > h1, +.tsd-panel > h2, +.tsd-panel > h3 { + margin: 1.5rem -1.5rem 0.75rem -1.5rem; + padding: 0 1.5rem 0.75rem 1.5rem; +} +.tsd-panel > h1.tsd-before-signature, +.tsd-panel > h2.tsd-before-signature, +.tsd-panel > h3.tsd-before-signature { + margin-bottom: 0; + border-bottom: none; +} + +.tsd-panel-group { + margin: 4rem 0; +} +.tsd-panel-group.tsd-index-group { + margin: 2rem 0; +} +.tsd-panel-group.tsd-index-group details { + margin: 2rem 0; +} + +#tsd-search { + transition: background-color 0.2s; +} +#tsd-search .title { + position: relative; + z-index: 2; +} +#tsd-search .field { + position: absolute; + left: 0; + top: 0; + right: 2.5rem; + height: 100%; +} +#tsd-search .field input { + box-sizing: border-box; + position: relative; + top: -50px; + z-index: 1; + width: 100%; + padding: 0 10px; + opacity: 0; + outline: 0; + border: 0; + background: transparent; + color: var(--color-text); +} +#tsd-search .field label { + position: absolute; + overflow: hidden; + right: -40px; +} +#tsd-search .field input, +#tsd-search .title, +#tsd-toolbar-links a { + transition: opacity 0.2s; +} +#tsd-search .results { + position: absolute; + visibility: hidden; + top: 40px; + width: 100%; + margin: 0; + padding: 0; + list-style: none; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); +} +#tsd-search .results li { + background-color: var(--color-background); + line-height: initial; + padding: 4px; +} +#tsd-search .results li:nth-child(even) { + background-color: var(--color-background-secondary); +} +#tsd-search .results li.state { + display: none; +} +#tsd-search .results li.current:not(.no-results), +#tsd-search .results li:hover:not(.no-results) { + background-color: var(--color-accent); +} +#tsd-search .results a { + display: flex; + align-items: center; + padding: 0.25rem; + box-sizing: border-box; +} +#tsd-search .results a:before { + top: 10px; +} +#tsd-search .results span.parent { + color: var(--color-text-aside); + font-weight: normal; +} +#tsd-search.has-focus { + background-color: var(--color-accent); +} +#tsd-search.has-focus .field input { + top: 0; + opacity: 1; +} +#tsd-search.has-focus .title, +#tsd-search.has-focus #tsd-toolbar-links a { + z-index: 0; + opacity: 0; +} +#tsd-search.has-focus .results { + visibility: visible; +} +#tsd-search.loading .results li.state.loading { + display: block; +} +#tsd-search.failure .results li.state.failure { + display: block; +} + +#tsd-toolbar-links { + position: absolute; + top: 0; + right: 2rem; + height: 100%; + display: flex; + align-items: center; + justify-content: flex-end; +} +#tsd-toolbar-links a { + margin-left: 1.5rem; +} +#tsd-toolbar-links a:hover { + text-decoration: underline; +} + +.tsd-signature { + margin: 0 0 1rem 0; + padding: 1rem 0.5rem; + border: 1px solid var(--color-accent); + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 14px; + overflow-x: auto; +} + +.tsd-signature-symbol { + color: var(--color-text-aside); + font-weight: normal; +} + +.tsd-signature-type { + font-style: italic; + font-weight: normal; +} + +.tsd-signatures { + padding: 0; + margin: 0 0 1em 0; + list-style-type: none; +} +.tsd-signatures .tsd-signature { + margin: 0; + border-color: var(--color-accent); + border-width: 1px 0; + transition: background-color 0.1s; +} +.tsd-description .tsd-signatures .tsd-signature { + border-width: 1px; +} + +ul.tsd-parameter-list, +ul.tsd-type-parameter-list { + list-style: square; + margin: 0; + padding-left: 20px; +} +ul.tsd-parameter-list > li.tsd-parameter-signature, +ul.tsd-type-parameter-list > li.tsd-parameter-signature { + list-style: none; + margin-left: -20px; +} +ul.tsd-parameter-list h5, +ul.tsd-type-parameter-list h5 { + font-size: 16px; + margin: 1em 0 0.5em 0; +} +.tsd-sources { + margin-top: 1rem; + font-size: 0.875em; +} +.tsd-sources a { + color: var(--color-text-aside); + text-decoration: underline; +} +.tsd-sources ul { + list-style: none; + padding: 0; +} + +.tsd-page-toolbar { + position: sticky; + z-index: 1; + top: 0; + left: 0; + width: 100%; + color: var(--color-text); + background: var(--color-background-secondary); + border-bottom: 1px var(--color-accent) solid; + transition: transform 0.3s ease-in-out; +} +.tsd-page-toolbar a { + color: var(--color-text); + text-decoration: none; +} +.tsd-page-toolbar a.title { + font-weight: bold; +} +.tsd-page-toolbar a.title:hover { + text-decoration: underline; +} +.tsd-page-toolbar .tsd-toolbar-contents { + display: flex; + justify-content: space-between; + height: 2.5rem; + margin: 0 auto; +} +.tsd-page-toolbar .table-cell { + position: relative; + white-space: nowrap; + line-height: 40px; +} +.tsd-page-toolbar .table-cell:first-child { + width: 100%; +} +.tsd-page-toolbar .tsd-toolbar-icon { + box-sizing: border-box; + line-height: 0; + padding: 12px 0; +} + +.tsd-widget { + display: inline-block; + overflow: hidden; + opacity: 0.8; + height: 40px; + transition: + opacity 0.1s, + background-color 0.2s; + vertical-align: bottom; + cursor: pointer; +} +.tsd-widget:hover { + opacity: 0.9; +} +.tsd-widget.active { + opacity: 1; + background-color: var(--color-accent); +} +.tsd-widget.no-caption { + width: 40px; +} +.tsd-widget.no-caption:before { + margin: 0; +} + +.tsd-widget.options, +.tsd-widget.menu { + display: none; +} +input[type="checkbox"] + .tsd-widget:before { + background-position: -120px 0; +} +input[type="checkbox"]:checked + .tsd-widget:before { + background-position: -160px 0; +} + +img { + max-width: 100%; +} + +.tsd-anchor-icon { + display: inline-flex; + align-items: center; + margin-left: 0.5rem; + vertical-align: middle; + color: var(--color-text); +} + +.tsd-anchor-icon svg { + width: 1em; + height: 1em; + visibility: hidden; +} + +.tsd-anchor-link:hover > .tsd-anchor-icon svg { + visibility: visible; +} + +.deprecated { + text-decoration: line-through !important; +} + +.warning { + padding: 1rem; + color: var(--color-warning-text); + background: var(--color-background-warning); +} + +.tsd-kind-project { + color: var(--color-ts-project); +} +.tsd-kind-module { + color: var(--color-ts-module); +} +.tsd-kind-namespace { + color: var(--color-ts-namespace); +} +.tsd-kind-enum { + color: var(--color-ts-enum); +} +.tsd-kind-enum-member { + color: var(--color-ts-enum-member); +} +.tsd-kind-variable { + color: var(--color-ts-variable); +} +.tsd-kind-function { + color: var(--color-ts-function); +} +.tsd-kind-class { + color: var(--color-ts-class); +} +.tsd-kind-interface { + color: var(--color-ts-interface); +} +.tsd-kind-constructor { + color: var(--color-ts-constructor); +} +.tsd-kind-property { + color: var(--color-ts-property); +} +.tsd-kind-method { + color: var(--color-ts-method); +} +.tsd-kind-call-signature { + color: var(--color-ts-call-signature); +} +.tsd-kind-index-signature { + color: var(--color-ts-index-signature); +} +.tsd-kind-constructor-signature { + color: var(--color-ts-constructor-signature); +} +.tsd-kind-parameter { + color: var(--color-ts-parameter); +} +.tsd-kind-type-literal { + color: var(--color-ts-type-literal); +} +.tsd-kind-type-parameter { + color: var(--color-ts-type-parameter); +} +.tsd-kind-accessor { + color: var(--color-ts-accessor); +} +.tsd-kind-get-signature { + color: var(--color-ts-get-signature); +} +.tsd-kind-set-signature { + color: var(--color-ts-set-signature); +} +.tsd-kind-type-alias { + color: var(--color-ts-type-alias); +} + +/* if we have a kind icon, don't color the text by kind */ +.tsd-kind-icon ~ span { + color: var(--color-text); +} + +* { + scrollbar-width: thin; + scrollbar-color: var(--color-accent) var(--color-icon-background); +} + +*::-webkit-scrollbar { + width: 0.75rem; +} + +*::-webkit-scrollbar-track { + background: var(--color-icon-background); +} + +*::-webkit-scrollbar-thumb { + background-color: var(--color-accent); + border-radius: 999rem; + border: 0.25rem solid var(--color-icon-background); +} + +/* mobile */ +@media (max-width: 769px) { + .tsd-widget.options, + .tsd-widget.menu { + display: inline-block; + } + + .container-main { + display: flex; + } + html .col-content { + float: none; + max-width: 100%; + width: 100%; + } + html .col-sidebar { + position: fixed !important; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + padding: 1.5rem 1.5rem 0 0; + width: 75vw; + visibility: hidden; + background-color: var(--color-background); + transform: translate(100%, 0); + } + html .col-sidebar > *:last-child { + padding-bottom: 20px; + } + html .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } + + .to-has-menu .overlay { + animation: fade-in 0.4s; + } + + .to-has-menu .col-sidebar { + animation: pop-in-from-right 0.4s; + } + + .from-has-menu .overlay { + animation: fade-out 0.4s; + } + + .from-has-menu .col-sidebar { + animation: pop-out-to-right 0.4s; + } + + .has-menu body { + overflow: hidden; + } + .has-menu .overlay { + visibility: visible; + } + .has-menu .col-sidebar { + visibility: visible; + transform: translate(0, 0); + display: flex; + flex-direction: column; + gap: 1.5rem; + max-height: 100vh; + padding: 1rem 2rem; + } + .has-menu .tsd-navigation { + max-height: 100%; + } +} + +/* one sidebar */ +@media (min-width: 770px) { + .container-main { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); + grid-template-areas: "sidebar content"; + margin: 2rem auto; + } + + .col-sidebar { + grid-area: sidebar; + } + .col-content { + grid-area: content; + padding: 0 1rem; + } +} +@media (min-width: 770px) and (max-width: 1399px) { + .col-sidebar { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + padding-top: 1rem; + } + .site-menu { + margin-top: 1rem; + } +} + +/* two sidebars */ +@media (min-width: 1200px) { + .container-main { + grid-template-columns: minmax(0, 1fr) minmax(0, 2.5fr) minmax(0, 20rem); + grid-template-areas: "sidebar content toc"; + } + + .col-sidebar { + display: contents; + } + + .page-menu { + grid-area: toc; + padding-left: 1rem; + } + .site-menu { + grid-area: sidebar; + } + + .site-menu { + margin-top: 1rem 0; + } + + .page-menu, + .site-menu { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + } +} diff --git a/docs/classes/Editor.html b/docs/classes/Editor.html new file mode 100644 index 000000000..d9721bc4b --- /dev/null +++ b/docs/classes/Editor.html @@ -0,0 +1,657 @@ +Editor | iink-ts - v1.0.0-buildVersion +
+
+
+ +

Class Editor

+
+

Hierarchy

+
    +
  • Editor
+
+
+
+ +
+
+

Constructors

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      wrapperHTML: HTMLElement
    • +
    • +
      options: TBehaviorOptions
    • +
    • +
      globalClassCss: string = "ms-editor"
    +

    Returns Editor

+
+

Properties

+
+ +
#behaviors: IBehaviors
+
+ +
#initializationDeferred: DeferredPromise<void>
+
+ +
#loaderHTML: HTMLDivElement
+
+ +
#loggerConfiguration: TLoggerConfiguration
+
+ +
#messageHTML: HTMLDivElement
+
+ +
#smartGuide?: SmartGuide
+
+ +
logger: Logger
+
+ +
showStrokesPan: boolean = false
+
+ +
wrapperHTML: HTMLEditorElement
+
+

Accessors

+
+ +
+
+ +
    +
  • get configuration(): TConfiguration
  • +
  • +

    Returns TConfiguration

  • +
  • set configuration(configuration): void
  • +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
    +
  • get initializationPromise(): Promise<void>
  • +
  • +

    Returns Promise<void>

+
+ +
    +
  • get intention(): Intention
  • +
  • +

    Returns Intention

  • +
  • set intention(m): void
  • +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
+
+ +
    +
  • get model(): IModel
  • +
  • +

    Returns IModel

+
+ +
    +
  • get penStyle(): TPenStyle
  • +
  • +

    Returns TPenStyle

  • +
  • set penStyle(ps): void
  • +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    +
  • get penStyleClasses(): string
  • +
  • +

    Returns string

  • +
  • set penStyleClasses(psc): void
  • +
  • +
    +

    Parameters

    +
      +
    • +
      psc: string
    +

    Returns void

+
+ +
    +
  • get theme(): TTheme
  • +
  • +

    Returns TTheme

  • +
  • set theme(t): void
  • +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+

Methods

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns Promise<void>

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      idle: boolean
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      err: Error
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      notif: {
          message: string;
          timeout?: number;
      }
      +
        +
      • +
        message: string
      • +
      • +
        Optional timeout?: number
    +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      Optional params: {
          conversionState?: TConverstionState;
          mimeTypes?: string[];
      }
      +
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      Optional mimeTypes: string[]
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      data: string | TJIIXExport | Blob
    • +
    • +
      Optional mimeType: string
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +

    Returns Promise<void>

+
+ +
    + +
  • +

    Returns Promise<IModel>

+
+ +
    + +
  • +

    Returns Promise<IModel>

+
+ +
    + +
  • +

    Returns Promise<IModel>

+
+ +
    + +
  • +

    Returns Promise<void>

+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/behaviors.RestBehaviors.html b/docs/classes/behaviors.RestBehaviors.html new file mode 100644 index 000000000..1667d585c --- /dev/null +++ b/docs/classes/behaviors.RestBehaviors.html @@ -0,0 +1,533 @@ +RestBehaviors | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Class RestBehaviors

+
+

Hierarchy

+
    +
  • RestBehaviors
+
+

Implements

+
+
+
+
+ +
+
+

Constructors

+
+ +
+
+

Properties

+
+ +
#configuration: TConfiguration
+
+ +
#exportTimer?: Timeout
+
+ +
#logger: Logger = ...
+
+ +
#model: IModel
+
+ +
#resizeTimer?: Timeout
+
+ +
+
+ +
intention: Intention
+
+ +
name: string = "RestBehaviors"
+
+ +
+
+ +
recognizer: RestRecognizer
+
+ +
renderer: CanvasRenderer
+
+ +
styleManager: StyleManager
+
+ +
undoRedoManager: UndoRedoManager
+
+

Accessors

+
+ +
    +
  • get configuration(): TConfiguration
  • +
  • +

    Returns TConfiguration

+
+ +
+
+ +
    +
  • get currentPenStyle(): TPenStyle
  • +
  • +

    Returns TPenStyle

+
+ +
+
+ +
    +
  • get model(): IModel
  • +
  • +

    Returns IModel

+
+ +
    +
  • get penStyle(): TPenStyle
  • +
  • +

    Returns TPenStyle

+
+ +
    +
  • get penStyleClasses(): string
  • +
  • +

    Returns string

+
+ +
    +
  • get theme(): TTheme
  • +
  • +

    Returns TTheme

+
+

Methods

+
+ +
+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      Optional conversionState: TConverstionState
    • +
    • +
      Optional requestedMimeTypes: string[]
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +

    Returns Promise<void>

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      Optional mimeTypes: string[]
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      domElement: HTMLElement
    +

    Returns Promise<void>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      evt: PointerEvent
    • +
    • +
      point: TPointer
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      _evt: PointerEvent
    • +
    • +
      point: TPointer
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      _evt: PointerEvent
    • +
    • +
      point: TPointer
    +

    Returns void

+
+ +
    + +
  • +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      height: number
    • +
    • +
      width: number
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      Optional penClass: string
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +

    Returns Promise<IModel>

+
+ +
    + +
  • +

    Returns Promise<IModel>

+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/behaviors.WSBehaviors.html b/docs/classes/behaviors.WSBehaviors.html new file mode 100644 index 000000000..b22fcf9d5 --- /dev/null +++ b/docs/classes/behaviors.WSBehaviors.html @@ -0,0 +1,584 @@ +WSBehaviors | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Class WSBehaviors

+
+

Hierarchy

+
    +
  • WSBehaviors
+
+

Implements

+
+
+
+
+ +
+
+

Constructors

+
+ +
+
+

Properties

+
+ +
#configuration: TConfiguration
+
+ +
#logger: Logger = ...
+
+ +
#model: IModel
+
+ +
#resizeTimer?: Timeout
+
+ +
+
+ +
intention: Intention
+
+ +
name: string = "WSBehaviors"
+
+ +
+
+ +
recognizer: WSRecognizer
+
+ +
renderer: WSSVGRenderer
+
+ +
styleManager: StyleManager
+
+ +
undoRedoManager: UndoRedoManager
+
+

Accessors

+
+ +
    +
  • get configuration(): TConfiguration
  • +
  • +

    Returns TConfiguration

+
+ +
+
+ +
    +
  • get currentPenStyle(): TPenStyle
  • +
  • +

    Returns TPenStyle

+
+ +
+
+ +
    +
  • get model(): IModel
  • +
  • +

    Returns IModel

+
+ +
    +
  • get penStyle(): TPenStyle
  • +
  • +

    Returns TPenStyle

+
+ +
    +
  • get penStyleClasses(): string
  • +
  • +

    Returns string

+
+ +
    +
  • get theme(): TTheme
  • +
  • +

    Returns TTheme

+
+

Methods

+
+ +
+
+ +
+
+ +
    + +
  • +

    Returns Promise<void>

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      Optional mimeTypes: string[]
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      data: Blob
    • +
    • +
      Optional mimeType: string
    +

    Returns Promise<IModel>

+
+ +
+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      domElement: HTMLElement
    +

    Returns Promise<void>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      evt: PointerEvent
    • +
    • +
      point: TPointer
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      _evt: PointerEvent
    • +
    • +
      point: TPointer
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      _evt: PointerEvent
    • +
    • +
      point: TPointer
    +

    Returns Promise<void>

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      height: number
    • +
    • +
      width: number
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns Promise<void>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      Optional penClass: string
    +

    Returns Promise<void>

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns Promise<void>

+
+ +
    + +
  • +

    Returns Promise<IModel>

+
+ +
    + +
  • +

    Returns Promise<IModel>

+
+ +
    + +
  • +

    Returns Promise<void>

+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/configuration.Configuration.html b/docs/classes/configuration.Configuration.html new file mode 100644 index 000000000..3432613b5 --- /dev/null +++ b/docs/classes/configuration.Configuration.html @@ -0,0 +1,191 @@ +Configuration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Class Configuration

+
+

Hierarchy

+
    +
  • Configuration
+
+

Implements

+
+
+
+
+ +
+
+

Constructors

+
+ +
+
+

Properties

+
+ +
#logger: Logger = ...
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+

Methods

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/event.InternalEvent.html b/docs/classes/event.InternalEvent.html new file mode 100644 index 000000000..dd4799f30 --- /dev/null +++ b/docs/classes/event.InternalEvent.html @@ -0,0 +1,601 @@ +InternalEvent | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Class InternalEvent

+
+

Hierarchy

+
    +
  • EventTarget +
      +
    • InternalEvent
+
+
+
+ +
+
+

Constructors

+
+ +
    + +
  • +

    Returns InternalEvent

+
+

Properties

+
+ +
#abortController: AbortController
+
+ +
#instance: InternalEvent
+
+ +
#logger: Logger = ...
+
+

Methods

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      type: string
    • +
    • +
      Optional data: unknown
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      callback: (() => void)
      +
        +
      • +
          +
        • (): void
        • +
        • +

          Returns void

    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      callback: (() => void)
      +
        +
      • +
          +
        • (): void
        • +
        • +

          Returns void

    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      callback: ((context) => void)
      +
        +
      • +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      callback: ((params?) => void)
      +
        +
      • +
          +
        • (params?): void
        • +
        • +
          +

          Parameters

          +
            +
          • +
            Optional params: {
                conversionState?: TConverstionState;
                mimeTypes?: string[];
            }
            +
          +

          Returns void

    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      callback: ((err) => void)
      +
        +
      • +
          +
        • (err): void
        • +
        • +
          +

          Parameters

          +
            +
          • +
            err: Error
          +

          Returns void

    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      callback: ((exports) => void)
      +
        +
      • +
          +
        • (exports): void
        • +
        • +
          +

          Parameters

          +
          +

          Returns void

    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      callback: ((idle) => void)
      +
        +
      • +
          +
        • (idle): void
        • +
        • +
          +

          Parameters

          +
            +
          • +
            idle: boolean
          +

          Returns void

    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      callback: ((jiix) => void)
      +
        +
      • +
          +
        • (jiix): void
        • +
        • +
          +

          Parameters

          +
          +

          Returns void

    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      callback: ((notif) => void)
      +
        +
      • +
          +
        • (notif): void
        • +
        • +
          +

          Parameters

          +
            +
          • +
            notif: {
                message: string;
                timeout?: number;
            }
            +
              +
            • +
              message: string
            • +
            • +
              Optional timeout?: number
          +

          Returns void

    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      callback: ((contentChange) => void)
      +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      callback: (() => void)
      +
        +
      • +
          +
        • (): void
        • +
        • +

          Returns void

    +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      err: Error
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      idle: boolean
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      notif: {
          message: string;
          timeout?: number;
      }
      +
        +
      • +
        message: string
      • +
      • +
        Optional timeout?: number
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
+
+ +
    + +
  • +

    Returns void

+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/event.PublicEvent.html b/docs/classes/event.PublicEvent.html new file mode 100644 index 000000000..f2bc78222 --- /dev/null +++ b/docs/classes/event.PublicEvent.html @@ -0,0 +1,270 @@ +PublicEvent | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Class PublicEvent

+
+

Hierarchy

+
    +
  • EventTarget +
      +
    • PublicEvent
+
+
+
+ +
+
+

Constructors

+
+ +
    + +
  • +

    Returns PublicEvent

+
+

Properties

+
+ +
#element?: HTMLElement
+
+ +
#instance: PublicEvent
+
+ +
#logger: Logger = ...
+
+

Methods

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      type: string
    • +
    • +
      Optional data: unknown
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      idle: boolean
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      el: HTMLElement
    +

    Returns void

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/grabber.PointerEventGrabber.html b/docs/classes/grabber.PointerEventGrabber.html new file mode 100644 index 000000000..4453165e1 --- /dev/null +++ b/docs/classes/grabber.PointerEventGrabber.html @@ -0,0 +1,329 @@ +PointerEventGrabber | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Class PointerEventGrabber

+
+

Hierarchy

+
    +
  • PointerEventGrabber
+
+

Implements

+
+
+
+
+ +
+
+

Constructors

+
+ +
+
+

Properties

+
+ +
#logger: Logger = ...
+
+ +
activePointerId?: number
+
+ +
configuration: TGrabberConfiguration
+
+ +
domElement: HTMLElement
+
+ +
onPointerDown: ((evt, point) => void)
+
+

Type declaration

+
    +
  • +
      +
    • (evt, point): void
    • +
    • +
      +

      Parameters

      +
        +
      • +
        evt: PointerEvent
      • +
      • +
        point: TPointer
      +

      Returns void

+
+ +
onPointerMove: ((evt, point) => void)
+
+

Type declaration

+
    +
  • +
      +
    • (evt, point): void
    • +
    • +
      +

      Parameters

      +
        +
      • +
        evt: PointerEvent
      • +
      • +
        point: TPointer
      +

      Returns void

+
+ +
onPointerUp: ((evt, point) => void)
+
+

Type declaration

+
    +
  • +
      +
    • (evt, point): void
    • +
    • +
      +

      Parameters

      +
        +
      • +
        evt: PointerEvent
      • +
      • +
        point: TPointer
      +

      Returns void

+
+

Methods

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      domElement: HTMLElement
    +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      event: MouseEvent | TouchEvent
    +

    Returns TPointer

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      evt: PointerEvent
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      evt: PointerEvent
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      evt: PointerEvent
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      e: Event
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      oneFloat: number
    • +
    • +
      requestedFloatPrecision: number
    +

    Returns number

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/logger.Logger.html b/docs/classes/logger.Logger.html new file mode 100644 index 000000000..a87a68d45 --- /dev/null +++ b/docs/classes/logger.Logger.html @@ -0,0 +1,185 @@ +Logger | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Class Logger

+
+

Hierarchy

+
    +
  • Logger
+
+
+
+ +
+
+

Constructors

+
+
+

Properties

+
+
+

Methods

+
+
+

Constructors

+
+ +
+
+

Properties

+
+ +
instanceName: LoggerClass
+
+ +
+
+

Methods

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      Rest ...data: any
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      Rest ...error: any
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      Rest ...data: any
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      Rest ...data: any
    +

    Returns void

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/logger.LoggerManager.html b/docs/classes/logger.LoggerManager.html new file mode 100644 index 000000000..6f7d3aadd --- /dev/null +++ b/docs/classes/logger.LoggerManager.html @@ -0,0 +1,139 @@ +LoggerManager | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Class LoggerManager

+
+

Hierarchy

+
    +
  • LoggerManager
+
+
+
+ +
+
+

Constructors

+
+
+

Properties

+
+
+

Methods

+
+
+

Constructors

+
+ +
+
+

Properties

+
+ +
#loggerMap: Map<LoggerClass, Logger> = ...
+
+

Methods

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns Logger

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/model.Model.html b/docs/classes/model.Model.html new file mode 100644 index 000000000..88dc5bb12 --- /dev/null +++ b/docs/classes/model.Model.html @@ -0,0 +1,520 @@ +Model | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Class Model

+
+

Hierarchy

+
    +
  • Model
+
+

Implements

+
+
+
+
+ +
+
+

Constructors

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      width: number = 100
    • +
    • +
      height: number = 100
    • +
    • +
      creationDate: number = ...
    +

    Returns Model

+
+

Properties

+
+ +
#logger: Logger = ...
+
+ +
converts?: TExport
+
+ +
creationTime: number
+
+ +
currentStroke?: TStroke
+
+ +
exports?: TExport
+
+ +
height: number
+
+ +
idle: boolean
+
+ +
modificationDate: number
+
+ +
+
+ +
rawStrokes: TStroke[]
+
+ +
selectedStrokes: TStroke[]
+
+ +
width: number
+
+

Methods

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns TStroke[]

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
+
+ +
+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      distance: number
    • +
    • +
      globalDistance: number
    +

    Returns number

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns boolean

+
+ +
+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      point: TPointer
    • +
    • +
      pointerId: number
    • +
    • +
      pointerType: string
    • +
    • +
      style: TPenStyle
    • +
    • +
      dpi: number = 96
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      id: string
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns string[]

+
+ +
+
+ +
+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      position: number = ...
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/model.Stroke.html b/docs/classes/model.Stroke.html new file mode 100644 index 000000000..0e777ad43 --- /dev/null +++ b/docs/classes/model.Stroke.html @@ -0,0 +1,183 @@ +Stroke | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Class Stroke

+
+

Hierarchy

+
    +
  • Stroke
+
+

Implements

+
+
+
+
+ +
+
+

Constructors

+
+
+

Properties

+
+
+

Constructors

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      style: TPenStyle
    • +
    • +
      pointerId: number
    • +
    • +
      pointerType: string = "pen"
    +

    Returns Stroke

+
+

Properties

+
+ +
#logger: Logger = ...
+
+ +
elementType?: string
+
+ +
id: string
+
+ +
length: number
+
+ +
pointerId: number
+
+ +
pointerType: string
+
+ +
pointers: TPointer[]
+
+ +
style: TPenStyle
+
+ +
type: string
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/recognizer.RestRecognizer.html b/docs/classes/recognizer.RestRecognizer.html new file mode 100644 index 000000000..047bc592b --- /dev/null +++ b/docs/classes/recognizer.RestRecognizer.html @@ -0,0 +1,278 @@ +RestRecognizer | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Class RestRecognizer

+
+

Hierarchy

+
    +
  • RestRecognizer
+
+

Implements

+
+
+
+
+ +
+
+

Constructors

+
+
+

Properties

+
+
+

Accessors

+
+
+

Methods

+
+
+

Constructors

+
+ +
+
+

Properties

+
+ +
#logger: Logger = ...
+
+ +
recognitionConfiguration: TRecognitionConfiguration
+
+ +
serverConfiguration: TServerConfiguration
+
+

Accessors

+
+ +
+
+ +
    +
  • get url(): string
  • +
  • +

    Returns string

+
+

Methods

+
+ +
+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      model: IModel
    • +
    • +
      Optional requestedMimeTypes: string[]
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      Optional requestedMimeTypes: string[]
    +

    Returns string[]

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      data: any
    • +
    • +
      mimeType: string
    +

    Returns Promise<any>

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      data: unknown
    • +
    • +
      mimeType: string
    +

    Returns Promise<TExport>

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/recognizer.WSRecognizer.html b/docs/classes/recognizer.WSRecognizer.html new file mode 100644 index 000000000..15b8fde7c --- /dev/null +++ b/docs/classes/recognizer.WSRecognizer.html @@ -0,0 +1,786 @@ +WSRecognizer | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Class WSRecognizer

+
+

A websocket dialog have this sequence : +--------------------------- Client --------------------------------------------------- Server ---------------------------------- +init: send newContentPackage or restoreIInkSession ==================> + <================== hmacChallenge +answer hmacChallenge: send the hmac ==================> + <================== contentPackageDescription +answer contentPackageDescription: + send the configuration ==================> + send newContentPart or openContentPart ==================> + <================== partChanged + <================== contentChanged + <================== newPart + <================== svgPatch

+

setPenStyle (send the parameters) ==================> +setTheme (send the parameters) ==================> +setPenStyleClasses (send the parameters) ==================> + <================== svgPatch +addStrokes (send the strokes ) ============> + <================== update

+
+
+
+

Hierarchy

+
    +
  • WSRecognizer
+
+

Implements

+
+
+
+
+ +
+
+

Constructors

+
+ +
+
+

Properties

+
+ +
#logger: Logger = ...
+
+ +
addStrokeDeferred?: DeferredPromise<TExport>
+
+ +
clearDeferred?: DeferredPromise<TExport>
+
+ +
connected?: DeferredPromise<void>
+
+ +
convertDeferred?: DeferredPromise<TExport>
+
+ +
currentErrorCode?: string | number
+
+ +
currentPartId?: string
+
+ +
exportDeferred?: DeferredPromise<TExport>
+
+ +
importDeferred?: DeferredPromise<TExport>
+
+ +
importPointEventsDeferred?: DeferredPromise<TExport>
+
+ +
initialized?: DeferredPromise<void>
+
+ +
penStyle?: TPenStyle
+
+ +
penStyleClasses?: string
+
+ +
pingCount: number = 0
+
+ +
recognitionConfiguration: TRecognitionConfiguration
+
+ +
reconnectionCount: number = 0
+
+ +
redoDeferred?: DeferredPromise<TExport>
+
+ +
resizeDeferred?: DeferredPromise<void>
+
+ +
serverConfiguration: TServerConfiguration
+
+ +
sessionId?: string
+
+ +
socket: WebSocket
+
+ +
theme?: TTheme
+
+ +
undoDeferred?: DeferredPromise<TExport>
+
+ +
url: string
+
+ +
viewSizeHeight: number
+
+ +
viewSizeWidth: number
+
+ +
waitForIdleDeferred?: DeferredPromise<void>
+
+

Accessors

+
+ +
+
+ +
    +
  • get mimeTypes(): string[]
  • +
  • +

    Returns string[]

+
+

Methods

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns Promise<TExport>

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      code: number
    • +
    • +
      reason: string
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      evt: CloseEvent
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      model: IModel
    • +
    • +
      Optional requestedMimeTypes: string[]
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      model: IModel
    • +
    • +
      data: Blob
    • +
    • +
      Optional mimeType: string
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns Promise<TExport>

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      height: number
    • +
    • +
      width: number
    +

    Returns Promise<void>

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +

    Returns Promise<void>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      message: MessageEvent<string>
    +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      error: Error
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns Promise<void>

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns Promise<void>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      penStyleClasses: string
    +

    Returns Promise<void>

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns Promise<void>

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +

    Returns Promise<void>

+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/renderer.CanvasRenderer.html b/docs/classes/renderer.CanvasRenderer.html new file mode 100644 index 000000000..06d700bf7 --- /dev/null +++ b/docs/classes/renderer.CanvasRenderer.html @@ -0,0 +1,262 @@ +CanvasRenderer | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Class CanvasRenderer

+
+

Hierarchy

+
    +
  • CanvasRenderer
+
+
+
+ +
+
+

Constructors

+
+ +
+
+

Properties

+
+ +
#logger: Logger = ...
+
+ +
+
+ +
context: {
    capturingCanvas: HTMLCanvasElement;
    capturingCanvasContext: CanvasRenderingContext2D;
    parent: HTMLElement;
    renderingCanvas: HTMLCanvasElement;
    renderingCanvasContext: CanvasRenderingContext2D;
}
+
+

Type declaration

+
    +
  • +
    capturingCanvas: HTMLCanvasElement
  • +
  • +
    capturingCanvasContext: CanvasRenderingContext2D
  • +
  • +
    parent: HTMLElement
  • +
  • +
    renderingCanvas: HTMLCanvasElement
  • +
  • +
    renderingCanvasContext: CanvasRenderingContext2D
+
+ +
stroker: CanvasStroker
+
+

Methods

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      type: string
    +

    Returns HTMLCanvasElement

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      context2D: CanvasRenderingContext2D
    • +
    • +
      symbol: TSymbol
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      element: HTMLElement
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/renderer.CanvasStroker.html b/docs/classes/renderer.CanvasStroker.html new file mode 100644 index 000000000..400f61e2a --- /dev/null +++ b/docs/classes/renderer.CanvasStroker.html @@ -0,0 +1,198 @@ +CanvasStroker | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Class CanvasStroker

+
+

Hierarchy

+
    +
  • CanvasStroker
+
+
+
+ +
+
+

Constructors

+
+ +
+
+

Methods

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      context2d: CanvasRenderingContext2D
    • +
    • +
      stroke: TStroke
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      context2d: CanvasRenderingContext2D
    • +
    • +
      center: TPointer
    • +
    • +
      radius: number
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      context2d: CanvasRenderingContext2D
    • +
    • +
      begin: TPointer
    • +
    • +
      end: TPointer
    • +
    • +
      width: number
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      context2d: CanvasRenderingContext2D
    • +
    • +
      begin: TPointer
    • +
    • +
      end: TPointer
    • +
    • +
      width: number
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/renderer.SVGStroker.html b/docs/classes/renderer.SVGStroker.html new file mode 100644 index 000000000..bafd63148 --- /dev/null +++ b/docs/classes/renderer.SVGStroker.html @@ -0,0 +1,207 @@ +SVGStroker | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Class SVGStroker

+
+

Hierarchy

+
    +
  • SVGStroker
+
+
+
+ +
+
+

Constructors

+
+ +
+
+

Methods

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns string

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      svgElement: SVGElement
    • +
    • +
      stroke: TStroke
    • +
    • +
      Optional attrs: {
          name: string;
          value: string;
      }[]
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns string

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns string

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns string

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns string

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/renderer.WSSVGRenderer.html b/docs/classes/renderer.WSSVGRenderer.html new file mode 100644 index 000000000..a9295fbf7 --- /dev/null +++ b/docs/classes/renderer.WSSVGRenderer.html @@ -0,0 +1,392 @@ +WSSVGRenderer | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Class WSSVGRenderer

+
+

Hierarchy

+
    +
  • WSSVGRenderer
+
+
+
+ +
+
+

Constructors

+
+ +
+
+

Properties

+
+ +
#logger: Logger = ...
+
+ +
+
+ +
context: {
    parent: HTMLElement;
}
+
+

Type declaration

+
    +
  • +
    parent: HTMLElement
+
+ +
stroker: SVGStroker
+
+

Methods

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      svgElement: SVGElement
    • +
    • +
      stroke: TStroke
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      element: HTMLElement
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/smartguide.SmartGuide.html b/docs/classes/smartguide.SmartGuide.html new file mode 100644 index 000000000..56320834e --- /dev/null +++ b/docs/classes/smartguide.SmartGuide.html @@ -0,0 +1,616 @@ +SmartGuide | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Class SmartGuide

+
+

Hierarchy

+
    +
  • SmartGuide
+
+
+
+ +
+
+

Constructors

+
+ +
+
+

Properties

+
+ +
#candidatesElement: HTMLDivElement
+
+ +
#convertElement: HTMLButtonElement
+
+ +
#copyElement: HTMLButtonElement
+
+ +
#deleteElement: HTMLButtonElement
+
+ +
#ellipsisElement: HTMLDivElement
+
+ +
#fadeOutTimout?: Timeout
+
+ +
#isMenuOpen: boolean
+
+ +
#logger: Logger = ...
+
+ +
#menuElement: HTMLDivElement
+
+ +
#prompterContainerElement: HTMLDivElement
+
+ +
#prompterTextElement: HTMLDivElement
+
+ +
#smartGuideElement: HTMLDivElement
+
+ +
#tagElement: HTMLDivElement
+
+ +
+
+ +
lastWord?: TWordExport
+
+ +
+
+ +
renderingConfiguration: TRenderingConfiguration
+
+ +
uuid: string
+
+ +
wordToChange?: TWordExport
+
+

Accessors

+
+ +
+
+

Methods

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      duration: number = 3000
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      evt: Event
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      evt: Event
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      evt: Event
    +

    Returns Promise<void>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      evt: Event
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      evt: Event
    +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      evt: Event
    +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      target: HTMLElement
    +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/style.StyleManager.html b/docs/classes/style.StyleManager.html new file mode 100644 index 000000000..761346c6f --- /dev/null +++ b/docs/classes/style.StyleManager.html @@ -0,0 +1,236 @@ +StyleManager | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Class StyleManager

+
+

Hierarchy

+
    +
  • StyleManager
+
+
+
+ +
+
+

Constructors

+
+ +
+
+

Properties

+
+ +
#currentPenStyle: TPenStyle
+
+ +
#logger: Logger = ...
+
+ +
#penStyle: TPenStyle
+
+ +
#penStyleClasses: string
+
+ +
#theme: TTheme
+
+

Accessors

+
+ +
    +
  • get currentPenStyle(): TPenStyle
  • +
  • +

    Returns TPenStyle

+
+ +
+
+ +
    +
  • get penStyleClasses(): string
  • +
  • +

    Returns string

+
+ +
    +
  • get theme(): TTheme
  • +
  • +

    Returns TTheme

+
+

Methods

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      penStyleClass: string = ""
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/undoredo.UndoRedoContext.html b/docs/classes/undoredo.UndoRedoContext.html new file mode 100644 index 000000000..0ac0afeb3 --- /dev/null +++ b/docs/classes/undoredo.UndoRedoContext.html @@ -0,0 +1,156 @@ +UndoRedoContext | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Class UndoRedoContext

+
+

Hierarchy

+
    +
  • UndoRedoContext
+
+

Implements

+
+
+
+
+ +
+
+

Constructors

+
+
+

Properties

+
+
+

Constructors

+
+ +
+
+

Properties

+
+ +
canRedo: boolean
+
+ +
canUndo: boolean
+
+ +
empty: boolean
+
+ +
possibleUndoCount: number
+
+ +
stack: IModel[]
+
+ +
stackIndex: number
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/undoredo.UndoRedoManager.html b/docs/classes/undoredo.UndoRedoManager.html new file mode 100644 index 000000000..7fb6b26f8 --- /dev/null +++ b/docs/classes/undoredo.UndoRedoManager.html @@ -0,0 +1,232 @@ +UndoRedoManager | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Class UndoRedoManager

+
+

Hierarchy

+
    +
  • UndoRedoManager
+
+
+
+ +
+
+

Constructors

+
+ +
+
+

Properties

+
+ +
#logger: Logger = ...
+
+ +
configuration: TUndoRedoConfiguration
+
+ +
+
+

Accessors

+
+ +
+
+

Methods

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +

    Returns IModel

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +

    Returns IModel

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/utils.DeferredPromise.html b/docs/classes/utils.DeferredPromise.html new file mode 100644 index 000000000..dfe9cac31 --- /dev/null +++ b/docs/classes/utils.DeferredPromise.html @@ -0,0 +1,170 @@ +DeferredPromise | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Class DeferredPromise<T>

+
+

Type Parameters

+
    +
  • +

    T

+
+

Hierarchy

+
    +
  • DeferredPromise
+
+
+
+ +
+
+

Constructors

+
+
+

Properties

+
+
+

Constructors

+
+ +
+
+

Properties

+
+ +
isFullFilled: boolean
+
+ +
isPending: boolean
+
+ +
promise: Promise<T>
+
+ +
reject: ((value) => void)
+
+

Type declaration

+
    +
  • +
      +
    • (value): void
    • +
    • +
      +

      Parameters

      +
        +
      • +
        value: Error
      +

      Returns void

+
+ +
resolve: ((value) => void)
+
+

Type declaration

+
    +
  • +
      +
    • (value): void
    • +
    • +
      +

      Parameters

      +
        +
      • +
        value: T
      +

      Returns void

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/enums/constants.ExportType.html b/docs/enums/constants.ExportType.html new file mode 100644 index 000000000..6730a99e2 --- /dev/null +++ b/docs/enums/constants.ExportType.html @@ -0,0 +1,126 @@ +ExportType | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Enumeration ExportTypeConst

+
+
+

Remarks

List all supported MIME types for export. Attention, the MIME types supported depend on the TRecognitionType | type of recognition

+
+
+
+
+ +
+
+

Enumeration Members

+
+
+

Enumeration Members

+
+ +
JIIX: "application/vnd.myscript.jiix"
+
+ +
LATEX: "application/x-latex"
+
+ +
MATHML: "application/mathml+xml"
+
+ +
OFFICE_DOCUMENT: "application/vnd.openxmlformats-officedocument.presentationml.presentation"
+
+ +
SVG: "image/svg+xml"
+
+ +
TEXT: "text/plain"
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/enums/constants.Intention.html b/docs/enums/constants.Intention.html new file mode 100644 index 000000000..752c0aef0 --- /dev/null +++ b/docs/enums/constants.Intention.html @@ -0,0 +1,98 @@ +Intention | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Enumeration IntentionConst

+
+
+

Remarks

List the possibilities of interactions

+
+
+
+
+ +
+
+

Enumeration Members

+
+
+

Enumeration Members

+
+ +
Erase: "erase"
+
+ +
Write: "write"
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/enums/constants.LoggerClass.html b/docs/enums/constants.LoggerClass.html new file mode 100644 index 000000000..0bfc4e79e --- /dev/null +++ b/docs/enums/constants.LoggerClass.html @@ -0,0 +1,171 @@ +LoggerClass | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Enumeration LoggerClassConst

+
+
+
+ +
+
+

Enumeration Members

+
+ +
BEHAVIORS: "BEHAVIORS"
+
+ +
CONFIGURATION: "CONFIGURATION"
+
+ +
EDITOR: "EDITOR"
+
+ +
GRABBER: "GRABBER"
+
+ +
INTERNALEVENT: "INTERNALEVENT"
+
+ +
MODEL: "MODEL"
+
+ +
PUBLIC_EVENT: "PUBLIC_EVENT"
+
+ +
RECOGNIZER: "RECOGNIZER"
+
+ +
RENDERER: "RENDERER"
+
+ +
SMARTGUIDE: "SMARTGUIDE"
+
+ +
STROKE: "STROKE"
+
+ +
STYLEMANAGER: "STYLEMANAGER"
+
+ +
UNDOREDO_MANAGER: "UNDOREDO_MANAGER"
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/enums/constants.LoggerLevel.html b/docs/enums/constants.LoggerLevel.html new file mode 100644 index 000000000..3178a8b15 --- /dev/null +++ b/docs/enums/constants.LoggerLevel.html @@ -0,0 +1,108 @@ +LoggerLevel | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Enumeration LoggerLevelConst

+
+
+
+ +
+
+

Enumeration Members

+
+
+

Enumeration Members

+
+ +
DEBUG: "1"
+
+ +
ERROR: "4"
+
+ +
INFO: "2"
+
+ +
WARN: "3"
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/functions/model.convertStrokeToJSON.html b/docs/functions/model.convertStrokeToJSON.html new file mode 100644 index 000000000..a70c2dac6 --- /dev/null +++ b/docs/functions/model.convertStrokeToJSON.html @@ -0,0 +1,76 @@ +convertStrokeToJSON | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Function convertStrokeToJSON

+
+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/functions/renderer.canvasRendererShape.drawLine.html b/docs/functions/renderer.canvasRendererShape.drawLine.html new file mode 100644 index 000000000..c3b78845d --- /dev/null +++ b/docs/functions/renderer.canvasRendererShape.drawLine.html @@ -0,0 +1,93 @@ +drawLine | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Function drawLine

+
+
    + +
  • +

    Draw a line

    +
    +
    +

    Parameters

    +
      +
    • +
      context2D: CanvasRenderingContext2D
      +

      Current rendering context2D

      +
      +
    • +
    • +
      p1: TPoint
      +

      Origin point

      +
      +
    • +
    • +
      p2: TPoint
      +

      Destination point

      +
      +
    +

    Returns void

    +
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/functions/renderer.canvasRendererShape.drawShapeSymbol.html b/docs/functions/renderer.canvasRendererShape.drawShapeSymbol.html new file mode 100644 index 000000000..258b04a25 --- /dev/null +++ b/docs/functions/renderer.canvasRendererShape.drawShapeSymbol.html @@ -0,0 +1,88 @@ +drawShapeSymbol | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Function drawShapeSymbol

+
+
    + +
  • +

    Draw a shape symbol

    +
    +
    +

    Parameters

    +
      +
    • +
      context2D: CanvasRenderingContext2D
      +

      Current rendering context2D

      +
      +
    • +
    • +
      symbol: TSymbol
      +

      Symbol to draw

      +
      +
    +

    Returns void

    +
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/functions/renderer.canvasRendererStroke.drawStroke.html b/docs/functions/renderer.canvasRendererStroke.drawStroke.html new file mode 100644 index 000000000..cabefdf9b --- /dev/null +++ b/docs/functions/renderer.canvasRendererStroke.drawStroke.html @@ -0,0 +1,81 @@ +drawStroke | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Function drawStroke

+
+
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/functions/renderer.canvasRendererText.drawTextSymbol.html b/docs/functions/renderer.canvasRendererText.drawTextSymbol.html new file mode 100644 index 000000000..07166a883 --- /dev/null +++ b/docs/functions/renderer.canvasRendererText.drawTextSymbol.html @@ -0,0 +1,85 @@ +drawTextSymbol | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Function drawTextSymbol

+
+
    + +
  • +

    Draw a text symbol

    +
    +
    +

    Parameters

    +
      +
    • +
      context2D: CanvasRenderingContext2D
    • +
    • +
      symbol: TSymbol
      +

      Symbol to draw

      +
      +
    +

    Returns void

    +
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/functions/renderer.quadradicsUtils.computeAxeAngle.html b/docs/functions/renderer.quadradicsUtils.computeAxeAngle.html new file mode 100644 index 000000000..33390fead --- /dev/null +++ b/docs/functions/renderer.quadradicsUtils.computeAxeAngle.html @@ -0,0 +1,79 @@ +computeAxeAngle | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Function computeAxeAngle

+
+
    + +
  • +
    +

    Parameters

    +
    +

    Returns number

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/functions/renderer.quadradicsUtils.computeLinksPoints.html b/docs/functions/renderer.quadradicsUtils.computeLinksPoints.html new file mode 100644 index 000000000..85e5e7d81 --- /dev/null +++ b/docs/functions/renderer.quadradicsUtils.computeLinksPoints.html @@ -0,0 +1,81 @@ +computeLinksPoints | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Function computeLinksPoints

+
+
    + +
  • +
    +

    Parameters

    +
      +
    • +
      point: TPointer
    • +
    • +
      angle: number
    • +
    • +
      width: number
    +

    Returns TPoint[]

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/functions/renderer.quadradicsUtils.computeMiddlePoint.html b/docs/functions/renderer.quadradicsUtils.computeMiddlePoint.html new file mode 100644 index 000000000..12878909a --- /dev/null +++ b/docs/functions/renderer.quadradicsUtils.computeMiddlePoint.html @@ -0,0 +1,79 @@ +computeMiddlePoint | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Function computeMiddlePoint

+
+
    + +
  • +
    +

    Parameters

    +
    +

    Returns TPointer

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/functions/utils.crypto.computeHmac.html b/docs/functions/utils.crypto.computeHmac.html new file mode 100644 index 000000000..8fa225550 --- /dev/null +++ b/docs/functions/utils.crypto.computeHmac.html @@ -0,0 +1,81 @@ +computeHmac | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Function computeHmac

+
+
    + +
  • +
    +

    Parameters

    +
      +
    • +
      message: string
    • +
    • +
      applicationKey: string
    • +
    • +
      hmacKey: string
    +

    Returns string

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/functions/utils.geometric.computeDistance.html b/docs/functions/utils.geometric.computeDistance.html new file mode 100644 index 000000000..bcfa8d109 --- /dev/null +++ b/docs/functions/utils.geometric.computeDistance.html @@ -0,0 +1,79 @@ +computeDistance | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Function computeDistance

+
+
    + +
  • +
    +

    Parameters

    +
    +

    Returns number

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/functions/utils.getAvailableFontList.html b/docs/functions/utils.getAvailableFontList.html new file mode 100644 index 000000000..bf8a43578 --- /dev/null +++ b/docs/functions/utils.getAvailableFontList.html @@ -0,0 +1,76 @@ +getAvailableFontList | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Function getAvailableFontList

+
+
    + +
  • +
    +

    Parameters

    +
    +

    Returns Promise<string[]>

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/functions/utils.getAvailableLanguageList.html b/docs/functions/utils.getAvailableLanguageList.html new file mode 100644 index 000000000..add9282b2 --- /dev/null +++ b/docs/functions/utils.getAvailableLanguageList.html @@ -0,0 +1,76 @@ +getAvailableLanguageList | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Function getAvailableLanguageList

+
+
    + +
  • +
    +

    Parameters

    +
    +

    Returns Promise<Record<string, string>[]>

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/functions/utils.version.isVersionSuperiorOrEqual.html b/docs/functions/utils.version.isVersionSuperiorOrEqual.html new file mode 100644 index 000000000..cdfffa454 --- /dev/null +++ b/docs/functions/utils.version.isVersionSuperiorOrEqual.html @@ -0,0 +1,79 @@ +isVersionSuperiorOrEqual | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Function isVersionSuperiorOrEqual

+
+
    + +
  • +
    +

    Parameters

    +
      +
    • +
      source: string
    • +
    • +
      target: string
    +

    Returns boolean

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 000000000..8f90c8641 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,182 @@ +iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+

iink-ts - v1.0.0-buildVersion

+

iinkTS

npm version +Examples +Documentation

+
+

The fastest way to integrate rich handwriting features in your webapp.

+
+
+ +
+ +

iinkTS is a JavaScript library that can be used in every web application to bring handwriting recognition.

+

It integrates all you need:

+
    +
  • Signal capture for all devices,
  • +
  • Digital ink rendering,
  • +
  • Link to MyScript Cloud to bring handwriting recognition.
  • +
+

Table of contents

+

Features

    +
  • Text and Math support,
  • +
  • Easy to integrate,
  • +
  • Digital ink capture and rendering,
  • +
  • Rich editing gestures,
  • +
  • Import and export content,
  • +
  • Styling,
  • +
  • Typeset support,
  • +
  • More than 200 mathematical symbols supported,
  • +
  • 72 supported languages.
  • +
+

You can discover all the features on our Developer website for Text and Math.

+

Requirements

    +
  1. Have npm, yarn.
  2. +
  3. Have a MyScript developer account. You can create one here.
  4. +
  5. Get your keys and the free monthly quota to access MyScript Cloud at developer.myscript.com
  6. +
+

Installation

iinkTS can be installed with the well known package managers npm, yarn.

+

If you want to use npm or yarn you first have to init a project (or use an existing one).

+
npm init
OR
yarn init +
+

You can then install iinkTS and use it as showed in the Usage section.

+
npm install iink-ts
OR
yarn add iink-ts +
+

Usage

    +
  1. Create an index.html file in the same directory.

    +
  2. +
  3. Add the following lines in the head section of your file to use iinkTS and the css :

    +
  4. +
+
<script src="node_modules/iink-ts/dist/iink.min.js"></script>
+
+
    +
  1. Still in the head section, add a style and specify the height and the width of your editor:
  2. +
+
<style>
#editor {
width: 100%;
height: 100%;
}
</style> +
+
    +
  1. In the body tag, create a div tag that will contain the editing area:
  2. +
+
    <div id="editor"></div>
+
+
    +
  1. In JavaScript and within a <script> tag placed before the closing tag </body>, create the editor using the Editor constructor function, your editor html element and a simple configuration, then initialize it:
  2. +
+
  const editorElement = document.getElementById('editor');

const editor = new iink.Editor(editorElement, {
server: {
applicationKey: '#YOUR MYSCRIPT DEVELOPER APPLICATION KEY#',
hmacKey: '#YOUR MYSCRIPT DEVELOPER HMAC KEY#'
};
editor.initialize();
}); +
+
    +
  1. Your index.html file should look like this:
  2. +
+
<html>
<head>
<script src="node_modules/iink-ts/dist/iink.min.js"></script>
<style>
#editor {
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<div id="editor" touch-action="none"></div>
<script>
const editorElement = document.getElementById('editor');

const editor = new iink.Editor(editorElement, {
server: {
applicationKey: '#YOUR MYSCRIPT DEVELOPER APPLICATION KEY#',
hmacKey: '#YOUR MYSCRIPT DEVELOPER HMAC KEY#'
}
});
editor.initialize();
</script>
</body>
</html> +
+
    +
  1. Open index.html in your browser or serve your folder content using any web server.
  2. +
+

You can find this guide, and a more complete example on the MyScript Developer website.

+

Documentation

You can find a complete documentation with the following sections on our Developer website:

+ +

As well as a global Configuration page.

+

We also provide a complete API Reference.

+

Development

Instructions to help you build the project and develop are available in the SETUP.md file.

+

Getting support

You can get support and ask your questions on the dedicated section of MyScript Developer website.

+

Sharing your feedback ?

Made a cool app with iinkTS? We would love to hear about you! +We’re planning to showcase apps using it so let us know by sending a quick mail to myapp@myscript.com.

+

Contributing

We welcome your contributions: if you would like to extend iinkTS for your needs, feel free to fork it!

+

Please take a look at our contributing guidelines before submitting your pull request.

+

License

This library is licensed under the Apache 2.0.

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/_internal_.IBehaviors.html b/docs/interfaces/_internal_.IBehaviors.html new file mode 100644 index 000000000..125ae2762 --- /dev/null +++ b/docs/interfaces/_internal_.IBehaviors.html @@ -0,0 +1,414 @@ +IBehaviors | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Interface IBehaviors

+
+

Hierarchy

+
    +
  • IBehaviors
+
+

Implemented by

+
+
+
+
+ +
+
+

Properties

+
+ +
+
+ +
grabber: IGrabber
+
+ +
init: ((element) => Promise<void>)
+
+

Type declaration

+
    +
  • +
      +
    • (element): Promise<void>
    • +
    • +
      +

      Parameters

      +
        +
      • +
        element: HTMLElement
      +

      Returns Promise<void>

+
+ +
intention: Intention
+
+ +
name: string
+
+ +
+
+ +
recognizer: IRecognizer
+
+ +
styleManager: StyleManager
+
+

Accessors

+
+ +
    +
  • get configuration(): TConfiguration
  • +
  • +

    Returns TConfiguration

  • +
  • set configuration(conf): void
  • +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    +
  • get currentPenStyle(): TPenStyle
  • +
  • +

    Returns TPenStyle

+
+ +
    +
  • get model(): IModel
  • +
  • +

    Returns IModel

+
+ +
+
+ +
    +
  • get penStyleClasses(): string
  • +
  • +

    Returns string

+
+ +
    +
  • get theme(): TTheme
  • +
  • +

    Returns TTheme

+
+

Methods

+
+ +
    + +
  • +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      Optional conversionState: TConverstionState
    • +
    • +
      Optional requestedMimeTypes: string[]
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +

    Returns Promise<void>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      Optional mimeTypes: string[]
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      data: Blob
    • +
    • +
      Optional mimeType: string
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      height: number
    • +
    • +
      width: number
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns any

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      Optional penStyleClasses: string
    +

    Returns any

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns any

+
+ +
    + +
  • +

    Returns Promise<IModel>

+
+ +
    + +
  • +

    Returns Promise<void>

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/_internal_.IGrabber.html b/docs/interfaces/_internal_.IGrabber.html new file mode 100644 index 000000000..d8d6b21ea --- /dev/null +++ b/docs/interfaces/_internal_.IGrabber.html @@ -0,0 +1,169 @@ +IGrabber | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Interface IGrabber

+
+

Hierarchy

+
    +
  • IGrabber
+
+

Implemented by

+
+
+
+
+ +
+
+

Methods

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      Optional domElement: HTMLElement
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      Optional domElement: HTMLElement
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      evt: PointerEvent
    • +
    • +
      point: TPointer
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      evt: PointerEvent
    • +
    • +
      point: TPointer
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      evt: PointerEvent
    • +
    • +
      point: TPointer
    +

    Returns void

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/_internal_.IModel.html b/docs/interfaces/_internal_.IModel.html new file mode 100644 index 000000000..1de3ff4c9 --- /dev/null +++ b/docs/interfaces/_internal_.IModel.html @@ -0,0 +1,410 @@ +IModel | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Interface IModel

+
+

Hierarchy

+
    +
  • IModel
+
+

Implemented by

+
+
+
+
+ +
+
+

Properties

+
+ +
converts?: TExport
+
+ +
creationTime: number
+
+ +
currentStroke?: TStroke
+
+ +
exports?: TExport
+
+ +
height: number
+
+ +
idle: boolean
+
+ +
modificationDate: number
+
+ +
+
+ +
rawStrokes: TStroke[]
+
+ +
selectedStrokes: TStroke[]
+
+ +
width: number
+
+

Methods

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +

    Returns TStroke[]

+
+ +
    + +
  • +

    Returns IModel

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      point: TPointer
    • +
    • +
      pointerId: number
    • +
    • +
      pointerType: string
    • +
    • +
      style: TPenStyle
    • +
    • +
      dpi: number = 96
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns any

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns any

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      id: string
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns string[]

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      position: number = ...
    +

    Returns void

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns void

+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/_internal_.IRecognizer.html b/docs/interfaces/_internal_.IRecognizer.html new file mode 100644 index 000000000..89deb7832 --- /dev/null +++ b/docs/interfaces/_internal_.IRecognizer.html @@ -0,0 +1,140 @@ +IRecognizer | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Interface IRecognizer

+
+

Hierarchy

+
    +
  • IRecognizer
+
+

Implemented by

+
+
+
+
+ +
+
+

Methods

+
+
+

Methods

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      model: IModel
    • +
    • +
      Optional mimeTypes: string[]
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
      +
    • +
      model: IModel
    • +
    • +
      data: Blob
    • +
    • +
      Optional mimeType: string
    +

    Returns Promise<IModel>

+
+ +
    + +
  • +
    +

    Parameters

    +
    +

    Returns Promise<IModel>

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules.html b/docs/modules.html new file mode 100644 index 000000000..8e6470f96 --- /dev/null +++ b/docs/modules.html @@ -0,0 +1,87 @@ +iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+

iink-ts - v1.0.0-buildVersion

+
+
+

Index

+
+

Modules

+
+
+

Namespaces

+
+
+

Classes

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules/_internal_.html b/docs/modules/_internal_.html new file mode 100644 index 000000000..79d2ed74b --- /dev/null +++ b/docs/modules/_internal_.html @@ -0,0 +1,151 @@ +<internal> | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Module <internal>

+
+
+

Index

+
+

Interfaces

+
+
+

Type Aliases

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules/behaviors.html b/docs/modules/behaviors.html new file mode 100644 index 000000000..75b129e92 --- /dev/null +++ b/docs/modules/behaviors.html @@ -0,0 +1,73 @@ +behaviors | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Namespace behaviors

+
+
+

Index

+
+

Classes

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules/configuration.html b/docs/modules/configuration.html new file mode 100644 index 000000000..773643849 --- /dev/null +++ b/docs/modules/configuration.html @@ -0,0 +1,84 @@ +configuration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+ +
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules/constants.html b/docs/modules/constants.html new file mode 100644 index 000000000..9dc9911d5 --- /dev/null +++ b/docs/modules/constants.html @@ -0,0 +1,90 @@ +constants | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Namespace constants

+
+
+

Index

+
+

Editor

+
+
+

Error

+
+
+

Events

+
+
+

Export

+
+
+

Logger

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules/event.html b/docs/modules/event.html new file mode 100644 index 000000000..4e695786c --- /dev/null +++ b/docs/modules/event.html @@ -0,0 +1,73 @@ +event | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Namespace event

+
+
+

Index

+
+

Classes

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules/grabber.html b/docs/modules/grabber.html new file mode 100644 index 000000000..089359ff7 --- /dev/null +++ b/docs/modules/grabber.html @@ -0,0 +1,72 @@ +grabber | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Namespace grabber

+
+
+

Index

+
+

Classes

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules/logger.html b/docs/modules/logger.html new file mode 100644 index 000000000..8254d5c64 --- /dev/null +++ b/docs/modules/logger.html @@ -0,0 +1,73 @@ +logger | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Namespace logger

+
+
+

Index

+
+

Classes

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules/model.html b/docs/modules/model.html new file mode 100644 index 000000000..ab6518124 --- /dev/null +++ b/docs/modules/model.html @@ -0,0 +1,77 @@ +model | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Namespace model

+
+
+

Index

+
+

Classes

+
+
+

Functions

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules/recognizer.html b/docs/modules/recognizer.html new file mode 100644 index 000000000..4b5ef5679 --- /dev/null +++ b/docs/modules/recognizer.html @@ -0,0 +1,73 @@ +recognizer | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Namespace recognizer

+
+
+

Index

+
+

Classes

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules/renderer.canvasRendererShape.html b/docs/modules/renderer.canvasRendererShape.html new file mode 100644 index 000000000..85e97badd --- /dev/null +++ b/docs/modules/renderer.canvasRendererShape.html @@ -0,0 +1,78 @@ +canvasRendererShape | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Namespace canvasRendererShape

+
+
+

Index

+
+

Variables

+
+
+

Functions

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules/renderer.canvasRendererStroke.html b/docs/modules/renderer.canvasRendererStroke.html new file mode 100644 index 000000000..6ec888c14 --- /dev/null +++ b/docs/modules/renderer.canvasRendererStroke.html @@ -0,0 +1,73 @@ +canvasRendererStroke | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Namespace canvasRendererStroke

+
+
+

Index

+
+

Functions

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules/renderer.canvasRendererText.html b/docs/modules/renderer.canvasRendererText.html new file mode 100644 index 000000000..6d797502f --- /dev/null +++ b/docs/modules/renderer.canvasRendererText.html @@ -0,0 +1,77 @@ +canvasRendererText | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Namespace canvasRendererText

+
+
+

Index

+
+

Variables

+
+
+

Functions

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules/renderer.html b/docs/modules/renderer.html new file mode 100644 index 000000000..dee86270d --- /dev/null +++ b/docs/modules/renderer.html @@ -0,0 +1,82 @@ +renderer | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Namespace renderer

+
+
+

Index

+
+

Namespaces

+
+
+

Classes

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules/renderer.quadradicsUtils.html b/docs/modules/renderer.quadradicsUtils.html new file mode 100644 index 000000000..4ccc3b033 --- /dev/null +++ b/docs/modules/renderer.quadradicsUtils.html @@ -0,0 +1,75 @@ +quadradicsUtils | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Namespace quadradicsUtils

+
+
+

Index

+
+

Functions

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules/smartguide.html b/docs/modules/smartguide.html new file mode 100644 index 000000000..b82fe4159 --- /dev/null +++ b/docs/modules/smartguide.html @@ -0,0 +1,72 @@ +smartguide | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Namespace smartguide

+
+
+

Index

+
+

Classes

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules/style.html b/docs/modules/style.html new file mode 100644 index 000000000..57d9203e1 --- /dev/null +++ b/docs/modules/style.html @@ -0,0 +1,78 @@ +style | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Namespace style

+
+
+

Index

+
+

Classes

+
+
+

Variables

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules/undoredo.html b/docs/modules/undoredo.html new file mode 100644 index 000000000..2265686e6 --- /dev/null +++ b/docs/modules/undoredo.html @@ -0,0 +1,73 @@ +undoredo | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Namespace undoredo

+
+
+

Index

+
+

Classes

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules/utils.crypto.html b/docs/modules/utils.crypto.html new file mode 100644 index 000000000..1308fc525 --- /dev/null +++ b/docs/modules/utils.crypto.html @@ -0,0 +1,73 @@ +crypto | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Namespace crypto

+
+
+

Index

+
+

Functions

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules/utils.geometric.html b/docs/modules/utils.geometric.html new file mode 100644 index 000000000..e0844dfbf --- /dev/null +++ b/docs/modules/utils.geometric.html @@ -0,0 +1,73 @@ +geometric | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Namespace geometric

+
+
+

Index

+
+

Functions

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules/utils.html b/docs/modules/utils.html new file mode 100644 index 000000000..2e1014116 --- /dev/null +++ b/docs/modules/utils.html @@ -0,0 +1,83 @@ +utils | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Namespace utils

+
+
+

Index

+
+

Namespaces

+
+
+

Classes

+
+
+

Functions

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/modules/utils.version.html b/docs/modules/utils.version.html new file mode 100644 index 000000000..caf86c2f9 --- /dev/null +++ b/docs/modules/utils.version.html @@ -0,0 +1,73 @@ +version | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Namespace version

+
+
+

Index

+
+

Functions

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.HTMLEditorElement.html b/docs/types/_internal_.HTMLEditorElement.html new file mode 100644 index 000000000..ef3494115 --- /dev/null +++ b/docs/types/_internal_.HTMLEditorElement.html @@ -0,0 +1,72 @@ +HTMLEditorElement | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias HTMLEditorElement

+
HTMLEditorElement: HTMLElement & {
    editor: Editor;
}
+
+

Type declaration

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TAngleUnit.html b/docs/types/_internal_.TAngleUnit.html new file mode 100644 index 000000000..c87be647a --- /dev/null +++ b/docs/types/_internal_.TAngleUnit.html @@ -0,0 +1,67 @@ +TAngleUnit | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TAngleUnit

+
TAngleUnit: "deg" | "rad"
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TBehaviorOptions.html b/docs/types/_internal_.TBehaviorOptions.html new file mode 100644 index 000000000..98feaa200 --- /dev/null +++ b/docs/types/_internal_.TBehaviorOptions.html @@ -0,0 +1,85 @@ +TBehaviorOptions | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TBehaviorOptions

+
TBehaviorOptions: {
    behaviors?: {
        grabber?: IGrabber;
        recognizer?: IRecognizer;
    };
    configuration: TConfiguration;
    logger?: TLoggerConfiguration;
    penStyle?: TPenStyle;
    theme?: TTheme;
}
+
+

Type declaration

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TConfiguration.html b/docs/types/_internal_.TConfiguration.html new file mode 100644 index 000000000..5e87c141a --- /dev/null +++ b/docs/types/_internal_.TConfiguration.html @@ -0,0 +1,84 @@ +TConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TConfiguration

+
TConfiguration: {
    events: TEventConfiguration;
    grabber: TGrabberConfiguration;
    recognition: TRecognitionConfiguration;
    rendering: TRenderingConfiguration;
    server: TServerConfiguration;
    triggers: TTriggerConfiguration;
    undo-redo: TUndoRedoConfiguration;
}
+
+

Type declaration

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TConfigurationClient.html b/docs/types/_internal_.TConfigurationClient.html new file mode 100644 index 000000000..688b3c5c9 --- /dev/null +++ b/docs/types/_internal_.TConfigurationClient.html @@ -0,0 +1,84 @@ +TConfigurationClient | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TConfigurationClient

+
TConfigurationClient: {
    events?: TEventConfiguration;
    grabber?: TGrabberConfiguration;
    recognition?: TRecognitionConfigurationClient;
    rendering?: TRenderingConfiguration;
    server?: TServerConfigurationClient;
    triggers?: TTriggerConfiguration;
    undo-redo?: TUndoRedoConfiguration;
}
+
+

Type declaration

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TConverstionState.html b/docs/types/_internal_.TConverstionState.html new file mode 100644 index 000000000..efd297337 --- /dev/null +++ b/docs/types/_internal_.TConverstionState.html @@ -0,0 +1,67 @@ +TConverstionState | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TConverstionState

+
TConverstionState: "DIGITAL_EDIT" | "HANDWRITING"
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TConvertConfiguration.html b/docs/types/_internal_.TConvertConfiguration.html new file mode 100644 index 000000000..92e930318 --- /dev/null +++ b/docs/types/_internal_.TConvertConfiguration.html @@ -0,0 +1,72 @@ +TConvertConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TConvertConfiguration

+
TConvertConfiguration: {
    convertOnDoubleTap: boolean;
}
+
+

Type declaration

+
    +
  • +
    convertOnDoubleTap: boolean
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TDebugConfiguration.html b/docs/types/_internal_.TDebugConfiguration.html new file mode 100644 index 000000000..4e4dad35e --- /dev/null +++ b/docs/types/_internal_.TDebugConfiguration.html @@ -0,0 +1,74 @@ +TDebugConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TDebugConfiguration

+
TDebugConfiguration: {
    draw-image-boxes: boolean;
    draw-text-boxes: boolean;
}
+
+

Type declaration

+
    +
  • +
    draw-image-boxes: boolean
  • +
  • +
    draw-text-boxes: boolean
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TDiagramConfiguration.html b/docs/types/_internal_.TDiagramConfiguration.html new file mode 100644 index 000000000..45cbfe898 --- /dev/null +++ b/docs/types/_internal_.TDiagramConfiguration.html @@ -0,0 +1,82 @@ +TDiagramConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TDiagramConfiguration

+
TDiagramConfiguration: {
    convert?: TDiagramConvertConfiguration;
    enable-sub-blocks?: boolean;
    eraser?: TEraserConfiguration;
    mimeTypes: ("application/vnd.myscript.jiix" | "application/vnd.openxmlformats-officedocument.presentationml.presentation" | "image/svg+xml")[];
    session-time?: number;
    text?: TTextConfConfiguration;
}
+
+

Type declaration

+
    +
  • +
    Optional convert?: TDiagramConvertConfiguration
  • +
  • +
    Optional enable-sub-blocks?: boolean
  • +
  • +
    Optional eraser?: TEraserConfiguration
  • +
  • +
    mimeTypes: ("application/vnd.myscript.jiix" | "application/vnd.openxmlformats-officedocument.presentationml.presentation" | "image/svg+xml")[]
  • +
  • +
    Optional session-time?: number
  • +
  • +
    Optional text?: TTextConfConfiguration
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TDiagramConvertConfiguration.html b/docs/types/_internal_.TDiagramConvertConfiguration.html new file mode 100644 index 000000000..695fd4caa --- /dev/null +++ b/docs/types/_internal_.TDiagramConvertConfiguration.html @@ -0,0 +1,78 @@ +TDiagramConvertConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TDiagramConvertConfiguration

+
TDiagramConvertConfiguration: {
    edge?: boolean;
    match-text-size?: boolean;
    node?: boolean;
    text?: boolean;
}
+
+

Type declaration

+
    +
  • +
    Optional edge?: boolean
  • +
  • +
    Optional match-text-size?: boolean
  • +
  • +
    Optional node?: boolean
  • +
  • +
    Optional text?: boolean
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TEraserConfiguration.html b/docs/types/_internal_.TEraserConfiguration.html new file mode 100644 index 000000000..261286dd5 --- /dev/null +++ b/docs/types/_internal_.TEraserConfiguration.html @@ -0,0 +1,72 @@ +TEraserConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TEraserConfiguration

+
TEraserConfiguration: {
    erase-precisely: boolean;
}
+
+

Type declaration

+
    +
  • +
    erase-precisely: boolean
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TEventConfiguration.html b/docs/types/_internal_.TEventConfiguration.html new file mode 100644 index 000000000..9b4befdfd --- /dev/null +++ b/docs/types/_internal_.TEventConfiguration.html @@ -0,0 +1,72 @@ +TEventConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TEventConfiguration

+
TEventConfiguration: {
    processDelay: number;
}
+
+

Type declaration

+
    +
  • +
    processDelay: number
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TExport.html b/docs/types/_internal_.TExport.html new file mode 100644 index 000000000..4996184c8 --- /dev/null +++ b/docs/types/_internal_.TExport.html @@ -0,0 +1,112 @@ +TExport | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TExport

+
TExport: {
    application/mathml+xml?: string;
    application/vnd.myscript.jiix?: TJIIXExport;
    application/vnd.openxmlformats-officedocument.presentationml.presentation?: Blob;
    application/x-latex?: string;
    image/svg+xml?: string;
    text/plain?: string;
    [key: string]: TJIIXExport | string | Blob;
}
+

List all supported MIME types for export. +Attention, the MIME types supported depend on the type of recognition

+
+
+

Type declaration

+
    +
  • +
    [key: string]: TJIIXExport | string | Blob
  • +
  • +
    Optional application/mathml+xml?: string
    +

    mathml+xml is only use for math export

    +
    +
  • +
  • +
    Optional application/vnd.myscript.jiix?: TJIIXExport
    +

    vnd.myscript.jiix is used for text and raw-content exports

    +
    +
  • +
  • +
    Optional application/vnd.openxmlformats-officedocument.presentationml.presentation?: Blob
    +

    vnd.openxmlformats-officedocument.presentationml.presentation is only use for diagram export

    +
    +
    +

    See

    Blob

    +
  • +
  • +
    Optional application/x-latex?: string
    +

    x-latex is only use for math export

    +
    +
    +

    See

    katex to render

    +
  • +
  • +
    Optional image/svg+xml?: string
    +

    svg+xml is only use for diagram export

    +
    +
  • +
  • +
    Optional text/plain?: string
    +

    text/plain is only use for text export

    +
    +
+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TExportConfiguration.html b/docs/types/_internal_.TExportConfiguration.html new file mode 100644 index 000000000..1777422c1 --- /dev/null +++ b/docs/types/_internal_.TExportConfiguration.html @@ -0,0 +1,78 @@ +TExportConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TExportConfiguration

+
TExportConfiguration: {
    image?: TImageConfiguration;
    image-resolution?: number;
    jiix?: TJiixConfiguration;
    mathml?: TMathMLExport;
}
+
+

Type declaration

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TGrabberConfiguration.html b/docs/types/_internal_.TGrabberConfiguration.html new file mode 100644 index 000000000..a35c2601c --- /dev/null +++ b/docs/types/_internal_.TGrabberConfiguration.html @@ -0,0 +1,76 @@ +TGrabberConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TGrabberConfiguration

+
TGrabberConfiguration: {
    listenerOptions: TListenerConfiguration;
    timestampFloatPrecision: number;
    xyFloatPrecision: number;
}
+
+

Type declaration

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TGuidesConfiguration.html b/docs/types/_internal_.TGuidesConfiguration.html new file mode 100644 index 000000000..b8a670be1 --- /dev/null +++ b/docs/types/_internal_.TGuidesConfiguration.html @@ -0,0 +1,74 @@ +TGuidesConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TGuidesConfiguration

+
TGuidesConfiguration: {
    enable: boolean;
    gap: numnber;
}
+
+

Type declaration

+
    +
  • +
    enable: boolean
  • +
  • +
    gap: numnber
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TImageConfiguration.html b/docs/types/_internal_.TImageConfiguration.html new file mode 100644 index 000000000..e1d530acc --- /dev/null +++ b/docs/types/_internal_.TImageConfiguration.html @@ -0,0 +1,74 @@ +TImageConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TImageConfiguration

+
TImageConfiguration: {
    guides: boolean;
    viewport: TImageViewportConfiguration;
}
+
+

Type declaration

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TImageViewportConfiguration.html b/docs/types/_internal_.TImageViewportConfiguration.html new file mode 100644 index 000000000..0367607bf --- /dev/null +++ b/docs/types/_internal_.TImageViewportConfiguration.html @@ -0,0 +1,78 @@ +TImageViewportConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TImageViewportConfiguration

+
TImageViewportConfiguration: {
    height: number;
    width: number;
    x: number;
    y: number;
}
+
+

Type declaration

+
    +
  • +
    height: number
  • +
  • +
    width: number
  • +
  • +
    x: number
  • +
  • +
    y: number
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TJIIXExport.html b/docs/types/_internal_.TJIIXExport.html new file mode 100644 index 000000000..a52c4f1b2 --- /dev/null +++ b/docs/types/_internal_.TJIIXExport.html @@ -0,0 +1,80 @@ +TJIIXExport | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TJIIXExport

+
TJIIXExport: {
    id: string;
    label: string;
    type: string;
    version: string;
    words: TWordExport[];
}
+
+

Type declaration

+
    +
  • +
    id: string
  • +
  • +
    label: string
  • +
  • +
    type: string
  • +
  • +
    version: string
  • +
  • +
    words: TWordExport[]
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TJiixConfiguration.html b/docs/types/_internal_.TJiixConfiguration.html new file mode 100644 index 000000000..62abb7c34 --- /dev/null +++ b/docs/types/_internal_.TJiixConfiguration.html @@ -0,0 +1,83 @@ +TJiixConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TJiixConfiguration

+
TJiixConfiguration: {
    bounding-box?: boolean;
    strokes: boolean;
    style?: boolean;
    text?: {
        chars: boolean;
        words: boolean;
    };
}
+
+

Type declaration

+
    +
  • +
    Optional bounding-box?: boolean
  • +
  • +
    strokes: boolean
  • +
  • +
    Optional style?: boolean
  • +
  • +
    Optional text?: {
        chars: boolean;
        words: boolean;
    }
    +
      +
    • +
      chars: boolean
    • +
    • +
      words: boolean
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TListenerConfiguration.html b/docs/types/_internal_.TListenerConfiguration.html new file mode 100644 index 000000000..20ecbfe5e --- /dev/null +++ b/docs/types/_internal_.TListenerConfiguration.html @@ -0,0 +1,74 @@ +TListenerConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TListenerConfiguration

+
TListenerConfiguration: {
    capture: boolean;
    passive: boolean;
}
+
+

Type declaration

+
    +
  • +
    capture: boolean
  • +
  • +
    passive: boolean
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TLoggerConfiguration.html b/docs/types/_internal_.TLoggerConfiguration.html new file mode 100644 index 000000000..5bcade465 --- /dev/null +++ b/docs/types/_internal_.TLoggerConfiguration.html @@ -0,0 +1,67 @@ +TLoggerConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TLoggerConfiguration

+
TLoggerConfiguration: {
    [key in keyof typeof LoggerClass]: LoggerLevel
}
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TMarginConfiguration.html b/docs/types/_internal_.TMarginConfiguration.html new file mode 100644 index 000000000..0d85e1876 --- /dev/null +++ b/docs/types/_internal_.TMarginConfiguration.html @@ -0,0 +1,78 @@ +TMarginConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TMarginConfiguration

+
TMarginConfiguration: {
    bottom: number;
    left: number;
    right: number;
    top: number;
}
+
+

Type declaration

+
    +
  • +
    bottom: number
  • +
  • +
    left: number
  • +
  • +
    right: number
  • +
  • +
    top: number
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TMathConfiguration.html b/docs/types/_internal_.TMathConfiguration.html new file mode 100644 index 000000000..39770a3ad --- /dev/null +++ b/docs/types/_internal_.TMathConfiguration.html @@ -0,0 +1,90 @@ +TMathConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TMathConfiguration

+
TMathConfiguration: {
    customGrammar?: string;
    customGrammarContent?: string;
    customGrammarId?: string;
    eraser?: TEraserConfiguration;
    margin: TMarginConfiguration;
    mimeTypes: ("application/x-latex" | "application/mathml+xml" | "application/vnd.myscript.jiix")[];
    recognition-timeout?: number;
    session-time?: number;
    solver?: TSolverConfiguration;
    undo-redo?: TMathUndoRedoConfiguration;
}
+
+

Type declaration

+
    +
  • +
    Optional customGrammar?: string
  • +
  • +
    Optional customGrammarContent?: string
  • +
  • +
    Optional customGrammarId?: string
  • +
  • +
    Optional eraser?: TEraserConfiguration
  • +
  • +
    margin: TMarginConfiguration
  • +
  • +
    mimeTypes: ("application/x-latex" | "application/mathml+xml" | "application/vnd.myscript.jiix")[]
  • +
  • +
    Optional recognition-timeout?: number
  • +
  • +
    Optional session-time?: number
  • +
  • +
    Optional solver?: TSolverConfiguration
  • +
  • +
    Optional undo-redo?: TMathUndoRedoConfiguration
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TMathMLExport.html b/docs/types/_internal_.TMathMLExport.html new file mode 100644 index 000000000..17383267d --- /dev/null +++ b/docs/types/_internal_.TMathMLExport.html @@ -0,0 +1,72 @@ +TMathMLExport | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TMathMLExport

+
TMathMLExport: {
    flavor: TMathMLFlavor;
}
+
+

Type declaration

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TMathMLFlavor.html b/docs/types/_internal_.TMathMLFlavor.html new file mode 100644 index 000000000..7beb46353 --- /dev/null +++ b/docs/types/_internal_.TMathMLFlavor.html @@ -0,0 +1,72 @@ +TMathMLFlavor | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TMathMLFlavor

+
TMathMLFlavor: {
    name: string;
}
+
+

Type declaration

+
    +
  • +
    name: string
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TMathSolvedTheme.html b/docs/types/_internal_.TMathSolvedTheme.html new file mode 100644 index 000000000..034dabdb8 --- /dev/null +++ b/docs/types/_internal_.TMathSolvedTheme.html @@ -0,0 +1,74 @@ +TMathSolvedTheme | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TMathSolvedTheme

+
TMathSolvedTheme: {
    color: string;
    font-family: string;
}
+
+

Type declaration

+
    +
  • +
    color: string
  • +
  • +
    font-family: string
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TMathTheme.html b/docs/types/_internal_.TMathTheme.html new file mode 100644 index 000000000..b19f2c595 --- /dev/null +++ b/docs/types/_internal_.TMathTheme.html @@ -0,0 +1,72 @@ +TMathTheme | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TMathTheme

+
TMathTheme: {
    font-family: string;
}
+
+

Type declaration

+
    +
  • +
    font-family: string
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TMathUndoRedoConfiguration.html b/docs/types/_internal_.TMathUndoRedoConfiguration.html new file mode 100644 index 000000000..4d2537fad --- /dev/null +++ b/docs/types/_internal_.TMathUndoRedoConfiguration.html @@ -0,0 +1,72 @@ +TMathUndoRedoConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TMathUndoRedoConfiguration

+
TMathUndoRedoConfiguration: {
    mode: TUndoRedoMode;
}
+
+

Type declaration

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TPenStyle.html b/docs/types/_internal_.TPenStyle.html new file mode 100644 index 000000000..7985e5a18 --- /dev/null +++ b/docs/types/_internal_.TPenStyle.html @@ -0,0 +1,81 @@ +TPenStyle | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TPenStyle

+
TPenStyle: {
    -myscript-pen-fill-color?: string;
    -myscript-pen-fill-style?: string;
    -myscript-pen-width?: number;
    color?: string;
    width?: number;
}
+
+

Type declaration

+
    +
  • +
    Optional -myscript-pen-fill-color?: string
  • +
  • +
    Optional -myscript-pen-fill-style?: string
  • +
  • +
    Optional -myscript-pen-width?: number
  • +
  • +
    Optional color?: string
  • +
  • +
    Optional width?: number
+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TPoint.html b/docs/types/_internal_.TPoint.html new file mode 100644 index 000000000..f4039ddc2 --- /dev/null +++ b/docs/types/_internal_.TPoint.html @@ -0,0 +1,74 @@ +TPoint | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TPoint

+
TPoint: {
    x: number;
    y: number;
}
+
+

Type declaration

+
    +
  • +
    x: number
  • +
  • +
    y: number
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TPointer.html b/docs/types/_internal_.TPointer.html new file mode 100644 index 000000000..17fcbd7cc --- /dev/null +++ b/docs/types/_internal_.TPointer.html @@ -0,0 +1,74 @@ +TPointer | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TPointer

+
TPointer: TPoint & {
    p: number;
    t: number;
}
+
+

Type declaration

+
    +
  • +
    p: number
  • +
  • +
    t: number
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TProtocol.html b/docs/types/_internal_.TProtocol.html new file mode 100644 index 000000000..4821db45b --- /dev/null +++ b/docs/types/_internal_.TProtocol.html @@ -0,0 +1,67 @@ +TProtocol | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TProtocol

+
TProtocol: "WEBSOCKET" | "REST"
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TRawContentConfiguration.html b/docs/types/_internal_.TRawContentConfiguration.html new file mode 100644 index 000000000..247f89db5 --- /dev/null +++ b/docs/types/_internal_.TRawContentConfiguration.html @@ -0,0 +1,78 @@ +TRawContentConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TRawContentConfiguration

+
TRawContentConfiguration: {
    eraser?: TEraserConfiguration;
    recognition?: TRecognitionConfiguration;
    session-time?: number;
    text?: TTextConfConfiguration;
}
+
+

Type declaration

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TRecognitionConfiguration.html b/docs/types/_internal_.TRecognitionConfiguration.html new file mode 100644 index 000000000..a4fd97115 --- /dev/null +++ b/docs/types/_internal_.TRecognitionConfiguration.html @@ -0,0 +1,95 @@ +TRecognitionConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TRecognitionConfiguration

+
TRecognitionConfiguration: {
    alwaysConnected: boolean;
    convert?: TConvertConfiguration;
    diagram: TDiagramConfiguration;
    export: TExportConfiguration;
    gesture: {
        enable: boolean;
    };
    lang: string;
    math: TMathConfiguration;
    raw-content: TRawContentConfiguration;
    renderer: TRecognitionRendererConfiguration;
    text: TTextConfiguration;
    type: TRecognitionType;
}
+
+

Type declaration

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TRecognitionConfigurationClient.html b/docs/types/_internal_.TRecognitionConfigurationClient.html new file mode 100644 index 000000000..800af61ff --- /dev/null +++ b/docs/types/_internal_.TRecognitionConfigurationClient.html @@ -0,0 +1,95 @@ +TRecognitionConfigurationClient | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TRecognitionConfigurationClient

+
TRecognitionConfigurationClient: {
    alwaysConnected?: boolean;
    convert?: TConvertConfiguration;
    diagram?: TDiagramConfiguration;
    export?: TExportConfiguration;
    gesture?: {
        enable: boolean;
    };
    lang?: string;
    math?: TMathConfiguration;
    raw-content?: TRawContentConfiguration;
    renderer?: TRecognitionRendererConfiguration;
    text?: TTextConfiguration;
    type?: TRecognitionType;
}
+
+

Type declaration

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TRecognitionPositions.html b/docs/types/_internal_.TRecognitionPositions.html new file mode 100644 index 000000000..214d436fe --- /dev/null +++ b/docs/types/_internal_.TRecognitionPositions.html @@ -0,0 +1,74 @@ +TRecognitionPositions | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TRecognitionPositions

+
TRecognitionPositions: {
    lastReceivedPosition: number;
    lastSentPosition: number;
}
+
+

Type declaration

+
    +
  • +
    lastReceivedPosition: number
  • +
  • +
    lastSentPosition: number
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TRecognitionRendererConfiguration.html b/docs/types/_internal_.TRecognitionRendererConfiguration.html new file mode 100644 index 000000000..d302c8efa --- /dev/null +++ b/docs/types/_internal_.TRecognitionRendererConfiguration.html @@ -0,0 +1,72 @@ +TRecognitionRendererConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TRecognitionRendererConfiguration

+
TRecognitionRendererConfiguration: {
    debug: TDebugConfiguration;
}
+
+

Type declaration

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TRecognitionType.html b/docs/types/_internal_.TRecognitionType.html new file mode 100644 index 000000000..ed3f1cd37 --- /dev/null +++ b/docs/types/_internal_.TRecognitionType.html @@ -0,0 +1,67 @@ +TRecognitionType | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TRecognitionType

+
TRecognitionType: "TEXT" | "MATH" | "DIAGRAM" | "Raw Content"
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TRenderingConfiguration.html b/docs/types/_internal_.TRenderingConfiguration.html new file mode 100644 index 000000000..4d7e6a1ab --- /dev/null +++ b/docs/types/_internal_.TRenderingConfiguration.html @@ -0,0 +1,78 @@ +TRenderingConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TRenderingConfiguration

+
TRenderingConfiguration: {
    guides: TGuidesConfiguration;
    minHeight: number;
    minWidth: number;
    smartGuide: TSmartGuidesConfiguration;
}
+
+

Type declaration

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TRestPostConfiguration.html b/docs/types/_internal_.TRestPostConfiguration.html new file mode 100644 index 000000000..72d0bc087 --- /dev/null +++ b/docs/types/_internal_.TRestPostConfiguration.html @@ -0,0 +1,82 @@ +TRestPostConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TRestPostConfiguration

+
TRestPostConfiguration: {
    diagram?: TDiagramConfiguration;
    export: TExportConfiguration;
    lang: string;
    math?: TMathConfiguration;
    raw-content?: TRawContentConfiguration;
    text?: TTextConfiguration;
}
+
+

Type declaration

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TRestPostData.html b/docs/types/_internal_.TRestPostData.html new file mode 100644 index 000000000..774ac6a2b --- /dev/null +++ b/docs/types/_internal_.TRestPostData.html @@ -0,0 +1,86 @@ +TRestPostData | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TRestPostData

+
TRestPostData: {
    configuration: TRestPostConfiguration;
    contentType: string;
    conversionState?: TConverstionState;
    height: number;
    strokeGroups: TStrokeGroupJSON[];
    width: nmber;
    xDPI: number;
    yDPI: nmber;
}
+
+

Type declaration

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TRoundingMode.html b/docs/types/_internal_.TRoundingMode.html new file mode 100644 index 000000000..f7e295549 --- /dev/null +++ b/docs/types/_internal_.TRoundingMode.html @@ -0,0 +1,67 @@ +TRoundingMode | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TRoundingMode

+
TRoundingMode: "half up" | "truncate"
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TSchene.html b/docs/types/_internal_.TSchene.html new file mode 100644 index 000000000..2e1dbf186 --- /dev/null +++ b/docs/types/_internal_.TSchene.html @@ -0,0 +1,67 @@ +TSchene | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TSchene

+
TSchene: "https" | "http"
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TServerConfiguration.html b/docs/types/_internal_.TServerConfiguration.html new file mode 100644 index 000000000..6863bdb20 --- /dev/null +++ b/docs/types/_internal_.TServerConfiguration.html @@ -0,0 +1,99 @@ +TServerConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TServerConfiguration

+
TServerConfiguration: {
    applicationKey: string;
    hmacKey: string;
    host: string;
    protocol: TProtocol;
    scheme: TSchene;
    useWindowLocation?: boolean;
    version: string;
    websocket: {
        autoReconnect: boolean;
        fileChunkSize: number;
        maxPingLostCount: number;
        maxRetryCount: number;
        pingDelay: number;
        pingEnabled: boolean;
    };
}
+
+

Type declaration

+
    +
  • +
    applicationKey: string
  • +
  • +
    hmacKey: string
  • +
  • +
    host: string
  • +
  • +
    protocol: TProtocol
  • +
  • +
    scheme: TSchene
  • +
  • +
    Optional useWindowLocation?: boolean
  • +
  • +
    version: string
  • +
  • +
    websocket: {
        autoReconnect: boolean;
        fileChunkSize: number;
        maxPingLostCount: number;
        maxRetryCount: number;
        pingDelay: number;
        pingEnabled: boolean;
    }
    +
      +
    • +
      autoReconnect: boolean
    • +
    • +
      fileChunkSize: number
    • +
    • +
      maxPingLostCount: number
    • +
    • +
      maxRetryCount: number
    • +
    • +
      pingDelay: number
    • +
    • +
      pingEnabled: boolean
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TServerConfigurationClient.html b/docs/types/_internal_.TServerConfigurationClient.html new file mode 100644 index 000000000..a7cf5fc61 --- /dev/null +++ b/docs/types/_internal_.TServerConfigurationClient.html @@ -0,0 +1,99 @@ +TServerConfigurationClient | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TServerConfigurationClient

+
TServerConfigurationClient: {
    applicationKey?: string;
    hmacKey?: string;
    host?: string;
    protocol?: TProtocol;
    scheme?: TSchene;
    useWindowLocation?: boolean;
    version?: string;
    websocket?: {
        autoReconnect?: boolean;
        fileChunkSize?: number;
        maxPingLostCount?: number;
        maxRetryCount?: number;
        pingDelay?: number;
        pingEnabled?: boolean;
    };
}
+
+

Type declaration

+
    +
  • +
    Optional applicationKey?: string
  • +
  • +
    Optional hmacKey?: string
  • +
  • +
    Optional host?: string
  • +
  • +
    Optional protocol?: TProtocol
  • +
  • +
    Optional scheme?: TSchene
  • +
  • +
    Optional useWindowLocation?: boolean
  • +
  • +
    Optional version?: string
  • +
  • +
    Optional websocket?: {
        autoReconnect?: boolean;
        fileChunkSize?: number;
        maxPingLostCount?: number;
        maxRetryCount?: number;
        pingDelay?: number;
        pingEnabled?: boolean;
    }
    +
      +
    • +
      Optional autoReconnect?: boolean
    • +
    • +
      Optional fileChunkSize?: number
    • +
    • +
      Optional maxPingLostCount?: number
    • +
    • +
      Optional maxRetryCount?: number
    • +
    • +
      Optional pingDelay?: number
    • +
    • +
      Optional pingEnabled?: boolean
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TSmartGuidesConfiguration.html b/docs/types/_internal_.TSmartGuidesConfiguration.html new file mode 100644 index 000000000..3869a048c --- /dev/null +++ b/docs/types/_internal_.TSmartGuidesConfiguration.html @@ -0,0 +1,79 @@ +TSmartGuidesConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TSmartGuidesConfiguration

+
TSmartGuidesConfiguration: {
    enable: boolean;
    fadeOut: {
        duration: number;
        enable: boolean;
    };
}
+
+

Type declaration

+
    +
  • +
    enable: boolean
  • +
  • +
    fadeOut: {
        duration: number;
        enable: boolean;
    }
    +
      +
    • +
      duration: number
    • +
    • +
      enable: boolean
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TSolverConfiguration.html b/docs/types/_internal_.TSolverConfiguration.html new file mode 100644 index 000000000..d4205e6ce --- /dev/null +++ b/docs/types/_internal_.TSolverConfiguration.html @@ -0,0 +1,82 @@ +TSolverConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TSolverConfiguration

+
TSolverConfiguration: {
    angle-unit?: TAngleUnit;
    decimal-separator?: string;
    enable?: boolean;
    fractional-part-digits?: number;
    options?: TSolverOptions;
    rounding-mode?: TRoundingMode;
}
+
+

Type declaration

+
    +
  • +
    Optional angle-unit?: TAngleUnit
  • +
  • +
    Optional decimal-separator?: string
  • +
  • +
    Optional enable?: boolean
  • +
  • +
    Optional fractional-part-digits?: number
  • +
  • +
    Optional options?: TSolverOptions
  • +
  • +
    Optional rounding-mode?: TRoundingMode
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TSolverOptions.html b/docs/types/_internal_.TSolverOptions.html new file mode 100644 index 000000000..b7dd97285 --- /dev/null +++ b/docs/types/_internal_.TSolverOptions.html @@ -0,0 +1,67 @@ +TSolverOptions | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TSolverOptions

+
TSolverOptions: "algebraic" | "numeric"
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TStroke.html b/docs/types/_internal_.TStroke.html new file mode 100644 index 000000000..a3de8acea --- /dev/null +++ b/docs/types/_internal_.TStroke.html @@ -0,0 +1,80 @@ +TStroke | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TStroke

+
TStroke: TSymbol & {
    id: string;
    length: number;
    pointerId: number;
    pointerType: string;
    pointers: TPointer[];
}
+
+

Type declaration

+
    +
  • +
    id: string
  • +
  • +
    length: number
  • +
  • +
    pointerId: number
  • +
  • +
    pointerType: string
  • +
  • +
    pointers: TPointer[]
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TStrokeGroupJSON.html b/docs/types/_internal_.TStrokeGroupJSON.html new file mode 100644 index 000000000..2eda155cc --- /dev/null +++ b/docs/types/_internal_.TStrokeGroupJSON.html @@ -0,0 +1,74 @@ +TStrokeGroupJSON | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TStrokeGroupJSON

+
TStrokeGroupJSON: {
    penStyle?: string;
    strokes: TStrokeJSON[];
}
+
+

Type declaration

+
    +
  • +
    Optional penStyle?: string
  • +
  • +
    strokes: TStrokeJSON[]
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TStrokeJSON.html b/docs/types/_internal_.TStrokeJSON.html new file mode 100644 index 000000000..08815fb86 --- /dev/null +++ b/docs/types/_internal_.TStrokeJSON.html @@ -0,0 +1,82 @@ +TStrokeJSON | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TStrokeJSON

+
TStrokeJSON: {
    id: string;
    p: number[];
    pointerType: string;
    t: number[];
    x: number[];
    y: number[];
}
+
+

Type declaration

+
    +
  • +
    id: string
  • +
  • +
    p: number[]
  • +
  • +
    pointerType: string
  • +
  • +
    t: number[]
  • +
  • +
    x: number[]
  • +
  • +
    y: number[]
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TSymbol.html b/docs/types/_internal_.TSymbol.html new file mode 100644 index 000000000..d8e3c4296 --- /dev/null +++ b/docs/types/_internal_.TSymbol.html @@ -0,0 +1,76 @@ +TSymbol | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TSymbol

+
TSymbol: {
    elementType?: string;
    style: TPenStyle;
    type: string;
}
+
+

Type declaration

+
    +
  • +
    Optional elementType?: string
  • +
  • +
    style: TPenStyle
  • +
  • +
    type: string
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TTextConfConfiguration.html b/docs/types/_internal_.TTextConfConfiguration.html new file mode 100644 index 000000000..777ca9ec2 --- /dev/null +++ b/docs/types/_internal_.TTextConfConfiguration.html @@ -0,0 +1,76 @@ +TTextConfConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TTextConfConfiguration

+
TTextConfConfiguration: {
    addLKText?: boolean;
    customLexicon?: string[];
    customResources?: string[];
}
+
+

Type declaration

+
    +
  • +
    Optional addLKText?: boolean
  • +
  • +
    Optional customLexicon?: string[]
  • +
  • +
    Optional customResources?: string[]
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TTextConfiguration.html b/docs/types/_internal_.TTextConfiguration.html new file mode 100644 index 000000000..d0d03680a --- /dev/null +++ b/docs/types/_internal_.TTextConfiguration.html @@ -0,0 +1,82 @@ +TTextConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TTextConfiguration

+
TTextConfiguration: {
    configuration?: TTextConfConfiguration;
    eraser?: TEraserConfiguration;
    guides?: TTextGuidesConfiguration;
    margin: TMarginConfiguration;
    mimeTypes: ("text/plain" | "application/vnd.myscript.jiix")[];
    text?: boolean;
}
+
+

Type declaration

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TTextGuidesConfiguration.html b/docs/types/_internal_.TTextGuidesConfiguration.html new file mode 100644 index 000000000..663914ceb --- /dev/null +++ b/docs/types/_internal_.TTextGuidesConfiguration.html @@ -0,0 +1,72 @@ +TTextGuidesConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TTextGuidesConfiguration

+
TTextGuidesConfiguration: {
    enable: boolean;
}
+
+

Type declaration

+
    +
  • +
    enable: boolean
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TTextTheme.html b/docs/types/_internal_.TTextTheme.html new file mode 100644 index 000000000..0ee04cf74 --- /dev/null +++ b/docs/types/_internal_.TTextTheme.html @@ -0,0 +1,74 @@ +TTextTheme | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TTextTheme

+
TTextTheme: {
    font-family: string;
    font-size: number;
}
+
+

Type declaration

+
    +
  • +
    font-family: string
  • +
  • +
    font-size: number
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TTheme.html b/docs/types/_internal_.TTheme.html new file mode 100644 index 000000000..85c721a42 --- /dev/null +++ b/docs/types/_internal_.TTheme.html @@ -0,0 +1,80 @@ +TTheme | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TTheme

+
TTheme: {
    .math: TMathTheme;
    .math-solved: TMathSolvedTheme;
    .text: TTextTheme;
    ink: TPenStyle;
    [key: string]: unknown;
}
+
+

Type declaration

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TTriggerConfiguration.html b/docs/types/_internal_.TTriggerConfiguration.html new file mode 100644 index 000000000..6b14a1289 --- /dev/null +++ b/docs/types/_internal_.TTriggerConfiguration.html @@ -0,0 +1,85 @@ +TTriggerConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TTriggerConfiguration

+
TTriggerConfiguration: {
    exportContent: "QUIET_PERIOD" | "POINTER_UP" | "DEMAND";
    exportContentDelay: number;
    resizeTriggerDelay: number;
}
+

Configure when the action is triggered. +POINTER_UP : Action is triggered on every PenUP. + This is the recommended mode for CDK V3 WebSocket recognitions. +QUIET_PERIOD : Action is triggered after a quiet period in milli-seconds on every pointer up. + The value is set to 1000 for example recognition will be triggered when the user stops writing for 1 seconds. + This is the recommended mode for all REST discoveries. +DEMAND : Action is triggered on external demande

+
+
+

Type declaration

+
    +
  • +
    exportContent: "QUIET_PERIOD" | "POINTER_UP" | "DEMAND"
  • +
  • +
    exportContentDelay: number
  • +
  • +
    resizeTriggerDelay: number
+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TUndoRedoConfiguration.html b/docs/types/_internal_.TUndoRedoConfiguration.html new file mode 100644 index 000000000..a39c94ab8 --- /dev/null +++ b/docs/types/_internal_.TUndoRedoConfiguration.html @@ -0,0 +1,72 @@ +TUndoRedoConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TUndoRedoConfiguration

+
TUndoRedoConfiguration: {
    maxStackSize: number;
}
+
+

Type declaration

+
    +
  • +
    maxStackSize: number
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TUndoRedoContext.html b/docs/types/_internal_.TUndoRedoContext.html new file mode 100644 index 000000000..2586c586a --- /dev/null +++ b/docs/types/_internal_.TUndoRedoContext.html @@ -0,0 +1,82 @@ +TUndoRedoContext | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TUndoRedoContext

+
TUndoRedoContext: {
    canRedo: boolean;
    canUndo: boolean;
    empty: boolean;
    possibleUndoCount: number;
    stack: IModel[];
    stackIndex: number;
}
+
+

Type declaration

+
    +
  • +
    canRedo: boolean
  • +
  • +
    canUndo: boolean
  • +
  • +
    empty: boolean
  • +
  • +
    possibleUndoCount: number
  • +
  • +
    stack: IModel[]
  • +
  • +
    stackIndex: number
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TUndoRedoMode.html b/docs/types/_internal_.TUndoRedoMode.html new file mode 100644 index 000000000..60d3ccfed --- /dev/null +++ b/docs/types/_internal_.TUndoRedoMode.html @@ -0,0 +1,67 @@ +TUndoRedoMode | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TUndoRedoMode

+
TUndoRedoMode: "stroke" | "session"
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TUpdatePatch.html b/docs/types/_internal_.TUpdatePatch.html new file mode 100644 index 000000000..6f9b7e12f --- /dev/null +++ b/docs/types/_internal_.TUpdatePatch.html @@ -0,0 +1,72 @@ +TUpdatePatch | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TUpdatePatch

+
TUpdatePatch: {
    type: TUpdatePatchType;
}
+
+

Type declaration

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TUpdatePatchAppendChild.html b/docs/types/_internal_.TUpdatePatchAppendChild.html new file mode 100644 index 000000000..71259abee --- /dev/null +++ b/docs/types/_internal_.TUpdatePatchAppendChild.html @@ -0,0 +1,74 @@ +TUpdatePatchAppendChild | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TUpdatePatchAppendChild

+
TUpdatePatchAppendChild: TUpdatePatch & {
    parentId?: string;
    svg: string;
}
+
+

Type declaration

+
    +
  • +
    Optional parentId?: string
  • +
  • +
    svg: string
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TUpdatePatchInsertBefore.html b/docs/types/_internal_.TUpdatePatchInsertBefore.html new file mode 100644 index 000000000..d89ce0172 --- /dev/null +++ b/docs/types/_internal_.TUpdatePatchInsertBefore.html @@ -0,0 +1,74 @@ +TUpdatePatchInsertBefore | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TUpdatePatchInsertBefore

+
TUpdatePatchInsertBefore: TUpdatePatch & {
    refId: string;
    svg: string;
}
+
+

Type declaration

+
    +
  • +
    refId: string
  • +
  • +
    svg: string
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TUpdatePatchRemoveAttribut.html b/docs/types/_internal_.TUpdatePatchRemoveAttribut.html new file mode 100644 index 000000000..b3fff6ca1 --- /dev/null +++ b/docs/types/_internal_.TUpdatePatchRemoveAttribut.html @@ -0,0 +1,74 @@ +TUpdatePatchRemoveAttribut | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TUpdatePatchRemoveAttribut

+
TUpdatePatchRemoveAttribut: TUpdatePatch & {
    id?: string;
    name: string;
}
+
+

Type declaration

+
    +
  • +
    Optional id?: string
  • +
  • +
    name: string
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TUpdatePatchRemoveChild.html b/docs/types/_internal_.TUpdatePatchRemoveChild.html new file mode 100644 index 000000000..f1384f414 --- /dev/null +++ b/docs/types/_internal_.TUpdatePatchRemoveChild.html @@ -0,0 +1,74 @@ +TUpdatePatchRemoveChild | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TUpdatePatchRemoveChild

+
TUpdatePatchRemoveChild: TUpdatePatch & {
    index: number;
    parentId: string;
}
+
+

Type declaration

+
    +
  • +
    index: number
  • +
  • +
    parentId: string
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TUpdatePatchRemoveElement.html b/docs/types/_internal_.TUpdatePatchRemoveElement.html new file mode 100644 index 000000000..21757c49c --- /dev/null +++ b/docs/types/_internal_.TUpdatePatchRemoveElement.html @@ -0,0 +1,72 @@ +TUpdatePatchRemoveElement | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TUpdatePatchRemoveElement

+
TUpdatePatchRemoveElement: TUpdatePatch & {
    id: string;
}
+
+

Type declaration

+
    +
  • +
    id: string
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TUpdatePatchReplaceAll.html b/docs/types/_internal_.TUpdatePatchReplaceAll.html new file mode 100644 index 000000000..f2fd2deb2 --- /dev/null +++ b/docs/types/_internal_.TUpdatePatchReplaceAll.html @@ -0,0 +1,72 @@ +TUpdatePatchReplaceAll | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TUpdatePatchReplaceAll

+
TUpdatePatchReplaceAll: TUpdatePatch & {
    svg: string;
}
+
+

Type declaration

+
    +
  • +
    svg: string
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TUpdatePatchReplaceELement.html b/docs/types/_internal_.TUpdatePatchReplaceELement.html new file mode 100644 index 000000000..02e5426fe --- /dev/null +++ b/docs/types/_internal_.TUpdatePatchReplaceELement.html @@ -0,0 +1,74 @@ +TUpdatePatchReplaceELement | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TUpdatePatchReplaceELement

+
TUpdatePatchReplaceELement: TUpdatePatch & {
    id: string;
    svg: string;
}
+
+

Type declaration

+
    +
  • +
    id: string
  • +
  • +
    svg: string
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TUpdatePatchSetAttribut.html b/docs/types/_internal_.TUpdatePatchSetAttribut.html new file mode 100644 index 000000000..94a3bdb35 --- /dev/null +++ b/docs/types/_internal_.TUpdatePatchSetAttribut.html @@ -0,0 +1,76 @@ +TUpdatePatchSetAttribut | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TUpdatePatchSetAttribut

+
TUpdatePatchSetAttribut: TUpdatePatch & {
    id?: string;
    name: string;
    value: string;
}
+
+

Type declaration

+
    +
  • +
    Optional id?: string
  • +
  • +
    name: string
  • +
  • +
    value: string
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TUpdatePatchType.html b/docs/types/_internal_.TUpdatePatchType.html new file mode 100644 index 000000000..0506d2e89 --- /dev/null +++ b/docs/types/_internal_.TUpdatePatchType.html @@ -0,0 +1,67 @@ +TUpdatePatchType | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TUpdatePatchType

+
TUpdatePatchType: "REPLACE_ALL" | "REMOVE_ELEMENT" | "REPLACE_ELEMENT" | "REMOVE_CHILD" | "APPEND_CHILD" | "INSERT_BEFORE" | "REMOVE_ATTRIBUTE" | "SET_ATTRIBUTE"
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TWebSocketEvent.html b/docs/types/_internal_.TWebSocketEvent.html new file mode 100644 index 000000000..d23295043 --- /dev/null +++ b/docs/types/_internal_.TWebSocketEvent.html @@ -0,0 +1,74 @@ +TWebSocketEvent | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TWebSocketEvent

+
TWebSocketEvent: {
    type: string;
    [key: string]: unknown;
}
+
+

Type declaration

+
    +
  • +
    [key: string]: unknown
  • +
  • +
    type: string
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TWebSocketSVGPatchEvent.html b/docs/types/_internal_.TWebSocketSVGPatchEvent.html new file mode 100644 index 000000000..af16e58b8 --- /dev/null +++ b/docs/types/_internal_.TWebSocketSVGPatchEvent.html @@ -0,0 +1,74 @@ +TWebSocketSVGPatchEvent | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TWebSocketSVGPatchEvent

+
TWebSocketSVGPatchEvent: TWebSocketEvent & {
    layer: "MODEL" | "CAPTURE";
    updates: TUpdatePatch[];
}
+
+

Type declaration

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/_internal_.TWordExport.html b/docs/types/_internal_.TWordExport.html new file mode 100644 index 000000000..54702acba --- /dev/null +++ b/docs/types/_internal_.TWordExport.html @@ -0,0 +1,76 @@ +TWordExport | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Type alias TWordExport

+
TWordExport: {
    candidates?: string[];
    id?: string;
    label: string;
}
+
+

Type declaration

+
    +
  • +
    Optional candidates?: string[]
  • +
  • +
    Optional id?: string
  • +
  • +
    label: string
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/variables/configuration.DefaultConfiguration.html b/docs/variables/configuration.DefaultConfiguration.html new file mode 100644 index 000000000..90195a7be --- /dev/null +++ b/docs/variables/configuration.DefaultConfiguration.html @@ -0,0 +1,75 @@ +DefaultConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Variable DefaultConfigurationConst

+
DefaultConfiguration: TConfiguration = { + server: DefaultServerConfiguration, + recognition: DefaultRecognitionConfiguration, + grabber: DefaultGrabberConfiguration, + rendering: DefaultRenderingConfiguration, + triggers: DefaultTriggerConfiguration, + events: DefaultEventsConfiguration, + "undo-redo": DefaultUndoRedoConfiguration +}
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/variables/configuration.DefaultEventsConfiguration.html b/docs/variables/configuration.DefaultEventsConfiguration.html new file mode 100644 index 000000000..b072360cd --- /dev/null +++ b/docs/variables/configuration.DefaultEventsConfiguration.html @@ -0,0 +1,69 @@ +DefaultEventsConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Variable DefaultEventsConfigurationConst

+
DefaultEventsConfiguration: TEventConfiguration = { + processDelay: 10 +}
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/variables/configuration.DefaultGrabberConfiguration.html b/docs/variables/configuration.DefaultGrabberConfiguration.html new file mode 100644 index 000000000..224069852 --- /dev/null +++ b/docs/variables/configuration.DefaultGrabberConfiguration.html @@ -0,0 +1,74 @@ +DefaultGrabberConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Variable DefaultGrabberConfigurationConst

+
DefaultGrabberConfiguration: TGrabberConfiguration = { + listenerOptions: { + capture: false, + passive: true + }, + xyFloatPrecision: 0, + timestampFloatPrecision: 0 +}
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/variables/configuration.DefaultLoggerConfiguration.html b/docs/variables/configuration.DefaultLoggerConfiguration.html new file mode 100644 index 000000000..bebe9cd84 --- /dev/null +++ b/docs/variables/configuration.DefaultLoggerConfiguration.html @@ -0,0 +1,81 @@ +DefaultLoggerConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Variable DefaultLoggerConfigurationConst

+
DefaultLoggerConfiguration: TLoggerConfiguration = { + [LoggerClass.EDITOR]: LoggerLevel.ERROR, + [LoggerClass.BEHAVIORS]: LoggerLevel.ERROR, + [LoggerClass.RECOGNIZER]: LoggerLevel.ERROR, + [LoggerClass.GRABBER]: LoggerLevel.ERROR, + [LoggerClass.RENDERER]: LoggerLevel.ERROR, + [LoggerClass.CONFIGURATION]: LoggerLevel.ERROR, + [LoggerClass.PUBLIC_EVENT]: LoggerLevel.ERROR, + [LoggerClass.INTERNALEVENT]: LoggerLevel.ERROR, + [LoggerClass.MODEL]: LoggerLevel.ERROR, + [LoggerClass.STROKE]: LoggerLevel.ERROR, + [LoggerClass.SMARTGUIDE]: LoggerLevel.ERROR, + [LoggerClass.STYLEMANAGER]: LoggerLevel.ERROR, + [LoggerClass.UNDOREDO_MANAGER]: LoggerLevel.ERROR, +}
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/variables/configuration.DefaultRecognitionConfiguration.html b/docs/variables/configuration.DefaultRecognitionConfiguration.html new file mode 100644 index 000000000..094a4bec9 --- /dev/null +++ b/docs/variables/configuration.DefaultRecognitionConfiguration.html @@ -0,0 +1,146 @@ +DefaultRecognitionConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Variable DefaultRecognitionConfigurationConst

+
DefaultRecognitionConfiguration: TRecognitionConfiguration = { + type: "TEXT", + alwaysConnected: true, + lang: "en_US", + gesture: { + enable: true + }, + export: { + "image-resolution": 300, + jiix: { + "bounding-box": false, + strokes: false, + text: { + chars: false, + words: true + } + }, + }, + renderer: { + debug: { + "draw-text-boxes": false, + "draw-image-boxes": false + } + }, + math: { + mimeTypes: ["application/vnd.myscript.jiix"], + solver: { + enable: true, + "fractional-part-digits": 3, + "decimal-separator": ".", + "rounding-mode": "half up", + "angle-unit": "deg" + }, + margin: { + bottom: 10, + left: 15, + right: 15, + top: 10 + }, + eraser: { + "erase-precisely": false + }, + "undo-redo": { + mode: "stroke" + } + }, + text: { + guides: { + enable: true + }, + mimeTypes: ["application/vnd.myscript.jiix"], + margin: { + top: 20, + left: 10, + right: 10, + bottom: 10 + }, + eraser: { + "erase-precisely": false + } + }, + diagram: { + mimeTypes: ["application/vnd.myscript.jiix"], + eraser: { + "erase-precisely": false + }, + convert: { + "match-text-size": true + } + }, + "raw-content": { + recognition: { + text: true, + shape: true + }, + eraser: { + "erase-precisely": false + } + } +}
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/variables/configuration.DefaultRenderingConfiguration.html b/docs/variables/configuration.DefaultRenderingConfiguration.html new file mode 100644 index 000000000..e10bd0561 --- /dev/null +++ b/docs/variables/configuration.DefaultRenderingConfiguration.html @@ -0,0 +1,81 @@ +DefaultRenderingConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Variable DefaultRenderingConfigurationConst

+
DefaultRenderingConfiguration: TRenderingConfiguration = { + minHeight: 100, + minWidth: 100, + smartGuide: { + enable: true, + fadeOut: { + enable: false, + duration: 5000 + } + }, + guides: { + enable: true, + gap: 50 + } +}
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/variables/configuration.DefaultServerConfiguration.html b/docs/variables/configuration.DefaultServerConfiguration.html new file mode 100644 index 000000000..3bee3a723 --- /dev/null +++ b/docs/variables/configuration.DefaultServerConfiguration.html @@ -0,0 +1,83 @@ +DefaultServerConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Variable DefaultServerConfigurationConst

+
DefaultServerConfiguration: TServerConfiguration = { + protocol: "WEBSOCKET", + scheme: "https", + host: "cloud.myscript.com", + applicationKey: "", + hmacKey: "", + version: "2.1.0", + useWindowLocation: false, + websocket: { + pingEnabled: true, + pingDelay: 30000, + maxPingLostCount: 10, + autoReconnect: true, + maxRetryCount: 2, + fileChunkSize: 300000 + } +}
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/variables/configuration.DefaultTriggerConfiguration.html b/docs/variables/configuration.DefaultTriggerConfiguration.html new file mode 100644 index 000000000..c27d835df --- /dev/null +++ b/docs/variables/configuration.DefaultTriggerConfiguration.html @@ -0,0 +1,71 @@ +DefaultTriggerConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Variable DefaultTriggerConfigurationConst

+
DefaultTriggerConfiguration: TTriggerConfiguration = { + exportContent: "POINTER_UP", + exportContentDelay: 1000, + resizeTriggerDelay: 100 +}
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/variables/configuration.DefaultUndoRedoConfiguration.html b/docs/variables/configuration.DefaultUndoRedoConfiguration.html new file mode 100644 index 000000000..90dab522b --- /dev/null +++ b/docs/variables/configuration.DefaultUndoRedoConfiguration.html @@ -0,0 +1,69 @@ +DefaultUndoRedoConfiguration | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Variable DefaultUndoRedoConfigurationConst

+
DefaultUndoRedoConfiguration: TUndoRedoConfiguration = { + maxStackSize: 100 +}
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/variables/constants.Error.html b/docs/variables/constants.Error.html new file mode 100644 index 000000000..1ec428299 --- /dev/null +++ b/docs/variables/constants.Error.html @@ -0,0 +1,107 @@ +Error | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Variable ErrorConst

+
Error: {
    ABNORMAL_CLOSURE: "MyScript recognition server is not reachable.";
    BAD_GATEWAY: "MyScript recognition server was acting as a gateway or proxy and received an invalid response from the upstream server.";
    CANT_ESTABLISH: "Unable to establish a connection to MyScript recognition server. Check the host and your connectivity.";
    GOING_AWAY: "MyScript recognition server is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection.";
    INTERNAL_ERROR: "MyScript recognition server terminated the connection because it encountered an unexpected condition that prevented it from fulfilling the request.";
    INVALID_FRAME_PAULOAD: "MyScript recognition server terminated the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message).";
    MESSAGE_TOO_BIG: "MyScript recognition server terminated the connection because a data frame was received that is too large.";
    NO_ACTIVITY: "Session closed due to no activity.";
    POLICY_VIOLATION: "MyScript recognition server terminated the connection because it received a message that violates its policy.";
    PROTOCOL_ERROR: "MyScript recognition server terminated the connection due to a protocol error.";
    SERVICE_RESTART: "MyScript recognition server terminated the connection because it is restarting.";
    TLS_HANDSHAKE: "MyScript recognition server connection was closed due to a failure to perform a TLS handshake";
    TOO_OLD: "Session is too old. Max Session Duration Reached.";
    TRY_AGAIN: "MyScript recognition server terminated the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients.";
    UNKNOW: "An unknown error has occurred.";
    UNSUPPORTED_DATA: "MyScript recognition server terminated the connection because the endpoint received data of a type it cannot accept. (For example, a text-only endpoint received binary data.)";
    WRONG_CREDENTIALS: "Application credentials are invalid. Please check or regenerate your application key and hmackey.";
} = ...
+
+

Type declaration

+
    +
  • +
    Readonly ABNORMAL_CLOSURE: "MyScript recognition server is not reachable."
  • +
  • +
    Readonly BAD_GATEWAY: "MyScript recognition server was acting as a gateway or proxy and received an invalid response from the upstream server."
  • +
  • +
    Readonly CANT_ESTABLISH: "Unable to establish a connection to MyScript recognition server. Check the host and your connectivity."
  • +
  • +
    Readonly GOING_AWAY: "MyScript recognition server is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection."
  • +
  • +
    Readonly INTERNAL_ERROR: "MyScript recognition server terminated the connection because it encountered an unexpected condition that prevented it from fulfilling the request."
  • +
  • +
    Readonly INVALID_FRAME_PAULOAD: "MyScript recognition server terminated the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message)."
  • +
  • +
    Readonly MESSAGE_TOO_BIG: "MyScript recognition server terminated the connection because a data frame was received that is too large."
  • +
  • +
    Readonly NO_ACTIVITY: "Session closed due to no activity."
  • +
  • +
    Readonly POLICY_VIOLATION: "MyScript recognition server terminated the connection because it received a message that violates its policy."
  • +
  • +
    Readonly PROTOCOL_ERROR: "MyScript recognition server terminated the connection due to a protocol error."
  • +
  • +
    Readonly SERVICE_RESTART: "MyScript recognition server terminated the connection because it is restarting."
  • +
  • +
    Readonly TLS_HANDSHAKE: "MyScript recognition server connection was closed due to a failure to perform a TLS handshake"
  • +
  • +
    Readonly TOO_OLD: "Session is too old. Max Session Duration Reached."
  • +
  • +
    Readonly TRY_AGAIN: "MyScript recognition server terminated the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients."
  • +
  • +
    Readonly UNKNOW: "An unknown error has occurred."
  • +
  • +
    Readonly UNSUPPORTED_DATA: "MyScript recognition server terminated the connection because the endpoint received data of a type it cannot accept. (For example, a text-only endpoint received binary data.)"
  • +
  • +
    Readonly WRONG_CREDENTIALS: "Application credentials are invalid. Please check or regenerate your application key and hmackey."
+
+

Remarks

List all errors generated by the backend with their descriptions

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/variables/constants.EventType.html b/docs/variables/constants.EventType.html new file mode 100644 index 000000000..3a4a95e96 --- /dev/null +++ b/docs/variables/constants.EventType.html @@ -0,0 +1,118 @@ +EventType | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Variable EventTypeConst

+
EventType: {
    CHANGED: "changed";
    CLEARED: "cleared";
    CONVERTED: "converted";
    ERROR: "error";
    EXPORTED: "exported";
    IDLE: "idle";
    IMPORTED: "imported";
    LOADED: "loaded";
    POINTEREVENTS: "pointer_events";
} = ...
+
+

Type declaration

+
    +
  • +
    Readonly CHANGED: "changed"
    +

    event emitted when history has changed i.e. the context of undo-redo

    +
    +
  • +
  • +
    Readonly CLEARED: "cleared"
    +

    event emitted when clearing is complete

    +
    +
  • +
  • +
    Readonly CONVERTED: "converted"
    +

    event emitted after the conversion is complete

    +
    +
  • +
  • +
    Readonly ERROR: "error"
    +

    event emitted when the editor encounters an error

    +
    +
  • +
  • +
    Readonly EXPORTED: "exported"
    +

    event emitted after the end of the export

    +
    +
  • +
  • +
    Readonly IDLE: "idle"
    +

    event emitted when the server is idle after a job

    +
    +
  • +
  • +
    Readonly IMPORTED: "imported"
    +

    event emitted after the end of the import

    +
    +
  • +
  • +
    Readonly LOADED: "loaded"
    +

    event emitted after full editor initialization

    +
    +
  • +
  • +
    Readonly POINTEREVENTS: "pointer_events"
    +

    event emitted on click on pointer events

    +
    +
+
+

Remarks

Lists all events that can be listened to on the editor or DOM element

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/variables/constants.InternalEventType.html b/docs/variables/constants.InternalEventType.html new file mode 100644 index 000000000..202cc5ac9 --- /dev/null +++ b/docs/variables/constants.InternalEventType.html @@ -0,0 +1,95 @@ +InternalEventType | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Variable InternalEventTypeConst Internal

+
InternalEventType: {
    CLEAR: "internal_clear";
    CLEAR_MESSAGE: "internal_clear_message";
    CONTEXT_CHANGE: "internal_context_change";
    CONVERT: "internal_convert";
    ERROR: "internal_error";
    EXPORTED: "internal_exported";
    IDLE: "internal_idle";
    IMPORT_JIIX: "internal_import_jiix";
    NOTIF: "internal_notif";
    SVG_PATCH: "internal_svg_patch";
    WS_CLOSED: "internal_websocket_closed";
} = ...
+
+

Type declaration

+
    +
  • +
    Readonly CLEAR: "internal_clear"
  • +
  • +
    Readonly CLEAR_MESSAGE: "internal_clear_message"
  • +
  • +
    Readonly CONTEXT_CHANGE: "internal_context_change"
  • +
  • +
    Readonly CONVERT: "internal_convert"
  • +
  • +
    Readonly ERROR: "internal_error"
  • +
  • +
    Readonly EXPORTED: "internal_exported"
  • +
  • +
    Readonly IDLE: "internal_idle"
  • +
  • +
    Readonly IMPORT_JIIX: "internal_import_jiix"
  • +
  • +
    Readonly NOTIF: "internal_notif"
  • +
  • +
    Readonly SVG_PATCH: "internal_svg_patch"
  • +
  • +
    Readonly WS_CLOSED: "internal_websocket_closed"
+
+

Remarks

Lists all internal library events

+
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/variables/renderer.canvasRendererShape.ShapeSymbols.html b/docs/variables/renderer.canvasRendererShape.ShapeSymbols.html new file mode 100644 index 000000000..018635a59 --- /dev/null +++ b/docs/variables/renderer.canvasRendererShape.ShapeSymbols.html @@ -0,0 +1,87 @@ +ShapeSymbols | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Variable ShapeSymbolsConst

+
ShapeSymbols: {
    ellipse: string;
    line: string;
    recognizedShape: string;
    shape: string;
    table: string;
} = { + table: "table", + shape: "shape", + recognizedShape: "recognizedShape", + ellipse: "ellipse", + line: "line" +}
+
+

Type declaration

+
    +
  • +
    ellipse: string
  • +
  • +
    line: string
  • +
  • +
    recognizedShape: string
  • +
  • +
    shape: string
  • +
  • +
    table: string
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/variables/renderer.canvasRendererText.TextSymbols.html b/docs/variables/renderer.canvasRendererText.TextSymbols.html new file mode 100644 index 000000000..a8779d888 --- /dev/null +++ b/docs/variables/renderer.canvasRendererText.TextSymbols.html @@ -0,0 +1,84 @@ +TextSymbols | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Variable TextSymbolsConst

+
TextSymbols: {
    char: string;
    inputCharacter: string;
    string: string;
    textLine: string;
} = { + inputCharacter: "inputCharacter", + char: "char", + string: "string", + textLine: "textLine" +}
+
+

Type declaration

+
    +
  • +
    char: string
  • +
  • +
    inputCharacter: string
  • +
  • +
    string: string
  • +
  • +
    textLine: string
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/variables/style.DefaultPenStyle.html b/docs/variables/style.DefaultPenStyle.html new file mode 100644 index 000000000..be08e05ea --- /dev/null +++ b/docs/variables/style.DefaultPenStyle.html @@ -0,0 +1,67 @@ +DefaultPenStyle | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Variable DefaultPenStyleConst

+
DefaultPenStyle: TPenStyle = {}
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/variables/style.DefaultTheme.html b/docs/variables/style.DefaultTheme.html new file mode 100644 index 000000000..c560d99ff --- /dev/null +++ b/docs/variables/style.DefaultTheme.html @@ -0,0 +1,86 @@ +DefaultTheme | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Variable DefaultThemeConst

+
DefaultTheme: TTheme = { + ink: { + color: "#000000", + width: 1, + "-myscript-pen-width": 1, + "-myscript-pen-fill-style": "none", + "-myscript-pen-fill-color": "#FFFFFF00" + }, + ".math": { + "font-family": "STIXGeneral" + }, + ".math-solved": { + "font-family": "STIXGeneral", + color: "#A8A8A8FF" + }, + ".text": { + "font-family": "MyScriptInter", + "font-size": 10 + } +}
+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/variables/style.StyleHelper.html b/docs/variables/style.StyleHelper.html new file mode 100644 index 000000000..5fd3c4299 --- /dev/null +++ b/docs/variables/style.StyleHelper.html @@ -0,0 +1,196 @@ +StyleHelper | iink-ts - v1.0.0-buildVersion
+
+ +
+
+
+
+ +

Variable StyleHelperConst

+
StyleHelper: {
    JSONToString(style) => string;
    penStyleToCSS(penStyle) => string;
    penStyleToJSON(penStyleString) => TPenStyle;
    stringToJSON(style) => {
        [key: string]: string;
    };
    themeToCSS(json) => string;
    themeToJSON(style) => TTheme;
} = { + themeToCSS(json: TTheme): string { + return parser.toCSS(json) as string; + }, + themeToJSON(style: string): TTheme { + const theme = parser.toJSON(style) as TTheme; + theme[".text"]["font-size"] = Number(theme[".text"]["font-size"]); + theme.ink["-myscript-pen-width"] = Number(theme.ink["-myscript-pen-width"]); + theme.ink.width = Number(theme.ink.width); + return theme; + }, + penStyleToCSS(penStyle: TPenStyle): string { + let css = parser.toCSS({ css: penStyle }) as string; + css = css.substring(6, css.length - 3); + return css; + }, + penStyleToJSON(penStyleString: string): TPenStyle { + const penStyle = parser.toJSON(`css {${penStyleString}}`).css as TPenStyle; + if (penStyle.width) { + penStyle.width = Number(penStyle.width); + } + else { + delete penStyle.width; + } + if (penStyle["-myscript-pen-width"]) { + penStyle["-myscript-pen-width"] = Number(penStyle["-myscript-pen-width"]); + } + else { + delete penStyle["-myscript-pen-width"]; + } + return penStyle; + }, + stringToJSON(style: string): { + [key: string]: string; + } { + return parser.toJSON(`css {${style}}`).css; + }, + JSONToString(style: { + [key: string]: string; + }): string { + return Object.entries(style).map(([k, v]) => `${k}:${v}`).join(";"); + } +}
+
+

Type declaration

+
    +
  • +
    JSONToString:function
    +
      + +
    • +
      +

      Parameters

      +
        +
      • +
        style: {
            [key: string]: string;
        }
        +
          +
        • +
          [key: string]: string
      +

      Returns string

  • +
  • +
    penStyleToCSS:function
    +
      + +
    • +
      +

      Parameters

      +
      +

      Returns string

  • +
  • +
    penStyleToJSON:function
    +
      + +
    • +
      +

      Parameters

      +
        +
      • +
        penStyleString: string
      +

      Returns TPenStyle

  • +
  • +
    stringToJSON:function
    +
      + +
    • +
      +

      Parameters

      +
        +
      • +
        style: string
      +

      Returns {
          [key: string]: string;
      }

      +
        +
      • +
        [key: string]: string
  • +
  • +
    themeToCSS:function
    +
      + +
    • +
      +

      Parameters

      +
      +

      Returns string

  • +
  • +
    themeToJSON:function
    +
      + +
    • +
      +

      Parameters

      +
        +
      • +
        style: string
      +

      Returns TTheme

+
+ +
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/examples/server-configuration.json b/examples/server-configuration.json index 8ace2172b..ac60f62c5 100644 --- a/examples/server-configuration.json +++ b/examples/server-configuration.json @@ -1,6 +1,6 @@ { - "scheme": "http", - "host": "localhost:8897", - "applicationKey": "30a605cb-95ea-45ac-aea5-c093322c5100", - "hmacKey": "dc2afdde-40e9-4e96-9d11-430100771123" + "scheme": "https", + "host": "cloud.preprod.myscript.com", + "applicationKey": "df0e4940-0927-45f0-9873-686bfd51395d", + "hmacKey": "b12a8e02-ce2a-4539-b4d8-b8c1b09fda1d" } diff --git a/favicon.ico b/favicon.ico deleted file mode 100644 index 73b1792a595144fc4b21a7aa3207c491cd9065b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmbu3u?>JQ35J|Gw{0tm#( zM0BrOO0P{`tGu@9znU=(<5blwn5}5p=@s9cSvf1=Y2DtQGa%wgBH60$+>aSZ LR|nsvhxYFVnB5%* diff --git a/index.html b/index.html new file mode 100644 index 000000000..d04f1836b --- /dev/null +++ b/index.html @@ -0,0 +1 @@ +Title diff --git a/jest.integration.config.js b/jest.integration.config.js deleted file mode 100644 index ec9c37a80..000000000 --- a/jest.integration.config.js +++ /dev/null @@ -1,65 +0,0 @@ -import { devices } from "playwright" - -const projects = [ - { - name: "Desktop Chrome", - ...devices["Desktop Chrome"] - }, - { - name: "Desktop Firefox", - ...devices["Desktop Firefox"] - }, - { - name: "Desktop Safari", - ...devices["Desktop Safari"] - }, - { - name: "Tablet Chrome", - ...devices["Galaxy Tab S4 landscape"] - }, - { - name: "Tablet Safari", - ...devices["iPad Mini landscape"], - }, -] - -const testEnvironmentOptions = { - "jest-playwright": { - contextOptions: { - baseURL: process.env.BASE_URL || "http://localhost:8000", - ignoreHTTPSErrors: true, - }, - exitOnPageError: true, - useDefaultBrowserType: true, - launchOptions: { - headless: process.env.HEADLESS === "false" ? false : true, - }, - }, -} -if (process.env.DEVICE) { - testEnvironmentOptions["jest-playwright"].devices = [process.env.DEVICE] -} -if (process.env.BROWSER) { - testEnvironmentOptions["jest-playwright"].browsers = [process.env.BROWSER] -} -if (process.env.PROJECT) { - const proj = projects.find(p => process.env.PROJECT === p.name) - testEnvironmentOptions["jest-playwright"].devices = [proj] - testEnvironmentOptions["jest-playwright"].browsers = [proj.defaultBrowserType] -} -if(!process.env.DEVICE && !process.env.BROWSER && !process.env.PROJECT) { - testEnvironmentOptions["jest-playwright"].devices = projects - testEnvironmentOptions["jest-playwright"].browsers = ["chromium", "firefox", "webkit"] -} - -export default { - preset: "jest-playwright-preset", - - testEnvironmentOptions, - - setupFilesAfterEnv: ["expect-playwright", "./test/integration/jest.setup.js"], - - testMatch: ["**/integration/**/*.test.js"], - - verbose: false, -} diff --git a/jest.unit.config.js b/jest.unit.config.js deleted file mode 100644 index 54aa8407b..000000000 --- a/jest.unit.config.js +++ /dev/null @@ -1,42 +0,0 @@ - -export default { - clearMocks: true, - // collectCoverage: true, - collectCoverageFrom: [ - "./src/**", - "!./src/@types/**" - ], - coverageThreshold: { - global: { - branches: 80, - functions: 80, - lines: 80, - // statements: -10, - }, - }, - coverageDirectory: "coverage", - coverageProvider: "v8", - moduleFileExtensions: [ - "ts", - "js" - ], - preset: "ts-jest", - setupFiles: [ - "jest-canvas-mock", - "./test/unit/jest.setup.js" - ], - setupFilesAfterEnv: [ - "jest-websocket-mock" - ], - testEnvironment: "jsdom", - testMatch: [ - "**/unit/**/*.test.ts" - ], - testPathIgnorePatterns: [ - "/node_modules/" - ], - transform: { - "^.+\\.css$": "jest-transform-css" - }, - verbose: false -} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index ffdc1c3b5..000000000 --- a/package-lock.json +++ /dev/null @@ -1,21241 +0,0 @@ -{ - "name": "iink-ts", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "iink-ts", - "version": "1.0.0", - "license": "Apache-2.0", - "dependencies": { - "crypto-js": "^3.3.0", - "json-css": "^1.5.6" - }, - "devDependencies": { - "@rollup/plugin-node-resolve": "^13.3.0", - "@types/jest": "^29.2.0", - "@types/node": "^18.11.5", - "@typescript-eslint/eslint-plugin": "^5.33.0", - "@typescript-eslint/parser": "^5.33.0", - "babel-jest": "^29.2.2", - "eslint": "^8.22.0", - "eslint-plugin-jest": "^27.1.3", - "eslint-plugin-playwright": "^0.11.2", - "jest": "^29.0.0", - "jest-canvas-mock": "^2.4.0", - "jest-environment-jsdom": "^28.1.3", - "jest-fetch-mock": "^3.0.3", - "jest-playwright-preset": "^2.0.0", - "jest-transform-css": "^4.0.1", - "jest-websocket-mock": "^2.4.0", - "npm-run-all": "^4.1.5", - "playwright": "^1.27.1", - "postcss": "^8.4.16", - "rollup": "^2.76.0", - "rollup-plugin-commonjs": "^10.1.0", - "rollup-plugin-delete": "^2.0.0", - "rollup-plugin-dts": "^4.2.2", - "rollup-plugin-livereload": "^2.0.5", - "rollup-plugin-postcss": "^4.0.2", - "rollup-plugin-serve": "^2.0.0", - "rollup-plugin-terser": "^7.0.2", - "rollup-plugin-typescript2": "^0.32.1", - "ts-jest": "^29.0.3", - "ts-node": "^10.9.1", - "tslib": "^2.4.0", - "typedoc": "^0.23.24", - "typedoc-plugin-missing-exports": "^1.0.0", - "typescript": "^4.7.4" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.10", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", - "dev": true, - "dependencies": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", - "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", - "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.11", - "@babel/types": "^7.18.10", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", - "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.2", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "dev": true - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz", - "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/console/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz", - "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==", - "dev": true, - "dependencies": { - "@jest/console": "^29.3.1", - "@jest/reporters": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.2.0", - "jest-config": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-resolve-dependencies": "^29.3.1", - "jest-runner": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "jest-watcher": "^29.3.1", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/jest-docblock": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", - "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-environment-node": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", - "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-leak-detector": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", - "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-runner": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", - "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", - "dev": true, - "dependencies": { - "@jest/console": "^29.3.1", - "@jest/environment": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.2.0", - "jest-environment-node": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-leak-detector": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-resolve": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-util": "^29.3.1", - "jest-watcher": "^29.3.1", - "jest-worker": "^29.3.1", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/environment": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", - "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "jest-mock": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/environment/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", - "dev": true, - "peer": true, - "dependencies": { - "expect": "^28.1.3", - "jest-snapshot": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", - "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.2.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect/node_modules/@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", - "dev": true, - "peer": true, - "dependencies": { - "jest-get-type": "^28.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/@jest/expect/node_modules/jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/@jest/fake-timers": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", - "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/fake-timers/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz", - "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/expect": "^29.3.1", - "@jest/types": "^29.3.1", - "jest-mock": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@jest/expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", - "dev": true, - "dependencies": { - "expect": "^29.3.1", - "jest-snapshot": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/globals/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz", - "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@jridgewell/trace-mapping": "^0.3.15", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "jest-worker": "^29.3.1", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/schemas": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", - "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", - "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.15", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz", - "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==", - "dev": true, - "dependencies": { - "@jest/console": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz", - "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.3.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz", - "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.3.1", - "@jridgewell/trace-mapping": "^0.3.15", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.3.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform/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==", - "dev": true - }, - "node_modules/@jest/transform/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", - "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "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==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", - "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "deepmerge": "^4.2.2", - "is-builtin-module": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "rollup": "^2.42.0" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", - "dev": true - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "dev": true - }, - "node_modules/@sinclair/typebox": { - "version": "0.24.28", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.28.tgz", - "integrity": "sha512-dgJd3HLOkLmz4Bw50eZx/zJwtBq65nms3N9VBYu5LTjJ883oBFkTyXRlCB/ZGGwqYpJJHA5zW2Ibhl5ngITfow==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.1.20", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", - "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.3.0" - } - }, - "node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.2.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.4.tgz", - "integrity": "sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A==", - "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/jest/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@types/jest/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jsdom": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.15.tgz", - "integrity": "sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/parse5": "^6.0.3", - "@types/tough-cookie": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.11.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.11.tgz", - "integrity": "sha512-KJ021B1nlQUBLopzZmPBVuGU9un7WJd/W4ya7Ih02B4Uwky5Nja0yGYav2EfYIk0RR2Q9oVhf60S2XR1BCWJ2g==", - "dev": true - }, - "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==", - "dev": true - }, - "node_modules/@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", - "dev": true - }, - "node_modules/@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "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==", - "dev": true - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", - "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", - "dev": true - }, - "node_modules/@types/wait-on": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@types/wait-on/-/wait-on-5.3.1.tgz", - "integrity": "sha512-2FFOKCF/YydrMUaqg+fkk49qf0e5rDgwt6aQsMzFQzbS419h2gNOXyiwp/o2yYy27bi/C1z+HgfncryjGzlvgQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.11", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.11.tgz", - "integrity": "sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA==", - "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==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.1.tgz", - "integrity": "sha512-S1iZIxrTvKkU3+m63YUOxYPKaP+yWDQrdhxTglVDVEVBf+aCSw85+BmJnyUaQQsk5TXFG/LpBu9fa+LrAQ91fQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.33.1", - "@typescript-eslint/type-utils": "5.33.1", - "@typescript-eslint/utils": "5.33.1", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.33.1.tgz", - "integrity": "sha512-IgLLtW7FOzoDlmaMoXdxG8HOCByTBXrB1V2ZQYSEV1ggMmJfAkMWTwUjjzagS6OkfpySyhKFkBw7A9jYmcHpZA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.33.1", - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/typescript-estree": "5.33.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.1.tgz", - "integrity": "sha512-8ibcZSqy4c5m69QpzJn8XQq9NnqAToC8OdH/W6IXPXv83vRyEDPYLdjAlUx8h/rbusq6MkW4YdQzURGOqsn3CA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/visitor-keys": "5.33.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.33.1.tgz", - "integrity": "sha512-X3pGsJsD8OiqhNa5fim41YtlnyiWMF/eKsEZGsHID2HcDqeSC5yr/uLOeph8rNF2/utwuI0IQoAK3fpoxcLl2g==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "5.33.1", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.1.tgz", - "integrity": "sha512-7K6MoQPQh6WVEkMrMW5QOA5FO+BOwzHSNd0j3+BlBwd6vtzfZceJ8xJ7Um2XDi/O3umS8/qDX6jdy2i7CijkwQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.1.tgz", - "integrity": "sha512-JOAzJ4pJ+tHzA2pgsWQi4804XisPHOtbvwUyqsuuq8+y5B5GMZs7lI1xDWs6V2d7gE/Ez5bTGojSK12+IIPtXA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/visitor-keys": "5.33.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.33.1.tgz", - "integrity": "sha512-uphZjkMaZ4fE8CR4dU7BquOV6u0doeQAr8n6cQenl/poMaIyJtBu8eys5uk6u5HiDH01Mj5lzbJ5SfeDz7oqMQ==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.33.1", - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/typescript-estree": "5.33.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.1.tgz", - "integrity": "sha512-nwIxOK8Z2MPWltLKMLOEZwmfBZReqUdbEoHQXeCpa+sRVARe5twpJGHCB4dk9903Yaf0nMAlGbQfaAH92F60eg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.33.1", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-sequence-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", - "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", - "dev": true - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "dependencies": { - "default-require-extensions": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/babel-jest": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz", - "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==", - "dev": true, - "dependencies": { - "@jest/transform": "^29.3.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.2.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", - "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", - "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.2.0", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/caching-transform/node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "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==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001378", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001378.tgz", - "integrity": "sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ci-info": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", - "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", - "dev": true - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "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==", - "dev": true - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/concat-with-sourcemaps": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", - "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", - "dev": true, - "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dev": true, - "dependencies": { - "node-fetch": "2.6.7" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-js": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", - "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" - }, - "node_modules/css-declaration-sorter": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz", - "integrity": "sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssfontparser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", - "integrity": "sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg==", - "dev": true - }, - "node_modules/cssnano": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz", - "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==", - "dev": true, - "dependencies": { - "cssnano-preset-default": "^5.2.12", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", - "dev": true, - "dependencies": { - "css-declaration-sorter": "^6.3.0", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/cwd": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", - "integrity": "sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==", - "dev": true, - "dependencies": { - "find-pkg": "^0.1.2", - "fs-exists-sync": "^0.1.0" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.0.tgz", - "integrity": "sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==", - "dev": true - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/del": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", - "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", - "dev": true, - "dependencies": { - "globby": "^10.0.1", - "graceful-fs": "^4.2.2", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.1", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/del/node_modules/globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", - "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "dev": true, - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.222", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.222.tgz", - "integrity": "sha512-gEM2awN5HZknWdLbngk4uQCVfhucFAfFzuchP3wM3NN6eow1eDU0dFy2kts43FB20ZfhVFF0jmFSTb1h5OhyIg==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", - "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "unbox-primitive": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "engines": { - "node": ">= 0.8.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==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.22.0.tgz", - "integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.3", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-jest": { - "version": "27.1.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.1.6.tgz", - "integrity": "sha512-XA7RFLSrlQF9IGtAmhddkUkBuICCTuryfOTfCSWcZHiHb69OilIH05oozH2XA6CEOtztnOd0vgXyvxZodkxGjg==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "^5.10.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-playwright": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-0.11.2.tgz", - "integrity": "sha512-uRLRLk7uTzc8NE6t4wBU8dijQwHvC66R/h7xwdM779jsJjMUtSmeaB8ayRkkpfwi+UU5BEfwvDANwmE+ccMVDw==", - "dev": true, - "peerDependencies": { - "eslint": ">=7", - "eslint-plugin-jest": ">=24" - }, - "peerDependenciesMeta": { - "eslint-plugin-jest": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-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==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/espree": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", - "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==", - "dev": true, - "dependencies": { - "os-homedir": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect-playwright": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/expect-playwright/-/expect-playwright-0.8.0.tgz", - "integrity": "sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg==", - "dev": true - }, - "node_modules/expect/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/expect/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-file-up": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz", - "integrity": "sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==", - "dev": true, - "dependencies": { - "fs-exists-sync": "^0.1.0", - "resolve-dir": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/find-pkg": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz", - "integrity": "sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==", - "dev": true, - "dependencies": { - "find-file-up": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/find-process": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz", - "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "commander": "^5.1.0", - "debug": "^4.1.1" - }, - "bin": { - "find-process": "bin/find-process.js" - } - }, - "node_modules/find-process/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", - "dev": true - }, - "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==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/fs-exists-sync": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/generic-names": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", - "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", - "dev": true, - "dependencies": { - "loader-utils": "^3.2.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==", - "dev": true, - "dependencies": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.0", - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "which": "^1.2.12" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasha/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", - "dev": true - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==", - "dev": true, - "dependencies": { - "import-from": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==", - "dev": true, - "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-from/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-builtin-module": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", - "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", - "dev": true, - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "dependencies": { - "append-transform": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "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", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "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==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", - "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", - "dev": true, - "dependencies": { - "@jest/core": "^29.3.1", - "@jest/types": "^29.3.1", - "import-local": "^3.0.2", - "jest-cli": "^29.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-canvas-mock": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.4.0.tgz", - "integrity": "sha512-mmMpZzpmLzn5vepIaHk5HoH3Ka4WykbSoLuG/EKoJd0x0ID/t+INo1l8ByfcUJuDM+RIsL4QDg/gDnBbrj2/IQ==", - "dev": true, - "dependencies": { - "cssfontparser": "^1.2.1", - "moo-color": "^1.0.2" - } - }, - "node_modules/jest-changed-files": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", - "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", - "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "p-limit": "^3.1.0", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", - "dev": true, - "peer": true, - "dependencies": { - "jest-get-type": "^28.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/globals": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", - "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/types": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/source-map": { - "version": "28.1.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", - "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.13", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-circus/node_modules/diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-circus/node_modules/jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-resolve": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", - "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-runtime": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", - "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/globals": "^28.1.3", - "@jest/source-map": "^28.1.2", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "leven": "^3.1.0", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jest-cli": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz", - "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==", - "dev": true, - "dependencies": { - "@jest/core": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz", - "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.3.1", - "@jest/types": "^29.3.1", - "babel-jest": "^29.3.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.3.1", - "jest-environment-node": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-runner": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/@jest/expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", - "dev": true, - "dependencies": { - "expect": "^29.3.1", - "jest-snapshot": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/jest-circus": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz", - "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/expect": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "p-limit": "^3.1.0", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-docblock": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", - "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-each": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz", - "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "jest-util": "^29.3.1", - "pretty-format": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-environment-node": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", - "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-leak-detector": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", - "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-runner": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", - "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", - "dev": true, - "dependencies": { - "@jest/console": "^29.3.1", - "@jest/environment": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.2.0", - "jest-environment-node": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-leak-detector": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-resolve": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-util": "^29.3.1", - "jest-watcher": "^29.3.1", - "jest-worker": "^29.3.1", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", - "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", - "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", - "dev": true, - "peer": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-each": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", - "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "jest-util": "^28.1.3", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-each/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-each/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-jsdom": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-28.1.3.tgz", - "integrity": "sha512-HnlGUmZRdxfCByd3GM2F100DgQOajUBzEitjGqIREcb45kGjZvRrKUdlaF6escXBdcXNl0OBh+1ZrfeZT3GnAg==", - "dev": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/jsdom": "^16.2.4", - "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3", - "jsdom": "^19.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", - "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-fetch-mock": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz", - "integrity": "sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==", - "dev": true, - "dependencies": { - "cross-fetch": "^3.0.4", - "promise-polyfill": "^8.1.3" - } - }, - "node_modules/jest-get-type": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", - "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz", - "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.3.1", - "jest-worker": "^29.3.1", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-haste-map/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-leak-detector": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", - "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", - "dev": true, - "peer": true, - "dependencies": { - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-leak-detector/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", - "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", - "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-message-util/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-mock": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", - "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-mock/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-playwright-preset": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jest-playwright-preset/-/jest-playwright-preset-2.0.0.tgz", - "integrity": "sha512-pV5ruTJJMen3lwshUL4dlSqLlP8z4q9MXqWJkmy+sB6HYfzXoqBHzhl+5hslznhnSVTe4Dwu+reiiwcUJpYUbw==", - "dev": true, - "dependencies": { - "expect-playwright": "^0.8.0", - "jest-process-manager": "^0.3.1", - "nyc": "^15.1.0", - "playwright-core": ">=1.2.0", - "rimraf": "^3.0.2", - "uuid": "^8.3.2" - }, - "peerDependencies": { - "jest": "^28.0.0", - "jest-circus": "^28.0.0", - "jest-environment-node": "^28.0.0", - "jest-runner": "^28.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-process-manager": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/jest-process-manager/-/jest-process-manager-0.3.1.tgz", - "integrity": "sha512-x9W54UgZ7IkzUHgXtnI1x4GKOVjxtwW0CA/7yGbTHtT/YhENO0Lic2yfVyC/gekn7OIEMcQmy0L1r9WLQABfqw==", - "dev": true, - "dependencies": { - "@types/wait-on": "^5.2.0", - "chalk": "^4.1.0", - "cwd": "^0.10.0", - "exit": "^0.1.2", - "find-process": "^1.4.4", - "prompts": "^2.4.1", - "signal-exit": "^3.0.3", - "spawnd": "^5.0.0", - "tree-kill": "^1.2.2", - "wait-on": "^5.3.0" - } - }, - "node_modules/jest-regex-util": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", - "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz", - "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz", - "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==", - "dev": true, - "dependencies": { - "jest-regex-util": "^29.2.0", - "jest-snapshot": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", - "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/console": "^28.1.3", - "@jest/environment": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "graceful-fs": "^4.2.9", - "jest-docblock": "^28.1.1", - "jest-environment-node": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-leak-detector": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-resolve": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-util": "^28.1.3", - "jest-watcher": "^28.1.3", - "jest-worker": "^28.1.3", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", - "dev": true, - "peer": true, - "dependencies": { - "jest-get-type": "^28.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/globals": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", - "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/types": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/source-map": { - "version": "28.1.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", - "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.13", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-runner/node_modules/diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-runner/node_modules/jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-resolve": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", - "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-runtime": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", - "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/globals": "^28.1.3", - "@jest/source-map": "^28.1.2", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^28.1.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "leven": "^3.1.0", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-watcher": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", - "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jest-runtime": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz", - "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/globals": "^29.3.1", - "@jest/source-map": "^29.2.0", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz", - "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.3.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-haste-map": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "natural-compare": "^1.4.0", - "pretty-format": "^29.3.1", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-transform-css": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jest-transform-css/-/jest-transform-css-4.0.1.tgz", - "integrity": "sha512-/rhrYXnLACL2rQ4ME6KtPGR2bKM27HDI6nRHGzGBrZXqkErN+PwxCz+wz6oflIf783szH8HWL0p5Iu7RXTSHYQ==", - "dev": true, - "dependencies": { - "common-tags": "1.8.2", - "cosmiconfig": "7.0.1", - "cross-spawn": "7.0.3", - "postcss-load-config": "2.0.0", - "postcss-modules": "4.3.1", - "style-inject": "0.3.0" - }, - "peerDependencies": { - "postcss": "^8.4.12" - } - }, - "node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-util/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz", - "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "leven": "^3.1.0", - "pretty-format": "^29.3.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-validate/node_modules/pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-watcher": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz", - "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.3.1", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-watcher/node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/jest-watcher/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-websocket-mock": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jest-websocket-mock/-/jest-websocket-mock-2.4.0.tgz", - "integrity": "sha512-AOwyuRw6fgROXHxMOiTDl1/T4dh3fV4jDquha5N0csS/PNp742HeTZWPAuKppVRSQ8s3fUGgJHoyZT9JDO0hMA==", - "dev": true, - "dependencies": { - "jest-diff": "^28.0.2", - "mock-socket": "^9.1.0" - } - }, - "node_modules/jest-websocket-mock/node_modules/diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-websocket-mock/node_modules/jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-websocket-mock/node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", - "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.3.1", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/joi": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz", - "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.0", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz", - "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", - "dev": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.5.0", - "acorn-globals": "^6.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.1", - "decimal.js": "^10.3.1", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^3.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^10.0.0", - "ws": "^8.2.3", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-css": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/json-css/-/json-css-1.5.6.tgz", - "integrity": "sha512-B/0T0OxZH9tSb93tXV6VOYtXqrPz/Vgz2QrCT/4NXen8HGElYkYr9V+8IrSVTMj/ftxa8cG1kcu7f3iAMlaFlQ==" - }, - "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", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/livereload": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.3.tgz", - "integrity": "sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw==", - "dev": true, - "dependencies": { - "chokidar": "^3.5.0", - "livereload-js": "^3.3.1", - "opts": ">= 1.2.0", - "ws": "^7.4.3" - }, - "bin": { - "livereload": "bin/livereload.js" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/livereload-js": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.4.1.tgz", - "integrity": "sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g==", - "dev": true - }, - "node_modules/livereload/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/loader-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", - "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", - "dev": true, - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "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==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mock-socket": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.1.5.tgz", - "integrity": "sha512-3DeNIcsQixWHHKk6NdoBhWI4t1VMj5/HzfnI1rE/pLl5qKx7+gd4DNA07ehTaZ6MoUU053si6Hd+YtiM/tQZfg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/moo-color": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.3.tgz", - "integrity": "sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==", - "dev": true, - "dependencies": { - "color-name": "^1.1.4" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "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==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "bin": { - "npm-run-all": "bin/npm-run-all/index.js", - "run-p": "bin/run-p/index.js", - "run-s": "bin/run-s/index.js" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm-run-all/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/npm-run-all/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/npm-run-all/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/npm-run-all/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/npm-run-all/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/npm-run-all/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-all/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-all/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nwsapi": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", - "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==", - "dev": true - }, - "node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/nyc/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/nyc/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nyc/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/nyc/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true, - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/opts": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", - "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==", - "dev": true - }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", - "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/playwright": { - "version": "1.32.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.32.1.tgz", - "integrity": "sha512-GnEizysWMvoqHC3I9l8+4/ZxeLwLNdJJG76xdKGxzOcIZDcw5RSk/FKrFb5CuA+zcLpjIM2p9eR9Z4CuUDkWXg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "playwright-core": "1.32.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/playwright-core": { - "version": "1.32.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.32.1.tgz", - "integrity": "sha512-KZYUQC10mXD2Am1rGlidaalNGYk3LU1vZqqNk0gT4XPty1jOqgup8KDP8l2CUlqoNKhXM5IfGjWgW37xvGllBA==", - "dev": true, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", - "dev": true, - "dependencies": { - "browserslist": "^4.20.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", - "dev": true, - "dependencies": { - "cosmiconfig": "^4.0.0", - "import-cwd": "^2.0.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/postcss-load-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/postcss-load-config/node_modules/cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", - "dev": true, - "dependencies": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-load-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/postcss-load-config/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dev": true, - "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-modules": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.3.1.tgz", - "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==", - "dev": true, - "dependencies": { - "generic-names": "^4.0.0", - "icss-replace-symbols": "^1.1.0", - "lodash.camelcase": "^4.3.0", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "string-hash": "^1.1.1" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dev": true, - "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dev": true, - "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/promise-polyfill": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.2.3.tgz", - "integrity": "sha512-Og0+jCRQetV84U8wVjMNccfGCnMQ9mGs9Hv78QFe+pSDD3gWTpz0y+1QCuxy5d/vBFuZ3iwP2eycAkvqIMPmWg==", - "dev": true - }, - "node_modules/promise.series": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz", - "integrity": "sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==", - "dev": true, - "dependencies": { - "expand-tilde": "^1.2.2", - "global-modules": "^0.2.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "2.78.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.0.tgz", - "integrity": "sha512-4+YfbQC9QEVvKTanHhIAFVUFSRsezvQF8vFOJwtGfb9Bb+r014S+qryr9PSmw8x6sMnPkmFBGAvIFVQxvJxjtg==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-commonjs": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz", - "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-commonjs.", - "dev": true, - "dependencies": { - "estree-walker": "^0.6.1", - "is-reference": "^1.1.2", - "magic-string": "^0.25.2", - "resolve": "^1.11.0", - "rollup-pluginutils": "^2.8.1" - }, - "peerDependencies": { - "rollup": ">=1.12.0" - } - }, - "node_modules/rollup-plugin-commonjs/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - }, - "node_modules/rollup-plugin-delete": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-delete/-/rollup-plugin-delete-2.0.0.tgz", - "integrity": "sha512-/VpLMtDy+8wwRlDANuYmDa9ss/knGsAgrDhM+tEwB1npHwNu4DYNmDfUL55csse/GHs9Q+SMT/rw9uiaZ3pnzA==", - "dev": true, - "dependencies": { - "del": "^5.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/rollup-plugin-dts": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-4.2.2.tgz", - "integrity": "sha512-A3g6Rogyko/PXeKoUlkjxkP++8UDVpgA7C+Tdl77Xj4fgEaIjPSnxRmR53EzvoYy97VMVwLAOcWJudaVAuxneQ==", - "dev": true, - "dependencies": { - "magic-string": "^0.26.1" - }, - "engines": { - "node": ">=v12.22.11" - }, - "funding": { - "url": "https://github.com/sponsors/Swatinem" - }, - "optionalDependencies": { - "@babel/code-frame": "^7.16.7" - }, - "peerDependencies": { - "rollup": "^2.55", - "typescript": "^4.1" - } - }, - "node_modules/rollup-plugin-dts/node_modules/magic-string": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", - "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/rollup-plugin-livereload": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-2.0.5.tgz", - "integrity": "sha512-vqQZ/UQowTW7VoiKEM5ouNW90wE5/GZLfdWuR0ELxyKOJUIaj+uismPZZaICU4DnWPVjnpCDDxEqwU7pcKY/PA==", - "dev": true, - "dependencies": { - "livereload": "^0.9.1" - }, - "engines": { - "node": ">=8.3" - } - }, - "node_modules/rollup-plugin-postcss": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-4.0.2.tgz", - "integrity": "sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "concat-with-sourcemaps": "^1.1.0", - "cssnano": "^5.0.1", - "import-cwd": "^3.0.0", - "p-queue": "^6.6.2", - "pify": "^5.0.0", - "postcss-load-config": "^3.0.0", - "postcss-modules": "^4.0.0", - "promise.series": "^0.2.0", - "resolve": "^1.19.0", - "rollup-pluginutils": "^2.8.2", - "safe-identifier": "^0.4.2", - "style-inject": "^0.3.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "postcss": "8.x" - } - }, - "node_modules/rollup-plugin-postcss/node_modules/import-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", - "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", - "dev": true, - "dependencies": { - "import-from": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup-plugin-postcss/node_modules/import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup-plugin-postcss/node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/rollup-plugin-postcss/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup-plugin-serve": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-serve/-/rollup-plugin-serve-2.0.1.tgz", - "integrity": "sha512-/9lnzylTMwbXNQUwWAO0DIxW145wl+rmikwFXgujLJ5N9bRfWcjP+qd1XM5wxSiw8ZlBAlFy/n2zRvzcG21bBw==", - "dev": true, - "dependencies": { - "mime": ">=2.4.6", - "opener": "1" - } - }, - "node_modules/rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/rollup-plugin-typescript2": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.32.1.tgz", - "integrity": "sha512-RanO8bp1WbeMv0bVlgcbsFNCn+Y3rX7wF97SQLDxf0fMLsg0B/QFF005t4AsGUcDgF3aKJHoqt4JF2xVaABeKw==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^4.1.2", - "find-cache-dir": "^3.3.2", - "fs-extra": "^10.0.0", - "resolve": "^1.20.0", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "rollup": ">=1.26.3", - "typescript": ">=2.4.0" - } - }, - "node_modules/rollup-plugin-typescript2/node_modules/@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "dev": true, - "dependencies": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/rollup-plugin-typescript2/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "dependencies": { - "estree-walker": "^0.6.1" - } - }, - "node_modules/rollup-pluginutils/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safe-identifier": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", - "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==", - "dev": true - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz", - "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/shiki": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.1.tgz", - "integrity": "sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==", - "dev": true, - "dependencies": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/spawn-wrap/node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawnd": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-5.0.0.tgz", - "integrity": "sha512-28+AJr82moMVWolQvlAIv3JcYDkjkFTEmfDc503wxrF5l2rQ3dFz6DpbXp3kD4zmgGGldfM4xM4v1sFj/ZaIOA==", - "dev": true, - "dependencies": { - "exit": "^0.1.2", - "signal-exit": "^3.0.3", - "tree-kill": "^1.2.2", - "wait-port": "^0.2.9" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", - "dev": true - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.padend": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", - "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "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==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-inject": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", - "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==", - "dev": true - }, - "node_modules/stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/terser/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-jest": { - "version": "29.0.3", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz", - "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.1", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typedoc": { - "version": "0.23.28", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.28.tgz", - "integrity": "sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==", - "dev": true, - "dependencies": { - "lunr": "^2.3.9", - "marked": "^4.2.12", - "minimatch": "^7.1.3", - "shiki": "^0.14.1" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 14.14" - }, - "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x" - } - }, - "node_modules/typedoc-plugin-missing-exports": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-1.0.0.tgz", - "integrity": "sha512-7s6znXnuAj1eD9KYPyzVzR1lBF5nwAY8IKccP5sdoO9crG4lpd16RoFpLsh2PccJM+I2NASpr0+/NMka6ThwVA==", - "dev": true, - "peerDependencies": { - "typedoc": "0.22.x || 0.23.x" - } - }, - "node_modules/typedoc/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/typedoc/node_modules/minimatch": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.5.tgz", - "integrity": "sha512-OzOamaOmNBJZUv2qqY1OSWa+++4YPpOkLgkc0w30Oov5ufKlWWXnFUl0l4dgmSv5Shq/zRVkEOXAe2NaqO4l5Q==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "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==", - "dev": true - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true - }, - "node_modules/vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "dev": true - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", - "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", - "dev": true, - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/wait-on": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz", - "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==", - "dev": true, - "dependencies": { - "axios": "^0.21.1", - "joi": "^17.3.0", - "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^6.6.3" - }, - "bin": { - "wait-on": "bin/wait-on" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/wait-port": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-0.2.14.tgz", - "integrity": "sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "commander": "^3.0.2", - "debug": "^4.1.1" - }, - "bin": { - "wait-port": "bin/wait-port.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wait-port/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wait-port/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wait-port/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/wait-port/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/wait-port/node_modules/commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true - }, - "node_modules/wait-port/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/wait-port/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wait-port/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", - "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", - "dev": true, - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "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==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", - "dev": true - }, - "@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", - "dev": true, - "requires": { - "@babel/types": "^7.18.10", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", - "dev": true, - "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", - "dev": true, - "requires": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", - "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - } - }, - "@babel/traverse": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", - "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.11", - "@babel/types": "^7.18.10", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", - "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.2", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "dev": true - }, - "@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dev": true, - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz", - "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "slash": "^3.0.0" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "@jest/core": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz", - "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==", - "dev": true, - "requires": { - "@jest/console": "^29.3.1", - "@jest/reporters": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.2.0", - "jest-config": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-resolve-dependencies": "^29.3.1", - "jest-runner": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "jest-watcher": "^29.3.1", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - } - }, - "@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - } - }, - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true - }, - "jest-docblock": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", - "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-environment-node": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", - "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", - "dev": true, - "requires": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - } - }, - "jest-leak-detector": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", - "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", - "dev": true, - "requires": { - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - } - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - } - }, - "jest-runner": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", - "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", - "dev": true, - "requires": { - "@jest/console": "^29.3.1", - "@jest/environment": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.2.0", - "jest-environment-node": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-leak-detector": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-resolve": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-util": "^29.3.1", - "jest-watcher": "^29.3.1", - "jest-worker": "^29.3.1", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "@jest/environment": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", - "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "jest-mock": "^28.1.3" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - } - } - }, - "@jest/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", - "dev": true, - "peer": true, - "requires": { - "expect": "^28.1.3", - "jest-snapshot": "^28.1.3" - }, - "dependencies": { - "@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", - "dev": true, - "peer": true, - "requires": { - "jest-get-type": "^28.0.2" - } - }, - "@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - } - }, - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "peer": true - }, - "expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", - "dev": true, - "peer": true, - "requires": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - } - }, - "jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true - }, - "jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "peer": true - }, - "jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - } - }, - "jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/expect-utils": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", - "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", - "dev": true, - "requires": { - "jest-get-type": "^29.2.0" - } - }, - "@jest/fake-timers": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", - "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - } - } - }, - "@jest/globals": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz", - "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==", - "dev": true, - "requires": { - "@jest/environment": "^29.3.1", - "@jest/expect": "^29.3.1", - "@jest/types": "^29.3.1", - "jest-mock": "^29.3.1" - }, - "dependencies": { - "@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - } - }, - "@jest/expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", - "dev": true, - "requires": { - "expect": "^29.3.1", - "jest-snapshot": "^29.3.1" - } - }, - "@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - } - }, - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "@jest/reporters": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz", - "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@jridgewell/trace-mapping": "^0.3.15", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "jest-worker": "^29.3.1", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "@jest/schemas": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", - "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/source-map": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", - "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.15", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz", - "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==", - "dev": true, - "requires": { - "@jest/console": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz", - "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==", - "dev": true, - "requires": { - "@jest/test-result": "^29.3.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "slash": "^3.0.0" - } - }, - "@jest/transform": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz", - "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.3.1", - "@jridgewell/trace-mapping": "^0.3.15", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.3.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "dependencies": { - "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==", - "dev": true - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } - } - }, - "@jest/types": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", - "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - } - } - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@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==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@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==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@rollup/plugin-node-resolve": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", - "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "deepmerge": "^4.2.2", - "is-builtin-module": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - } - }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - } - }, - "@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "dev": true, - "requires": { - "@hapi/hoek": "^9.0.0" - } - }, - "@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", - "dev": true - }, - "@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "dev": true - }, - "@sinclair/typebox": { - "version": "0.24.28", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.28.tgz", - "integrity": "sha512-dgJd3HLOkLmz4Bw50eZx/zJwtBq65nms3N9VBYu5LTjJ883oBFkTyXRlCB/ZGGwqYpJJHA5zW2Ibhl5ngITfow==", - "dev": true - }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "@types/babel__core": { - "version": "7.1.20", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", - "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@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==", - "dev": true - }, - "@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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "29.2.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.4.tgz", - "integrity": "sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A==", - "dev": true, - "requires": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "@types/jsdom": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.15.tgz", - "integrity": "sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/parse5": "^6.0.3", - "@types/tough-cookie": "*" - } - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "@types/node": { - "version": "18.11.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.11.tgz", - "integrity": "sha512-KJ021B1nlQUBLopzZmPBVuGU9un7WJd/W4ya7Ih02B4Uwky5Nja0yGYav2EfYIk0RR2Q9oVhf60S2XR1BCWJ2g==", - "dev": true - }, - "@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==", - "dev": true - }, - "@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", - "dev": true - }, - "@types/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", - "dev": true - }, - "@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@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==", - "dev": true - }, - "@types/tough-cookie": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", - "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", - "dev": true - }, - "@types/wait-on": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@types/wait-on/-/wait-on-5.3.1.tgz", - "integrity": "sha512-2FFOKCF/YydrMUaqg+fkk49qf0e5rDgwt6aQsMzFQzbS419h2gNOXyiwp/o2yYy27bi/C1z+HgfncryjGzlvgQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/yargs": { - "version": "17.0.11", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.11.tgz", - "integrity": "sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA==", - "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==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.1.tgz", - "integrity": "sha512-S1iZIxrTvKkU3+m63YUOxYPKaP+yWDQrdhxTglVDVEVBf+aCSw85+BmJnyUaQQsk5TXFG/LpBu9fa+LrAQ91fQ==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.33.1", - "@typescript-eslint/type-utils": "5.33.1", - "@typescript-eslint/utils": "5.33.1", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.33.1.tgz", - "integrity": "sha512-IgLLtW7FOzoDlmaMoXdxG8HOCByTBXrB1V2ZQYSEV1ggMmJfAkMWTwUjjzagS6OkfpySyhKFkBw7A9jYmcHpZA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.33.1", - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/typescript-estree": "5.33.1", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.1.tgz", - "integrity": "sha512-8ibcZSqy4c5m69QpzJn8XQq9NnqAToC8OdH/W6IXPXv83vRyEDPYLdjAlUx8h/rbusq6MkW4YdQzURGOqsn3CA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/visitor-keys": "5.33.1" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.33.1.tgz", - "integrity": "sha512-X3pGsJsD8OiqhNa5fim41YtlnyiWMF/eKsEZGsHID2HcDqeSC5yr/uLOeph8rNF2/utwuI0IQoAK3fpoxcLl2g==", - "dev": true, - "requires": { - "@typescript-eslint/utils": "5.33.1", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.1.tgz", - "integrity": "sha512-7K6MoQPQh6WVEkMrMW5QOA5FO+BOwzHSNd0j3+BlBwd6vtzfZceJ8xJ7Um2XDi/O3umS8/qDX6jdy2i7CijkwQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.1.tgz", - "integrity": "sha512-JOAzJ4pJ+tHzA2pgsWQi4804XisPHOtbvwUyqsuuq8+y5B5GMZs7lI1xDWs6V2d7gE/Ez5bTGojSK12+IIPtXA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/visitor-keys": "5.33.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.33.1.tgz", - "integrity": "sha512-uphZjkMaZ4fE8CR4dU7BquOV6u0doeQAr8n6cQenl/poMaIyJtBu8eys5uk6u5HiDH01Mj5lzbJ5SfeDz7oqMQ==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.33.1", - "@typescript-eslint/types": "5.33.1", - "@typescript-eslint/typescript-estree": "5.33.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.1.tgz", - "integrity": "sha512-nwIxOK8Z2MPWltLKMLOEZwmfBZReqUdbEoHQXeCpa+sRVARe5twpJGHCB4dk9903Yaf0nMAlGbQfaAH92F60eg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.33.1", - "eslint-visitor-keys": "^3.3.0" - } - }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } - } - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-sequence-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", - "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "requires": { - "default-require-extensions": "^3.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "requires": { - "follow-redirects": "^1.14.0" - } - }, - "babel-jest": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz", - "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==", - "dev": true, - "requires": { - "@jest/transform": "^29.3.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.2.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", - "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", - "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^29.2.0", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true - }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001378", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001378.tgz", - "integrity": "sha512-JVQnfoO7FK7WvU4ZkBRbPjaot4+YqxogSDosHv0Hv5mWpUESmN+UubMU6L/hGz8QlQ2aY5U0vR6MOs6j/CXpNA==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "ci-info": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", - "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "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==", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "concat-with-sourcemaps": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", - "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - } - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dev": true, - "requires": { - "node-fetch": "2.6.7" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-js": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz", - "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" - }, - "css-declaration-sorter": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz", - "integrity": "sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==", - "dev": true, - "requires": {} - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cssfontparser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", - "integrity": "sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg==", - "dev": true - }, - "cssnano": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz", - "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==", - "dev": true, - "requires": { - "cssnano-preset-default": "^5.2.12", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - } - }, - "cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", - "dev": true, - "requires": { - "css-declaration-sorter": "^6.3.0", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - } - }, - "cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true, - "requires": {} - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - } - }, - "cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "cwd": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", - "integrity": "sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==", - "dev": true, - "requires": { - "find-pkg": "^0.1.2", - "fs-exists-sync": "^0.1.0" - } - }, - "data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dev": true, - "requires": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "dependencies": { - "whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "requires": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - } - } - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "decimal.js": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.0.tgz", - "integrity": "sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==", - "dev": true - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, - "requires": { - "strip-bom": "^4.0.0" - } - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "del": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", - "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", - "dev": true, - "requires": { - "globby": "^10.0.1", - "graceful-fs": "^4.2.2", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.1", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0" - }, - "dependencies": { - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", - "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "dev": true, - "requires": { - "webidl-conversions": "^7.0.0" - } - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "electron-to-chromium": { - "version": "1.4.222", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.222.tgz", - "integrity": "sha512-gEM2awN5HZknWdLbngk4uQCVfhucFAfFzuchP3wM3NN6eow1eDU0dFy2kts43FB20ZfhVFF0jmFSTb1h5OhyIg==", - "dev": true - }, - "emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", - "dev": true, - "peer": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", - "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "unbox-primitive": "^1.0.2" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": 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==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "eslint": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.22.0.tgz", - "integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.3", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "eslint-plugin-jest": { - "version": "27.1.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.1.6.tgz", - "integrity": "sha512-XA7RFLSrlQF9IGtAmhddkUkBuICCTuryfOTfCSWcZHiHb69OilIH05oozH2XA6CEOtztnOd0vgXyvxZodkxGjg==", - "dev": true, - "requires": { - "@typescript-eslint/utils": "^5.10.0" - } - }, - "eslint-plugin-playwright": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-0.11.2.tgz", - "integrity": "sha512-uRLRLk7uTzc8NE6t4wBU8dijQwHvC66R/h7xwdM779jsJjMUtSmeaB8ayRkkpfwi+UU5BEfwvDANwmE+ccMVDw==", - "dev": true, - "requires": {} - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "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==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", - "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==", - "dev": true, - "requires": { - "os-homedir": "^1.0.1" - } - }, - "expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", - "dev": true, - "requires": { - "@jest/expect-utils": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "expect-playwright": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/expect-playwright/-/expect-playwright-0.8.0.tgz", - "integrity": "sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-file-up": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz", - "integrity": "sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==", - "dev": true, - "requires": { - "fs-exists-sync": "^0.1.0", - "resolve-dir": "^0.1.0" - } - }, - "find-pkg": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz", - "integrity": "sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==", - "dev": true, - "requires": { - "find-file-up": "^0.1.2" - } - }, - "find-process": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz", - "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "commander": "^5.1.0", - "debug": "^4.1.1" - }, - "dependencies": { - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true - } - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "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==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true - }, - "fs-exists-sync": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==", - "dev": true - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "generic-names": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", - "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", - "dev": true, - "requires": { - "loader-utils": "^3.2.0" - } - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==", - "dev": true, - "requires": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - } - }, - "global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.0", - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "which": "^1.2.12" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "requires": { - "whatwg-encoding": "^2.0.0" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", - "dev": true - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==", - "dev": true, - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true - } - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-builtin-module": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", - "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", - "dev": true, - "requires": { - "builtin-modules": "^3.3.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "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", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "requires": { - "@types/estree": "*" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "requires": { - "append-transform": "^2.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", - "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - } - }, - "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==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "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", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", - "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", - "dev": true, - "requires": { - "@jest/core": "^29.3.1", - "@jest/types": "^29.3.1", - "import-local": "^3.0.2", - "jest-cli": "^29.3.1" - } - }, - "jest-canvas-mock": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.4.0.tgz", - "integrity": "sha512-mmMpZzpmLzn5vepIaHk5HoH3Ka4WykbSoLuG/EKoJd0x0ID/t+INo1l8ByfcUJuDM+RIsL4QDg/gDnBbrj2/IQ==", - "dev": true, - "requires": { - "cssfontparser": "^1.2.1", - "moo-color": "^1.0.2" - } - }, - "jest-changed-files": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", - "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", - "dev": true, - "requires": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" - } - }, - "jest-circus": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", - "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", - "dev": true, - "peer": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "p-limit": "^3.1.0", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0" - } - }, - "@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", - "dev": true, - "peer": true, - "requires": { - "jest-get-type": "^28.0.2" - } - }, - "@jest/globals": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", - "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", - "dev": true, - "peer": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/types": "^28.1.3" - } - }, - "@jest/source-map": { - "version": "28.1.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", - "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", - "dev": true, - "peer": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.13", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", - "dev": true, - "peer": true, - "requires": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - } - }, - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "peer": true - }, - "diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "peer": true - }, - "expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", - "dev": true, - "peer": true, - "requires": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - } - }, - "jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true - }, - "jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "peer": true - }, - "jest-resolve": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", - "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - } - }, - "jest-runtime": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", - "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", - "dev": true, - "peer": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/globals": "^28.1.3", - "@jest/source-map": "^28.1.2", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - } - }, - "jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - } - }, - "jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "leven": "^3.1.0", - "pretty-format": "^28.1.3" - } - }, - "jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-cli": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz", - "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==", - "dev": true, - "requires": { - "@jest/core": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - }, - "dependencies": { - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } - } - }, - "jest-config": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz", - "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.3.1", - "@jest/types": "^29.3.1", - "babel-jest": "^29.3.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.3.1", - "jest-environment-node": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-runner": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - } - }, - "@jest/expect": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", - "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", - "dev": true, - "requires": { - "expect": "^29.3.1", - "jest-snapshot": "^29.3.1" - } - }, - "@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - } - }, - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true - }, - "jest-circus": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz", - "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==", - "dev": true, - "requires": { - "@jest/environment": "^29.3.1", - "@jest/expect": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "p-limit": "^3.1.0", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-docblock": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", - "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz", - "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "jest-util": "^29.3.1", - "pretty-format": "^29.3.1" - } - }, - "jest-environment-node": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", - "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", - "dev": true, - "requires": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - } - }, - "jest-leak-detector": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", - "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", - "dev": true, - "requires": { - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - } - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - } - }, - "jest-runner": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", - "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", - "dev": true, - "requires": { - "@jest/console": "^29.3.1", - "@jest/environment": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.2.0", - "jest-environment-node": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-leak-detector": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-resolve": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-util": "^29.3.1", - "jest-watcher": "^29.3.1", - "jest-worker": "^29.3.1", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "jest-diff": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", - "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "jest-docblock": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", - "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", - "dev": true, - "peer": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", - "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "jest-util": "^28.1.3", - "pretty-format": "^28.1.3" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true - } - } - }, - "jest-environment-jsdom": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-28.1.3.tgz", - "integrity": "sha512-HnlGUmZRdxfCByd3GM2F100DgQOajUBzEitjGqIREcb45kGjZvRrKUdlaF6escXBdcXNl0OBh+1ZrfeZT3GnAg==", - "dev": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/jsdom": "^16.2.4", - "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3", - "jsdom": "^19.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - } - } - }, - "jest-environment-node": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", - "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", - "dev": true, - "peer": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - } - } - }, - "jest-fetch-mock": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz", - "integrity": "sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==", - "dev": true, - "requires": { - "cross-fetch": "^3.0.4", - "promise-polyfill": "^8.1.3" - } - }, - "jest-get-type": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", - "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", - "dev": true - }, - "jest-haste-map": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz", - "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.3.1", - "jest-worker": "^29.3.1", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "dependencies": { - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } - } - }, - "jest-leak-detector": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", - "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", - "dev": true, - "peer": true, - "requires": { - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "dependencies": { - "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true - } - } - }, - "jest-matcher-utils": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", - "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "jest-message-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", - "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - } - } - }, - "jest-mock": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", - "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/node": "*" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - } - } - }, - "jest-playwright-preset": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jest-playwright-preset/-/jest-playwright-preset-2.0.0.tgz", - "integrity": "sha512-pV5ruTJJMen3lwshUL4dlSqLlP8z4q9MXqWJkmy+sB6HYfzXoqBHzhl+5hslznhnSVTe4Dwu+reiiwcUJpYUbw==", - "dev": true, - "requires": { - "expect-playwright": "^0.8.0", - "jest-process-manager": "^0.3.1", - "nyc": "^15.1.0", - "playwright-core": ">=1.2.0", - "rimraf": "^3.0.2", - "uuid": "^8.3.2" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} - }, - "jest-process-manager": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/jest-process-manager/-/jest-process-manager-0.3.1.tgz", - "integrity": "sha512-x9W54UgZ7IkzUHgXtnI1x4GKOVjxtwW0CA/7yGbTHtT/YhENO0Lic2yfVyC/gekn7OIEMcQmy0L1r9WLQABfqw==", - "dev": true, - "requires": { - "@types/wait-on": "^5.2.0", - "chalk": "^4.1.0", - "cwd": "^0.10.0", - "exit": "^0.1.2", - "find-process": "^1.4.4", - "prompts": "^2.4.1", - "signal-exit": "^3.0.3", - "spawnd": "^5.0.0", - "tree-kill": "^1.2.2", - "wait-on": "^5.3.0" - } - }, - "jest-regex-util": { - "version": "29.2.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", - "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", - "dev": true - }, - "jest-resolve": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz", - "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "dependencies": { - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz", - "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==", - "dev": true, - "requires": { - "jest-regex-util": "^29.2.0", - "jest-snapshot": "^29.3.1" - } - }, - "jest-runner": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", - "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", - "dev": true, - "peer": true, - "requires": { - "@jest/console": "^28.1.3", - "@jest/environment": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "graceful-fs": "^4.2.9", - "jest-docblock": "^28.1.1", - "jest-environment-node": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-leak-detector": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-resolve": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-util": "^28.1.3", - "jest-watcher": "^28.1.3", - "jest-worker": "^28.1.3", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "dependencies": { - "@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0" - } - }, - "@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", - "dev": true, - "peer": true, - "requires": { - "jest-get-type": "^28.0.2" - } - }, - "@jest/globals": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", - "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", - "dev": true, - "peer": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/types": "^28.1.3" - } - }, - "@jest/source-map": { - "version": "28.1.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", - "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", - "dev": true, - "peer": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.13", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", - "dev": true, - "peer": true, - "requires": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - } - }, - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "peer": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "peer": true - }, - "diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "peer": true - }, - "expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", - "dev": true, - "peer": true, - "requires": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - } - }, - "jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "peer": true - }, - "jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "peer": true - }, - "jest-resolve": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", - "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", - "dev": true, - "peer": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - } - }, - "jest-runtime": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", - "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", - "dev": true, - "peer": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/globals": "^28.1.3", - "@jest/source-map": "^28.1.2", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - } - }, - "jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", - "dev": true, - "peer": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - } - }, - "jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", - "dev": true, - "peer": true, - "requires": { - "@jest/types": "^28.1.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "leven": "^3.1.0", - "pretty-format": "^28.1.3" - } - }, - "jest-watcher": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", - "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", - "dev": true, - "peer": true, - "requires": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-runtime": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz", - "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==", - "dev": true, - "requires": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/globals": "^29.3.1", - "@jest/source-map": "^29.2.0", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "dependencies": { - "@jest/environment": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", - "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - } - }, - "@jest/fake-timers": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", - "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - } - }, - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", - "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "jest-snapshot": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz", - "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.3.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-haste-map": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "natural-compare": "^1.4.0", - "pretty-format": "^29.3.1", - "semver": "^7.3.5" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "jest-message-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", - "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "jest-transform-css": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jest-transform-css/-/jest-transform-css-4.0.1.tgz", - "integrity": "sha512-/rhrYXnLACL2rQ4ME6KtPGR2bKM27HDI6nRHGzGBrZXqkErN+PwxCz+wz6oflIf783szH8HWL0p5Iu7RXTSHYQ==", - "dev": true, - "requires": { - "common-tags": "1.8.2", - "cosmiconfig": "7.0.1", - "cross-spawn": "7.0.3", - "postcss-load-config": "2.0.0", - "postcss-modules": "4.3.1", - "style-inject": "0.3.0" - } - }, - "jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "dependencies": { - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - } - } - }, - "jest-validate": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz", - "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "leven": "^3.1.0", - "pretty-format": "^29.3.1" - }, - "dependencies": { - "@jest/schemas": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", - "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "pretty-format": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", - "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - } - } - } - }, - "jest-watcher": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz", - "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==", - "dev": true, - "requires": { - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.3.1", - "string-length": "^4.0.1" - }, - "dependencies": { - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true - }, - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } - } - }, - "jest-websocket-mock": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jest-websocket-mock/-/jest-websocket-mock-2.4.0.tgz", - "integrity": "sha512-AOwyuRw6fgROXHxMOiTDl1/T4dh3fV4jDquha5N0csS/PNp742HeTZWPAuKppVRSQ8s3fUGgJHoyZT9JDO0hMA==", - "dev": true, - "requires": { - "jest-diff": "^28.0.2", - "mock-socket": "^9.1.0" - }, - "dependencies": { - "diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true - }, - "jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true - } - } - }, - "jest-worker": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", - "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", - "dev": true, - "requires": { - "@types/node": "*", - "jest-util": "^29.3.1", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "joi": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz", - "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==", - "dev": true, - "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.0", - "@sideway/pinpoint": "^2.0.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsdom": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz", - "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.5.0", - "acorn-globals": "^6.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.1", - "decimal.js": "^10.3.1", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^3.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^10.0.0", - "ws": "^8.2.3", - "xml-name-validator": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-css": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/json-css/-/json-css-1.5.6.tgz", - "integrity": "sha512-B/0T0OxZH9tSb93tXV6VOYtXqrPz/Vgz2QrCT/4NXen8HGElYkYr9V+8IrSVTMj/ftxa8cG1kcu7f3iAMlaFlQ==" - }, - "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", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true - }, - "jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "livereload": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.3.tgz", - "integrity": "sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw==", - "dev": true, - "requires": { - "chokidar": "^3.5.0", - "livereload-js": "^3.3.1", - "opts": ">= 1.2.0", - "ws": "^7.4.3" - }, - "dependencies": { - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "requires": {} - } - } - }, - "livereload-js": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.4.1.tgz", - "integrity": "sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g==", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - } - } - }, - "loader-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", - "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.8" - } - }, - "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==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true - }, - "mock-socket": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.1.5.tgz", - "integrity": "sha512-3DeNIcsQixWHHKk6NdoBhWI4t1VMj5/HzfnI1rE/pLl5qKx7+gd4DNA07ehTaZ6MoUU053si6Hd+YtiM/tQZfg==", - "dev": true - }, - "moo-color": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.3.tgz", - "integrity": "sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==", - "dev": true, - "requires": { - "color-name": "^1.1.4" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "requires": { - "process-on-spawn": "^1.0.0" - } - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "nwsapi": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", - "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==", - "dev": true - }, - "nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "requires": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "dependencies": { - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "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" - } - }, - "opts": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", - "integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - } - }, - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "requires": { - "p-finally": "^1.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", - "dev": true - }, - "pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true - }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "playwright": { - "version": "1.32.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.32.1.tgz", - "integrity": "sha512-GnEizysWMvoqHC3I9l8+4/ZxeLwLNdJJG76xdKGxzOcIZDcw5RSk/FKrFb5CuA+zcLpjIM2p9eR9Z4CuUDkWXg==", - "dev": true, - "requires": { - "playwright-core": "1.32.1" - } - }, - "playwright-core": { - "version": "1.32.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.32.1.tgz", - "integrity": "sha512-KZYUQC10mXD2Am1rGlidaalNGYk3LU1vZqqNk0gT4XPty1jOqgup8KDP8l2CUlqoNKhXM5IfGjWgW37xvGllBA==", - "dev": true - }, - "postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", - "dev": true, - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", - "dev": true, - "requires": { - "browserslist": "^4.20.3", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true, - "requires": {} - }, - "postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "requires": {} - }, - "postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, - "requires": {} - }, - "postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, - "requires": {} - }, - "postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", - "dev": true, - "requires": { - "cosmiconfig": "^4.0.0", - "import-cwd": "^2.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", - "dev": true, - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - } - } - }, - "postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" - } - }, - "postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dev": true, - "requires": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-modules": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.3.1.tgz", - "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==", - "dev": true, - "requires": { - "generic-names": "^4.0.0", - "icss-replace-symbols": "^1.1.0", - "lodash.camelcase": "^4.3.0", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "string-hash": "^1.1.1" - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true, - "requires": {} - }, - "postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dev": true, - "requires": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dev": true, - "requires": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - } - }, - "postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "requires": { - "fromentries": "^1.2.0" - } - }, - "promise-polyfill": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.2.3.tgz", - "integrity": "sha512-Og0+jCRQetV84U8wVjMNccfGCnMQ9mGs9Hv78QFe+pSDD3gWTpz0y+1QCuxy5d/vBFuZ3iwP2eycAkvqIMPmWg==", - "dev": true - }, - "promise.series": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz", - "integrity": "sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==", - "dev": true - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - } - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==", - "dev": true, - "requires": { - "expand-tilde": "^1.2.2", - "global-modules": "^0.2.3" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "2.78.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.0.tgz", - "integrity": "sha512-4+YfbQC9QEVvKTanHhIAFVUFSRsezvQF8vFOJwtGfb9Bb+r014S+qryr9PSmw8x6sMnPkmFBGAvIFVQxvJxjtg==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "rollup-plugin-commonjs": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz", - "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==", - "dev": true, - "requires": { - "estree-walker": "^0.6.1", - "is-reference": "^1.1.2", - "magic-string": "^0.25.2", - "resolve": "^1.11.0", - "rollup-pluginutils": "^2.8.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - } - } - }, - "rollup-plugin-delete": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-delete/-/rollup-plugin-delete-2.0.0.tgz", - "integrity": "sha512-/VpLMtDy+8wwRlDANuYmDa9ss/knGsAgrDhM+tEwB1npHwNu4DYNmDfUL55csse/GHs9Q+SMT/rw9uiaZ3pnzA==", - "dev": true, - "requires": { - "del": "^5.1.0" - } - }, - "rollup-plugin-dts": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-4.2.2.tgz", - "integrity": "sha512-A3g6Rogyko/PXeKoUlkjxkP++8UDVpgA7C+Tdl77Xj4fgEaIjPSnxRmR53EzvoYy97VMVwLAOcWJudaVAuxneQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "magic-string": "^0.26.1" - }, - "dependencies": { - "magic-string": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", - "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.8" - } - } - } - }, - "rollup-plugin-livereload": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-2.0.5.tgz", - "integrity": "sha512-vqQZ/UQowTW7VoiKEM5ouNW90wE5/GZLfdWuR0ELxyKOJUIaj+uismPZZaICU4DnWPVjnpCDDxEqwU7pcKY/PA==", - "dev": true, - "requires": { - "livereload": "^0.9.1" - } - }, - "rollup-plugin-postcss": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-4.0.2.tgz", - "integrity": "sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "concat-with-sourcemaps": "^1.1.0", - "cssnano": "^5.0.1", - "import-cwd": "^3.0.0", - "p-queue": "^6.6.2", - "pify": "^5.0.0", - "postcss-load-config": "^3.0.0", - "postcss-modules": "^4.0.0", - "promise.series": "^0.2.0", - "resolve": "^1.19.0", - "rollup-pluginutils": "^2.8.2", - "safe-identifier": "^0.4.2", - "style-inject": "^0.3.0" - }, - "dependencies": { - "import-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", - "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", - "dev": true, - "requires": { - "import-from": "^3.0.0" - } - }, - "import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "rollup-plugin-serve": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-serve/-/rollup-plugin-serve-2.0.1.tgz", - "integrity": "sha512-/9lnzylTMwbXNQUwWAO0DIxW145wl+rmikwFXgujLJ5N9bRfWcjP+qd1XM5wxSiw8ZlBAlFy/n2zRvzcG21bBw==", - "dev": true, - "requires": { - "mime": ">=2.4.6", - "opener": "1" - } - }, - "rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "dependencies": { - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - } - } - } - }, - "rollup-plugin-typescript2": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.32.1.tgz", - "integrity": "sha512-RanO8bp1WbeMv0bVlgcbsFNCn+Y3rX7wF97SQLDxf0fMLsg0B/QFF005t4AsGUcDgF3aKJHoqt4JF2xVaABeKw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^4.1.2", - "find-cache-dir": "^3.3.2", - "fs-extra": "^10.0.0", - "resolve": "^1.20.0", - "tslib": "^2.4.0" - }, - "dependencies": { - "@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "dev": true, - "requires": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - } - }, - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - } - } - }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "requires": { - "estree-walker": "^0.6.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - } - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-identifier": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", - "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==", - "dev": true - }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shell-quote": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz", - "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==", - "dev": true - }, - "shiki": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.1.tgz", - "integrity": "sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==", - "dev": true, - "requires": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "requires": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "dependencies": { - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - } - } - }, - "spawnd": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-5.0.0.tgz", - "integrity": "sha512-28+AJr82moMVWolQvlAIv3JcYDkjkFTEmfDc503wxrF5l2rQ3dFz6DpbXp3kD4zmgGGldfM4xM4v1sFj/ZaIOA==", - "dev": true, - "requires": { - "exit": "^0.1.2", - "signal-exit": "^3.0.3", - "tree-kill": "^1.2.2", - "wait-port": "^0.2.9" - } - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", - "dev": true - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.padend": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", - "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "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==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "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==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "style-inject": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", - "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==", - "dev": true - }, - "stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "postcss-selector-parser": "^6.0.4" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "dependencies": { - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, - "tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "ts-jest": { - "version": "29.0.3", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz", - "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.1", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "^21.0.1" - }, - "dependencies": { - "jest-util": { - "version": "29.3.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", - "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - } - } - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "dependencies": { - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - } - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typedoc": { - "version": "0.23.28", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.28.tgz", - "integrity": "sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==", - "dev": true, - "requires": { - "lunr": "^2.3.9", - "marked": "^4.2.12", - "minimatch": "^7.1.3", - "shiki": "^0.14.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.5.tgz", - "integrity": "sha512-OzOamaOmNBJZUv2qqY1OSWa+++4YPpOkLgkc0w30Oov5ufKlWWXnFUl0l4dgmSv5Shq/zRVkEOXAe2NaqO4l5Q==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "typedoc-plugin-missing-exports": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-1.0.0.tgz", - "integrity": "sha512-7s6znXnuAj1eD9KYPyzVzR1lBF5nwAY8IKccP5sdoO9crG4lpd16RoFpLsh2PccJM+I2NASpr0+/NMka6ThwVA==", - "dev": true, - "requires": {} - }, - "typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "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==", - "dev": true - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true - }, - "vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "dev": true - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", - "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", - "dev": true, - "requires": { - "xml-name-validator": "^4.0.0" - } - }, - "wait-on": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz", - "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==", - "dev": true, - "requires": { - "axios": "^0.21.1", - "joi": "^17.3.0", - "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^6.6.3" - } - }, - "wait-port": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-0.2.14.tgz", - "integrity": "sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "commander": "^3.0.2", - "debug": "^4.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true - }, - "whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "requires": { - "iconv-lite": "0.6.3" - } - }, - "whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true - }, - "whatwg-url": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", - "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", - "dev": true, - "requires": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "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==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", - "dev": true, - "requires": {} - }, - "xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 0634873f0..000000000 --- a/package.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "name": "iink-ts", - "version": "1.0.0-buildVersion", - "description": "iinkTS is the fastest way to integrate handwriting panel and recognition in your webapp", - "license": "Apache-2.0", - "private": false, - "main": "dist/iink.min.js", - "module": "dist/iink.esm.js", - "type": "module", - "types": "dist/iink.d.ts", - "keywords": [ - "myscript", - "javascript", - "developer", - "handwriting", - "recognition", - "cloud", - "iink" - ], - "files": [ - "dist", - "package.json" - ], - "homepage": "https://myscript.github.io/iinkTS/", - "repository": "git://github.com/MyScript/iinkTS.git", - "scripts": { - "lint": "eslint ./src --ext .ts", - "lint:fix": "eslint ./src --ext .ts --fix", - "test:unit": "jest --config=jest.unit.config.js", - "test:unit:coverage": "jest --config=jest.unit.config.js --coverage", - "test:integration": "jest --config=jest.integration.config.js", - "build:docs": "typedoc", - "build:lib": "rollup -c config/rollup.config.build.js --sourcemap", - "build": "npm-run-all lint:fix test:unit build:lib build:docs", - "dev": "rollup -c config/rollup.config.dev.js -w --sourcemap" - }, - "dependencies": { - "crypto-js": "^3.3.0", - "json-css": "^1.5.6" - }, - "devDependencies": { - "@rollup/plugin-node-resolve": "^13.3.0", - "@types/jest": "^29.2.0", - "@types/node": "^18.11.5", - "@typescript-eslint/eslint-plugin": "^5.33.0", - "@typescript-eslint/parser": "^5.33.0", - "babel-jest": "^29.2.2", - "eslint": "^8.22.0", - "eslint-plugin-jest": "^27.1.3", - "eslint-plugin-playwright": "^0.15.3", - "jest": "^29.0.0", - "jest-canvas-mock": "^2.4.0", - "jest-environment-jsdom": "^28.1.3", - "jest-fetch-mock": "^3.0.3", - "jest-playwright-preset": "^3.0.1", - "jest-transform-css": "^6.0.1", - "jest-websocket-mock": "^2.4.0", - "npm-run-all": "^4.1.5", - "playwright": "^1.36.1", - "postcss": "^8.4.16", - "rollup": "^2.76.0", - "rollup-plugin-commonjs": "^10.1.0", - "rollup-plugin-delete": "^2.0.0", - "rollup-plugin-dts": "^4.2.2", - "rollup-plugin-livereload": "^2.0.5", - "rollup-plugin-postcss": "^4.0.2", - "rollup-plugin-serve": "^2.0.0", - "rollup-plugin-terser": "^7.0.2", - "rollup-plugin-typescript2": "^0.32.1", - "ts-jest": "^29.0.3", - "ts-node": "^10.9.1", - "tslib": "^2.4.0", - "typedoc": "^0.25.2", - "typedoc-plugin-missing-exports": "^2.1.0", - "typescript": "^4.7.4" - }, - "resolutions": { - "**/loader-utils": "3.2.1", - "**/json5": "2.2.2" - } -} diff --git a/plugins/typdoc-default-object.ts b/plugins/typdoc-default-object.ts deleted file mode 100644 index f30d8423c..000000000 --- a/plugins/typdoc-default-object.ts +++ /dev/null @@ -1,42 +0,0 @@ -// @ts-check -// eslint-disable-next-line @typescript-eslint/no-var-requires -const { TypeScript, Converter } = require("typedoc") - -exports.load = function ({ application }) -{ - const defaultValues = new Map() - - const printer = TypeScript.createPrinter({ - removeComments: true, - omitTrailingSemicolon: true, - newLine: TypeScript.NewLineKind.LineFeed - }) - - application.converter.on( - Converter.EVENT_CREATE_DECLARATION, - (context, reflection) => - { - const symbol = context.project.getSymbolFromReflection(reflection) - if (!symbol) return - - const decl = symbol.getDeclarations()?.find(TypeScript.isVariableDeclaration) - if (!decl || !decl.initializer) return - - if (decl.initializer.kind === TypeScript.SyntaxKind.ObjectLiteralExpression) { - // Unfortunately can't just set defaultValue right here, this happens before TD sets it. - defaultValues.set( - reflection, - printer.printNode(TypeScript.EmitHint.Expression, decl.initializer, decl.getSourceFile()) - ) - } - } - ) - - application.converter.on(Converter.EVENT_RESOLVE_BEGIN, () => - { - for (const [refl, init] of defaultValues) { - refl.defaultValue = init.replace("/n", "
") - } - defaultValues.clear() - }) -} diff --git a/preview.gif b/preview.gif deleted file mode 100644 index 80b1e8505ebca90eb9f9f6dc3e2692a02d11f9f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190750 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%0DL!Dc~8kpN}`uF1J^?V-|^{euMf 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

Ub(e0xK> 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

_W!!J}f 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

_`G2+0#vPjt4gV;n%s diff --git a/src/@types/Behaviors.d.ts b/src/@types/Behaviors.d.ts deleted file mode 100644 index c0020ff22..000000000 --- a/src/@types/Behaviors.d.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { IGrabber } from "./grabber/Grabber" -import { IModel } from "./model/Model" -import { IRecognizer } from "./recognizer/Recognizer" -import { TTheme } from "./style/Theme" -import { TConverstionState } from "./configuration/RecognitionConfiguration" -import { TPenStyle } from "./style/PenStyle" -import { TStroke } from "./model/Stroke" -import { TUndoRedoContext } from "./undo-redo/UndoRedoContext" -import { TConfiguration } from "./configuration" -import { StyleManager } from "../style/StyleManager" -import { TLoggerConfiguration } from "./configuration/LoggerConfiguration" - -export type TBehaviorOptions = { - configuration: TConfiguration - behaviors?: { - grabber?: IGrabber - recognizer?: IRecognizer - } - penStyle?: TPenStyle - theme?: TTheme - logger?: TLoggerConfiguration -} - -export interface IBehaviors -{ - name: string - grabber: IGrabber - recognizer: IRecognizer - context: TUndoRedoContext - options: TBehaviorOptions - styleManager: StyleManager - intention: Intention - #configuration: TConfiguration - - get currentPenStyle(): TPenStyle - - get model(): IModel - - get penStyle(): TPenStyle - setPenStyle(penStyle?: TPenStyle) - - get penStyleClasses(): string - setPenStyleClasses(penStyleClasses?: string) - - get theme(): TTheme - setTheme(theme?: TTheme) - - get configuration(): TConfiguration - set configuration(conf: TConfiguration) - - async init: (element: HTMLElement) => Promise - async export(mimeTypes?: string[]): Promise - async convert(conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise - async resize(height: number, width: number): Promise - async undo(): Promise - async redo(): Promise - - async waitForIdle?(): Promise - async importPointEvents?(strokes: TStroke[]): Promise - async import?(data: Blob, mimeType?: string): Promise - - async clear(): Promise - - async destroy(): Promise -} diff --git a/src/@types/configuration/Configuration.d.ts b/src/@types/configuration/Configuration.d.ts deleted file mode 100644 index 21febbe5e..000000000 --- a/src/@types/configuration/Configuration.d.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { TEventConfiguration } from "./EventConfiguration" -import { TGrabberConfiguration } from "./GrabberConfiguration" -import { TRecognitionConfiguration, TRecognitionConfigurationClient } from "./RecognitionConfiguration" -import { TRenderingConfiguration } from "./RenderingConfiguration" -import { TServerConfiguration, TServerConfigurationClient } from "./ServerConfiguration" -import { TTriggerConfiguration } from "./TriggerConfiguration" -import { TUndoRedoConfiguration } from "./UndoRedoConfiguration" - -export type TConfiguration = { - server: TServerConfiguration - recognition: TRecognitionConfiguration - grabber: TGrabberConfiguration - rendering: TRenderingConfiguration - triggers: TTriggerConfiguration - events: TEventConfiguration - "undo-redo": TUndoRedoConfiguration -} - -export type TConfigurationClient = { - server?: TServerConfigurationClient - recognition?: TRecognitionConfigurationClient - grabber?: TGrabberConfiguration - rendering?: TRenderingConfiguration - triggers?: TTriggerConfiguration - events?: TEventConfiguration - "undo-redo"?: TUndoRedoConfiguration -} diff --git a/src/@types/configuration/EventConfiguration.d.ts b/src/@types/configuration/EventConfiguration.d.ts deleted file mode 100644 index 973f55002..000000000 --- a/src/@types/configuration/EventConfiguration.d.ts +++ /dev/null @@ -1,4 +0,0 @@ - -export type TEventConfiguration = { - processDelay: number -} \ No newline at end of file diff --git a/src/@types/configuration/GrabberConfiguration.d.ts b/src/@types/configuration/GrabberConfiguration.d.ts deleted file mode 100644 index 9e23dace0..000000000 --- a/src/@types/configuration/GrabberConfiguration.d.ts +++ /dev/null @@ -1,11 +0,0 @@ - -export type TListenerConfiguration = { - capture: boolean - passive: boolean -} - -export type TGrabberConfiguration = { - listenerOptions: TListenerConfiguration - xyFloatPrecision: number - timestampFloatPrecision: number -} \ No newline at end of file diff --git a/src/@types/configuration/LoggerConfiguration.ts b/src/@types/configuration/LoggerConfiguration.ts deleted file mode 100644 index f2f83ed81..000000000 --- a/src/@types/configuration/LoggerConfiguration.ts +++ /dev/null @@ -1,33 +0,0 @@ - -/** - * @group Logger - */ -export const enum LoggerLevel { - DEBUG = "1", - INFO = "2", - WARN = "3", - ERROR = "4" - } - -/** - * @group Logger - */ - export const enum LoggerClass { - EDITOR = "EDITOR", - RECOGNIZER = "RECOGNIZER", - GRABBER = "GRABBER", - BEHAVIORS = "BEHAVIORS", - CONFIGURATION = "CONFIGURATION", - PUBLIC_EVENT = "PUBLIC_EVENT", - MODEL = "MODEL", - RENDERER = "RENDERER", - SMARTGUIDE = "SMARTGUIDE", - STYLEMANAGER = "STYLEMANAGER", - UNDOREDO_MANAGER = "UNDOREDO_MANAGER", - STROKE = "STROKE", - INTERNALEVENT = "INTERNALEVENT" - } - - export type TLoggerConfiguration = { - [key in keyof typeof LoggerClass]: LoggerLevel - } diff --git a/src/@types/configuration/RecognitionConfiguration.d.ts b/src/@types/configuration/RecognitionConfiguration.d.ts deleted file mode 100644 index 444021158..000000000 --- a/src/@types/configuration/RecognitionConfiguration.d.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { TConvertConfiguration } from "./recognition/ConvertConfiguration" -import { TDiagramConfiguration } from "./recognition/DiagramConfiguration" -import { TExportConfiguration } from "./recognition/ExportConfiguration" -import { TMathConfiguration } from "./recognition/MathConfiguration" -import { TRawContentConfiguration } from "./recognition/RawContentConfiguration" -import { TTextConfiguration } from "./recognition/TextConfiguration" - -export type TDebugConfiguration = { - "draw-text-boxes": boolean - "draw-image-boxes": boolean -} - -export type TRecognitionRendererConfiguration = { - debug: TDebugConfiguration -} - -export type TRecognitionType = "TEXT" | "MATH" | "DIAGRAM" | "Raw Content" - -export type TConverstionState = "DIGITAL_EDIT" | "HANDWRITING" - -export type TRecognitionConfiguration = { - convert?: TConvertConfiguration - type: TRecognitionType - alwaysConnected: boolean - lang: string - math: TMathConfiguration - text: TTextConfiguration - diagram: TDiagramConfiguration - renderer: TRecognitionRendererConfiguration - export: TExportConfiguration - "raw-content": TRawContentConfiguration - gesture: { enable: boolean } -} - -export type TRecognitionConfigurationClient = { - convert?: TConvertConfiguration - type?: TRecognitionType - alwaysConnected?: boolean - lang?: string - math?: TMathConfiguration - text?: TTextConfiguration - diagram?: TDiagramConfiguration - renderer?: TRecognitionRendererConfiguration - export?: TExportConfiguration - "raw-content"?: TRawContentConfiguration - gesture?: { enable: boolean } -} diff --git a/src/@types/configuration/RenderingConfiguration.d.ts b/src/@types/configuration/RenderingConfiguration.d.ts deleted file mode 100644 index e59c85bdc..000000000 --- a/src/@types/configuration/RenderingConfiguration.d.ts +++ /dev/null @@ -1,20 +0,0 @@ - -export type TGuidesConfiguration = { - enable: boolean - gap: numnber -} - -export type TSmartGuidesConfiguration = { - enable: boolean - fadeOut: { - enable: boolean - duration: number - } -} - -export type TRenderingConfiguration = { - minHeight: number - minWidth: number - smartGuide: TSmartGuidesConfiguration - guides: TGuidesConfiguration -} diff --git a/src/@types/configuration/ServerConfiguration.d.ts b/src/@types/configuration/ServerConfiguration.d.ts deleted file mode 100644 index 2068a9aab..000000000 --- a/src/@types/configuration/ServerConfiguration.d.ts +++ /dev/null @@ -1,39 +0,0 @@ -export type TProtocol = "WEBSOCKET" | "REST" - -export type TSchene = "https" | "http" - -export type TServerConfiguration = { - protocol: TProtocol, - scheme: TSchene, - host: string - applicationKey: string - hmacKey: string - version: string - useWindowLocation?: boolean - websocket: { - pingEnabled: boolean - pingDelay: number - maxPingLostCount: number - autoReconnect: boolean - maxRetryCount: number - fileChunkSize: number - } -} - -export type TServerConfigurationClient = { - protocol?: TProtocol, - scheme?: TSchene, - host?: string - applicationKey?: string - hmacKey?: string - version?: string - useWindowLocation?: boolean - websocket?: { - pingEnabled?: boolean - pingDelay?: number - maxPingLostCount?: number - autoReconnect?: boolean - maxRetryCount?: number - fileChunkSize?: number - } -} diff --git a/src/@types/configuration/TriggerConfiguration.d.ts b/src/@types/configuration/TriggerConfiguration.d.ts deleted file mode 100644 index 0dd95743f..000000000 --- a/src/@types/configuration/TriggerConfiguration.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Configure when the action is triggered. - * POINTER_UP : Action is triggered on every PenUP. - * This is the recommended mode for CDK V3 WebSocket recognitions. - * QUIET_PERIOD : Action is triggered after a quiet period in milli-seconds on every pointer up. - * The value is set to 1000 for example recognition will be triggered when the user stops writing for 1 seconds. - * This is the recommended mode for all REST discoveries. - * DEMAND : Action is triggered on external demande - */ - export type TTriggerConfiguration = { - exportContent: "QUIET_PERIOD" | "POINTER_UP" | "DEMAND" - exportContentDelay: number - resizeTriggerDelay: number -} \ No newline at end of file diff --git a/src/@types/configuration/UndoRedoConfiguration.d.ts b/src/@types/configuration/UndoRedoConfiguration.d.ts deleted file mode 100644 index 756eaad87..000000000 --- a/src/@types/configuration/UndoRedoConfiguration.d.ts +++ /dev/null @@ -1,4 +0,0 @@ - -export type TUndoRedoConfiguration = { - maxStackSize: number -} \ No newline at end of file diff --git a/src/@types/configuration/index.d.ts b/src/@types/configuration/index.d.ts deleted file mode 100644 index 99e674bfc..000000000 --- a/src/@types/configuration/index.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -export * from "./recognition" -export * from "./Configuration" -export * from "./EventConfiguration" -export * from "./GrabberConfiguration" -export * from "./RecognitionConfiguration" -export * from "./RenderingConfiguration" -export * from "./ServerConfiguration" -export * from "./TriggerConfiguration" -export * from "./UndoRedoConfiguration" -export * from "./LoggerConfiguration" \ No newline at end of file diff --git a/src/@types/configuration/recognition/ConvertConfiguration.d.ts b/src/@types/configuration/recognition/ConvertConfiguration.d.ts deleted file mode 100644 index c86a4fc72..000000000 --- a/src/@types/configuration/recognition/ConvertConfiguration.d.ts +++ /dev/null @@ -1,4 +0,0 @@ - -export type TConvertConfiguration = { - convertOnDoubleTap: boolean -} \ No newline at end of file diff --git a/src/@types/configuration/recognition/DiagramConfiguration.d.ts b/src/@types/configuration/recognition/DiagramConfiguration.d.ts deleted file mode 100644 index 0a15e2597..000000000 --- a/src/@types/configuration/recognition/DiagramConfiguration.d.ts +++ /dev/null @@ -1,19 +0,0 @@ - -import { TEraserConfiguration } from "./EraserConfiguration" -import { TTextConfConfiguration } from "./TextConfiguration" - -export type TDiagramConvertConfiguration = { - edge?: boolean - node?: boolean - text?: boolean - "match-text-size"?: boolean -} - -export type TDiagramConfiguration = { - mimeTypes: ("application/vnd.myscript.jiix" | "application/vnd.openxmlformats-officedocument.presentationml.presentation" | "image/svg+xml")[] - "enable-sub-blocks"?: boolean - text?: TTextConfConfiguration - convert?: TDiagramConvertConfiguration - "session-time"?: number - eraser?: TEraserConfiguration -} \ No newline at end of file diff --git a/src/@types/configuration/recognition/EraserConfiguration.d.ts b/src/@types/configuration/recognition/EraserConfiguration.d.ts deleted file mode 100644 index 11a0e44e7..000000000 --- a/src/@types/configuration/recognition/EraserConfiguration.d.ts +++ /dev/null @@ -1,4 +0,0 @@ - -export type TEraserConfiguration = { - "erase-precisely": boolean -} \ No newline at end of file diff --git a/src/@types/configuration/recognition/ExportConfiguration.d.ts b/src/@types/configuration/recognition/ExportConfiguration.d.ts deleted file mode 100644 index 6df9ffd6a..000000000 --- a/src/@types/configuration/recognition/ExportConfiguration.d.ts +++ /dev/null @@ -1,37 +0,0 @@ - -export type TImageViewportConfiguration = { - x: number - y: number - width: number - height: number -} - -export type TImageConfiguration = { - guides: boolean - viewport: TImageViewportConfiguration -} - -export type TJiixConfiguration = { - "bounding-box"?: boolean - strokes: boolean - text?: { - chars: boolean - words: boolean - } - style?: boolean -} - -export type TMathMLFlavor = { - name: string -} - -export type TMathMLExport = { - flavor: TMathMLFlavor -} - -export type TExportConfiguration = { - "image-resolution"?: number - image?: TImageConfiguration - jiix?: TJiixConfiguration - mathml?: TMathMLExport -} \ No newline at end of file diff --git a/src/@types/configuration/recognition/MarginConfiguration.d.ts b/src/@types/configuration/recognition/MarginConfiguration.d.ts deleted file mode 100644 index 4a270d922..000000000 --- a/src/@types/configuration/recognition/MarginConfiguration.d.ts +++ /dev/null @@ -1,7 +0,0 @@ - -export type TMarginConfiguration = { - bottom: number - left: number - right: number - top: number -} \ No newline at end of file diff --git a/src/@types/configuration/recognition/MathConfiguration.d.ts b/src/@types/configuration/recognition/MathConfiguration.d.ts deleted file mode 100644 index 4be7b77f8..000000000 --- a/src/@types/configuration/recognition/MathConfiguration.d.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { TMarginConfiguration } from "./MarginConfiguration" -import { TEraserConfiguration } from "./EraserConfiguration" - -export type TRoundingMode = "half up" | "truncate" - -export type TAngleUnit = "deg" | "rad" - -export type TSolverOptions = "algebraic" | "numeric" - -export type TSolverConfiguration = { - enable?: boolean - "fractional-part-digits"?: number - "decimal-separator"?: string - "rounding-mode"?: TRoundingMode - "angle-unit"?: TAngleUnit - options?: TSolverOptions -} - -export type TUndoRedoMode = "stroke" | "session" - -export type TMathUndoRedoConfiguration = { - mode: TUndoRedoMode -} - -export type TMathConfiguration = { - mimeTypes: ("application/x-latex" | "application/mathml+xml" | "application/vnd.myscript.jiix")[] - solver?: TSolverConfiguration - margin: TMarginConfiguration - "undo-redo"?: TMathUndoRedoConfiguration - customGrammar?: string - customGrammarId?: string - customGrammarContent?: string - eraser?: TEraserConfiguration - "session-time"?: number - "recognition-timeout"?: number -} diff --git a/src/@types/configuration/recognition/RawContentConfiguration.d.ts b/src/@types/configuration/recognition/RawContentConfiguration.d.ts deleted file mode 100644 index c22766aad..000000000 --- a/src/@types/configuration/recognition/RawContentConfiguration.d.ts +++ /dev/null @@ -1,15 +0,0 @@ - -import { TEraserConfiguration } from "./EraserConfiguration" -import { TTextConfConfiguration } from "./TextConfiguration" - -export type TRawContentRecognitionConfiguration = { - text: boolean - shape: boolean -} - -export type TRawContentConfiguration = { - text?: TTextConfConfiguration - "session-time"?: number - recognition?: TRecognitionConfiguration - eraser?: TEraserConfiguration -} diff --git a/src/@types/configuration/recognition/TextConfiguration.d.ts b/src/@types/configuration/recognition/TextConfiguration.d.ts deleted file mode 100644 index 773ba48aa..000000000 --- a/src/@types/configuration/recognition/TextConfiguration.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { TMarginConfiguration } from "./MarginConfiguration" -import { TEraserConfiguration } from "./EraserConfiguration" - -export type TTextGuidesConfiguration = { - enable: boolean -} - -export type TTextConfConfiguration = { - customResources?: string[] - customLexicon?: string[] - addLKText?: boolean -} - -export type TTextConfiguration = { - text?: boolean - mimeTypes: ("text/plain" | "application/vnd.myscript.jiix")[] - margin: TMarginConfiguration - guides?: TTextGuidesConfiguration - configuration?: TTextConfConfiguration - eraser?: TEraserConfiguration -} diff --git a/src/@types/configuration/recognition/index.d.ts b/src/@types/configuration/recognition/index.d.ts deleted file mode 100644 index ce1200bf9..000000000 --- a/src/@types/configuration/recognition/index.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * from "./ConvertConfiguration" -export * from "./DiagramConfiguration" -export * from "./EraserConfiguration" -export * from "./ExportConfiguration" -export * from "./MarginConfiguration" -export * from "./MathConfiguration" -export * from "./RawContentConfiguration" -export * from "./TextConfiguration" diff --git a/src/@types/geometry.ts b/src/@types/geometry.ts deleted file mode 100644 index 8ff835df7..000000000 --- a/src/@types/geometry.ts +++ /dev/null @@ -1,14 +0,0 @@ - -export type TPoint = { - x: number - y: number -} - -export type TPointer = TPoint & { - t: number - p: number -} - -export type TSegment = { p1: TPoint, p2: TPoint } - -export type TLineEquation = { a: number, b: number} diff --git a/src/@types/grabber/Grabber.d.ts b/src/@types/grabber/Grabber.d.ts deleted file mode 100644 index 15ef4cd52..000000000 --- a/src/@types/grabber/Grabber.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { TPointer } from "../geometry" - -export interface IGrabber { - attach(domElement?: HTMLElement): void - - detach(domElement?: HTMLElement): void - - onPointerDown(evt: PointerEvent, point: TPointer): void - - onPointerMove(evt: PointerEvent, point: TPointer): void - - onPointerUp(evt: PointerEvent, point: TPointer): void -} diff --git a/src/@types/index.d.ts b/src/@types/index.d.ts deleted file mode 100644 index efc388c45..000000000 --- a/src/@types/index.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * from "./Behaviors" -export * from "./configuration" -export * from "./geometry" -export * from "./grabber/Grabber" -export * from "./model" -export * from "./recognizer" -export * from "./renderer/Symbol" -export * from "./style" -export * from "./undo-redo/UndoRedoContext" diff --git a/src/@types/model/Model.d.ts b/src/@types/model/Model.d.ts deleted file mode 100644 index 269e4dbd0..000000000 --- a/src/@types/model/Model.d.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { TPoint, TPointer } from "../geometry" -import { TStroke } from "./Stroke" -import { TPenStyle } from "../style/PenStyle" -import { TRecognitionPositions } from "./RecognitionPositions" - -export type TWordExport = { - id?: string - label: string, - candidates?: string[] -} - -export type TJIIXExport = { - type: string, - id: string, - label: string, - version: string, - words: TWordExport[] -} - -/** - * List all supported MIME types for export. - * Attention, the MIME types supported depend on the {@link TRecognitionType | type of recognition} - */ -export type TExport = { - /** @hidden */ - [key: string]: TJIIXExport | string | Blob - /** - * vnd.myscript.jiix is used for text and raw-content exports - */ - "application/vnd.myscript.jiix"?: TJIIXExport - /** - * text/plain is only use for text export - */ - "text/plain"? : string - /** - * x-latex is only use for math export - * @see {@link https://katex.org/docs/browser.html | katex} to render - */ - "application/x-latex"?: string - /** - * mathml+xml is only use for math export - * @see {@link https://www.w3.org/Math/whatIsMathML.html | Mathematical Markup Language} - */ - "application/mathml+xml"?: string - /** - * svg+xml is only use for diagram export - */ - "image/svg+xml"?: string - /** - * vnd.openxmlformats-officedocument.presentationml.presentation is only use for diagram export - * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Blob | Blob} - */ - "application/vnd.openxmlformats-officedocument.presentationml.presentation"?: Blob -} - -export interface IModel -{ - readonly creationTime: number - modificationDate: number - currentStroke?: TStroke - positions: TRecognitionPositions - rawStrokes: TStroke[] - selectedStrokes: TStroke[] - converts?: TExport - exports?: TExport - width: number - height: number - idle: boolean - - mergeExport(exports: TExport) - mergeConvert(converts: TExport) - - addPoint(stroke: TStroke, point: TPointer): void - addStroke(stroke: TStroke): void - extractUnsentStrokes(): TStroke[] - - initCurrentStroke(point: TPointer, pointerId: number, pointerType: string, style: TPenStyle, dpi: number = 96): void - appendToCurrentStroke(point: TPointer): void - endCurrentStroke(point: TPointer): void - - resetSelectedStrokes(): void - appendSelectedStrokesFromPoint(point: TPoint): void - - removeStroke(id: string): void - updateStroke(updatedStroke: TStroke): void - removeStrokesFromPoint(point: TPoint): string[] - - updatePositionSent(position: number = this.model.rawStrokes.length - 1): void - updatePositionReceived(): void - - getClone(): IModel - - clear(): void -} diff --git a/src/@types/model/RecognitionPositions.d.ts b/src/@types/model/RecognitionPositions.d.ts deleted file mode 100644 index 042238459..000000000 --- a/src/@types/model/RecognitionPositions.d.ts +++ /dev/null @@ -1,5 +0,0 @@ - -export type TRecognitionPositions = { - lastSentPosition: number - lastReceivedPosition: number -} diff --git a/src/@types/model/Stroke.d.ts b/src/@types/model/Stroke.d.ts deleted file mode 100644 index c509bea76..000000000 --- a/src/@types/model/Stroke.d.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { TPointer } from "../geometry" -import { TSymbol } from "../renderer/Symbol" -import { TPenStyle } from "../style/PenStyle" - -export type TStrokeJSON = { - id: string - pointerType: string - x: number[] - y: number[] - t: number[] - p: number[] -} - -export type TStrokeGroupJSON = { - penStyle?: string - strokes: TStrokeJSON[] -} - -export type TStroke = TSymbol & { - id: string - pointerId: number - pointerType: string - pointers: TPointer[] - length: number -} - -export type TStrokeGroup = { - penStyle: TPenStyle - strokes: TStroke[] -} diff --git a/src/@types/model/index.d.ts b/src/@types/model/index.d.ts deleted file mode 100644 index e77dd1c61..000000000 --- a/src/@types/model/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./Model" -export * from "./RecognitionPositions" -export * from "./Stroke" diff --git a/src/@types/modules.d.ts b/src/@types/modules.d.ts deleted file mode 100644 index 645fe33b0..000000000 --- a/src/@types/modules.d.ts +++ /dev/null @@ -1,22 +0,0 @@ - -/** - * @hidden - */ -type JsonCSS = { - toCSS(json): string - toJSON(style): TTheme -} - -/** - * @hidden - */ -declare module "json-css" - -/** - * @hidden - */ -declare module "crypto-js/enc-hex" -/** - * @hidden - */ -declare module "crypto-js/hmac-sha512" diff --git a/src/@types/recognizer/Recognizer.d.ts b/src/@types/recognizer/Recognizer.d.ts deleted file mode 100644 index 45507ed41..000000000 --- a/src/@types/recognizer/Recognizer.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { IModel } from "../model/Model" - -export interface IRecognizer { - export(model: IModel, mimeTypes?: string[]): Promise - resize(model: IModel): Promise - import?(model: IModel, data: Blob, mimeType?: string): Promise -} diff --git a/src/@types/recognizer/RestRecognizer.d.ts b/src/@types/recognizer/RestRecognizer.d.ts deleted file mode 100644 index 4b177d9d5..000000000 --- a/src/@types/recognizer/RestRecognizer.d.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { TDiagramConfiguration } from "../configuration/recognition/DiagramConfiguration" -import { TMathConfiguration } from "../configuration/recognition/MathConfiguration" -import { TRawContentConfiguration } from "../configuration/recognition/RawContentConfiguration" -import { TTextConfiguration } from "../configuration/recognition/TextConfiguration" -import { TConverstionState } from "../configuration/RecognitionConfiguration" -import { TStrokeGroupJSON } from "../model/Stroke" - -export type TRestPostConfiguration = { - lang: string, - diagram?: TDiagramConfiguration, - math?: TMathConfiguration, - "raw-content"?: TRawContentConfiguration, - text?: TTextConfiguration, - export: TExportConfiguration -} - -export type TRestPostData = { - configuration: TRestPostConfiguration, - xDPI: number, - yDPI: nmber, - contentType: string, - conversionState?: TConverstionState - height: number, - width: nmber, - strokeGroups: TStrokeGroupJSON[] -} \ No newline at end of file diff --git a/src/@types/recognizer/WSRecognizer.d.ts b/src/@types/recognizer/WSRecognizer.d.ts deleted file mode 100644 index 5b5ed24c1..000000000 --- a/src/@types/recognizer/WSRecognizer.d.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { TExport } from "../model/Model" - - -export type TWebSocketEvent = { - type: string - [key: string]: unknown -} - -export type TWebSocketErrorEvent = { - type: string - code?: number | string - message?: string - data? : { - code: number | string - message: string - } -} - -export type TWebSocketHMACChallengeEvent = TWebSocketEvent & { - hmacChallenge: string - iinkSessionId: string -} - -export type TContentPackageDescriptionMessage = TWebSocketEvent & { - contentPartCount: number -} - -export type TWebSocketPartChangeEvent = TWebSocketEvent & { - partIdx: number - partId: string - partCount: number -} - -export type TWebSocketContentChangeEvent = TWebSocketEvent & { - partId: string - canUndo: boolean - canRedo: boolean - empty: boolean - undoStackIndex: number - possibleUndoCount: number -} - -export type TWebSocketExportEvent = TWebSocketEvent & { - partId: string - exports: TExport -} - -export type TUpdatePatchType = "REPLACE_ALL" | "REMOVE_ELEMENT" | "REPLACE_ELEMENT" | "REMOVE_CHILD" | "APPEND_CHILD" | "INSERT_BEFORE" | "REMOVE_ATTRIBUTE" | "SET_ATTRIBUTE" - -export type TUpdatePatch = { - type: TUpdatePatchType -} - -export type TUpdatePatchReplaceAll = TUpdatePatch & { - svg: string -} - -export type TUpdatePatchReplaceELement = TUpdatePatch & { - id: string - svg: string -} - -export type TUpdatePatchInsertBefore = TUpdatePatch & { - refId: string - svg: string -} - -export type TUpdatePatchRemoveElement = TUpdatePatch & { - id: string -} - -export type TUpdatePatchAppendChild = TUpdatePatch & { - parentId?: string - svg: string -} - -export type TUpdatePatchRemoveChild = TUpdatePatch & { - parentId: string - index: number -} - -export type TUpdatePatchRemoveAttribut = TUpdatePatch & { - id?: string - name: string -} - -export type TUpdatePatchSetAttribut = TUpdatePatch & { - id?: string - name: string - value: string -} - -export type TWebSocketSVGPatchEvent = TWebSocketEvent & { - updates: TUpdatePatch[] - layer: ("MODEL" | "CAPTURE") -} diff --git a/src/@types/recognizer/index.d.ts b/src/@types/recognizer/index.d.ts deleted file mode 100644 index adee9a25f..000000000 --- a/src/@types/recognizer/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./Recognizer" -export * from "./RestRecognizer" -export * from "./WSRecognizer" diff --git a/src/@types/renderer/Symbol.d.ts b/src/@types/renderer/Symbol.d.ts deleted file mode 100644 index cb526eb83..000000000 --- a/src/@types/renderer/Symbol.d.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { TPenStyle } from "../style/PenStyle" -import { TPoint, TPointer } from "../geometry" - -export type TSymbol = { - elementType?: string - type: string - style: TPenStyle -} - -export type TShapeSymbol = TSymbol & { - candidates: TSymbol[] - selectedCandidateIndex: number -} - -export type TShapeEllipseSymbol = TSymbol & { - centerPoint: TPoint - maxRadius: number - minRadius: number - orientation: number - startAngle: number - sweepAngle: number - beginDecoration?: string - endDecoration?: string - beginTangentAngle: number - endTangentAngle: number -} - -export type TShapeLineSymbol = TShapeEllipseSymbol & { - firstPoint: TPoint - lastPoint: TPoint -} - -export type TLineSymbol = TSymbol & { - data: { - p1: TPoint - p2: TPoint - } -} - -export type TShapeTableSymbol = TSymbol & { - lines: TShapeLineSymbol[] -} - -export type TShapeRecognizedSymbol = TSymbol & { - primitives: TSymbol[] -} - -export type TUnderLineSymbol = TSymbol & { - data: { - firstCharacter: number - lastCharacter: number - } -} - -export type TTextUnderlineDataSymbol = { - topLeftPoint: TPointer - height: number - width: number - textHeight: number - justificationType: string -} - -export type TTextUnderlineSymbol = TSymbol & { - label: string, - data: TTextUnderlineDataSymbol - underlineList: TUnderLineSymbol[] -} diff --git a/src/@types/style/PenStyle.d.ts b/src/@types/style/PenStyle.d.ts deleted file mode 100644 index 61a7f23f7..000000000 --- a/src/@types/style/PenStyle.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * @typedef {Object} PenStyle - * @property {String} color=#000000 Color (supported formats rgb() rgba() hsl() hsla() #rgb #rgba #rrggbb #rrggbbaa) - * @property {String} -myscript-pen-width=1 Width of strokes and primitives in mm (no other unit is supported yet) - * @property {String} -myscript-pen-fill-style=none - * @property {String} -myscript-pen-fill-color=#FFFFFF00 Color filled inside the area delimited by strokes and primitives - */ -export type TPenStyle = { - color?: string - width?: number - "-myscript-pen-width"?: number - "-myscript-pen-fill-style"?: string - "-myscript-pen-fill-color"?: string -} \ No newline at end of file diff --git a/src/@types/style/Theme.d.ts b/src/@types/style/Theme.d.ts deleted file mode 100644 index ea0eee1d1..000000000 --- a/src/@types/style/Theme.d.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { TPenStyle } from "./PenStyle" - -export type TMathTheme = { - "font-family": string -} - -export type TMathSolvedTheme = { - "font-family": string - color: string -} - -export type TTextTheme = { - "font-family": string, - "font-size": number -} - -export type TTheme = { - ink: TPenStyle - ".math": TMathTheme - ".math-solved": TMathSolvedTheme - ".text": TTextTheme - [key: string]: unknown -} \ No newline at end of file diff --git a/src/@types/style/index.d.ts b/src/@types/style/index.d.ts deleted file mode 100644 index c2ef16788..000000000 --- a/src/@types/style/index.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./PenStyle" -export * from "./Theme" diff --git a/src/@types/undo-redo/UndoRedoContext.d.ts b/src/@types/undo-redo/UndoRedoContext.d.ts deleted file mode 100644 index 72cc625a0..000000000 --- a/src/@types/undo-redo/UndoRedoContext.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { IModel } from "../model/Model" - -export type TUndoRedoContext = { - canUndo: boolean - canRedo: boolean - empty: boolean - stackIndex: number - possibleUndoCount: number - stack: IModel[] -} diff --git a/src/Constants.ts b/src/Constants.ts deleted file mode 100644 index 1424a31cd..000000000 --- a/src/Constants.ts +++ /dev/null @@ -1,123 +0,0 @@ -/** - * @group Error - * @remarks List all errors generated by the backend with their descriptions - */ -export const Error = { - NO_ACTIVITY: "Session closed due to no activity.", - WRONG_CREDENTIALS: "Application credentials are invalid. Please check or regenerate your application key and hmackey.", - TOO_OLD: "Session is too old. Max Session Duration Reached.", - UNKNOW: "An unknown error has occurred.", - ABNORMAL_CLOSURE: "MyScript recognition server is not reachable.", - CANT_ESTABLISH: "Unable to establish a connection to MyScript recognition server. Check the host and your connectivity.", - GOING_AWAY: "MyScript recognition server is going away, either because of a server failure or because the browser is navigating away from the page that opened the connection.", - PROTOCOL_ERROR: "MyScript recognition server terminated the connection due to a protocol error.", - UNSUPPORTED_DATA: "MyScript recognition server terminated the connection because the endpoint received data of a type it cannot accept. (For example, a text-only endpoint received binary data.)", - INVALID_FRAME_PAULOAD: "MyScript recognition server terminated the connection because a message was received that contained inconsistent data (e.g., non-UTF-8 data within a text message).", - POLICY_VIOLATION: "MyScript recognition server terminated the connection because it received a message that violates its policy.", - MESSAGE_TOO_BIG: "MyScript recognition server terminated the connection because a data frame was received that is too large.", - INTERNAL_ERROR: "MyScript recognition server terminated the connection because it encountered an unexpected condition that prevented it from fulfilling the request.", - SERVICE_RESTART: "MyScript recognition server terminated the connection because it is restarting.", - TRY_AGAIN: "MyScript recognition server terminated the connection due to a temporary condition, e.g. it is overloaded and is casting off some of its clients.", - BAD_GATEWAY: "MyScript recognition server was acting as a gateway or proxy and received an invalid response from the upstream server.", - TLS_HANDSHAKE: "MyScript recognition server connection was closed due to a failure to perform a TLS handshake" -} as const - -/** - * @event - * @remarks Lists all events that can be listened to on the editor or DOM element - */ -export const EventType = { - /** - * @event - * event emitted when history has changed i.e. the context of undo-redo - */ - CHANGED: "changed", - /** - * @event - * event emitted when clearing is complete - */ - CLEARED: "cleared", - /** - * @event - * event emitted after the conversion is complete - */ - CONVERTED: "converted", - /** - * @event - * event emitted when the editor encounters an error - */ - ERROR: "error", - /** - * @event - * event emitted on click on pointer events - */ - POINTEREVENTS: "pointer_events", - /** - * @event - * event emitted after the end of the export - */ - EXPORTED: "exported", - /** - * @event - * event emitted after the end of the import - */ - IMPORTED: "imported", - /** - * @event - * event emitted when the server is idle after a job - */ - IDLE: "idle", - /** - * @event - * event emitted after full editor initialization - */ - LOADED: "loaded", -} as const - -/** - * @event - * @internal - * @remarks Lists all internal library events - */ -export const InternalEventType = { - SVG_PATCH: "internal_svg_patch", - EXPORTED: "internal_exported", - CLEAR_MESSAGE: "internal_clear_message", - ERROR: "internal_error", - NOTIF: "internal_notif", - IMPORT_JIIX: "internal_import_jiix", - CONVERT: "internal_convert", - CLEAR: "internal_clear", - CONTEXT_CHANGE: "internal_context_change", - IDLE: "internal_idle", - WS_CLOSED: "internal_websocket_closed", -} as const - -/** - * @group Export - * @remarks List all supported MIME types for export. Attention, the MIME types supported depend on the {@link TRecognitionType | type of recognition} - */ -export const enum ExportType { - JIIX = "application/vnd.myscript.jiix", - TEXT = "text/plain", - LATEX = "application/x-latex", - MATHML = "application/mathml+xml", - SVG = "image/svg+xml", - OFFICE_DOCUMENT = "application/vnd.openxmlformats-officedocument.presentationml.presentation" -} - -/** - * @group Editor - * @remarks List the possibilities of interactions - */ -export const enum Intention -{ - Write = "write", - Erase = "erase", - // Selecting = "selecting" -} - -/** - * @group Logger - */ -export { LoggerClass, LoggerLevel } from "./@types/configuration/LoggerConfiguration" diff --git a/src/Editor.ts b/src/Editor.ts deleted file mode 100644 index 57988a039..000000000 --- a/src/Editor.ts +++ /dev/null @@ -1,483 +0,0 @@ -import { TConfiguration } from "./@types/configuration" -import { IGrabber } from "./@types/grabber/Grabber" -import { TStroke } from "./@types/model/Stroke" -import { IModel, TExport, TJIIXExport } from "./@types/model/Model" -import { TPenStyle } from "./@types/style/PenStyle" -import { TTheme } from "./@types/style/Theme" -import { IBehaviors, TBehaviorOptions } from "./@types/Behaviors" -import { TConverstionState } from "./@types/configuration/RecognitionConfiguration" -import { TMarginConfiguration } from "./@types/configuration/recognition/MarginConfiguration" -import { TUndoRedoContext } from "./@types/undo-redo/UndoRedoContext" -import { LoggerClass, TLoggerConfiguration } from "./@types/configuration/LoggerConfiguration" - -import { ExportType, Intention } from "./Constants" -import { DefaultLoggerConfiguration } from "./configuration" -import { PublicEvent } from "./event/PublicEvent" -import { InternalEvent } from "./event/InternalEvent" -import { SmartGuide } from "./smartguide/SmartGuide" -import { DeferredPromise } from "./utils/DeferredPromise" -import { RestBehaviors } from "./behaviors/RestBehaviors" -import { WSBehaviors } from "./behaviors/WSBehaviors" -import { LoggerManager, Logger } from "./logger" - -import "./iink.css" - -export type HTMLEditorElement = HTMLElement & -{ - editor: Editor -} - -export class Editor -{ - wrapperHTML: HTMLEditorElement - #loaderHTML: HTMLDivElement - #messageHTML: HTMLDivElement - #behaviors!: IBehaviors - #smartGuide?: SmartGuide - #initializationDeferred: DeferredPromise - - logger: Logger - #loggerConfiguration: TLoggerConfiguration - showStrokesPan = false - - constructor(wrapperHTML: HTMLElement, options: TBehaviorOptions, globalClassCss = "ms-editor") - { - this.#loggerConfiguration = Object.assign({}, DefaultLoggerConfiguration, options.logger) - - this.logger = LoggerManager.getLogger(LoggerClass.EDITOR) - this.logger.info("constructor", { wrapperHTML, options, globalClassCss }) - this.#initializationDeferred = new DeferredPromise() - - this.wrapperHTML = wrapperHTML as HTMLEditorElement - this.wrapperHTML.classList.add(globalClassCss) - this.events.setElement(this.wrapperHTML) - - this.#loaderHTML = document.createElement("div") - this.#loaderHTML.classList.add("loader") - this.#loaderHTML.style.display = "none" - this.wrapperHTML.appendChild(this.#loaderHTML) - - this.#messageHTML = document.createElement("div") - this.#messageHTML.classList.add("message") - this.#messageHTML.style.display = "none" - this.wrapperHTML.appendChild(this.#messageHTML) - - this.#instantiateBehaviors(options) - } - - get loggerConfiguration(): TLoggerConfiguration - { - return this.#loggerConfiguration - } - - set loggerConfiguration(loggerConfig: TLoggerConfiguration) - { - this.#loggerConfiguration = loggerConfig - LoggerManager.setLoggerLevel(loggerConfig) - } - - get initializationPromise(): Promise - { - return this.#initializationDeferred.promise - } - - get model(): IModel - { - return this.behaviors.model - } - - get behaviors(): IBehaviors - { - return this.#behaviors - } - - get configuration(): TConfiguration - { - return this.behaviors.configuration - } - set configuration(configuration: TConfiguration) - { - this.logger.info("set configuration", { configuration }) - this.#instantiateBehaviors({ configuration }) - this.initialize() - } - - get intention(): Intention - { - return this.behaviors.intention - } - set intention(m: Intention) - { - this.logger.info("set intention", { m }) - this.behaviors.intention = m - switch (this.behaviors.intention) { - case Intention.Erase: - this.wrapperHTML.classList.add("erasing") - this.wrapperHTML.classList.remove("selecting") - break - // case Intention.Selecting: - // this.model.resetSelectedStrokes() - // this.wrapperHTML.classList.remove("erasing") - // this.wrapperHTML.classList.add("selecting") - // break; - default: - this.logger.warn("set intention default", { m }) - document.body.style.cursor = "initial" - this.wrapperHTML.classList.remove("erasing") - this.wrapperHTML.classList.remove("selecting") - break - } - this.logger.debug("set intention", this.wrapperHTML) - } - - get events(): PublicEvent - { - return PublicEvent.getInstance() - } - - get context(): TUndoRedoContext - { - return this.behaviors.context - } - - get grabber(): IGrabber - { - return this.behaviors.grabber - } - - get currentPenStyle(): TPenStyle - { - return this.behaviors.currentPenStyle - } - - get penStyle(): TPenStyle - { - return this.behaviors.penStyle - } - set penStyle(ps: TPenStyle) - { - this.logger.info("set penStyle", { ps }) - this.behaviors.setPenStyle(ps) - } - - get theme(): TTheme - { - return this.behaviors.theme - } - set theme(t: TTheme) - { - this.logger.info("set theme", { t }) - this.behaviors.setTheme(t) - } - - get penStyleClasses(): string - { - return this.behaviors.penStyleClasses - } - set penStyleClasses(psc: string) - { - this.logger.info("set penStyleClasses", { psc }) - this.behaviors.setPenStyleClasses(psc) - } - - #instantiateBehaviors(options: TBehaviorOptions) - { - this.logger.info("instantiateBehaviors", { options }) - if (!options?.configuration) { - throw new Error("Configuration required") - } - InternalEvent.getInstance().removeAllListeners() - if (this.#behaviors) { - this.#behaviors.destroy() - } - let defaultBehaviors: IBehaviors - if (options.configuration.server?.protocol === "REST") { - defaultBehaviors = new RestBehaviors(options) - } else { - defaultBehaviors = new WSBehaviors(options) - } - this.#behaviors = Object.assign(defaultBehaviors, options.behaviors) - this.logger.debug("instantiateBehaviors", this.#behaviors) - } - - async #initializeBehaviors(): Promise - { - this.logger.info("initializeBehaviors start") - this.#initializationDeferred = new DeferredPromise() - this.#loaderHTML.style.display = "initial" - this.#cleanMessage() - this.logger.debug("initializeBehaviors", this.wrapperHTML) - return this.behaviors.init(this.wrapperHTML) - .then(async () => - { - this.logger.info("initializeBehaviors then") - this.wrapperHTML.editor = this - this.#initializationDeferred.resolve() - this.events.emitLoaded() - this.logger.debug("initializeBehaviors", this.wrapperHTML) - }) - .catch((error: Error) => - { - this.logger.error("initializeBehaviors catch", { error }) - this.#initializationDeferred.reject(error) - this.#showError(error) - }) - .finally(() => - { - this.logger.info("initializeBehaviors finally", { }) - this.#loaderHTML.style.display = "none" - return this.#initializationDeferred.promise - }) - } - - #initializeSmartGuide(): void - { - this.#smartGuide?.destroy() - this.logger.info("initializeSmartGuide", { smartGuide: this.configuration.rendering.smartGuide }) - if (this.configuration.rendering.smartGuide.enable) { - this.#smartGuide = new SmartGuide() - let margin: TMarginConfiguration - switch (this.configuration.recognition.type) { - case "TEXT": - margin = this.configuration.recognition.text.margin - break - case "MATH": - margin = this.configuration.recognition.math.margin - break - default: - this.logger.warn("initializeSmartGuide default", this.configuration.recognition.type) - margin = { - top: 20, - left: 10, - right: 10, - bottom: 10 - } - break - } - this.#smartGuide.init(this.wrapperHTML, margin, this.configuration.rendering) - } - } - - #cleanMessage() - { - this.logger.debug("cleanMessage", this.#messageHTML) - this.#messageHTML.style.display = "none" - this.#messageHTML.innerHTML = "" - this.logger.debug("cleanMessage", this.#messageHTML) - } - - #showError(err: Error) - { - this.logger.debug("showError", this.#messageHTML) - this.#messageHTML.style.display = "initial" - this.#messageHTML.classList.add("error-msg") - this.#messageHTML.classList.remove("info-msg") - this.#messageHTML.innerText = err.message - this.logger.debug("showError", this.#messageHTML) - } - - #showNotif(notif: { message: string, timeout?: number }) - { - this.logger.debug("showNotif", this.#messageHTML) - this.#messageHTML.style.display = "initial" - this.#messageHTML.classList.add("info-msg") - this.#messageHTML.classList.remove("error-msg") - this.#messageHTML.innerText = notif.message - setTimeout(() => - { - this.#cleanMessage() - }, notif.timeout || 2500) - this.logger.debug("showNotif", this.#messageHTML) - } - - #showStrokesIfDebug(): void - { - if (this.showStrokesPan) { - let panel = document.getElementById("stroke-panel") - const text = JSON.stringify(this.model.rawStrokes.map((s: TStroke) => ({ pointerType: s.pointerType, pointerId: s.pointerId, pointers: s.pointers }))) - if (!panel) { - panel = document.createElement("div") - panel.id = "stroke-panel" - panel.addEventListener("click", (e) => - { - e.preventDefault() - e.stopPropagation() - navigator.clipboard.writeText(panel?.innerText as string) - this.#showNotif({ message: "strokes copied to clipboard!", timeout: 1500 }) - }) - this.wrapperHTML.appendChild(panel) - } - panel.innerText = text - } - } - - #addListeners(): void - { - InternalEvent.getInstance().addConvertListener(this.convert.bind(this)) - InternalEvent.getInstance().addClearListener(this.clear.bind(this)) - InternalEvent.getInstance().addErrorListener(this.#showError.bind(this)) - InternalEvent.getInstance().addImportJIIXListener(this.#onImportJIIX.bind(this)) - InternalEvent.getInstance().addExportedListener(this.#onExport.bind(this)) - InternalEvent.getInstance().addNotifListener(this.#showNotif.bind(this)) - InternalEvent.getInstance().addClearMessageListener(this.#cleanMessage.bind(this)) - InternalEvent.getInstance().addContextChangeListener(this.#onContextChange.bind(this)) - InternalEvent.getInstance().addIdleListener(this.#onIdleChange.bind(this)) - } - - #onContextChange = (context: TUndoRedoContext) => - { - this.events.emitChanged(context) - } - - #onIdleChange = (idle: boolean) => - { - this.events.emitIdle(idle) - } - - #onExport(exports: TExport): void - { - this.logger.info("onExport", { exports }) - this.model.mergeExport(exports) - if (this.configuration.rendering.smartGuide.enable) { - if (exports && exports["application/vnd.myscript.jiix"]) { - const jjix = exports["application/vnd.myscript.jiix"] as TJIIXExport - this.#smartGuide?.update(jjix) - } - } - this.#showStrokesIfDebug() - this.events.emitExported(exports) - } - - #onImportJIIX(jiix: TJIIXExport): void - { - this.logger.info("onImportJIIX", { jiix }) - this.import(new Blob([JSON.stringify(jiix)], { type: ExportType.JIIX }), ExportType.JIIX) - } - - async initialize(): Promise - { - this.logger.info("initialize") - await this.#initializeBehaviors() - this.#initializeSmartGuide() - this.#addListeners() - } - - async waitForIdle(): Promise - { - if (this.behaviors.waitForIdle) - { - return this.behaviors.waitForIdle() - } - return - } - - async undo(): Promise - { - this.logger.debug("undo", this.model) - this.logger.info("undo", { }) - await this.#initializationDeferred.promise - await this.behaviors.undo() - this.#showStrokesIfDebug() - this.logger.debug("undo", this.model) - return this.model - } - - async redo(): Promise - { - this.logger.debug("redo", this.model) - this.logger.info("redo") - await this.#initializationDeferred.promise - await this.behaviors.redo() - this.#showStrokesIfDebug() - this.logger.debug("redo", this.model) - return this.model - } - - async clear(): Promise - { - this.logger.debug("clear", this.model) - this.logger.info("clear") - await this.#initializationDeferred.promise - await this.behaviors.clear() - this.events.emitCleared(this.model) - this.#showStrokesIfDebug() - this.logger.debug("clear", this.model) - return this.model - } - - async resize(): Promise - { - this.logger.debug("resize", this.model) - this.logger.info("resize") - await this.#initializationDeferred.promise - if (this.configuration.rendering.smartGuide.enable) { - this.#smartGuide?.resize() - } - const compStyles = window.getComputedStyle(this.wrapperHTML) - const height = Math.max(parseInt(compStyles.height.replace("px","")), this.configuration.rendering.minHeight) - const width = Math.max(parseInt(compStyles.width.replace("px","")), this.configuration.rendering.minWidth) - await this.behaviors.resize(height, width) - this.logger.debug("resize", this.model) - return this.model - } - - async export(mimeTypes?: string[]): Promise - { - this.logger.debug("export", this.model) - this.logger.info("export", { mimeTypes }) - await this.#initializationDeferred.promise - await this.behaviors.export(mimeTypes) - this.logger.debug("export", this.model) - return this.model - } - - async convert(params?: { conversionState?: TConverstionState, mimeTypes?: string[] }): Promise - { - this.logger.debug("convert", this.model) - this.logger.info("export", { params }) - await this.#initializationDeferred.promise - await this.behaviors.convert(params?.conversionState, params?.mimeTypes) - this.events.emitConverted(this.model.converts as TExport) - this.logger.debug("convert", this.model) - return this.model - } - - async import(data: Blob | string | TJIIXExport, mimeType?: string): Promise - { - this.logger.debug("import", this.model) - this.logger.info("import", { data, mimeType }) - await this.#initializationDeferred.promise - if (this.behaviors.import) { - let blobToImport: Blob - if (data instanceof Blob) { - blobToImport = data - } - else if (typeof data === "string") { - blobToImport = new Blob([data]) - } - else { - blobToImport = new Blob([JSON.stringify(data)]) - } - await this.behaviors.import(blobToImport, mimeType) - this.events.emitImported(this.model.exports as TExport) - this.logger.debug("import", this.model) - return this.model - } - return Promise.reject("Import impossible, behaviors has no import function") - } - - async importPointEvents(strokes: TStroke[]): Promise - { - this.logger.debug("importPointEvents", this.model) - this.logger.info("importPointEvents", { strokes }) - await this.#initializationDeferred.promise - if (this.behaviors.importPointEvents) { - await this.behaviors.importPointEvents(strokes) - this.events.emitImported(this.model.exports as TExport) - this.logger.debug("importPointEvents", this.model) - return this.model - } - return Promise.reject("Import impossible, behaviors has no importPointEvents function") - } - -} diff --git a/src/behaviors/RestBehaviors.ts b/src/behaviors/RestBehaviors.ts deleted file mode 100644 index 5da42f177..000000000 --- a/src/behaviors/RestBehaviors.ts +++ /dev/null @@ -1,319 +0,0 @@ -import { IBehaviors, TBehaviorOptions } from "../@types/Behaviors" -import { IModel, TExport } from "../@types/model/Model" -import { TConfiguration } from "../@types/configuration" -import { TConverstionState } from "../@types/configuration/RecognitionConfiguration" -import { TUndoRedoContext } from "../@types/undo-redo/UndoRedoContext" -import { TPenStyle } from "../@types/style/PenStyle" -import { TTheme } from "../@types/style/Theme" -import { TPointer } from "../@types/geometry" - -import { PointerEventGrabber } from "../grabber/PointerEventGrabber" -import { CanvasRenderer } from "../renderer/canvas/CanvasRenderer" -import { RestRecognizer } from "../recognizer/RestRecognizer" -import { DeferredPromise } from "../utils/DeferredPromise" -import { UndoRedoManager } from "../undo-redo/UndoRedoManager" -import { InternalEvent } from "../event/InternalEvent" -import { StyleManager } from "../style/StyleManager" -import { Configuration } from "../configuration/Configuration" -import { Model } from "../model/Model" -import { Intention, LoggerClass } from "../Constants" -import { LoggerManager } from "../logger" - -export class RestBehaviors implements IBehaviors -{ - name = "RestBehaviors" - options: TBehaviorOptions - grabber: PointerEventGrabber - renderer: CanvasRenderer - recognizer: RestRecognizer - undoRedoManager: UndoRedoManager - styleManager: StyleManager - #configuration: TConfiguration - #model: IModel - intention: Intention - #logger = LoggerManager.getLogger(LoggerClass.BEHAVIORS) - - #resizeTimer?: ReturnType - #exportTimer?: ReturnType - - constructor(options: TBehaviorOptions) - { - this.#logger.info("constructor", { options }) - this.options = options - this.#configuration = new Configuration(options?.configuration) - this.styleManager = new StyleManager(options.penStyle, options.theme) - - this.grabber = new PointerEventGrabber(this.#configuration.grabber) - this.renderer = new CanvasRenderer(this.#configuration.rendering) - this.recognizer = new RestRecognizer(this.#configuration.server, this.#configuration.recognition) - - this.intention = Intention.Write - this.#model = new Model() - this.undoRedoManager = new UndoRedoManager(this.#configuration["undo-redo"], this.model) - } - - get internalEvent(): InternalEvent - { - return InternalEvent.getInstance() - } - - get model(): IModel - { - return this.#model - } - - get context(): TUndoRedoContext - { - return this.undoRedoManager.context - } - - get currentPenStyle(): TPenStyle - { - return this.styleManager.currentPenStyle - } - - get penStyle(): TPenStyle - { - return this.styleManager.penStyle - } - setPenStyle(style?: TPenStyle) - { - this.#logger.info("setPenStyle", { style }) - this.styleManager.setPenStyle(style) - } - - get penStyleClasses(): string - { - return this.styleManager.penStyleClasses - } - setPenStyleClasses(penClass?: string) - { - this.#logger.info("setPenStyleClasses", { penClass }) - this.styleManager.setPenStyleClasses(penClass) - } - - get theme(): TTheme - { - return this.styleManager.theme - } - setTheme(theme?: TTheme) - { - this.#logger.info("setTheme", { theme }) - this.styleManager.setTheme(theme) - } - - get configuration(): TConfiguration - { - return this.#configuration - } - - async init(domElement: HTMLElement): Promise - { - this.#logger.info("init", { domElement }) - this.model.width = Math.max(domElement.clientWidth, this.#configuration.rendering.minWidth) - this.model.height = Math.max(domElement.clientHeight, this.#configuration.rendering.minHeight) - this.undoRedoManager.updateModelInStack(this.model) - - this.renderer.init(domElement) - - this.grabber.attach(domElement) - this.grabber.onPointerDown = this.onPointerDown.bind(this) - this.grabber.onPointerMove = this.onPointerMove.bind(this) - this.grabber.onPointerUp = this.onPointerUp.bind(this) - } - - private onPointerDown(evt: PointerEvent, point: TPointer): void - { - this.#logger.info("onPointerDown", { intention: this.intention, evt, point }) - const { pointerType } = evt - const style: TPenStyle = Object.assign({}, this.theme?.ink, this.currentPenStyle) - switch (this.intention) { - case Intention.Erase: - if (this.model.removeStrokesFromPoint(point).length > 0) { - this.model.endCurrentStroke(point) - this.updateModelRendering() - .then(model => Object.assign(this.model, model)) - .catch(error => this.internalEvent.emitError(error as Error)) - } - break - case Intention.Write: - this.model.initCurrentStroke(point, evt.pointerId, pointerType, style) - this.drawCurrentStroke() - break - default: - this.#logger.warn(`onPointerDown intention unknow: "${this.intention}"`) - break - } - } - - private onPointerMove(_evt: PointerEvent, point: TPointer): void - { - this.#logger.info("onPointerMove", { intention: this.intention, point }) - switch (this.intention) { - case Intention.Erase: - if (this.model.removeStrokesFromPoint(point).length > 0) { - this.model.endCurrentStroke(point) - this.updateModelRendering() - .then(newModel => Object.assign(this.#model, newModel)) - .catch(error => this.internalEvent.emitError(error as Error)) - } - break - case Intention.Write: - this.model.appendToCurrentStroke(point) - this.drawCurrentStroke() - break - default: - this.#logger.warn(`onPointerMove intention unknow: "${this.intention}"`) - break - } - } - - private onPointerUp(_evt: PointerEvent, point: TPointer): void - { - this.#logger.info("onPointerUp", { intention: this.intention, point }) - switch (this.intention) { - case Intention.Erase: - if (this.model.removeStrokesFromPoint(point).length > 0) { - this.model.endCurrentStroke(point) - this.updateModelRendering() - .then(newModel => Object.assign(this.#model, newModel)) - .catch(error => this.internalEvent.emitError(error as Error)) - } - break - case Intention.Write: - this.model.endCurrentStroke(point) - this.updateModelRendering() - .then(newModel => Object.assign(this.#model, newModel)) - .catch(error => this.internalEvent.emitError(error as Error)) - break - default: - this.#logger.warn(`onPointerUp intention unknow: "${this.intention}"`) - break - } - } - - drawCurrentStroke(): void - { - this.#logger.debug("drawCurrentStroke", { stroke: this.model.currentStroke }) - this.renderer.drawPendingStroke(this.model.currentStroke) - } - - async updateModelRendering(): Promise - { - this.#logger.info("updateModelRendering") - this.renderer.drawModel(this.model) - const deferred = new DeferredPromise() - this.undoRedoManager.addModelToStack(this.model) - if (this.#configuration.triggers.exportContent !== "DEMAND") { - clearTimeout(this.#exportTimer) - let currentModel = this.model.getClone() - this.#exportTimer = setTimeout(async () => - { - try { - currentModel = await this.recognizer.export(currentModel) - this.undoRedoManager.updateModelInStack(currentModel) - if (this.model.modificationDate === currentModel.modificationDate) { - this.model.exports = currentModel.exports - } - deferred.resolve(this.model) - } catch (error) { - this.#logger.error("updateModelRendering", { error }) - deferred.reject(error as Error) - } - }, this.#configuration.triggers.exportContent === "QUIET_PERIOD" ? this.#configuration.triggers.exportContentDelay : 0) - } else { - deferred.resolve(this.model) - } - await deferred.promise - this.internalEvent.emitExported(this.model.exports as TExport) - this.#logger.debug("updateModelRendering", this.model.exports) - return deferred.promise - } - - async export(mimeTypes?: string[]): Promise - { - this.#logger.info("export", { mimeTypes }) - const newModel = await this.recognizer.export(this.model.getClone(), mimeTypes) - if (this.model.modificationDate === newModel.modificationDate) { - this.model.mergeExport(newModel.exports as TExport) - } - this.undoRedoManager.updateModelInStack(newModel) - this.#logger.debug("export", this.model) - return this.model - } - - async convert(conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise - { - this.#logger.info("convert", { conversionState, requestedMimeTypes }) - const newModel = await this.recognizer.convert(this.model, conversionState, requestedMimeTypes) - Object.assign(this.#model, newModel) - this.#logger.debug("convert", this.model) - return this.model - } - - async resize(height: number, width: number): Promise - { - this.#logger.info("resize", { height, width }) - const deferredResize = new DeferredPromise() - this.model.height = height - this.model.width = width - this.renderer.resize(this.model) - if (this.model.rawStrokes.length) { - clearTimeout(this.#resizeTimer) - this.#resizeTimer = setTimeout(async () => - { - const resizeModel = await this.recognizer.resize(this.model) - deferredResize.resolve(resizeModel) - }, this.#configuration.triggers.resizeTriggerDelay) - } else { - deferredResize.resolve(this.model) - } - const newModel = await deferredResize.promise - this.#logger.debug("resize", { newModel }) - this.internalEvent.emitExported(newModel.exports as TExport) - return newModel - } - - async undo(): Promise - { - this.#logger.info("undo") - this.#model = this.undoRedoManager.undo() - this.renderer.drawModel(this.#model) - this.#model = await this.recognizer.export(this.#model) - this.undoRedoManager.updateModelInStack(this.#model) - this.internalEvent.emitExported(this.#model.exports as TExport) - this.#logger.debug("undo", this.#model) - return this.#model - } - - async redo(): Promise - { - this.#logger.info("redo") - this.#model = this.undoRedoManager.redo() - this.renderer.drawModel(this.#model) - this.#model = await this.recognizer.export(this.#model) - this.undoRedoManager.updateModelInStack(this.#model) - this.internalEvent.emitExported(this.#model.exports as TExport) - this.#logger.debug("redo", this.#model) - return this.#model - } - - async clear(): Promise - { - this.#logger.info("clear") - this.model.clear() - this.undoRedoManager.addModelToStack(this.model) - this.renderer.drawModel(this.model) - this.internalEvent.emitExported(this.model.exports as TExport) - this.#logger.debug("clear", this.model) - return this.model - } - - async destroy(): Promise - { - this.#logger.info("destroy") - this.grabber.detach() - this.renderer.destroy() - return Promise.resolve() - } -} diff --git a/src/behaviors/WSBehaviors.ts b/src/behaviors/WSBehaviors.ts deleted file mode 100644 index 07b3ff9fd..000000000 --- a/src/behaviors/WSBehaviors.ts +++ /dev/null @@ -1,325 +0,0 @@ -import { IBehaviors, TBehaviorOptions } from "../@types/Behaviors" -import { TConfiguration } from "../@types/configuration" -import { IModel, TExport } from "../@types/model/Model" -import { TWebSocketSVGPatchEvent } from "../@types/recognizer/WSRecognizer" -import { TStroke } from "../@types/model/Stroke" -import { TConverstionState } from "../@types/configuration/RecognitionConfiguration" -import { TUndoRedoContext } from "../@types/undo-redo/UndoRedoContext" -import { TTheme } from "../@types/style/Theme" -import { TPenStyle } from "../@types/style/PenStyle" -import { TPointer } from "../@types/geometry" - -import { PointerEventGrabber } from "../grabber/PointerEventGrabber" -import { WSRecognizer } from "../recognizer/WSRecognizer" -import { Intention } from "../Constants" -import { InternalEvent } from "../event/InternalEvent" -import { DeferredPromise } from "../utils/DeferredPromise" -import { WSSVGRenderer } from "../renderer/svg/WSSVGRenderer" -import { StyleManager } from "../style/StyleManager" -import { Configuration } from "../configuration/Configuration" -import { Model } from "../model/Model" -import { UndoRedoManager } from "../undo-redo" -import { LoggerManager } from "../logger" -import { LoggerClass } from "../Constants" - -export class WSBehaviors implements IBehaviors -{ - name = "WSBehaviors" - options: TBehaviorOptions - grabber: PointerEventGrabber - renderer: WSSVGRenderer - recognizer: WSRecognizer - undoRedoManager: UndoRedoManager - styleManager: StyleManager - #configuration: TConfiguration - #model: IModel - intention: Intention - #logger = LoggerManager.getLogger(LoggerClass.BEHAVIORS) - - #resizeTimer?: ReturnType - - constructor(options: TBehaviorOptions) - { - this.#logger.info("constructor", { options }) - this.options = options - this.#configuration = new Configuration(options?.configuration) - this.styleManager = new StyleManager(options.penStyle, options.theme) - - this.grabber = new PointerEventGrabber(this.#configuration.grabber) - this.renderer = new WSSVGRenderer(this.#configuration.rendering) - this.recognizer = new WSRecognizer(this.#configuration.server, this.#configuration.recognition) - - this.intention = Intention.Write - this.#model = new Model() - this.undoRedoManager = new UndoRedoManager(this.#configuration["undo-redo"], this.model) - } - - get internalEvent(): InternalEvent - { - return InternalEvent.getInstance() - } - - get model(): IModel - { - return this.#model - } - - get context(): TUndoRedoContext - { - return this.undoRedoManager.context - } - - get configuration(): TConfiguration - { - return this.#configuration - } - - get currentPenStyle(): TPenStyle - { - return this.styleManager.currentPenStyle - } - - get penStyle(): TPenStyle - { - return this.styleManager.penStyle - } - setPenStyle(penStyle?: TPenStyle): Promise - { - this.#logger.info("setPenStyle", { penStyle }) - this.styleManager.setPenStyle(penStyle) - this.#logger.debug("setPenStyle", this.styleManager.penStyle) - return this.recognizer.setPenStyle(this.styleManager.penStyle) - } - - get penStyleClasses(): string - { - return this.styleManager.penStyleClasses - } - setPenStyleClasses(penClass?: string): Promise - { - this.#logger.info("setPenStyleClasses", { penClass }) - this.styleManager.setPenStyleClasses(penClass) - this.#logger.debug("setPenStyleClasses", this.styleManager.penStyleClasses) - return this.recognizer.setPenStyleClasses(this.styleManager.penStyleClasses) - } - - get theme(): TTheme - { - return this.styleManager.theme - } - setTheme(theme: TTheme): Promise - { - this.#logger.info("setTheme", { theme }) - this.styleManager.setTheme(theme) - this.#logger.debug("setTheme", this.styleManager.theme) - return this.recognizer.setTheme(this.styleManager.theme) - } - - async init(domElement: HTMLElement): Promise - { - this.#logger.info("init", { domElement }) - const compStyles = window.getComputedStyle(domElement); - this.model.width = Math.max(parseInt(compStyles.width.replace("px","")), this.#configuration.rendering.minWidth) - this.model.height = Math.max(parseInt(compStyles.height.replace("px","")), this.#configuration.rendering.minHeight) - this.undoRedoManager.updateModelInStack(this.model) - - this.renderer.init(domElement) - - this.grabber.attach(domElement) - this.grabber.onPointerDown = this.onPointerDown.bind(this) - this.grabber.onPointerMove = this.onPointerMove.bind(this) - this.grabber.onPointerUp = this.onPointerUp.bind(this) - - this.internalEvent.addSVGPatchListener(this.onSVGPatch) - - await this.recognizer.init(this.model.height, this.model.width) - await this.setPenStyle(this.penStyle) - await this.setTheme(this.theme) - await this.setPenStyleClasses(this.penStyleClasses) - } - - private onPointerDown(evt: PointerEvent, point: TPointer): void - { - this.#logger.info("onPointerDown", { intention: this.intention, evt, point }) - let { pointerType } = evt - const style: TPenStyle = Object.assign({}, this.theme?.ink, this.currentPenStyle) - if (this.intention === Intention.Erase) { - pointerType = "eraser" - } - this.model.initCurrentStroke(point, evt.pointerId, pointerType, style) - this.drawCurrentStroke() - } - - private onPointerMove(_evt: PointerEvent, point: TPointer): void - { - this.#logger.info("onPointerMove", { intention: this.intention, point }) - this.model.appendToCurrentStroke(point) - this.drawCurrentStroke() - } - - private async onPointerUp(_evt: PointerEvent, point: TPointer): Promise - { - try { - this.#logger.info("onPointerUp", { intention: this.intention, point }) - this.model.endCurrentStroke(point) - await this.updateModelRendering() - } catch (error) { - this.internalEvent.emitError(error as Error) - } - } - - private onSVGPatch = (evt: TWebSocketSVGPatchEvent) => - { - this.#logger.info("onSVGPatch", { evt }) - this.renderer.updatesLayer(evt.layer, evt.updates) - } - - drawCurrentStroke(): void - { - this.#logger.debug("drawCurrentStroke", { stroke: this.model.currentStroke }) - const currentStroke = this.model.currentStroke as TStroke - if (currentStroke) { - this.renderer.drawPendingStroke(currentStroke) - } - } - - async updateModelRendering(): Promise - { - this.#logger.info("updateModelRendering") - if (this.#configuration.triggers.exportContent !== "DEMAND") { - const unsentStrokes = this.model.extractUnsentStrokes() - this.model.updatePositionSent() - this.undoRedoManager.addModelToStack(this.model) - this.renderer.clearErasingStrokes() - const exports = await this.recognizer.addStrokes(unsentStrokes) - this.model.mergeExport(exports) - this.undoRedoManager.updateModelInStack(this.model) - } - this.#logger.debug("updateModelRendering", this.model) - return this.model - } - - async waitForIdle(): Promise - { - return this.recognizer.waitForIdle() - } - - async importPointEvents(strokes: TStroke[]): Promise - { - this.#logger.info("importPointEvents", { strokes }) - const exportPoints = await this.recognizer.importPointEvents(strokes) - this.model.mergeExport(exportPoints) - this.#logger.debug("importPointEvents", this.model) - return this.model - } - - async export(mimeTypes?: string[]): Promise - { - this.#logger.info("export", { mimeTypes }) - try { - if (this.#configuration.triggers.exportContent === "DEMAND") { - const unsentStrokes = this.model.extractUnsentStrokes() - this.model.updatePositionSent() - const exports = await this.recognizer.addStrokes(unsentStrokes) - this.model.updatePositionReceived() - this.model.mergeExport(exports) - this.#logger.debug("export", this.model) - return this.model - } else { - return this.recognizer.export(this.model, mimeTypes) - } - } catch (error) { - this.#logger.error("export", { error } ) - this.internalEvent.emitError(error as Error) - return Promise.reject(error) - } - } - - async convert(conversionState?: TConverstionState): Promise - { - this.#logger.info("convert", { conversionState }) - this.undoRedoManager.addModelToStack(this.model) - this.context.stack.push(this.model.getClone()) - this.#model = await this.recognizer.convert(this.model, conversionState) - this.#logger.debug("convert", this.model) - this.undoRedoManager.addModelToStack(this.model) - return this.model - } - - async import(data: Blob, mimeType?: string): Promise - { - this.#logger.info("import", { data, mimeType }) - this.context.stack.push(this.model.getClone()) - const m = await this.recognizer.import(this.model, data, mimeType) - this.undoRedoManager.addModelToStack(m) - return m - } - - async resize(height: number, width: number): Promise - { - this.#logger.info("resize", { height, width }) - const deferredResize = new DeferredPromise() - this.model.height = height - this.model.width = width - const clonedModel = this.model.getClone() - this.renderer.resize(clonedModel) - clearTimeout(this.#resizeTimer) - this.#resizeTimer = setTimeout(async () => - { - try { - const resizeModel = await this.recognizer.resize(clonedModel) - deferredResize.resolve(resizeModel) - } catch (error) { - this.#logger.error("resize", { height, width, error } ) - deferredResize.reject(error as Error) - } - }, this.#configuration.triggers.resizeTriggerDelay) - - this.#model = await deferredResize.promise - this.internalEvent.emitExported(this.model.exports as TExport) - this.#logger.debug("resize", this.model) - return this.model - } - - async undo(): Promise - { - this.#logger.info("undo") - if (this.context.canUndo) { - this.#model = this.undoRedoManager.undo() - return this.recognizer.undo(this.model) - } - else { - throw new Error("Undo not allowed") - } - } - - async redo(): Promise - { - this.#logger.info("redo") - if (this.context.canRedo) { - this.#model = this.undoRedoManager.redo() - this.#logger.debug("undo", this.#model) - return this.recognizer.redo(this.model) - } - else { - throw new Error("Redo not allowed") - } - } - - async clear(): Promise - { - this.#logger.info("clear") - this.model.clear() - this.undoRedoManager.addModelToStack(this.model) - return this.recognizer.clear(this.model) - } - - async destroy(): Promise - { - this.#logger.info("destroy") - this.grabber.detach() - this.renderer.destroy() - this.recognizer.destroy() - return Promise.resolve() - } -} diff --git a/src/behaviors/index.ts b/src/behaviors/index.ts deleted file mode 100644 index 020095935..000000000 --- a/src/behaviors/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { RestBehaviors } from "./RestBehaviors" -export { WSBehaviors } from "./WSBehaviors" diff --git a/src/configuration/Configuration.ts b/src/configuration/Configuration.ts deleted file mode 100644 index 5c7b0864c..000000000 --- a/src/configuration/Configuration.ts +++ /dev/null @@ -1,85 +0,0 @@ - -import { TConfiguration, TConfigurationClient } from "../@types/configuration" -import { TEventConfiguration } from "../@types/configuration/EventConfiguration" -import { TGrabberConfiguration } from "../@types/configuration/GrabberConfiguration" -import { TRecognitionConfiguration } from "../@types/configuration/RecognitionConfiguration" -import { TRenderingConfiguration } from "../@types/configuration/RenderingConfiguration" -import { TServerConfiguration } from "../@types/configuration/ServerConfiguration" -import { TTriggerConfiguration } from "../@types/configuration/TriggerConfiguration" -import { TUndoRedoConfiguration } from "../@types/configuration/UndoRedoConfiguration" -import { DefaultConfiguration } from "./DefaultConfiguration" -import { mergeDeep } from "../utils/MergeHelper" -import { LoggerManager } from "../logger" -import { LoggerClass } from "../Constants" - -export class Configuration implements TConfiguration -{ - events: TEventConfiguration - grabber: TGrabberConfiguration - recognition: TRecognitionConfiguration - rendering: TRenderingConfiguration - server: TServerConfiguration - triggers: TTriggerConfiguration - "undo-redo": TUndoRedoConfiguration - #logger = LoggerManager.getLogger(LoggerClass.CONFIGURATION) - - constructor(configuration?: TConfigurationClient) - { - this.#logger.info("constructor", { configuration }) - this.events = JSON.parse(JSON.stringify(DefaultConfiguration.events)) - this.grabber = JSON.parse(JSON.stringify(DefaultConfiguration.grabber)) - this.recognition = JSON.parse(JSON.stringify(DefaultConfiguration.recognition)) - this.rendering = JSON.parse(JSON.stringify(DefaultConfiguration.rendering)) - this.server = JSON.parse(JSON.stringify(DefaultConfiguration.server)) - this.triggers = JSON.parse(JSON.stringify(DefaultConfiguration.triggers)) - - this.overrideDefaultConfiguration(configuration) - } - - overrideDefaultConfiguration(configuration?: TConfigurationClient): void - { - this.#logger.info("overrideDefaultConfiguration", { configuration }) - const defaultConf = JSON.parse(JSON.stringify(DefaultConfiguration)) - this.events = mergeDeep({}, defaultConf.events, configuration?.events) - this.grabber = mergeDeep({}, defaultConf.grabber, configuration?.grabber) - this.recognition = mergeDeep({}, defaultConf.recognition, configuration?.recognition) - this.rendering = mergeDeep({}, defaultConf.rendering, configuration?.rendering) - this.server = mergeDeep({}, defaultConf.server, configuration?.server) - this.triggers = mergeDeep({}, defaultConf.triggers, configuration?.triggers) - this["undo-redo"] = mergeDeep({}, defaultConf["undo-redo"], configuration?.["undo-redo"]) - - this.recognition.text.mimeTypes = configuration?.recognition?.text?.mimeTypes || defaultConf.recognition.text.mimeTypes - this.recognition.math.mimeTypes = configuration?.recognition?.math?.mimeTypes || defaultConf.recognition.math.mimeTypes - this.recognition.diagram.mimeTypes = configuration?.recognition?.diagram?.mimeTypes || defaultConf.recognition.diagram.mimeTypes - - if (this.server?.useWindowLocation) { - this.server.scheme = window.location.protocol.indexOf("s") > -1 ? "https" : "http" - this.server.host = window.location.host - } - - if ( - this.server.protocol === "REST" && - this.triggers.exportContent === "POINTER_UP" - ) { - this.triggers.exportContent = "QUIET_PERIOD" - this.triggers.exportContentDelay = Math.max(this.triggers.exportContentDelay, 50) - } - - if ( - this.server.protocol === "WEBSOCKET" && - this.recognition.type === "TEXT" - ) { - if ( - this.rendering.smartGuide.enable && - !this.recognition.text.mimeTypes.includes("application/vnd.myscript.jiix") - ) { - // mimeType required for smartGuide - this.recognition.text.mimeTypes.push("application/vnd.myscript.jiix") - } - } else { - // smartGuide enable only on websocket text - this.rendering.smartGuide.enable = false - } - this.#logger.debug("overrideDefaultConfiguration", { configuration: this }) - } -} diff --git a/src/configuration/DefaultConfiguration.ts b/src/configuration/DefaultConfiguration.ts deleted file mode 100644 index b80b33ac3..000000000 --- a/src/configuration/DefaultConfiguration.ts +++ /dev/null @@ -1,173 +0,0 @@ -import { TConfiguration } from "../@types/configuration" -import { TGrabberConfiguration } from "../@types/configuration/GrabberConfiguration" -import { TRenderingConfiguration } from "../@types/configuration/RenderingConfiguration" -import { TServerConfiguration } from "../@types/configuration/ServerConfiguration" -import { TRecognitionConfiguration } from "../@types/configuration/RecognitionConfiguration" -import { TTriggerConfiguration } from "../@types/configuration/TriggerConfiguration" -import { TEventConfiguration } from "../@types/configuration/EventConfiguration" -import { TUndoRedoConfiguration } from "../@types/configuration/UndoRedoConfiguration" -import { TLoggerConfiguration, LoggerClass, LoggerLevel } from "../@types/configuration/LoggerConfiguration" - -export const DefaultServerConfiguration: TServerConfiguration = { - protocol: "WEBSOCKET", - scheme: "https", - host: "cloud.myscript.com", - applicationKey: "", - hmacKey: "", - version: "2.1.0", - useWindowLocation: false, - websocket: { - pingEnabled: true, - pingDelay: 30000, - maxPingLostCount: 10, - autoReconnect: true, - maxRetryCount: 2, - fileChunkSize: 300000 - } -} - -export const DefaultRecognitionConfiguration: TRecognitionConfiguration = { - type: "TEXT", - alwaysConnected: true, - lang: "en_US", - gesture: { - enable: true - }, - export: { - "image-resolution": 300, - jiix: { - "bounding-box": false, - strokes: false, - text: { - chars: false, - words: true - } - }, - }, - renderer: { - debug: { - "draw-text-boxes": false, - "draw-image-boxes": false - } - }, - math: { - mimeTypes: ["application/vnd.myscript.jiix"], // "application/mathml+xml", "application/x-latex" , - solver: { - enable: true, - "fractional-part-digits": 3, - "decimal-separator": ".", - "rounding-mode": "half up", - "angle-unit": "deg" - }, - margin: { - bottom: 10, - left: 15, - right: 15, - top: 10 - }, - eraser: { - "erase-precisely": false - }, - "undo-redo": { - mode: "stroke" - } - }, - text: { - guides: { - enable: true - }, - mimeTypes: ["application/vnd.myscript.jiix"], // "text/plain" - margin: { - top: 20, - left: 10, - right: 10, - bottom: 10 - }, - eraser: { - "erase-precisely": false - } - }, - diagram: { - mimeTypes: ["application/vnd.myscript.jiix"], // "application/vnd.openxmlformats-officedocument.presentationml.presentation" - eraser: { - "erase-precisely": false - }, - convert: { - "match-text-size": true - } - }, - "raw-content": { - recognition: { - text: true, - shape: true - }, - eraser: { - "erase-precisely": false - } - } -} - -export const DefaultGrabberConfiguration: TGrabberConfiguration = { - listenerOptions: { - capture: false, - passive: true - }, - xyFloatPrecision: 0, - timestampFloatPrecision: 0 -} - -export const DefaultRenderingConfiguration: TRenderingConfiguration = { - minHeight: 100, - minWidth: 100, - smartGuide: { - enable: true, - fadeOut: { - enable: false, - duration: 5000 - } - }, - guides: { - enable: true, - gap: 50 - } -} - -export const DefaultTriggerConfiguration: TTriggerConfiguration = { - exportContent: "POINTER_UP", - exportContentDelay: 1000, - resizeTriggerDelay: 100 -} - -export const DefaultEventsConfiguration: TEventConfiguration = { - processDelay: 10 -} - -export const DefaultUndoRedoConfiguration: TUndoRedoConfiguration = { - maxStackSize: 100 -} - -export const DefaultConfiguration: TConfiguration = { - server: DefaultServerConfiguration, - recognition: DefaultRecognitionConfiguration, - grabber: DefaultGrabberConfiguration, - rendering: DefaultRenderingConfiguration, - triggers: DefaultTriggerConfiguration, - events: DefaultEventsConfiguration, - "undo-redo": DefaultUndoRedoConfiguration -} - -export const DefaultLoggerConfiguration: TLoggerConfiguration = { - [LoggerClass.EDITOR]: LoggerLevel.ERROR, - [LoggerClass.BEHAVIORS]: LoggerLevel.ERROR, - [LoggerClass.RECOGNIZER]: LoggerLevel.ERROR, - [LoggerClass.GRABBER]: LoggerLevel.ERROR, - [LoggerClass.RENDERER]: LoggerLevel.ERROR, - [LoggerClass.CONFIGURATION]: LoggerLevel.ERROR, - [LoggerClass.PUBLIC_EVENT]: LoggerLevel.ERROR, - [LoggerClass.INTERNALEVENT]: LoggerLevel.ERROR, - [LoggerClass.MODEL]: LoggerLevel.ERROR, - [LoggerClass.STROKE]: LoggerLevel.ERROR, - [LoggerClass.SMARTGUIDE]: LoggerLevel.ERROR, - [LoggerClass.STYLEMANAGER]: LoggerLevel.ERROR, - [LoggerClass.UNDOREDO_MANAGER]: LoggerLevel.ERROR, -} diff --git a/src/configuration/index.ts b/src/configuration/index.ts deleted file mode 100644 index 51f2786b6..000000000 --- a/src/configuration/index.ts +++ /dev/null @@ -1,3 +0,0 @@ - -export { Configuration } from "./Configuration" -export * from "./DefaultConfiguration" diff --git a/src/event/InternalEvent.ts b/src/event/InternalEvent.ts deleted file mode 100644 index 36b515e92..000000000 --- a/src/event/InternalEvent.ts +++ /dev/null @@ -1,164 +0,0 @@ -import { TConverstionState } from "../@types/configuration/RecognitionConfiguration" -import { TExport, TJIIXExport } from "../@types/model/Model" -import { TWebSocketSVGPatchEvent } from "../@types/recognizer/WSRecognizer" -import { TUndoRedoContext } from "../@types/undo-redo/UndoRedoContext" -import { InternalEventType } from "../Constants" -import { LoggerManager } from "../logger" -import { LoggerClass } from "../Constants" - -export class InternalEvent extends EventTarget -{ - static #instance: InternalEvent - #abortController: AbortController - #logger = LoggerManager.getLogger(LoggerClass.INTERNALEVENT) - - private constructor() - { - super() - this.#logger.info("constructor") - this.#abortController = new AbortController() - } - - public static getInstance(): InternalEvent - { - if (!InternalEvent.#instance) { - InternalEvent.#instance = new InternalEvent() - } - - return InternalEvent.#instance - } - - removeAllListeners(): void - { - this.#logger.info("removeAllListeners") - this.#abortController.abort() - this.#abortController = new AbortController() - } - - #emit(type: string, data?: unknown): void - { - this.dispatchEvent(new CustomEvent(type, Object.assign({ bubbles: true, composed: true }, data ? { detail: data } : undefined))) - } - - emitSVGPatch(patchChange: TWebSocketSVGPatchEvent): void - { - this.#logger.info("emitSVGPatch", { patchChange }) - this.#emit(InternalEventType.SVG_PATCH, patchChange) - } - addSVGPatchListener(callback: (contentChange: TWebSocketSVGPatchEvent) => void): void - { - this.#logger.info("addSVGPatchListener", { callback }) - this.addEventListener(InternalEventType.SVG_PATCH, (evt: unknown) => callback(((evt as CustomEvent).detail as TWebSocketSVGPatchEvent)), { signal: this.#abortController.signal }) - } - - emitExported(exports: TExport): void - { - this.#logger.info("emitExported", { exports }) - this.#emit(InternalEventType.EXPORTED, exports) - } - addExportedListener(callback: (exports: TExport) => void): void - { - this.#logger.info("addExportedListener", { callback }) - this.addEventListener(InternalEventType.EXPORTED, (evt: unknown) => callback(((evt as CustomEvent).detail as TExport)), { signal: this.#abortController.signal }) - } - - emitClearMessage(): void - { - this.#logger.info("emitClearMessage", { }) - this.#emit(InternalEventType.CLEAR_MESSAGE) - } - addClearMessageListener(callback: () => void): void - { - this.#logger.info("addClearMessageListener", { callback }) - this.addEventListener(InternalEventType.CLEAR_MESSAGE, () => callback(), { signal: this.#abortController.signal }) - } - - emitError(err: Error): void - { - this.#logger.info("emitError", { err }) - this.#emit(InternalEventType.ERROR, err) - } - - addErrorListener(callback: (err: Error) => void): void - { - this.#logger.info("addErrorListener", { callback }) - this.addEventListener(InternalEventType.ERROR, (evt: unknown) => callback(((evt as CustomEvent).detail as Error)), { signal: this.#abortController.signal }) - } - - emitWSClosed(): void - { - this.#logger.info("emitWSClosed", { }) - this.#emit(InternalEventType.WS_CLOSED) - } - addWSClosedListener(callback: () => void): void - { - this.#logger.info("addWSClosedListener", { callback }) - this.addEventListener(InternalEventType.WS_CLOSED, () => callback(), { signal: this.#abortController.signal }) - } - - emitNotif(notif: { message: string, timeout?: number }): void - { - this.#logger.info("emitWNotif", { notif }) - this.#emit(InternalEventType.NOTIF, notif) - } - addNotifListener(callback: (notif: { message: string, timeout?: number }) => void): void - { - this.#logger.info("addNotifListener", { callback }) - this.addEventListener(InternalEventType.NOTIF, (evt: unknown) => callback(((evt as CustomEvent).detail as { message: string, timeout?: number })), { signal: this.#abortController.signal }) - } - - emitImportJIIX(jiix: TJIIXExport): void - { - this.#logger.info("emitImportJIIX", { jiix }) - this.#emit(InternalEventType.IMPORT_JIIX, jiix) - } - addImportJIIXListener(callback: (jiix: TJIIXExport) => void): void - { - this.#logger.info("addImportJIIXListener", { callback }) - this.addEventListener(InternalEventType.IMPORT_JIIX, (evt: unknown) => callback(((evt as CustomEvent).detail as TJIIXExport)), { signal: this.#abortController.signal }) - } - - emitConvert(conversionState: TConverstionState = "DIGITAL_EDIT"): void - { - this.#logger.info("emitConvert", { conversionState }) - this.#emit(InternalEventType.CONVERT, conversionState) - } - addConvertListener(callback: (params?: { conversionState?: TConverstionState, mimeTypes?: string[] }) => void): void - { - this.#logger.info("addConvertListener", { callback }) - this.addEventListener(InternalEventType.CONVERT, (evt: unknown) => callback(((evt as CustomEvent).detail as { conversionState?: TConverstionState, mimeTypes?: string[] })), { signal: this.#abortController.signal }) - } - - emitClear(): void - { - this.#logger.info("emitClear") - this.#emit(InternalEventType.CLEAR) - } - addClearListener(callback: () => void): void - { - this.#logger.info("addClearListener", { callback }) - this.addEventListener(InternalEventType.CLEAR, () => callback(), { signal: this.#abortController.signal }) - } - - emitContextChange(context: TUndoRedoContext): void - { - this.#logger.info("emitContextChange", { context }) - this.#emit(InternalEventType.CONTEXT_CHANGE, context) - } - addContextChangeListener(callback: (context: TUndoRedoContext) => void): void - { - this.#logger.info("addContextChangeListener", { callback }) - this.addEventListener(InternalEventType.CONTEXT_CHANGE, (evt: unknown) => callback(((evt as CustomEvent).detail as TUndoRedoContext)), { signal: this.#abortController.signal }) - } - - emitIdle(idle: boolean): void - { - this.#logger.info("emitIdle", { idle }) - this.#emit(InternalEventType.IDLE, idle) - } - addIdleListener(callback: (idle: boolean) => void): void - { - this.#logger.info("addIdleListener", { callback }) - this.addEventListener(InternalEventType.IDLE, (evt: unknown) => callback(((evt as CustomEvent).detail as boolean)), { signal: this.#abortController.signal }) - } -} diff --git a/src/event/PublicEvent.ts b/src/event/PublicEvent.ts deleted file mode 100644 index 8065c8f64..000000000 --- a/src/event/PublicEvent.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { IModel, TExport } from "../@types/model/Model" -import { TUndoRedoContext } from "../@types/undo-redo/UndoRedoContext" -import { EventType } from "../Constants" -import { LoggerManager } from "../logger" -import { LoggerClass } from "../Constants" - -export class PublicEvent extends EventTarget -{ - static #instance: PublicEvent - #element?: HTMLElement - #logger = LoggerManager.getLogger(LoggerClass.PUBLIC_EVENT) - - private constructor() - { - super() - } - - public static getInstance(): PublicEvent - { - if (!PublicEvent.#instance) { - PublicEvent.#instance = new PublicEvent() - } - - return PublicEvent.#instance - } - - setElement(el: HTMLElement) - { - this.#logger.info("setElement", { el }) - this.#element = el - } - - #emit(type: string, data?: unknown): void - { - const evt = new CustomEvent(type, Object.assign({ bubbles: true, composed: true }, data ? { detail: data } : undefined)) - this.dispatchEvent(evt) - this.#element?.dispatchEvent(evt) - } - - emitLoaded(): void - { - this.#logger.info("emitLoaded") - this.#emit(EventType.LOADED) - } - - emitExported(exports: TExport): void - { - this.#logger.info("emitExported", { exports }) - this.#emit(EventType.EXPORTED, exports) - } - - emitChanged(undoRedoContext: TUndoRedoContext): void - { - this.#logger.info("emitChanged", { undoRedoContext }) - this.#emit(EventType.CHANGED, { - ...undoRedoContext, - canClear: !undoRedoContext.empty - }) - } - - emitIdle(idle: boolean): void - { - this.#logger.info("emitIdle", { idle }) - this.#emit(EventType.IDLE, idle) - } - - emitCleared(model?: IModel): void - { - this.#logger.info("emitCleared", { model }) - this.#emit(EventType.CLEARED, model) - } - - emitConverted(exports: TExport): void - { - this.#logger.info("emitConverted", { exports }) - this.#emit(EventType.CONVERTED, exports) - } - - emitImported(exports: TExport): void - { - this.#logger.info("emitImported", { exports }) - this.#emit(EventType.IMPORTED, exports) - } -} diff --git a/src/event/index.ts b/src/event/index.ts deleted file mode 100644 index 93c6f6c68..000000000 --- a/src/event/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { InternalEvent } from "./InternalEvent" -export { PublicEvent } from "./PublicEvent" diff --git a/src/grabber/PointerEventGrabber.ts b/src/grabber/PointerEventGrabber.ts deleted file mode 100644 index e3739f3ec..000000000 --- a/src/grabber/PointerEventGrabber.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { IGrabber } from "../@types/grabber/Grabber" -import { TGrabberConfiguration } from "../@types/configuration/GrabberConfiguration" -import { TPointer } from "../@types/geometry" -import { LoggerManager } from "../logger" -import { LoggerClass } from "../Constants" - -export class PointerEventGrabber implements IGrabber -{ - private configuration: TGrabberConfiguration - - private domElement!: HTMLElement - - private activePointerId?: number - - private prevent = (e: Event) => e.preventDefault() - #logger = LoggerManager.getLogger(LoggerClass.GRABBER) - - onPointerDown!: (evt: PointerEvent, point: TPointer) => void - onPointerMove!: (evt: PointerEvent, point: TPointer) => void - onPointerUp!: (evt: PointerEvent, point: TPointer) => void - - constructor(configuration: TGrabberConfiguration) - { - this.#logger.info("constructor", { configuration }) - this.configuration = configuration - } - - private roundFloat(oneFloat: number, requestedFloatPrecision: number): number - { - if (requestedFloatPrecision >= 0) { - const floatPrecision: number = Math.pow(10, requestedFloatPrecision) - return Math.round(oneFloat / floatPrecision) * floatPrecision - } - this.#logger.debug("roundFloat", { oneFloat, requestedFloatPrecision }) - return oneFloat - } - - private extractPoint(event: MouseEvent | TouchEvent): TPointer - { - let clientX: number, clientY: number - if ("changedTouches" in event) { - ({ clientX, clientY } = event.changedTouches[0]) - } else { - ({ clientX, clientY } = event) - } - const rect: DOMRect = this.domElement.getBoundingClientRect() - const pointer = { - x: this.roundFloat(clientX - rect.left - this.domElement.clientLeft, this.configuration.xyFloatPrecision), - y: this.roundFloat(clientY - rect.top - this.domElement.clientTop, this.configuration.xyFloatPrecision), - t: this.roundFloat(Date.now(), this.configuration.timestampFloatPrecision), - p: (event as PointerEvent).pressure || 1, - } - this.#logger.debug("extractPoint", { event, pointer }) - return pointer - } - - private pointerDownHandler = (evt: PointerEvent) => - { - this.#logger.info("pointerDown", { evt }) - // exit if not a left click or multi-touch - if (evt.button !== 0 || evt.buttons !== 1) { - return - } - - this.activePointerId = evt.pointerId - - if (this.onPointerDown) { - const point = this.extractPoint(evt) - this.onPointerDown(evt, point) - } - } - - private pointerMoveHandler = (evt: PointerEvent) => - { - this.#logger.info("pointerMove", { evt }) - if (this.activePointerId != undefined && this.activePointerId === evt.pointerId) { - if (this.onPointerMove) { - const point = this.extractPoint(evt) - this.onPointerMove(evt, point) - } - } - } - - private pointerUpHandler = (evt: PointerEvent) => - { - this.#logger.info("pointerUp", { evt }) - if (this.activePointerId != undefined && this.activePointerId === evt.pointerId) { - this.activePointerId = undefined - evt.stopPropagation() - if (this.onPointerUp) { - const point = this.extractPoint(evt) - this.onPointerUp(evt, point) - } - } - } - - attach(domElement: HTMLElement) - { - this.#logger.info("attach", { domElement }) - if (this.domElement) { - this.detach() - } - this.domElement = domElement - this.domElement.addEventListener("pointerdown", this.pointerDownHandler, this.configuration.listenerOptions) - this.domElement.addEventListener("pointermove", this.pointerMoveHandler, this.configuration.listenerOptions) - this.domElement.addEventListener("pointerup", this.pointerUpHandler, this.configuration.listenerOptions) - // this.domElement.addEventListener("pointerout", this.pointerUpHandler, this.configuration.listenerOptions) - this.domElement.addEventListener("pointerleave", this.pointerUpHandler, this.configuration.listenerOptions) - this.domElement.addEventListener("pointercancel", this.pointerUpHandler, this.configuration.listenerOptions) - - this.domElement.addEventListener("touchmove", this.prevent) - - // FIXME investigate why this is needed for iOS devices - // eslint-disable-next-line @typescript-eslint/no-empty-function - document.documentElement.addEventListener("pointerdown", () => { }) - } - - detach() - { - this.#logger.info("detach") - this.domElement?.removeEventListener("pointerdown", this.pointerDownHandler, this.configuration.listenerOptions) - this.domElement?.removeEventListener("pointermove", this.pointerMoveHandler, this.configuration.listenerOptions) - this.domElement?.removeEventListener("pointerup", this.pointerUpHandler, this.configuration.listenerOptions) - // this.domElement?.removeEventListener("pointerout", this.pointerUpHandler, this.configuration.listenerOptions) - this.domElement?.removeEventListener("pointerleave", this.pointerUpHandler, this.configuration.listenerOptions) - this.domElement?.removeEventListener("pointercancel", this.pointerUpHandler, this.configuration.listenerOptions) - this.domElement?.removeEventListener("touchmove", this.prevent) - // eslint-disable-next-line @typescript-eslint/no-empty-function - document.documentElement.removeEventListener("pointerdown", () => { }) - } -} diff --git a/src/grabber/index.ts b/src/grabber/index.ts deleted file mode 100644 index 760fbf7fa..000000000 --- a/src/grabber/index.ts +++ /dev/null @@ -1,2 +0,0 @@ - -export { PointerEventGrabber } from "./PointerEventGrabber" diff --git a/src/iink.css b/src/iink.css deleted file mode 100644 index c99cb65a7..000000000 --- a/src/iink.css +++ /dev/null @@ -1,328 +0,0 @@ -.ms-editor { - position: relative; - z-index: 10; - color: #1A9FFF; - font-family: sans-serif; -} - -.ms-editor.erasing { - cursor: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAEsSURBVDiNrdO7SgNBFMbx/3fmCbQ1tunDIayFBvFSKxbxBfSdBPEBtLIWb3Ebl4R9AQWLkE70CWbHZl1Eg2iSr5vL+c1hhhFTMhwOdyX1gQ2gVU+PgTyldNHtdq+/1+jroCiKtpmdSupNO6ApkgZmdtzpdJ5+QGVZ9qqqugSWfkO+5F3SnrvnDVQURTuE8PgP5DNvkjJ3fzaAEMLJDAjAclVVZwCqL/ZqBqSJme2YpMN5EIAYY9+A9XkhST0DVuaFgJYtAAGoDJgsAJoYkM+rSHqwlNL5Ajq6EMBoNLoBtmbsZuDumwYQYzwCXmdw3oAjAAPIsuxF0kG98GdE0r67PzcQgLvnIYQ14P4PyF39WZuH0rRdZVluxxj7kjaA1Xp6nFLKzezc3W+/13wAItdV6XjME1AAAAAASUVORK5CYII=') 10 10, auto; -} - -.ms-editor canvas, -.ms-editor svg { - z-index: 20; - position: absolute; - left: 0; - top: 0; - height: 100%; - width: 100%; -} - -.ms-editor canvas.ms-rendering-canvas { - z-index: 9; - pointer-events: none; - background-image: linear-gradient(to right, #F5F6F7 1px, transparent 1px), linear-gradient(to bottom, #F5F6F7 1px, transparent 1px); - background-size: 18px 18px; -} - -.ms-editor .loader { - z-index: 30; - position: absolute; - width: 120px; - height: 120px; - top: calc(50% - 60px); - left: calc(50% - 60px); - border: 16px solid #F5F6F7; - border-radius: 50%; - border-top-color: #1A9FFF; - -webkit-animation: spin 2s linear infinite; - animation: spin 2s linear infinite; -} - -.ms-editor .message { - z-index: 25; - position: absolute; - width: 300px; - max-height: calc(25%); - min-height: 200px; - top: calc(50% - 100px); - left: calc(50% - 150px); - font-size: 16px; - text-align: center; - word-wrap: break-word; -} - -.ms-editor .message.error-msg::before { - content: url("data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCA3Ni41IDYxMiA0NTkiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWluIG1lZXQiPgogICAgPHBhdGggZmlsbD0iIzFBOUZGRiIgZD0iTTQ5NC43LDIyOS41Yy0xNy44NTEtODYuNy05NC4zNTEtMTUzLTE4OC43LTE1M2MtMzguMjUsMC03My45NSwxMC4yLTEwMiwzMC42bDM4LjI1LDM4LjI1IGMxNy44NS0xMi43NSw0MC44LTE3Ljg1LDYzLjc1LTE3Ljg1Yzc2LjUsMCwxNDAuMjUsNjMuNzUsMTQwLjI1LDE0MC4yNXYxMi43NWgzOC4yNWM0My4zNSwwLDc2LjUsMzMuMTUsNzYuNSw3Ni41IGMwLDI4LjA1LTE1LjMsNTMuNTUtNDAuOCw2Ni4zbDM4LjI1LDM4LjI1QzU5MS42LDQzOC42LDYxMiw0MDAuMzUsNjEyLDM1N0M2MTIsMjkwLjcsNTU4LjQ1LDIzNC42LDQ5NC43LDIyOS41eiBNNzYuNSwxMDkuNjUgbDcxLjQsNjguODVDNjYuMywxODMuNiwwLDI0OS45LDAsMzMxLjVjMCw4NC4xNSw2OC44NSwxNTMsMTUzLDE1M2gyOTguMzVsNTEsNTFsMzMuMTUtMzMuMTVMMTA5LjY1LDc2LjVMNzYuNSwxMDkuNjV6IE0xOTYuMzUsMjI5LjVsMjA0LDIwNEgxNTNjLTU2LjEsMC0xMDItNDUuOS0xMDItMTAyYzAtNTYuMSw0NS45LTEwMiwxMDItMTAySDE5Ni4zNXoiIC8+Cjwvc3ZnPgo="); -} - -.ms-editor .message.info-msg::before { - content: ""; - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgdmlld0JveD0iMCAwIDI0IDI0IgogIGZpbGw9Im5vbmUiCiAgc3Ryb2tlPSIjMUE5RkZGIgogIHN0cm9rZS13aWR0aD0iMiIKICBzdHJva2UtbGluZWNhcD0icm91bmQiCiAgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIKPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIiAvPgogIDxsaW5lIHgxPSIxMiIgeTE9IjE2IiB4Mj0iMTIiIHkyPSIxMiIgLz4KICA8bGluZSB4MT0iMTIiIHkxPSI4IiB4Mj0iMTIuMDEiIHkyPSI4IiAvPgo8L3N2Zz4="); - background-size: 100% 100%; - display: block; - margin: auto; - padding-bottom: 10px; - height: 25px; - width: 25px; -} - -.ms-editor .smartguide { - position: absolute; - z-index: 40; - font-size: 16px; - height: 48px; - line-height: 48px; -} - -.ms-editor .smartguide.smartguide-in { - visibility: visible !important; - transition: opacity 0.5s; - opacity: 1; -} - -.ms-editor .smartguide.smartguide-out { - transition: opacity 1s, visibility 1s; - visibility: hidden !important; - opacity: 0; -} - -.ms-editor .smartguide .tag-icon { - padding: 0 18px; - border: 1px solid #959DA6; - font-weight: bold; - font-size: large; - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; - position: absolute; - z-index: 31; - height: 100%; - line-height: 48px; - background-color: rgba(255, 255, 255, 0.9); - color: #959DA6; -} - -.ms-editor .smartguide .ellipsis { - cursor: pointer; - border-bottom: 1px solid #959DA6; - position: absolute; - z-index: 31; - height: 48px; - line-height: 38px; - padding: 0 8px; - font-weight: bold; - font-size: x-large; - background-color: rgba(255, 255, 255, 0.9); - color: #959DA6; - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; - -webkit-tap-highlight-color: transparent; -} - -.ms-editor .smartguide .ellipsis:active { - background-color: #e0e0e0; -} - -.ms-editor .smartguide .prompter-container { - background-color: rgba(255, 255, 255, 0.9); - height: 48px; - line-height: 48px; - overflow: hidden; - white-space: nowrap; - display: block; - text-align: left; - border-bottom: 1px solid #959DA6; - position: absolute; - z-index: 30; - color: #bfbfbf; - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; - -webkit-tap-highlight-color: transparent; -} - -.ms-editor .smartguide .prompter-container > div > span { - cursor: pointer; - display: inline-block; -} - -.ms-editor .smartguide .prompter-container .prompter-text { - margin-left: 12px; -} - -.ms-editor .smartguide .prompter-container .prompter-text .added-word { - animation: 0.1s linear word-added, - 3s ease-in-out color-input; -} - -.ms-editor .smartguide .prompter-container .prompter-text .modified-word { - animation: 0.1s linear word-modified, - 3s ease-in-out color-input; -} - -.ms-editor .smartguide .candidates { - color: black; - flex-direction: column; - text-align: center; - line-height: 30px; - border-radius: 3px; - position: absolute; - box-shadow: 2px 2px 12px #BDBDBD, -2px 2px 12px #BDBDBD; - background-color: #F5F5F5; - z-index: 100; - -webkit-tap-highlight-color: transparent; -} - -.ms-editor .smartguide .candidates > span { - cursor: pointer; - padding: 2px 20px; -} - -.ms-editor .smartguide .candidates > span:hover { - background-color: #EEEEEE; -} - -.ms-editor .smartguide .candidates > span:active { - background-color: #E0E0E0; -} - -.ms-editor .smartguide .candidates .selected-word { - font-weight: bold; - background-color: #E0E0E0; -} - -.ms-editor .smartguide .more-menu { - display: flex; - flex-direction: column; - margin-right: 12px; - line-height: 30px; - border-radius: 3px; - position: absolute; - z-index: 100; - box-shadow: 2px 2px 12px #BDBDBD; - background-color: #F5F5F5; - overflow: hidden; - transition: max-height 1s ease-out, opacity 1s, visibility 0.5s linear; -} -.ms-editor .smartguide .more-menu.open { - max-height: 500px; - visibility: visible; - opacity: 1; -} -.ms-editor .smartguide .more-menu.close { - max-height: 0; - visibility: hidden; - opacity: 0; -} - -.ms-editor .smartguide .more-menu .options-label-button { - color: black; - font-size: 16px; - cursor: pointer; - box-sizing: border-box; - background: transparent; - border: none; - padding: 0 24px; - margin: 0; - height: 40px; - outline: none; - -webkit-tap-highlight-color: transparent; -} - -.ms-editor .smartguide .more-menu .options-label-button:hover { - background-color: #EEEEEE; -} - -.ms-editor .smartguide .more-menu .options-label-button:active { - background-color: #E0E0E0; -} - -.ms-editor .ps__rail-x { - top: 32px !important; -} - -.ms-editor #stroke-panel { - position: fixed; - bottom: 10px; - left: 10px; - right: 10px; - background-color: white; - border: solid black 2px; - padding: 5px; - word-wrap: break-word; - overflow: auto; - cursor: copy; - max-height: 100px; - z-index: 999; -} - -/** Stroke **/ - -.ms-editor .removed-stroke { - opacity: 0; - transition: opacity 0.1s ease-in-out; -} - -.ms-editor .added-stroke { - animation: 0.2s opacity-appear; -} - -@keyframes color-input { - 0% { - color: black; - } - 100% { - color: #bfbfbf; - } -} - -@keyframes word-added { - 0% { - transform: translate(5px, 0); - } - 100% { - transform: none; - } -} - -@keyframes word-modified { - 0% { - transform: translate(0, 5px); - } - 100% { - transform: none; - } -} - -@keyframes opacity-appear { - 0% { - opacity: 0; - } - 100% { - opacity : 1; - } -} - -@keyframes spin { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(360deg); - } -} - -@-webkit-keyframes spin { - 0% { - -webkit-transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - } -} diff --git a/src/iink.ts b/src/iink.ts deleted file mode 100644 index 8a57ac1ec..000000000 --- a/src/iink.ts +++ /dev/null @@ -1,28 +0,0 @@ - -export { Editor } from "./Editor" - -export * as utils from "./utils" - -export * as constants from "./Constants" - -export * as configuration from "./configuration" - -export * as behaviors from "./behaviors" - -export * as recognizer from "./recognizer" - -export * as renderer from "./renderer" - -export * as grabber from "./grabber" - -export * as style from "./style" - -export * as model from "./model" - -export * as undoredo from "./undo-redo" - -export * as event from "./event" - -export * as smartguide from "./smartguide/SmartGuide" - -export * as logger from "./logger" diff --git a/src/logger/index.ts b/src/logger/index.ts deleted file mode 100644 index d8cdae4e6..000000000 --- a/src/logger/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { LoggerManager } from "./loggerManager" -export { Logger } from "./logger" \ No newline at end of file diff --git a/src/logger/logger.ts b/src/logger/logger.ts deleted file mode 100644 index 47212025a..000000000 --- a/src/logger/logger.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { LoggerClass, LoggerLevel } from "../@types" - -export class Logger -{ - instanceName: LoggerClass - level: LoggerLevel - - constructor(instanceName: LoggerClass, level: LoggerLevel) - { - this.instanceName = instanceName - this.level = level - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - debug(...data: any) - { - if (LoggerLevel.DEBUG >= this.level) { - const dataLog = { - from: this.instanceName, - message: data, - } - console.debug(dataLog) - } - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - info(...data: any) - { - if (LoggerLevel.INFO >= this.level) { - const dataLog = { - from: this.instanceName, - message: data, - } - console.info(dataLog) - } - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - warn(...data: any) - { - if (LoggerLevel.WARN >= this.level) { - const dataLog = { - from: this.instanceName, - message: data, - } - console.warn(dataLog) - } - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - error(...error: any) - { - const dataLog = { - from: this.instanceName, - error, - } - console.error(dataLog) - } -} diff --git a/src/logger/loggerManager.ts b/src/logger/loggerManager.ts deleted file mode 100644 index 671a06d40..000000000 --- a/src/logger/loggerManager.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { TLoggerConfiguration } from "../@types" -import { LoggerClass, LoggerLevel } from "../Constants" -import { Logger } from "./logger" - -export class LoggerManager -{ - static #loggerMap: Map = new Map() - static getLogger(name: LoggerClass): Logger { - if(!this.#loggerMap.has(name)) - { - this.#loggerMap.set(name, new Logger(name, LoggerLevel.ERROR)) - } - return this.#loggerMap.get(name) as Logger - } - - static setLoggerLevel(config: TLoggerConfiguration) - { - - Object.keys(config).forEach((lc) => { - LoggerManager.getLogger(lc as LoggerClass).level = config[lc as LoggerClass] - }) - } -} diff --git a/src/model/Model.ts b/src/model/Model.ts deleted file mode 100644 index aab9e1841..000000000 --- a/src/model/Model.ts +++ /dev/null @@ -1,267 +0,0 @@ -import { TPenStyle } from "../@types/style/PenStyle" -import { TPoint, TPointer } from "../@types/geometry" -import { TStroke } from "../@types/model/Stroke" -import { IModel, TExport } from "../@types/model/Model" -import { TRecognitionPositions } from "../@types/model/RecognitionPositions" - -import { computeDistance } from "../utils/geometric" -import { Stroke } from "./Stroke" -import { LoggerManager } from "../logger" -import { LoggerClass } from "../Constants" - -export class Model implements IModel -{ - readonly creationTime: number - modificationDate: number - currentStroke?: TStroke - positions: TRecognitionPositions - rawStrokes: TStroke[] - selectedStrokes: TStroke[] - exports?: TExport - converts?: TExport - width: number - height: number - idle: boolean - #logger = LoggerManager.getLogger(LoggerClass.MODEL) - - constructor(width = 100, height = 100, creationDate: number = Date.now()) - { - this.#logger.info("constructor", { width, height, creationDate }) - this.creationTime = creationDate - this.modificationDate = creationDate - this.width = width - this.height = height - this.rawStrokes = [] - this.selectedStrokes = [] - this.positions = { - lastSentPosition: 0, - lastReceivedPosition: 0 - } - this.idle = true - } - - mergeExport(exports: TExport) - { - this.#logger.info("mergeExport", { exports }) - if (this.exports) { - Object.assign(this.exports, exports) - } else { - this.exports = exports - } - this.#logger.debug("mergeExport", this.exports) - } - - mergeConvert(converts: TExport) - { - this.#logger.info("mergeConvert", { converts }) - if (this.converts) { - Object.assign(this.converts, converts) - } else { - this.converts = converts - } - this.#logger.debug("mergeConvert", this.converts) - } - - private computePressure(distance: number, globalDistance: number): number - { - let ratio = 1.0 - if (globalDistance === 0) { - ratio = 0.5 - } else if (distance === globalDistance) { - ratio = 1.0 - } else if (distance < 10) { - ratio = 0.2 + Math.pow(0.1 * distance, 0.4) - } else if (distance > globalDistance - 10) { - ratio = 0.2 + Math.pow(0.1 * (globalDistance - distance), 0.4) - } - const pressure = ratio * Math.max(0.1, 1.0 - (0.1 * Math.sqrt(distance))) - return isNaN(pressure) ? 0.5 : Math.round(pressure * 100) / 100 - } - - private filterPointByAcquisitionDelta(stroke: TStroke, point: TPointer, lastPointer: TPointer): boolean - { - const delta: number = (2 + ((stroke.style["-myscript-pen-width"] || 0) / 4)) - return !lastPointer || - stroke.pointers.length === 0 || - Math.abs(lastPointer.x - point.x) >= delta || - Math.abs(lastPointer.y - point.y) >= delta - } - - addPoint(stroke: TStroke, pointer: TPointer): void - { - this.#logger.debug("addPoint", { stroke, pointer }) - const lastPointer: TPointer = stroke.pointers.at(-1) || { p: 1, t: 0, x: 0, y: 0 } - if (this.filterPointByAcquisitionDelta(stroke, pointer, lastPointer)) { - const distance = computeDistance(pointer, lastPointer) - stroke.length += distance - pointer.p = this.computePressure(distance, stroke.length) - stroke.pointers.push(pointer) - } - } - - addStroke(stroke: TStroke): void - { - this.#logger.info("addStroke", { stroke }) - this.rawStrokes.push(stroke) - } - - extractUnsentStrokes(): TStroke[] - { - return this.rawStrokes.slice(this.positions.lastSentPosition) - } - - initCurrentStroke(point: TPointer, pointerId: number, pointerType: string, style: TPenStyle, dpi = 96): void - { - this.#logger.info("initCurrentStroke", { point, pointerId, pointerType, style, dpi }) - if (style["-myscript-pen-width"]) { - const pxWidth = (style["-myscript-pen-width"] * dpi) / 25.4 - style.width = pxWidth / 2 - } - this.modificationDate = Date.now() - this.exports = undefined - this.converts = undefined - this.currentStroke = new Stroke(style, pointerId, pointerType) - this.#logger.debug("initCurrentStroke", this.currentStroke) - this.addPoint(this.currentStroke, point) - } - - appendToCurrentStroke(point: TPointer): void - { - this.#logger.info("appendToCurrentStroke", { point }) - if (this.currentStroke) { - this.addPoint(this.currentStroke, point) - } - this.#logger.debug("appendToCurrentStroke", this.currentStroke) - } - - endCurrentStroke(point: TPointer): void - { - this.#logger.info("endCurrentStroke", { point }) - if (this.currentStroke) { - this.addPoint(this.currentStroke, point) - this.addStroke(this.currentStroke) - this.currentStroke = undefined - } - this.#logger.debug("endCurrentStroke", this.currentStroke) - } - - #getStrokeFromPoint(point: TPoint): TStroke[] - { - this.#logger.info("getStrokeFromPoint", { point }) - const isBetween = (val: number, min: number, max: number): boolean => (val >= min && val <= max) - - const _strokeList: TStroke[] = [] - this.rawStrokes.forEach((stroke) => - { - for (let i = 0; i < stroke.pointers.length; i++) { - const strokePointer = stroke.pointers[i] - if ( - isBetween(strokePointer.x, point.x - 5, point.x + 5) && - isBetween(strokePointer.y, point.y - 5, point.y + 5) - ) { - _strokeList.push(stroke) - break - } - else { - if (computeDistance(point, strokePointer) < 10) { - _strokeList.push(stroke) - break - } - } - } - }) - this.#logger.debug("getStrokeFromPoint", { strokes: _strokeList }) - return _strokeList - } - - resetSelectedStrokes(): void - { - this.selectedStrokes = [] - } - - appendSelectedStrokesFromPoint(point: TPoint): void - { - this.#logger.info("appendSelectedStrokesFromPoint", { point }) - this.#getStrokeFromPoint(point) - .forEach(s => - { - if (!this.selectedStrokes.includes(s)) { - this.selectedStrokes.push(s) - } - }) - } - - updateStroke(updatedStroke: TStroke): void - { - this.#logger.info("updateStroke", { updatedStroke }) - const strokeIndex = this.rawStrokes.findIndex((s: TStroke): boolean => s.id === updatedStroke.id) - if (strokeIndex !== -1) { - this.rawStrokes.splice(strokeIndex, 1, updatedStroke) - } - this.#logger.debug("updateStroke", this.rawStrokes) - } - - removeStroke(id: string): void - { - this.#logger.info("removeStroke", { id }) - const strokeIndex = this.rawStrokes.findIndex((s: TStroke): boolean => s.id === id) - if (strokeIndex !== -1) { - this.rawStrokes.splice(strokeIndex, 1) - } - this.#logger.debug("removeStroke", this.rawStrokes) - } - - removeStrokesFromPoint(point: TPoint): string[] - { - this.#logger.info("removeStrokesFromPoint", { point }) - const strokes = this.#getStrokeFromPoint(point) - strokes.forEach(strokeToRemove => - { - this.removeStroke(strokeToRemove.id) - }) - this.#logger.debug("removeStrokesFromPoint", strokes.map(s => s.id)) - return strokes.map(s => s.id) - } - - updatePositionSent(position: number = this.rawStrokes.length): void - { - this.#logger.info("updatePositionSent", { position }) - this.positions.lastSentPosition = position - this.#logger.debug("updatePositionSent", this.positions.lastSentPosition) - } - - updatePositionReceived(): void - { - this.#logger.info("updatePositionReceived") - this.positions.lastReceivedPosition = this.positions.lastSentPosition - this.#logger.debug("updatePositionReceived", this.positions.lastReceivedPosition) - } - - getClone(): IModel - { - this.#logger.info("getClone") - const clonedModel = new Model(this.width, this.height, this.creationTime) - clonedModel.modificationDate = JSON.parse(JSON.stringify(this.modificationDate)) - clonedModel.currentStroke = this.currentStroke ? JSON.parse(JSON.stringify(this.currentStroke)) : undefined - clonedModel.rawStrokes = JSON.parse(JSON.stringify(this.rawStrokes)) - clonedModel.positions = JSON.parse(JSON.stringify(this.positions)) - clonedModel.exports = this.exports ? JSON.parse(JSON.stringify(this.exports)) : undefined - clonedModel.converts = this.converts ? JSON.parse(JSON.stringify(this.converts)) : undefined - clonedModel.idle = this.idle - this.#logger.debug("getClone", { clonedModel }) - return clonedModel - } - - clear(): void - { - this.#logger.info("clear") - this.modificationDate = Date.now() - this.currentStroke = undefined - this.rawStrokes = [] - this.positions.lastSentPosition = 0 - this.positions.lastReceivedPosition = 0 - this.exports = undefined - this.converts = undefined - this.idle = true - } -} diff --git a/src/model/Stroke.ts b/src/model/Stroke.ts deleted file mode 100644 index e68293cac..000000000 --- a/src/model/Stroke.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { TPenStyle } from "../@types/style/PenStyle" -import { TStroke, TStrokeJSON } from "../@types/model/Stroke" -import { TPointer } from "../@types/geometry" -import { LoggerManager } from "../logger" -import { LoggerClass } from "../Constants" - -export class Stroke implements TStroke -{ - id: string - type: string - pointerId: number - pointerType: string - elementType?: string - pointers: TPointer[] - length: number - style: TPenStyle - #logger = LoggerManager.getLogger(LoggerClass.STROKE) - - constructor(style: TPenStyle, pointerId: number, pointerType = "pen") - { - this.#logger.info("constructor", { style, pointerId, pointerType }) - this.id = `${pointerType}-${Date.now().toString()}` - this.type = "stroke" - this.pointerId = pointerId - this.pointerType = pointerType - this.pointers = [] - this.length = 0 - this.style = style - } -} - -export function convertStrokeToJSON(stroke: TStroke): TStrokeJSON -{ - const json: TStrokeJSON = { - id: stroke.id, - pointerType: stroke.pointerType, - p: [], - t: [], - x: [], - y: [] - } - stroke.pointers.forEach(p => { - json.p.push(p.p) - json.t.push(p.t) - json.x.push(p.x) - json.y.push(p.y) - }) - return json -} diff --git a/src/model/index.ts b/src/model/index.ts deleted file mode 100644 index e261eeb52..000000000 --- a/src/model/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { Model } from "./Model" -export { Stroke, convertStrokeToJSON } from "./Stroke" diff --git a/src/recognizer/RestRecognizer.ts b/src/recognizer/RestRecognizer.ts deleted file mode 100644 index 4d646303f..000000000 --- a/src/recognizer/RestRecognizer.ts +++ /dev/null @@ -1,278 +0,0 @@ - -import { IRecognizer } from "../@types/recognizer/Recognizer" -import { TRestPostConfiguration, TRestPostData } from "../@types/recognizer/RestRecognizer" -import { TStrokeGroup, TStrokeGroupJSON } from "../@types/model/Stroke" -import { TConverstionState, TRecognitionConfiguration } from "../@types/configuration/RecognitionConfiguration" -import { TServerConfiguration } from "../@types/configuration/ServerConfiguration" -import { IModel, TExport, TJIIXExport } from "../@types/model/Model" -import { TPenStyle } from "../@types/style/PenStyle" - -import { Error as ErrorConst } from "../Constants" -import { StyleHelper } from "../style/StyleHelper" -import { computeHmac } from "../utils/CryptoHelper" -import { isVersionSuperiorOrEqual } from "../utils/version" -import { convertStrokeToJSON } from "../model/Stroke" - -import { LoggerManager } from "../logger" -import { LoggerClass } from "../Constants" - -type ApiError = { - code?: string - message: string -} - -export class RestRecognizer implements IRecognizer -{ - protected serverConfiguration: TServerConfiguration - protected recognitionConfiguration: TRecognitionConfiguration - #logger = LoggerManager.getLogger(LoggerClass.RECOGNIZER) - - constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration) - { - this.#logger.info("constructor", { serverConfig, recognitionConfig }) - this.serverConfiguration = serverConfig - this.recognitionConfiguration = recognitionConfig - } - - get url() - { - return `${ this.serverConfiguration.scheme }://${ this.serverConfiguration.host }/api/v4.0/iink/batch` - } - - get postConfig(): TRestPostConfiguration - { - switch (this.recognitionConfiguration.type) { - case "DIAGRAM": - return { - lang: this.recognitionConfiguration.lang, - diagram: this.recognitionConfiguration.diagram, - export: this.recognitionConfiguration.export - } - case "MATH": - return { - lang: this.recognitionConfiguration.lang, - math: this.recognitionConfiguration.math, - export: this.recognitionConfiguration.export - } - case "Raw Content": - return { - lang: this.recognitionConfiguration.lang, - "raw-content": this.recognitionConfiguration["raw-content"], - export: this.recognitionConfiguration.export - } - case "TEXT": - return { - lang: this.recognitionConfiguration.lang, - text: this.recognitionConfiguration.text, - export: this.recognitionConfiguration.export - } - default: - throw new Error(`get postConfig error Recognition type unkow "${ this.recognitionConfiguration.type }"`) - break - } - } - - private buildData(model: IModel): TRestPostData - { - this.#logger.info("buildData", { model }) - const isPenStyleEqual = (ps1: TPenStyle, ps2: TPenStyle) => - { - return ps1 && ps2 && ps1["-myscript-pen-fill-color"] === ps2["-myscript-pen-fill-color"] && - ps1["-myscript-pen-fill-style"] === ps2["-myscript-pen-fill-style"] && - ps1["-myscript-pen-width"] === ps2["-myscript-pen-width"] && - ps1.color === ps2.color && - ps1.width === ps2.width - } - - const strokeGroupByPenStyle: TStrokeGroup[] = [] - model.rawStrokes.forEach((s) => { - const groupIndex = strokeGroupByPenStyle.findIndex(sg => isPenStyleEqual(sg.penStyle, s.style)) - if (groupIndex > -1) { - strokeGroupByPenStyle[groupIndex].strokes.push(s) - } else { - strokeGroupByPenStyle.push({ - penStyle: s.style, - strokes: [s] - }) - } - }) - - const strokeGroupsToSend: TStrokeGroupJSON[] = [] - strokeGroupByPenStyle.forEach((group: TStrokeGroup) => - { - const newPenStyle = JSON.stringify(group.penStyle) === "{}" ? undefined : StyleHelper.penStyleToCSS(group.penStyle as TPenStyle) - const newGroup = { - penStyle: newPenStyle, - strokes: group.strokes.map(convertStrokeToJSON) - } - strokeGroupsToSend.push(newGroup) - }) - - const contentType: string = this.recognitionConfiguration.type === "Raw Content" ? - "Raw Content" : - this.recognitionConfiguration.type.charAt(0).toUpperCase() + this.recognitionConfiguration.type.slice(1).toLowerCase() - - const data = { - configuration: this.postConfig, - xDPI: 96, - yDPI: 96, - contentType, - // theme: StyleHelper.themeToCSS(), - height: model.height, - width: model.width, - strokeGroups: strokeGroupsToSend - } - this.#logger.debug("buildData", { data }) - return data - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private async post(data: any, mimeType: string): Promise - { - this.#logger.info("post", { data, mimeType }) - const headers = new Headers() - headers.append("Accept", "application/json," + mimeType) - headers.append("applicationKey", this.serverConfiguration.applicationKey) - headers.append("hmac", computeHmac(JSON.stringify(data), this.serverConfiguration.applicationKey, this.serverConfiguration.hmacKey)) - headers.append("Content-Type", "application/json") - - if (isVersionSuperiorOrEqual(this.serverConfiguration.version, "2.0.4")) { - headers.append("myscript-client-name", "iink-ts") - headers.append("myscript-client-version", "1.0.0-buildVersion") - } - - const reqInit: RequestInit = { - method: "POST", - headers, - body: JSON.stringify(data) - } - const request = new Request(this.url, reqInit) - const response: Response = await fetch(request) - if (response.ok) { - const contentType = response.headers.get("content-type") - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let result: any - switch (contentType) { - case "application/vnd.openxmlformats-officedocument.presentationml.presentation": - case "image/png": - case "image/jpeg": - result = await response.blob() - break - case "application/json": - result = await response.json() - break - case "application/vnd.myscript.jiix": - result = await response.clone().json().catch(async () => await response.text()) - break - default: - this.#logger.warn("post default", { contentType }) - result = await response.text() - break - } - this.#logger.debug("post", { result }) - return result - } else { - const err = await response.json() as ApiError - this.#logger.error("post", { err }) - throw err - } - } - - private async tryFetch(data: unknown, mimeType: string): Promise - { - this.#logger.debug("tryFetch", { data, mimeType }) - return this.post(data, mimeType) - .then((res) => - { - const exports: TExport = {} - exports[mimeType] = res as TJIIXExport | string | Blob - this.#logger.debug("tryFetch", { exports }) - return exports - }) - .catch((err) => - { - this.#logger.error("tryFetch", { data, mimeType, err }) - let message = err.message || ErrorConst.UNKNOW - if (!err.code) { - message = ErrorConst.CANT_ESTABLISH - } else if (err.code === "access.not.granted") { - message = ErrorConst.WRONG_CREDENTIALS - } - const error = new Error(message) - throw error - }) - } - - private getMimeTypes(requestedMimeTypes?: string[]): string[] - { - this.#logger.info("getMimeTypes", { requestedMimeTypes }) - let mimeTypes: string[] = requestedMimeTypes || [] - if (!mimeTypes.length) { - switch (this.recognitionConfiguration.type) { - case "DIAGRAM": - mimeTypes = this.recognitionConfiguration.diagram.mimeTypes - break - case "MATH": - mimeTypes = this.recognitionConfiguration.math.mimeTypes - break - case "Raw Content": - mimeTypes = ["application/vnd.myscript.jiix"] - break - case "TEXT": - mimeTypes = this.recognitionConfiguration.text.mimeTypes - break - default: - throw new Error(`Recognition type "${ this.recognitionConfiguration.type }" is unknown.\n Possible types are:\n -DIAGRAM\n -MATH\n -Raw Content\n -TEXT`) - break - } - } - return mimeTypes - } - - async convert(model: IModel, conversionState?: TConverstionState, requestedMimeTypes?: string[]): Promise - { - this.#logger.info("convert", { model, conversionState, requestedMimeTypes }) - const myModel = model.getClone() - const mimeTypes = this.getMimeTypes(requestedMimeTypes) - const dataToConcert = this.buildData(myModel) - dataToConcert.conversionState = conversionState - const promises = mimeTypes.map(mt => this.tryFetch(dataToConcert, mt)) - const converts: TExport[] = await Promise.all(promises) - converts.forEach(c => - { - myModel.mergeConvert(c) - }) - this.#logger.debug("convert", { model: myModel }) - return myModel - } - - async export(model: IModel, requestedMimeTypes?: string[]): Promise - { - this.#logger.info("export", { model, requestedMimeTypes }) - const myModel = model.getClone() - if (myModel.rawStrokes.length === 0) { - return Promise.resolve(myModel) - } - const mimeTypes = this.getMimeTypes(requestedMimeTypes) - if (!mimeTypes.length) { - this.#logger.error("export", { model, requestedMimeTypes, "Export failed, no mimeTypes define in recognition configuration": String }) - return Promise.reject(new Error("Export failed, no mimeTypes define in recognition configuration")) - } - const mimeTypesRequiringExport: string[] = mimeTypes.filter(m => !myModel.exports || !myModel.exports[m]) - const data = this.buildData(model) - const exports: TExport[] = await Promise.all(mimeTypesRequiringExport.map(mimeType => this.tryFetch(data, mimeType))) - exports.forEach(e => - { - myModel.mergeExport(e) - }) - this.#logger.debug("export", { model: myModel }) - return myModel - } - - async resize(model: IModel): Promise - { - this.#logger.info("resize", { model }) - return this.export(model) - } - -} diff --git a/src/recognizer/WSRecognizer.ts b/src/recognizer/WSRecognizer.ts deleted file mode 100644 index 8be30b593..000000000 --- a/src/recognizer/WSRecognizer.ts +++ /dev/null @@ -1,734 +0,0 @@ - -import { IRecognizer } from "../@types/recognizer/Recognizer" -import { TConverstionState, TRecognitionConfiguration } from "../@types/configuration/RecognitionConfiguration" -import { TServerConfiguration } from "../@types/configuration/ServerConfiguration" -import { IModel, TExport, TJIIXExport } from "../@types/model/Model" -import { TWebSocketContentChangeEvent, TWebSocketErrorEvent, TWebSocketEvent, TWebSocketExportEvent, TWebSocketHMACChallengeEvent, TWebSocketPartChangeEvent, TWebSocketSVGPatchEvent } from "../@types/recognizer/WSRecognizer" -import { TStroke } from "../@types/model/Stroke" -import { TUndoRedoContext } from "../@types/undo-redo/UndoRedoContext" -import { TPenStyle } from "../@types/style/PenStyle" -import { TTheme } from "../@types/style/Theme" -import { LoggerClass } from "../@types/configuration/LoggerConfiguration" - -import { Error as ErrorConst } from "../Constants" -import { InternalEvent } from "../event/InternalEvent" -import { computeHmac } from "../utils/CryptoHelper" -import { StyleHelper } from "../style/StyleHelper" -import { DeferredPromise } from "../utils/DeferredPromise" -import { isVersionSuperiorOrEqual } from "../utils/version" -import { convertStrokeToJSON } from "../model/Stroke" -import { LoggerManager } from "../logger" - -/** - * A websocket dialog have this sequence : - * --------------------------- Client --------------------------------------------------- Server ---------------------------------- - * init: send newContentPackage or restoreIInkSession ==================> - * <================== hmacChallenge - * answer hmacChallenge: send the hmac ==================> - * <================== contentPackageDescription - * answer contentPackageDescription: - * send the configuration ==================> - * send newContentPart or openContentPart ==================> - * <================== partChanged - * <================== contentChanged - * <================== newPart - * <================== svgPatch - * - * setPenStyle (send the parameters) ==================> - * setTheme (send the parameters) ==================> - * setPenStyleClasses (send the parameters) ==================> - * <================== svgPatch - * addStrokes (send the strokes ) ============> - * <================== update - */ -export class WSRecognizer implements IRecognizer -{ - #logger = LoggerManager.getLogger(LoggerClass.RECOGNIZER) - protected serverConfiguration: TServerConfiguration - protected recognitionConfiguration: TRecognitionConfiguration - - protected socket!: WebSocket - protected pingCount = 0 - protected reconnectionCount = 0 - protected viewSizeHeight!: number - protected viewSizeWidth!: number - // contentPartCount = 0 - protected sessionId?: string - protected currentPartId?: string - protected currentErrorCode?: string | number - - protected penStyle?: TPenStyle - protected penStyleClasses?: string - protected theme?: TTheme - - protected connected?: DeferredPromise - protected initialized?: DeferredPromise - protected addStrokeDeferred?: DeferredPromise - protected exportDeferred?: DeferredPromise - protected convertDeferred?: DeferredPromise - protected importDeferred?: DeferredPromise - protected resizeDeferred?: DeferredPromise - protected undoDeferred?: DeferredPromise - protected redoDeferred?: DeferredPromise - protected clearDeferred?: DeferredPromise - protected importPointEventsDeferred?: DeferredPromise - protected waitForIdleDeferred?: DeferredPromise - - url: string - - constructor(serverConfig: TServerConfiguration, recognitionConfig: TRecognitionConfiguration) - { - this.serverConfiguration = serverConfig - this.recognitionConfiguration = recognitionConfig - const scheme = (this.serverConfiguration.scheme === "https") ? "wss" : "ws" - this.url = `${ scheme }://${ this.serverConfiguration.host }/api/v4.0/iink/document?applicationKey=${ this.serverConfiguration.applicationKey }` - this.#logger.info("constructor", { serverConfig, recognitionConfig, url: this.url }) - } - - get mimeTypes(): string[] - { - switch (this.recognitionConfiguration.type.toLocaleLowerCase()) { - case "text": - return this.recognitionConfiguration.text.mimeTypes - case "math": - return this.recognitionConfiguration.math.mimeTypes - case "diagram": - return this.recognitionConfiguration.diagram.mimeTypes - default: - //"raw-content" - return [] - } - } - - get internalEvent(): InternalEvent - { - return InternalEvent.getInstance() - } - - protected infinitePing(): void - { - this.pingCount++ - if (this.serverConfiguration.websocket.maxPingLostCount < this.pingCount) { - this.socket.close(1000, "PING_LOST") - } else if (this.socket.readyState <= 1) { - setTimeout(() => - { - if (this.socket.readyState <= 1) { - this.socket.send(JSON.stringify({ type: "ping" })) - this.infinitePing() - } - }, this.serverConfiguration.websocket.pingDelay) - } - } - - protected openCallback(): void - { - this.connected?.resolve() - const params: TWebSocketEvent = { - type: this.sessionId ? "restoreIInkSession" : "newContentPackage", - iinkSessionId: this.sessionId, - applicationKey: this.serverConfiguration.applicationKey, - xDpi: 96, - yDpi: 96, - viewSizeHeight: this.viewSizeHeight, - viewSizeWidth: this.viewSizeWidth - } - if (isVersionSuperiorOrEqual(this.serverConfiguration.version, "2.0.4")) { - params["myscript-client-name"] = "iink-ts" - params["myscript-client-version"] = "1.0.0-buildVersion" - } - this.send(params) - } - - protected rejectDeferredPending(error: Error): void - { - if (this.connected?.isPending) { - this.connected?.reject(error) - } - if (this.initialized?.isPending) { - this.initialized?.reject(error) - } - if (this.addStrokeDeferred?.isPending) { - this.addStrokeDeferred?.reject(error) - } - if (this.exportDeferred?.isPending) { - this.exportDeferred?.reject(error) - } - if (this.convertDeferred?.isPending) { - this.convertDeferred?.reject(error) - } - if (this.importDeferred?.isPending) { - this.importDeferred?.reject(error) - } - if (this.resizeDeferred?.isPending) { - this.resizeDeferred?.reject(error) - } - if (this.undoDeferred?.isPending) { - this.undoDeferred?.reject(error) - } - if (this.redoDeferred?.isPending) { - this.redoDeferred?.reject(error) - } - if (this.clearDeferred?.isPending) { - this.clearDeferred.reject(error) - } - if (this.waitForIdleDeferred?.isPending) { - this.waitForIdleDeferred.reject(error) - } - } - - protected closeCallback(evt: CloseEvent): void - { - let message = "" - if (!this.currentErrorCode) { - switch (evt.code) { - case 1000: - // Normal Closure - break - case 1001: - message = ErrorConst.GOING_AWAY - break - case 1002: - message = ErrorConst.PROTOCOL_ERROR - break - case 1003: - message = ErrorConst.UNSUPPORTED_DATA - break - case 1006: - message = ErrorConst.ABNORMAL_CLOSURE - break - case 1007: - message = ErrorConst.INVALID_FRAME_PAULOAD - break - case 1008: - message = ErrorConst.POLICY_VIOLATION - break - case 1009: - message = ErrorConst.MESSAGE_TOO_BIG - break - case 1011: - message = ErrorConst.INTERNAL_ERROR - break - case 1012: - message = ErrorConst.SERVICE_RESTART - break - case 1013: - message = ErrorConst.TRY_AGAIN - break - case 1014: - message = ErrorConst.BAD_GATEWAY - break - case 1015: - message = ErrorConst.TLS_HANDSHAKE - break - default: - this.#logger.warn("closeCallback unknow CloseEvent.code", { evt }) - message = ErrorConst.CANT_ESTABLISH - break - } - } - const error = new Error(message || evt.reason) - - this.rejectDeferredPending(error) - - if (!this.currentErrorCode && evt.code !== 1000) { - this.internalEvent.emitError(error) - } - } - - protected manageHMACChallengeMessage(websocketMessage: TWebSocketEvent): void - { - this.#logger.info("manageHMACChallengeMessage", { websocketMessage }) - const hmacChallengeMessage = websocketMessage as TWebSocketHMACChallengeEvent - if (hmacChallengeMessage.hmacChallenge) { - this.send({ - type: "hmac", - hmac: computeHmac(hmacChallengeMessage.hmacChallenge, this.serverConfiguration.applicationKey, this.serverConfiguration.hmacKey) - }) - } - if (hmacChallengeMessage.iinkSessionId) { - this.sessionId = hmacChallengeMessage.iinkSessionId - } - } - - protected manageContentPackageDescriptionMessage(): void - { - this.reconnectionCount = 0 - this.#logger.info("manageContentPackageDescriptionMessage") - - this.send({ ...this.recognitionConfiguration, type: "configuration" }) - - if (this.currentPartId) { - this.send({ type: "openContentPart", id: this.currentPartId, mimeTypes: this.mimeTypes }) - } - else { - this.send({ type: "newContentPart", contentType: this.recognitionConfiguration.type, mimeTypes: this.mimeTypes }) - } - } - - protected managePartChangeMessage(websocketMessage: TWebSocketEvent): void - { - this.#logger.info("managePartChangeMessage", { websocketMessage }) - const partChangeMessage = websocketMessage as TWebSocketPartChangeEvent - this.currentPartId = partChangeMessage.partId - this.initialized?.resolve() - } - - protected manageExportMessage(websocketMessage: TWebSocketEvent): void - { - this.#logger.info("manageExportMessage", { websocketMessage }) - const exportMessage = websocketMessage as TWebSocketExportEvent - if (exportMessage.exports["application/vnd.myscript.jiix"]) { - exportMessage.exports["application/vnd.myscript.jiix"] = JSON.parse(exportMessage.exports["application/vnd.myscript.jiix"].toString()) as TJIIXExport - } - this.initialized?.resolve() - this.addStrokeDeferred?.resolve(exportMessage.exports) - this.exportDeferred?.resolve(exportMessage.exports) - this.convertDeferred?.resolve(exportMessage.exports) - this.importDeferred?.resolve(exportMessage.exports) - this.undoDeferred?.resolve(exportMessage.exports) - this.redoDeferred?.resolve(exportMessage.exports) - this.clearDeferred?.resolve(exportMessage.exports) - this.importPointEventsDeferred?.resolve(exportMessage.exports) - this.internalEvent.emitExported(exportMessage.exports) - } - - protected async manageWaitForIdle(): Promise { - this.internalEvent.emitIdle(true) - this.waitForIdleDeferred?.resolve() - } - - protected manageErrorMessage(websocketMessage: TWebSocketEvent): void - { - const err = websocketMessage as TWebSocketErrorEvent - this.currentErrorCode = err.data?.code || err.code - let message = err.data?.message || err.message || ErrorConst.UNKNOW - - switch (this.currentErrorCode) { - case "no.activity": - message = ErrorConst.NO_ACTIVITY - break - case "access.not.granted": - message = ErrorConst.WRONG_CREDENTIALS - break - case "session.too.old": - message = ErrorConst.TOO_OLD - break - } - const error = new Error(message) - this.rejectDeferredPending(error) - this.internalEvent.emitError(error) - } - - protected manageContentChangeMessage(websocketMessage: TWebSocketEvent): void - { - this.#logger.info("manageContentChangeMessage", { websocketMessage }) - const contentChangeMessage = websocketMessage as TWebSocketContentChangeEvent - const context: TUndoRedoContext = { - canRedo: contentChangeMessage.canRedo, - canUndo: contentChangeMessage.canUndo, - empty: contentChangeMessage.empty, - stackIndex: contentChangeMessage.undoStackIndex, - possibleUndoCount: contentChangeMessage.possibleUndoCount, - stack: [] - } - this.internalEvent.emitContextChange(context) - } - - protected manageSVGPatchMessage(websocketMessage: TWebSocketEvent): void - { - this.#logger.info("manageSVGPatchMessage", { websocketMessage }) - this.resizeDeferred?.resolve() - const svgPatchMessage = websocketMessage as TWebSocketSVGPatchEvent - this.internalEvent.emitSVGPatch(svgPatchMessage) - } - - protected messageCallback(message: MessageEvent): void - { - this.#logger.debug("messageCallback", { message }) - this.currentErrorCode = undefined - const websocketMessage: TWebSocketEvent = JSON.parse(message.data) - if (websocketMessage.type !== "pong") { - this.pingCount = 0 - switch (websocketMessage.type) { - case "ack": - this.manageHMACChallengeMessage(websocketMessage) - break - case "contentPackageDescription": - this.manageContentPackageDescriptionMessage() - break - case "partChanged": - this.managePartChangeMessage(websocketMessage) - break - case "newPart": - this.initialized?.resolve() - break - case "contentChanged": - this.manageContentChangeMessage(websocketMessage) - break - case "exported": - this.manageExportMessage(websocketMessage) - break - case "svgPatch": - this.manageSVGPatchMessage(websocketMessage) - break - case "error": - this.manageErrorMessage(websocketMessage) - break - case "idle": - this.manageWaitForIdle() - break - default : - this.#logger.warn("messageCallback", `Message type unknow: "${websocketMessage.type}".`) - } - } - } - - async init(height: number, width: number): Promise - { - try { - this.#logger.info("init", { height, width }) - this.destroy() - this.connected = new DeferredPromise() - this.initialized = new DeferredPromise() - this.viewSizeHeight = height - this.viewSizeWidth = width - this.pingCount = 0 - this.socket = new WebSocket(this.url) - - if (this.serverConfiguration.websocket.pingEnabled) { - this.infinitePing() - } - - this.socket.addEventListener("open", this.openCallback.bind(this)) - this.socket.addEventListener("close", this.closeCallback.bind(this)) - this.socket.addEventListener("message", this.messageCallback.bind(this)) - - return this.initialized.promise - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } catch (err: any) { - const error = new Error(ErrorConst.CANT_ESTABLISH) - this.internalEvent.emitError(error) - this.initialized?.reject(error) - return this.initialized?.promise - } - } - - async send(message: TWebSocketEvent): Promise - { - if (!this.connected) { - return Promise.reject(new Error("Recognizer must be initilized")) - } - await this.connected.promise - if (this.socket.readyState === this.socket.OPEN) { - this.#logger.debug("send", { message }) - this.socket.send(JSON.stringify(message)) - return Promise.resolve() - } else { - if (this.socket.readyState != this.socket.CONNECTING && this.serverConfiguration.websocket.autoReconnect) { - this.reconnectionCount++ - if (this.serverConfiguration.websocket.maxRetryCount >= this.reconnectionCount) { - this.#logger.debug("send", `try to reconnect number: ${this.reconnectionCount}.`) - this.internalEvent.emitClearMessage() - await this.init(this.viewSizeHeight, this.viewSizeWidth) - await this.setPenStyle(this.penStyle as TPenStyle) - await this.setPenStyleClasses(this.penStyleClasses as string) - await this.setTheme(this.theme as TTheme) - return this.send(message) - } - else { - return Promise.reject(new Error("Unable to send message. The maximum number of connection attempts has been reached.")) - } - } - } - } - - async addStrokes(strokes: TStroke[]): Promise - { - this.#logger.info("addStrokes", { strokes }) - await this.initialized?.promise - this.addStrokeDeferred = new DeferredPromise() - if (strokes.length === 0) { - this.addStrokeDeferred.resolve({} as TExport) - } - else { - await this.send({ - type: "addStrokes", - strokes: strokes.map(convertStrokeToJSON) - }) - } - return this.addStrokeDeferred?.promise - } - - async setPenStyle(penStyle: TPenStyle): Promise - { - this.#logger.info("setPenStyle", { penStyle }) - await this.initialized?.promise - this.penStyle = penStyle - const message: TWebSocketEvent = { - type: "setPenStyle", - style: StyleHelper.penStyleToCSS(penStyle) - } - return this.send(message) - } - - async setPenStyleClasses(penStyleClasses: string): Promise - { - await this.initialized?.promise - this.penStyleClasses = penStyleClasses - this.#logger.info("setPenStyleClasses", { penStyleClasses }) - const message: TWebSocketEvent = { - type: "setPenStyleClasses", - styleClasses: penStyleClasses - } - return this.send(message) - } - - async setTheme(theme: TTheme): Promise - { - this.#logger.info("setTheme", { theme }) - await this.initialized?.promise - this.theme = theme - const message: TWebSocketEvent = { - type: "setTheme", - theme: StyleHelper.themeToCSS(theme) - } - return this.send(message) - } - - async export(model: IModel, requestedMimeTypes?: string[]): Promise - { - this.#logger.info("export", { model, requestedMimeTypes }) - await this.initialized?.promise - this.exportDeferred = new DeferredPromise() - const localModel = model.getClone() - let mimeTypes: string[] = requestedMimeTypes || [] - if (!mimeTypes.length) { - switch (this.recognitionConfiguration.type) { - case "DIAGRAM": - mimeTypes = this.recognitionConfiguration.diagram.mimeTypes - break - case "MATH": - mimeTypes = this.recognitionConfiguration.math.mimeTypes - break - case "Raw Content": - mimeTypes = ["application/vnd.myscript.jiix"] - break - case "TEXT": - mimeTypes = this.recognitionConfiguration.text.mimeTypes - break - default: - throw new Error(`Recognition type "${ this.recognitionConfiguration.type }" is unknown.\n Possible types are:\n -DIAGRAM\n -MATH\n -Raw Content\n -TEXT`) - } - } - - if (!mimeTypes.length) { - return Promise.reject(new Error(`Export failed, no mimeTypes define in recognition ${ this.recognitionConfiguration.type } configuration`)) - } - - const message: TWebSocketEvent = { - type: "export", - partId: this.currentPartId, - mimeTypes - } - await this.send(message) - const exports: TExport = await this.exportDeferred?.promise - localModel.updatePositionReceived() - localModel.mergeExport(exports) - this.#logger.debug("export", { model: localModel }) - return localModel - } - - async import(model: IModel, data: Blob, mimeType?: string): Promise - { - this.#logger.info("import", { data, mimeType }) - await this.initialized?.promise - const localModel = model.getClone() - const chunkSize = this.serverConfiguration.websocket.fileChunkSize - const importFileId = Math.random().toString(10).substring(2, 6) - this.importDeferred = new DeferredPromise() - const readBlob = (blob: Blob): Promise => - { - const fileReader = new FileReader() - return new Promise((resolve, reject) => - { - fileReader.onloadend = (ev) => resolve(ev.target?.result as string) - fileReader.onerror = () => reject() - fileReader.readAsText(blob) - }) - } - - const importFileMessage: TWebSocketEvent = { - type: "importFile", - importFileId, - mimeType - } - await this.send(importFileMessage) - for (let i = 0; i < data.size; i += chunkSize) { - const blobPart = data.slice(i, i + chunkSize, data.type) - const partFileString = await readBlob(blobPart) - const fileChuckMessage: TWebSocketEvent = { - type: "fileChunk", - importFileId, - data: partFileString, - lastChunk: i + chunkSize > data.size - } - await this.send(fileChuckMessage) - } - const exports = await this.importDeferred?.promise - this.importDeferred = undefined - localModel.mergeExport(exports) - return localModel - } - - async resize(model: IModel): Promise - { - this.#logger.info("resize", { model }) - await this.initialized?.promise - this.resizeDeferred = new DeferredPromise() - const localModel = model.getClone() - this.viewSizeHeight = localModel.height - this.viewSizeWidth = localModel.width - const message: TWebSocketEvent = { - type: "changeViewSize", - height: this.viewSizeHeight, - width: this.viewSizeWidth, - } - await this.send(message) - await this.resizeDeferred?.promise - return localModel - } - - async importPointEvents(strokes: TStroke[]): Promise - { - this.#logger.info("importPointsEvents", { strokes }) - await this.initialized?.promise - this.importPointEventsDeferred = new DeferredPromise() - const message: TWebSocketEvent = { - type: "pointerEvents", - events: strokes.map(convertStrokeToJSON) - } - this.send(message) - const exportPoints = await this.importPointEventsDeferred?.promise - this.importPointEventsDeferred = undefined - this.#logger.debug("importPointEvents", { exportPoints }) - return exportPoints as TExport - } - - async convert(model: IModel, conversionState?: TConverstionState): Promise - { - this.#logger.info("convert", { model, conversionState }) - await this.initialized?.promise - this.convertDeferred = new DeferredPromise() - const localModel = model.getClone() - const message: TWebSocketEvent = { - type: "convert", - conversionState - } - await this.send(message) - const myExportConverted: TExport = await this.convertDeferred?.promise - localModel.updatePositionReceived() - localModel.mergeConvert(myExportConverted) - localModel.mergeExport(myExportConverted) - this.#logger.debug("convert", { model: localModel }) - return localModel - } - - async waitForIdle(): Promise - { - await this.initialized?.promise - this.waitForIdleDeferred = new DeferredPromise() - const message: TWebSocketEvent = { - type: "waitForIdle", - } - await this.send(message) - return this.waitForIdleDeferred?.promise - } - - async undo(model: IModel): Promise - { - this.#logger.info("undo", { model }) - await this.initialized?.promise - const localModel = model.getClone() - this.undoDeferred = new DeferredPromise() - const message: TWebSocketEvent = { - type: "undo", - } - await this.send(message) - const undoExports = await this.undoDeferred?.promise - localModel.updatePositionReceived() - localModel.mergeExport(undoExports) - this.#logger.debug("undo", { model: localModel }) - this.undoDeferred = undefined - return localModel - } - - async redo(model: IModel): Promise - { - this.#logger.info("redo", { model }) - await this.initialized?.promise - const localModel = model.getClone() - this.redoDeferred = new DeferredPromise() - const message: TWebSocketEvent = { - type: "redo", - } - await this.send(message) - const redoExports = await this.redoDeferred?.promise - localModel.updatePositionReceived() - localModel.mergeExport(redoExports) - this.#logger.debug("redo", { model: redoExports }) - this.redoDeferred = undefined - return localModel - } - - async clear(model: IModel): Promise - { - this.#logger.info("clear", { model }) - await this.initialized?.promise - const localModel = model.getClone() - localModel.modificationDate = Date.now() - this.clearDeferred = new DeferredPromise() - const message: TWebSocketEvent = { - type: "clear", - } - await this.send(message) - const clearExports = await this.clearDeferred?.promise - localModel.updatePositionReceived() - localModel.mergeExport(clearExports) - this.clearDeferred = undefined - this.#logger.info("clear", { model: localModel }) - return localModel - } - - close(code: number, reason: string): void - { - if (this.socket.readyState === this.socket.OPEN || this.socket.readyState === this.socket.CONNECTING) { - this.#logger.info("close", { code, reason }) - this.socket.removeEventListener("close", this.closeCallback) - this.socket.removeEventListener("message", this.messageCallback) - this.socket.removeEventListener("open", this.openCallback) - this.socket.close(code, reason) - } - } - - destroy(): void - { - this.#logger.info("destroy") - this.connected = undefined - this.initialized = undefined - this.addStrokeDeferred = undefined - this.exportDeferred = undefined - this.convertDeferred = undefined - this.importDeferred = undefined - this.resizeDeferred = undefined - this.undoDeferred = undefined - this.redoDeferred = undefined - this.clearDeferred = undefined - if (this.socket) { - this.socket.removeEventListener("close", this.closeCallback) - this.socket.removeEventListener("message", this.messageCallback) - this.socket.removeEventListener("open", this.openCallback) - this.close(1000, "Recognizer destroyed") - } - } -} diff --git a/src/recognizer/index.ts b/src/recognizer/index.ts deleted file mode 100644 index 209199a4b..000000000 --- a/src/recognizer/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { RestRecognizer } from "./RestRecognizer" -export { WSRecognizer } from "./WSRecognizer" diff --git a/src/renderer/QuadraticUtils.ts b/src/renderer/QuadraticUtils.ts deleted file mode 100644 index 5b84db32b..000000000 --- a/src/renderer/QuadraticUtils.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { TPoint, TPointer } from "../@types/geometry" - -export function computeLinksPoints(point: TPointer, angle: number, width: number): TPoint[] -{ - const radius = point.p * width - return [ - { - x: (point.x - (Math.sin(angle) * radius)), - y: (point.y + (Math.cos(angle) * radius)) - }, - { - x: (point.x + (Math.sin(angle) * radius)), - y: (point.y - (Math.cos(angle) * radius)) - } - ] -} - -export function computeMiddlePoint(point1: TPointer, point2: TPointer): TPointer -{ - return { - x: ((point2.x + point1.x) / 2), - y: ((point2.y + point1.y) / 2), - p: ((point2.p + point1.p) / 2), - t: ((point2.t + point1.t) / 2) - } -} - -export function computeAxeAngle(begin: TPointer, end: TPointer): number -{ - return Math.atan2(end.y - begin.y, end.x - begin.x) -} diff --git a/src/renderer/canvas/CanvasRenderer.ts b/src/renderer/canvas/CanvasRenderer.ts deleted file mode 100644 index c365b863d..000000000 --- a/src/renderer/canvas/CanvasRenderer.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { TStroke } from "../../@types/model/Stroke" -import { TRenderingConfiguration } from "../../@types/configuration/RenderingConfiguration" -import { IModel } from "../../@types/model/Model" -import { TSymbol } from "../../@types/renderer/Symbol" - -import { drawShapeSymbol, ShapeSymbols } from "./CanvasRendererShapeSymbol" -import { drawStroke } from "./CanvasRendererStrokeSymbol" -import { drawTextSymbol, TextSymbols } from "./CanvasRendererTextSymbol" -import { CanvasStroker } from "./CanvasStroker" -import { LoggerManager } from "../../logger" -import { LoggerClass } from "../../Constants" - -export class CanvasRenderer -{ - config: TRenderingConfiguration - stroker: CanvasStroker - context!: { - parent: HTMLElement - renderingCanvas: HTMLCanvasElement - renderingCanvasContext: CanvasRenderingContext2D - capturingCanvas: HTMLCanvasElement - capturingCanvasContext: CanvasRenderingContext2D - } - #logger = LoggerManager.getLogger(LoggerClass.RENDERER) - - constructor(config: TRenderingConfiguration) - { - this.#logger.info("constructor", { config }) - this.config = config - this.stroker = new CanvasStroker() - } - - private createCanvas(type: string): HTMLCanvasElement - { - this.#logger.debug("createCanvas", { type }) - const canvas: HTMLCanvasElement = document.createElement("canvas") - canvas.id = type - canvas.classList.add(type) - canvas.classList.add("ms-canvas") - return canvas - } - - private resizeContent(): void - { - const pixelRatio: number = window.devicePixelRatio - const elements: HTMLCanvasElement[] = [this.context.renderingCanvas, this.context.capturingCanvas] - elements.forEach((canvas) => - { - const domElement = canvas.parentNode as HTMLElement - const width = Math.max(this.config.minWidth, domElement.clientWidth) - const height = Math.max(this.config.minHeight, domElement.clientHeight) - canvas.width = width * pixelRatio - canvas.height = height * pixelRatio - canvas.getContext("2d")?.scale(pixelRatio, pixelRatio) - canvas.style.width = `${ width }px` - canvas.style.height = `${ height }px` - }) - } - - private drawSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol) - { - const type = symbol.elementType || symbol.type - if (type === "stroke") { - drawStroke(context2D, symbol as TStroke, this.stroker) - } else if (Object.keys(TextSymbols).includes(type)) { - drawTextSymbol(context2D, symbol) - } else if (Object.keys(ShapeSymbols).includes(type)) { - drawShapeSymbol(context2D, symbol) - } - } - - init(element: HTMLElement): void - { - this.#logger.info("init", { element }) - const renderingCanvas: HTMLCanvasElement = this.createCanvas("ms-rendering-canvas") - element.appendChild(renderingCanvas) - - const capturingCanvas: HTMLCanvasElement = this.createCanvas("ms-capture-canvas") - element.appendChild(capturingCanvas) - - this.context = { - parent: element, - renderingCanvas, - renderingCanvasContext: renderingCanvas.getContext("2d") as CanvasRenderingContext2D, - capturingCanvas, - capturingCanvasContext: capturingCanvas.getContext("2d") as CanvasRenderingContext2D - } - - this.resizeContent() - } - - drawModel(model: IModel): void - { - this.#logger.info("drawModel", { model }) - this.context.renderingCanvasContext?.clearRect(0, 0, this.context.renderingCanvas.width, this.context.renderingCanvas.height) - model.rawStrokes.forEach(symbol => this.drawSymbol(this.context.renderingCanvasContext, symbol)) - this.context.capturingCanvasContext.clearRect(0, 0, this.context.capturingCanvas.width, this.context.capturingCanvas.height) - } - - drawPendingStroke(stroke: TStroke | undefined): void - { - this.#logger.info("drawPendingStroke", { stroke }) - this.context.capturingCanvasContext.clearRect(0, 0, this.context.capturingCanvas.width, this.context.capturingCanvas.height) - if (stroke && stroke?.pointerType !== "eraser") { - this.stroker.drawStroke(this.context.capturingCanvasContext, stroke) - } - } - - resize(model: IModel): void - { - this.#logger.info("resize", { model }) - this.resizeContent() - this.drawModel(model) - } - - destroy(): void - { - this.#logger.info("destroy") - if (this.context.parent) { - this.context.parent.innerHTML = "" - } - } -} diff --git a/src/renderer/canvas/CanvasRendererShapeSymbol.ts b/src/renderer/canvas/CanvasRendererShapeSymbol.ts deleted file mode 100644 index d5ec42c16..000000000 --- a/src/renderer/canvas/CanvasRendererShapeSymbol.ts +++ /dev/null @@ -1,190 +0,0 @@ - -import { TPoint } from "../../@types/geometry" -import { TSymbol, TShapeEllipseSymbol, TShapeLineSymbol, TShapeSymbol, TShapeTableSymbol, TLineSymbol, TShapeRecognizedSymbol } from "../../@types/renderer/Symbol" - -export const ShapeSymbols = { - table: "table", - shape: "shape", - recognizedShape: "recognizedShape", - ellipse: "ellipse", - line: "line" -} - -function phi(angle: number): number -{ - let returnedAngle = ((angle + Math.PI) % (Math.PI * 2)) - Math.PI - if (returnedAngle < -Math.PI) { - returnedAngle += Math.PI * 2 - } - return returnedAngle -} - -function drawEllipseArc(context2D: CanvasRenderingContext2D, shapeEllipse: TShapeEllipseSymbol): TPoint[] -{ - const { centerPoint, maxRadius, minRadius, orientation, startAngle, sweepAngle } = shapeEllipse - const angleStep = 0.02 // angle delta between interpolated - - let z1 = Math.cos(orientation) - let z3 = Math.sin(orientation) - let z2 = z1 - let z4 = z3 - z1 *= maxRadius - z2 *= minRadius - z3 *= maxRadius - z4 *= minRadius - - const n = Math.floor(Math.abs(sweepAngle) / angleStep) - - const boundariesPoints = [] - - context2D.save() - try { - context2D.beginPath() - - for (let i = 0; i <= n; i++) { - const angle = startAngle + ((i / n) * sweepAngle) // points on the arc, in radian - const alpha = Math.atan2(Math.sin(angle) / minRadius, Math.cos(angle) / maxRadius) - - const cosAlpha = Math.cos(alpha) - const sinAlpha = Math.sin(alpha) - - // current point - const x = (centerPoint.x + (z1 * cosAlpha)) - (z4 * sinAlpha) - const y = (centerPoint.y + (z2 * sinAlpha)) + (z3 * cosAlpha) - if (i === 0) { - context2D.moveTo(x, y) - } else { - context2D.lineTo(x, y) - } - - if (i === 0 || i === n) { - boundariesPoints.push({ x, y }) - } - } - - context2D.stroke() - } finally { - context2D.restore() - } - - return boundariesPoints -} - -function drawArrowHead(context2D: CanvasRenderingContext2D, headPoint: TPoint, angle: number, length: number) -{ - const alpha = phi(angle + (Math.PI * (7 / 8))) - const beta = phi(angle - (Math.PI * (7 / 8))) - context2D.save() - try { - context2D.fillStyle = context2D.strokeStyle - - context2D.moveTo(headPoint.x, headPoint.y) - context2D.beginPath() - context2D.lineTo(headPoint.x + (length * Math.cos(alpha)), headPoint.y + (length * Math.sin(alpha))) - context2D.lineTo(headPoint.x + (length * Math.cos(beta)), headPoint.y + (length * Math.sin(beta))) - context2D.lineTo(headPoint.x, headPoint.y) - context2D.fill() - } finally { - context2D.restore() - } -} - -function drawShapeEllipse(context2D: CanvasRenderingContext2D, shapeEllipse: TShapeEllipseSymbol) -{ - const points = drawEllipseArc(context2D, shapeEllipse) - - if (shapeEllipse?.beginDecoration === "ARROW_HEAD") { - drawArrowHead(context2D, points[0], shapeEllipse.beginTangentAngle, 12.0) - } - if (shapeEllipse?.endDecoration === "ARROW_HEAD") { - drawArrowHead(context2D, points[1], shapeEllipse.endTangentAngle, 12.0) - } -} - -/** - * Draw a line - * @param {Object} context2D Current rendering context2D - * @param {{x: Number, y: Number}} p1 Origin point - * @param {{x: Number, y: Number}} p2 Destination point - */ -export function drawLine(context2D: CanvasRenderingContext2D, p1: TPoint, p2: TPoint) -{ - context2D.save() - try { - context2D.beginPath() - context2D.moveTo(p1.x, p1.y) - context2D.lineTo(p2.x, p2.y) - context2D.stroke() - } finally { - context2D.restore() - } -} - -function drawShapeLine(context2D: CanvasRenderingContext2D, shapeLine: TShapeLineSymbol) -{ - drawLine(context2D, shapeLine.firstPoint, shapeLine.lastPoint) - if (shapeLine.beginDecoration === "ARROW_HEAD") { - drawArrowHead(context2D, shapeLine.firstPoint, shapeLine.beginTangentAngle, 12.0) - } - if (shapeLine.endDecoration === "ARROW_HEAD") { - drawArrowHead(context2D, shapeLine.lastPoint, shapeLine.endTangentAngle, 12.0) - } -} - -/** - * Draw a shape symbol - * @param {Object} context2D Current rendering context2D - * @param {Object} symbol Symbol to draw - */ -export function drawShapeSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol) -{ - context2D.save() - try { - context2D.lineWidth = symbol.style.width as number - context2D.strokeStyle = symbol.style.color as string - - if (symbol.elementType) { - switch (symbol.elementType) { - case ShapeSymbols.shape: { - const shapeSymbol = symbol as TShapeSymbol - drawShapeSymbol(context2D, shapeSymbol.candidates[shapeSymbol.selectedCandidateIndex]) - break - } - case ShapeSymbols.table:{ - const tableSymbols = symbol as TShapeTableSymbol - tableSymbols.lines.forEach(line => drawShapeSymbol(context2D, line)) - break - } - case ShapeSymbols.line: { - const lineSymbol = symbol as TLineSymbol - drawLine(context2D, lineSymbol.data.p1, lineSymbol.data.p2) - break - } - default: - // logger.error(`${ symbol.elementType } not implemented`) - break - } - } else { - switch (symbol.type) { - case ShapeSymbols.ellipse: { - drawShapeEllipse(context2D, symbol as TShapeEllipseSymbol) - break - } - case ShapeSymbols.line: { - drawShapeLine(context2D, symbol as TShapeLineSymbol) - break - } - case ShapeSymbols.recognizedShape: { - const recognizedShape = symbol as TShapeRecognizedSymbol - recognizedShape.primitives.forEach(primitive => drawShapeSymbol(context2D, primitive)) - break - } - default: - // logger.error(`${ symbol.type } not implemented`) - break - } - } - } finally { - context2D.restore() - } -} diff --git a/src/renderer/canvas/CanvasRendererStrokeSymbol.ts b/src/renderer/canvas/CanvasRendererStrokeSymbol.ts deleted file mode 100644 index ba169b71c..000000000 --- a/src/renderer/canvas/CanvasRendererStrokeSymbol.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { TStroke } from "../../@types/model/Stroke" -import { CanvasStroker } from "./CanvasStroker" - -export function drawStroke (context2D: CanvasRenderingContext2D, stroke: TStroke, stroker: CanvasStroker) { - if (stroker && stroke && stroke.pointerType !== "eraser") { - stroker.drawStroke(context2D, stroke) - } -} diff --git a/src/renderer/canvas/CanvasRendererTextSymbol.ts b/src/renderer/canvas/CanvasRendererTextSymbol.ts deleted file mode 100644 index d3f420bb6..000000000 --- a/src/renderer/canvas/CanvasRendererTextSymbol.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { TPoint } from "../../@types/geometry" -import { drawLine } from "./CanvasRendererShapeSymbol" -import { TSymbol, TTextUnderlineDataSymbol, TTextUnderlineSymbol, TUnderLineSymbol } from "../../@types/renderer/Symbol" - -export const TextSymbols = { - inputCharacter: "inputCharacter", - char: "char", - string: "string", - textLine: "textLine" -} - -function drawUnderline(context2D: CanvasRenderingContext2D, underline: TUnderLineSymbol, label: string, data: TTextUnderlineDataSymbol) -{ - const delta = data.width / label.length - const p1: TPoint = { - x: data.topLeftPoint.x + (underline.data.firstCharacter * delta), - y: data.topLeftPoint.y + data.height - } - const p2: TPoint = { - x: data.topLeftPoint.x + (underline.data.lastCharacter * delta), - y: data.topLeftPoint.y + data.height - } - drawLine(context2D, p1, p2) -} - -function drawText(context2D: CanvasRenderingContext2D, label: string, data: TTextUnderlineDataSymbol) -{ - context2D.save() - try { - context2D.font = `${ data.textHeight }px serif` - context2D.textAlign = (data.justificationType === "CENTER") ? "center" : "left" - context2D.textBaseline = "bottom" - context2D.fillStyle = context2D.strokeStyle - context2D.fillText(label, data.topLeftPoint.x, (data.topLeftPoint.y + data.height)) - } finally { - context2D.restore() - } -} - -function drawTextLine(context2D: CanvasRenderingContext2D, textLine: TTextUnderlineSymbol) -{ - drawText(context2D, textLine.label, textLine.data) - textLine.underlineList.forEach((underline) => - { - drawUnderline(context2D, underline, textLine.label, textLine.data) - }) -} - -/** - * Draw a text symbol - * @param {Object} context Current rendering context - * @param {Object} symbol Symbol to draw - */ -export function drawTextSymbol(context2D: CanvasRenderingContext2D, symbol: TSymbol) -{ - context2D.save() - try { - context2D.lineWidth = (symbol.style.width as number) - context2D.strokeStyle = (symbol.style.color as string) - const type: string = symbol.elementType || symbol.type - - switch (type) { - case TextSymbols.textLine: - drawTextLine(context2D, symbol as TTextUnderlineSymbol) - break - default: - console.info(`drawTextSymbol => ${symbol.elementType} not implemented`) - break - } - - } finally { - context2D.restore() - } -} diff --git a/src/renderer/canvas/CanvasStroker.ts b/src/renderer/canvas/CanvasStroker.ts deleted file mode 100644 index 18feb259c..000000000 --- a/src/renderer/canvas/CanvasStroker.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { TPointer } from "../../@types/geometry" -import { TStroke } from "../../@types/model/Stroke" -import { computeAxeAngle, computeLinksPoints, computeMiddlePoint } from "../QuadraticUtils" - -export class CanvasStroker -{ - - private renderArc(context2d: CanvasRenderingContext2D, center: TPointer, radius: number): void - { - context2d.arc(center.x, center.y, radius, 0, Math.PI * 2, true) - } - - private renderLine(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, width: number): void - { - const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, end), width) - const linkPoints2 = computeLinksPoints(end, computeAxeAngle(begin, end), width) - - context2d.moveTo(linkPoints1[0].x, linkPoints1[0].y) - context2d.lineTo(linkPoints2[0].x, linkPoints2[0].y) - context2d.lineTo(linkPoints2[1].x, linkPoints2[1].y) - context2d.lineTo(linkPoints1[1].x, linkPoints1[1].y) - } - - private renderFinal(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, width: number): void - { - const ARCSPLIT = 6 - const angle = computeAxeAngle(begin, end) - const linkPoints = computeLinksPoints(end, angle, width) - context2d.moveTo(linkPoints[0].x, linkPoints[0].y) - for (let i = 1; i <= ARCSPLIT; i++) { - const newAngle = angle - ((i * Math.PI) / ARCSPLIT) - context2d.lineTo(end.x - ((end.p * width) * Math.sin(newAngle)), end.y + (end.p * width * Math.cos(newAngle))) - } - } - - private renderQuadratic(context2d: CanvasRenderingContext2D, begin: TPointer, end: TPointer, ctrl: TPointer, width: number): void - { - const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, ctrl), width) - const linkPoints2 = computeLinksPoints(end, computeAxeAngle(ctrl, end), width) - const linkPoints3 = computeLinksPoints(ctrl, computeAxeAngle(begin, end), width) - - context2d.moveTo(linkPoints1[0].x, linkPoints1[0].y) - context2d.quadraticCurveTo(linkPoints3[0].x, linkPoints3[0].y, linkPoints2[0].x, linkPoints2[0].y) - context2d.lineTo(linkPoints2[1].x, linkPoints2[1].y) - context2d.quadraticCurveTo(linkPoints3[1].x, linkPoints3[1].y, linkPoints1[1].x, linkPoints1[1].y) - } - - drawStroke(context2d: CanvasRenderingContext2D, stroke: TStroke): void - { - const NUMBER_POINTS = stroke.pointers.length - const NUMBER_QUADRATICS = NUMBER_POINTS - 2 - const width = (stroke.style.width as number) > 0 ? (stroke.style.width as number) : context2d.lineWidth - const color = (stroke.style.color as string) ? (stroke.style.color as string) : context2d.strokeStyle - const firstPoint = stroke.pointers[0] as TPointer - - context2d.save() - try { - context2d.beginPath() - if (NUMBER_POINTS < 3) { - this.renderArc(context2d, firstPoint, width * 0.6) - } else { - this.renderArc(context2d, firstPoint, width * firstPoint.p) - const secondPoint: TPointer = computeMiddlePoint(firstPoint, stroke.pointers[1]) - this.renderLine(context2d, firstPoint, secondPoint, width) - - // Possibility to try this (the start looks better when the ink is large) - // var first = computeMiddlePoint(stroke.pointers[0], stroke.pointers[1]); - // context2d.arc(first.x, first.y, width * first.p, 0, Math.PI * 2, true); - - for (let i = 0; i < NUMBER_QUADRATICS; i++) { - const begin: TPointer = computeMiddlePoint(stroke.pointers[i], stroke.pointers[i + 1]) - const end: TPointer = computeMiddlePoint(stroke.pointers[i + 1], stroke.pointers[i + 2]) - const ctrl: TPointer = stroke.pointers[i + 1] - this.renderQuadratic(context2d, begin, end, ctrl, width) - } - const beginLine: TPointer = computeMiddlePoint(stroke.pointers[NUMBER_POINTS - 2], stroke.pointers[NUMBER_POINTS - 1]) - const endLine: TPointer = stroke.pointers[NUMBER_POINTS - 1] - this.renderLine(context2d, beginLine, endLine, width) - - const beginFinal: TPointer = stroke.pointers[NUMBER_POINTS - 2] - const endFinal: TPointer = stroke.pointers[NUMBER_POINTS - 1] - this.renderFinal(context2d, beginFinal, endFinal, width) - } - context2d.closePath() - if (color !== undefined) { - context2d.fillStyle = color - context2d.fill() - } - context2d.save() - } - finally { - context2d.restore() - } - } -} diff --git a/src/renderer/canvas/index.ts b/src/renderer/canvas/index.ts deleted file mode 100644 index 3f83e86a7..000000000 --- a/src/renderer/canvas/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { CanvasRenderer } from "./CanvasRenderer" -export * as canvasRendererShape from "./CanvasRendererShapeSymbol" -export * as canvasRendererStroke from "./CanvasRendererStrokeSymbol" -export * as canvasRendererText from "./CanvasRendererTextSymbol" -export { CanvasStroker } from "./CanvasStroker" diff --git a/src/renderer/index.ts b/src/renderer/index.ts deleted file mode 100644 index 06ec1febf..000000000 --- a/src/renderer/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./canvas" -export * from "./svg" -export * as quadradicsUtils from "./QuadraticUtils" diff --git a/src/renderer/svg/SVGStroker.ts b/src/renderer/svg/SVGStroker.ts deleted file mode 100644 index 19a91be0e..000000000 --- a/src/renderer/svg/SVGStroker.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { TPointer } from "../../@types/geometry" -import { TStroke } from "../../@types/model/Stroke" -import { computeAxeAngle, computeLinksPoints, computeMiddlePoint } from "../QuadraticUtils" - -export class SVGStroker -{ - - private getArcPath(center: TPointer, radius: number): string - { - const svgPath = [ - `M ${ center.x },${ center.y }`, - `m ${ -radius },0`, - `a ${ radius },${ radius } 0 1 0 ${ radius * 2 },0`, - `a ${ radius },${ radius } 0 1 0 ${ -(radius * 2) },0` - ].join(" ") - return svgPath - } - - private getLinePath(begin: TPointer, end: TPointer, width: number): string - { - const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, end), width) - const linkPoints2 = computeLinksPoints(end, computeAxeAngle(begin, end), width) - const svgPath = [ - `M ${ linkPoints1[0].x },${ linkPoints1[0].y }`, - `L ${ linkPoints2[0].x },${ linkPoints2[0].y }`, - `L ${ linkPoints2[1].x },${ linkPoints2[1].y }`, - `L ${ linkPoints1[1].x },${ linkPoints1[1].y }` - ].join(" ") - return svgPath - } - - private getFinalPath(begin: TPointer, end: TPointer, width: number): string - { - const ARCSPLIT = 6 - const angle = computeAxeAngle(begin, end) - const linkPoints = computeLinksPoints(end, angle, width) - const parts = [`M ${ linkPoints[0].x },${ linkPoints[0].y }`] - for (let i = 1; i <= ARCSPLIT; i++) { - const newAngle = angle - (i * (Math.PI / ARCSPLIT)) - parts.push(`L ${ end.x - (end.p * width * Math.sin(newAngle)) },${ end.y + (end.p * width * Math.cos(newAngle)) }`) - } - const svgPath = parts.join(" ") - return svgPath - } - - private getQuadraticPath(begin: TPointer, end: TPointer, central: TPointer, width: number): string - { - const linkPoints1 = computeLinksPoints(begin, computeAxeAngle(begin, central), width) - const linkPoints2 = computeLinksPoints(end, computeAxeAngle(central, end), width) - const linkPoints3 = computeLinksPoints(central, computeAxeAngle(begin, end), width) - const svgPath = [ - `M ${ linkPoints1[0].x },${ linkPoints1[0].y }`, - `Q ${ linkPoints3[0].x },${ linkPoints3[0].y } ${ linkPoints2[0].x },${ linkPoints2[0].y }`, - `L ${ linkPoints2[1].x },${ linkPoints2[1].y }`, - `Q ${ linkPoints3[1].x },${ linkPoints3[1].y } ${ linkPoints1[1].x },${ linkPoints1[1].y }` - ].join(" ") - return svgPath - } - - private buildSVGPath(stroke: TStroke): string - { - const STROKE_LENGTH = stroke.pointers.length - const STROKE_WIDTH = (stroke.style.width as number) - const NB_QUADRATICS = STROKE_LENGTH - 2 - const firstPoint = stroke.pointers[0] - - const parts = [] - if (STROKE_LENGTH < 3) { - parts.push(this.getArcPath(firstPoint, STROKE_WIDTH * 0.6)) - } else { - parts.push(this.getArcPath(firstPoint, STROKE_WIDTH * firstPoint.p)) - parts.push(this.getLinePath(firstPoint, computeMiddlePoint(firstPoint, stroke.pointers[1]), STROKE_WIDTH)) - - for (let i = 0; i < NB_QUADRATICS; i++) { - const begin = computeMiddlePoint(stroke.pointers[i], stroke.pointers[i + 1]) - const end = computeMiddlePoint(stroke.pointers[i + 1], stroke.pointers[i + 2]) - const central = stroke.pointers[i + 1] - parts.push(this.getQuadraticPath(begin, end, central, STROKE_WIDTH) - ) - } - const beforeLastPoint = stroke.pointers[STROKE_LENGTH - 2] - const lastPoint = stroke.pointers[STROKE_LENGTH - 1] - parts.push(this.getLinePath(computeMiddlePoint(beforeLastPoint, lastPoint), lastPoint, STROKE_WIDTH)) - parts.push(this.getFinalPath(beforeLastPoint, lastPoint, STROKE_WIDTH)) - } - return parts.join(" ") - } - - drawStroke(svgElement: SVGElement, stroke: TStroke, attrs?: { name: string, value: string }[]): void - { - const svgPathElement = document.createElementNS("http://www.w3.org/2000/svg", "path") - svgPathElement.classList.add("pending-stroke") - svgPathElement.setAttribute("id", stroke.id) - svgPathElement.setAttribute("type", stroke.pointerType) - attrs?.forEach(a => - { - svgPathElement.setAttribute(a.name, a.value) - }) - const svgPath = this.buildSVGPath(stroke) - svgPathElement.setAttribute("d", `${ svgPath }Z`) - svgElement.appendChild(svgPathElement) - } -} diff --git a/src/renderer/svg/WSSVGRenderer.ts b/src/renderer/svg/WSSVGRenderer.ts deleted file mode 100644 index 47646a266..000000000 --- a/src/renderer/svg/WSSVGRenderer.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { TRenderingConfiguration } from "../../@types/configuration/RenderingConfiguration" -import { IModel } from "../../@types/model/Model" -import { TUpdatePatch, TUpdatePatchAppendChild, TUpdatePatchInsertBefore, TUpdatePatchRemoveAttribut, TUpdatePatchRemoveChild, TUpdatePatchRemoveElement, TUpdatePatchReplaceAll, TUpdatePatchReplaceELement, TUpdatePatchSetAttribut } from "../../@types/recognizer/WSRecognizer" -import { TStroke } from "../../@types/model/Stroke" -import { SVGStroker } from "./SVGStroker" -import { LoggerManager } from "../../logger" -import { LoggerClass } from "../../Constants" - -export class WSSVGRenderer -{ - config: TRenderingConfiguration - stroker: SVGStroker - context!: { - parent: HTMLElement - } - #logger = LoggerManager.getLogger(LoggerClass.RENDERER) - - constructor(config: TRenderingConfiguration) - { - this.#logger.info("constructor", { config }) - this.config = config - this.stroker = new SVGStroker() - } - - init(element: HTMLElement): void - { - this.#logger.info("init", { element }) - element.style.fontSize = "10px" - this.context = { - parent: element - } - } - - #drawStroke(svgElement: SVGElement, stroke: TStroke) - { - let style: string - if (stroke.pointerType === "eraser") { - stroke.style.width = 20 - style = "fill:grey;stroke:transparent;shadowBlur:5;opacity:0.2;" - } else { - style = `fill:${ stroke.style.color };stroke:transparent;` - } - this.stroker.drawStroke(svgElement, stroke, [{ name: "style", value: style }]) - } - - #replaceAll(layerName: string, update: TUpdatePatchReplaceAll): void - { - const oldLayer = this.context.parent.querySelector(`svg[data-layer="${ layerName }"]`) as SVGElement | null - oldLayer?.remove() - this.context.parent.insertAdjacentHTML("beforeend", update.svg) - const layer = this.context.parent.querySelector(`svg[data-layer="${ layerName }"]`) as SVGElement - if (layerName === "MODEL") { - const pendingStrokesGroup = document.createElementNS("http://www.w3.org/2000/svg", "g") - pendingStrokesGroup.id = "pendingStrokes" - layer.appendChild(pendingStrokesGroup) - } - } - - #replaceElement(update: TUpdatePatchReplaceELement): void - { - const elementToRemove = this.context.parent.querySelector(`#${ update.id }`) as HTMLElement | null - if (elementToRemove) { - const parent = elementToRemove.parentNode as HTMLElement | null | undefined - elementToRemove?.remove() - parent?.insertAdjacentHTML("beforeend", update.svg) - } - } - - #appendChild(layerName: string, update: TUpdatePatchAppendChild): void - { - const parentSelector = update.parentId ? `#${ update.parentId }` : `svg[data-layer="${ layerName }"]` - const parent = this.context.parent.querySelector(parentSelector) as HTMLElement - parent?.insertAdjacentHTML("beforeend", update.svg) - } - - #removeChild(update: TUpdatePatchRemoveChild): void - { - this.context.parent.querySelector(`#${ update.parentId } > *:nth-child(${ update.index + 1 })`)?.remove() - } - - #removeElement(update: TUpdatePatchRemoveElement): void - { - const elementToRemove = this.context.parent.querySelector(`#${ update.id }`) - if (elementToRemove) { - if (update.id.includes("s") || update.id.includes("MODEL")) { - elementToRemove.remove() - } else { - elementToRemove.setAttribute("class", "removed-stroke") - setTimeout(() => - { - elementToRemove?.remove() - }, 100) - } - } - } - - #insertBefore(update: TUpdatePatchInsertBefore): void - { - const parent = this.context.parent.querySelector(`#${ update.refId }`) as HTMLElement | null - parent?.insertAdjacentHTML("beforebegin", update.svg) - } - - #setAttribute(update: TUpdatePatchSetAttribut): void - { - const selector = update.id ? `#${ update.id }` : "svg" - const element = this.context.parent.querySelector(selector) as HTMLElement | null - element?.setAttribute(update.name, update.value) - } - - #removeAttribute(update: TUpdatePatchRemoveAttribut): void - { - const selector = update.id ? `#${ update.id }` : "svg" - const element = this.context.parent.querySelector(selector) as HTMLElement | null - element?.removeAttribute(update.name) - } - - updateLayer(layerName: string, update: TUpdatePatch): void - { - this.#logger.info("updateLayer", { layerName, update }) - switch (update.type) { - case "REPLACE_ALL": - this.#replaceAll(layerName, update as TUpdatePatchReplaceAll) - break - case "REPLACE_ELEMENT": - this.#replaceElement(update as TUpdatePatchReplaceELement) - break - case "APPEND_CHILD": - this.#appendChild(layerName, update as TUpdatePatchAppendChild) - break - case "REMOVE_ELEMENT": - this.#removeElement(update as TUpdatePatchRemoveElement) - break - case "REMOVE_CHILD": - this.#removeChild(update as TUpdatePatchRemoveChild) - break - case "INSERT_BEFORE": - this.#insertBefore(update as TUpdatePatchInsertBefore) - break - case "SET_ATTRIBUTE": - this.#setAttribute(update as TUpdatePatchSetAttribut) - break - case "REMOVE_ATTRIBUTE": - this.#removeAttribute(update as TUpdatePatchRemoveAttribut) - break - default: - this.#logger.warn("updateLayer Default", {layerName, update}) - break - } - } - - updatesLayer(layerName: string, updates: TUpdatePatch[]): void - { - this.#logger.info("updatesLayer", { layerName, updates }) - updates.forEach(u => this.updateLayer(layerName, u)) - this.clearPendingStroke() - } - - clearPendingStroke(): void - { - this.#logger.info("clearPendingStroke", { }) - const pendingStrokeGroup = this.context.parent.querySelector("#pendingStrokes") as SVGElement - if (pendingStrokeGroup) { - pendingStrokeGroup.innerHTML = "" - } - } - - drawPendingStroke(stroke: TStroke): void - { - this.#logger.info("drawPendingStroke", { stroke }) - if (stroke) { - const pendingStrokeGroup = this.context.parent.querySelector("#pendingStrokes") as SVGElement - if (pendingStrokeGroup) { - const oldStroke = pendingStrokeGroup.querySelector(`#${ stroke?.id }`) - if (oldStroke) { - oldStroke.remove() - } - this.#drawStroke(pendingStrokeGroup, stroke) - } - } - } - - clearErasingStrokes(): void - { - const erasingStrokeList = this.context.parent.querySelectorAll("[type=eraser]") as NodeListOf - erasingStrokeList.forEach(erasingStroke => { - erasingStroke.remove() - }) - } - - resize(model: IModel): void - { - this.#logger.info("resize", { model }) - const rect = this.context.parent.getBoundingClientRect() - const svgList = this.context.parent.querySelectorAll("svg") - const width = Math.max(rect.width, model.width) - const height = Math.max(rect.height, model.height) - svgList.forEach(svg => - { - svg.setAttribute("viewBox", `0 0 ${ width }, ${ height }`) - svg.setAttribute("width", `${ width }px`) - svg.setAttribute("height", `${ height }px`) - }) - } - - destroy(): void - { - this.#logger.info("destroy", { context: this.context }) - if (this.context?.parent) { - this.context.parent.querySelectorAll("svg").forEach(n => n.remove()) - } - } -} diff --git a/src/renderer/svg/index.ts b/src/renderer/svg/index.ts deleted file mode 100644 index cb44a5602..000000000 --- a/src/renderer/svg/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { SVGStroker } from "./SVGStroker" -export { WSSVGRenderer} from "./WSSVGRenderer" diff --git a/src/smartguide/SmartGuide.ts b/src/smartguide/SmartGuide.ts deleted file mode 100644 index 44b69efeb..000000000 --- a/src/smartguide/SmartGuide.ts +++ /dev/null @@ -1,417 +0,0 @@ -import { TMarginConfiguration } from "../@types/configuration/recognition/MarginConfiguration" -import { TRenderingConfiguration } from "../@types/configuration/RenderingConfiguration" -import { TJIIXExport, TWordExport } from "../@types/model/Model" -import { InternalEvent } from "../event/InternalEvent" -import { LoggerManager } from "../logger" -import { LoggerClass } from "../Constants" - -export class SmartGuide { - uuid: string - #smartGuideElement!: HTMLDivElement - #prompterContainerElement!: HTMLDivElement - #prompterTextElement!: HTMLDivElement - #ellipsisElement!: HTMLDivElement - #tagElement!: HTMLDivElement - #candidatesElement!: HTMLDivElement - #menuElement!: HTMLDivElement - #convertElement!: HTMLButtonElement - #copyElement!: HTMLButtonElement - #deleteElement!: HTMLButtonElement - #fadeOutTimout?: ReturnType - #isMenuOpen!: boolean - margin: TMarginConfiguration - renderingConfiguration!: TRenderingConfiguration - jiix?: TJIIXExport - lastWord?: TWordExport - wordToChange?: TWordExport - #logger = LoggerManager.getLogger(LoggerClass.SMARTGUIDE) - - constructor() { - this.#logger.info("constructor", { }) - this.uuid = Math.random().toString(10).substring(2, 12) - this.margin = { - bottom: 0, - left: 0, - right: 0, - top: 0 - } - this.#createWrapperElement() - this.#createPrompterContainerElement() - this.#createPrompterTextElement() - this.#createEllipsisElement() - this.#createTagElement() - this.#createCandidatesElement() - this.#createMoreMenuElement() - this.#createConvertElement() - this.#createCopyElement() - this.#createDeleteElement() - } - - get internalEvent(): InternalEvent { - return InternalEvent.getInstance() - } - - #createWrapperElement(): void { - this.#smartGuideElement = document.createElement("div") - this.#smartGuideElement.id = `smartguide-${this.uuid}` - this.#smartGuideElement.classList.add("smartguide") - } - - #createPrompterContainerElement(): void { - this.#prompterContainerElement = document.createElement("div") - this.#prompterContainerElement.id = `prompter-container-${this.uuid}` - this.#prompterContainerElement.classList.add("prompter-container") - // this.#prompterContainerElement.appendChild(textElement) - } - - #createPrompterTextElement(): void { - this.#prompterTextElement = document.createElement("div") - this.#prompterTextElement.id = `prompter-text-${this.uuid}` - this.#prompterTextElement.classList.add("prompter-text") - this.#prompterTextElement.setAttribute("touch-action", "none") - } - - #createEllipsisElement(): void { - this.#ellipsisElement = document.createElement("div") - this.#ellipsisElement.id = `ellipsis-${this.uuid}` - this.#ellipsisElement.classList.add("ellipsis") - this.#ellipsisElement.innerHTML = "..." - } - - #createTagElement(): void { - this.#tagElement = document.createElement("div") - this.#tagElement.id = `tag-icon-${this.uuid}` - this.#tagElement.classList.add("tag-icon") - this.#tagElement.innerHTML = "¶" - } - - #createCandidatesElement(): void { - this.#candidatesElement = document.createElement("div") - this.#candidatesElement.id = `candidates-${this.uuid}` - this.#candidatesElement.classList.add("candidates") - } - - #createMoreMenuElement(): void { - this.#menuElement = document.createElement("div") - this.#menuElement.id = `more-menu-${this.uuid}` - this.#menuElement.classList.add("more-menu") - } - - #createConvertElement(): void { - this.#convertElement = document.createElement("button") - this.#convertElement.id = `convert-${this.uuid}` - this.#convertElement.classList.add("options-label-button") - this.#convertElement.innerHTML = "Convert" - } - - #createCopyElement(): void { - this.#copyElement = document.createElement("button") - this.#copyElement.id = `copy-${this.uuid}` - this.#copyElement.classList.add("options-label-button") - this.#copyElement.innerHTML = "Copy" - } - - #createDeleteElement(): void { - this.#deleteElement = document.createElement("button") - this.#deleteElement.id = `delete-${this.uuid}` - this.#deleteElement.classList.add("options-label-button") - this.#deleteElement.innerHTML = "Delete" - } - - init(domElement: HTMLElement, margin: TMarginConfiguration, renderingConfiguration: TRenderingConfiguration): void { - this.#logger.info("init", { domElement, margin, renderingConfiguration }) - domElement.appendChild(this.#smartGuideElement) - this.#smartGuideElement.appendChild(this.#tagElement) - - this.#prompterContainerElement.appendChild(this.#prompterTextElement) - this.#smartGuideElement.appendChild(this.#prompterContainerElement) - - this.#smartGuideElement.appendChild(this.#ellipsisElement) - - this.#menuElement.appendChild(this.#convertElement) - this.#menuElement.appendChild(this.#copyElement) - this.#menuElement.appendChild(this.#deleteElement) - this.#smartGuideElement.appendChild(this.#menuElement) - this.#menuElement.classList.add("close") - this.#isMenuOpen = false - - this.#smartGuideElement.appendChild(this.#candidatesElement) - this.#candidatesElement.style.display = "none" - this.margin = margin - this.renderingConfiguration = renderingConfiguration - this.#addListeners() - - this.#show() - if (this.renderingConfiguration.smartGuide.fadeOut.enable) { - this.#initFadeOutObserver(this.renderingConfiguration.smartGuide.fadeOut.duration) - } - - this.resize() - } - - #initFadeOutObserver(duration = 3000): void { - const observer = new MutationObserver(() => { - clearTimeout(this.#fadeOutTimout) - if ( - !this.#smartGuideElement.classList.contains("smartguide-out") && - this.#candidatesElement.style.display === "none" && - !this.#isMenuOpen - ) { - this.#fadeOutTimout = setTimeout(() => { - this.#hide() - }, duration) - } - }) - observer.observe(this.#smartGuideElement, { childList: true, subtree: true, attributes: true }) - } - - #show(): void { - this.#smartGuideElement.classList.remove("smartguide-out") - this.#smartGuideElement.classList.add("smartguide-in") - } - #hide(): void { - this.#smartGuideElement.classList.add("smartguide-out") - this.#smartGuideElement.classList.remove("smartguide-in") - } - - #showCandidates = (target: HTMLElement) => { - this.#logger.info("showCandidates", { target }) - const wordId = parseInt(target.id.replace("word-", "").replace(this.uuid, "")) - const words = this.jiix?.words as TWordExport[] - this.wordToChange = words[wordId] - if (this.wordToChange) { - this.wordToChange.id = wordId.toString() - this.#candidatesElement.innerHTML = "" - if (this.wordToChange?.candidates) { - this.#candidatesElement.style.display = "flex" - this.wordToChange.candidates.forEach((word, index) => { - if (this.wordToChange?.label === word) { - this.#candidatesElement.innerHTML += `${word}` - } else { - this.#candidatesElement.innerHTML += `${word}` - } - }) - const top = 48 - const left = target.getBoundingClientRect().left - 60 - this.#candidatesElement.style.top = `${top}px` - this.#candidatesElement.style.left = `${left}px` - - const parent = target.parentNode?.parentNode?.parentNode - if (parent) { - parent.insertBefore(this.#candidatesElement, target.parentNode?.parentNode) - } - } - } - } - #hideCandidates(): void { - this.#candidatesElement.style.display = "none" - } - - #openMenu(): void { - this.#menuElement.classList.add("open") - this.#menuElement.classList.remove("close") - this.#isMenuOpen = true - } - #closeMenu(): void { - this.#menuElement.classList.add("close") - this.#menuElement.classList.remove("open") - this.#isMenuOpen = false - } - - #onClickEllipsis = (evt: Event) => { - this.#logger.info("onClickEllipsis", { evt }) - evt.preventDefault() - evt.stopPropagation() - this.#isMenuOpen ? this.#closeMenu() : this.#openMenu() - this.#hideCandidates() - } - - #onClickConvert = (evt: Event) => { - this.#logger.info("onClickConvert", { evt }) - evt.preventDefault() - evt.stopPropagation() - this.internalEvent.emitConvert() - this.#closeMenu() - } - - #onClickCopy = async (evt: Event): Promise => { - this.#logger.info("onClickCopy", { evt }) - evt.preventDefault() - evt.stopPropagation() - try { - this.#closeMenu() - let message = "Nothing to copy" - if (this.#prompterTextElement.innerText) { - message = `"${this.#prompterTextElement.innerText}" copied to clipboard` - if (/iPad|iPhone|iPod/.test(navigator.userAgent)) { - const permissionName = "clipboard-write" as PermissionName; - const permissionStatus = await navigator.permissions.query({ name: permissionName }); - if (permissionStatus.state === "granted") { - await navigator.clipboard.writeText(this.#prompterTextElement.innerText) - } - } else { - await navigator.clipboard.writeText(this.#prompterTextElement.innerText) - } - } - this.internalEvent.emitNotif({ message, timeout: 1500 }) - } catch (err) { - this.#logger.error("onClickCopy", { err }) - this.internalEvent.emitError(err as Error) - } - } - - #onClickDelete = (evt: Event) => { - this.#logger.info("onClickDelete", { evt }) - evt.preventDefault() - evt.stopPropagation() - this.internalEvent.emitClear() - this.#closeMenu() - } - - #onClickCandidate = (evt: Event) => { - this.#logger.info("onClickCandidate", { evt }) - evt.preventDefault() - evt.stopPropagation() - const target = evt.target as HTMLElement - const candidate = target.innerText - if (this.jiix && candidate !== this.wordToChange?.label && this.wordToChange?.candidates?.includes(candidate)) { - this.jiix.words[parseInt(this.wordToChange?.id as string)].label = candidate - this.internalEvent.emitImportJIIX(this.jiix) - } - this.#candidatesElement.style.display = "none" - } - - #onClickPrompter = (evt: Event): void => { - this.#logger.info("onClickPrompter", { evt }) - evt.preventDefault() - evt.stopPropagation() - this.#closeMenu() - const target = evt.target as HTMLElement - if (target.id !== this.#prompterTextElement.id) { - this.#showCandidates(target) - } else { - this.#hideCandidates() - } - - } - - #onClickOutSide = () => { - this.#hideCandidates() - this.#closeMenu() - } - - #addListeners(): void { - this.#ellipsisElement.addEventListener("pointerdown", this.#onClickEllipsis.bind(this)) - this.#convertElement.addEventListener("pointerdown", this.#onClickConvert.bind(this)) - this.#copyElement.addEventListener("pointerdown", this.#onClickCopy.bind(this)) - this.#deleteElement.addEventListener("pointerdown", this.#onClickDelete.bind(this)) - this.#prompterTextElement.addEventListener("pointerdown", this.#onClickPrompter.bind(this)) - this.#candidatesElement.addEventListener("pointerdown", this.#onClickCandidate.bind(this)) - document.addEventListener("pointerdown", this.#onClickOutSide.bind(this)) - } - - #removeListeners(): void { - this.#ellipsisElement.removeEventListener("pointerdown", this.#onClickEllipsis) - this.#convertElement.removeEventListener("pointerdown", this.#onClickConvert) - this.#copyElement.removeEventListener("pointerdown", this.#onClickCopy) - this.#deleteElement.removeEventListener("pointerdown", this.#onClickDelete) - this.#prompterTextElement.removeEventListener("pointerdown", this.#onClickPrompter) - this.#candidatesElement.removeEventListener("pointerdown", this.#onClickCandidate) - document.removeEventListener("pointerdown", this.#onClickOutSide) - } - - resize(): void { - this.#logger.info("resize") - const mmToPixels = 3.779527559 - const marginTop = this.margin.top * mmToPixels - const marginLeft = this.margin.left * mmToPixels - const marginRight = this.margin.right * mmToPixels - // 12 is the space between line in mm - const top = marginTop - (12 * mmToPixels) - - this.#smartGuideElement.style.top = `${top}px` - this.#smartGuideElement.style.left = `${marginLeft}px` - this.#smartGuideElement.style.right = `${marginRight}px` - - let left = this.#tagElement.offsetWidth - this.#prompterContainerElement.style.marginLeft = `${left}px` - this.#prompterContainerElement.style.width = `${this.#smartGuideElement.clientWidth - this.#tagElement.offsetWidth - this.#ellipsisElement.offsetHeight}px` - left += this.#prompterContainerElement.offsetWidth - this.#menuElement.style.left = `${left - this.#menuElement.offsetWidth + this.#ellipsisElement.offsetWidth}px` - this.#menuElement.style.top = `${this.#ellipsisElement.offsetHeight}px` - this.#ellipsisElement.style.left = `${left}px` - } - - update(exports: TJIIXExport): void { - this.#logger.info("update", { exports }) - this.jiix = exports - const createWordSpan = (index: number, word?: TWordExport) => { - const span = document.createElement("span") - span.id = `word-${index}${this.uuid}` - if (word) { - span.textContent = word.label - } else { - span.innerHTML = " " - } - this.#logger.debug("update", { span }) - return span - } - - const populatePrompter = () => { - this.#logger.info("populatePrompter", { }) - this.#prompterTextElement.innerHTML = "" - if (this.jiix?.words) { - const words = this.jiix.words as TWordExport[] - const myFragment = document.createDocumentFragment() - words.forEach((word, index) => { - if (word.label === " " || word.label.includes("\n")) { - myFragment.appendChild(createWordSpan(index)) - } else if (index !== words.length - 1) { - myFragment.appendChild(createWordSpan(index, word)) - } else { - this.#prompterTextElement.appendChild(myFragment) - if (this.lastWord) { - this.lastWord = word - } - const span = createWordSpan(index, word) - // This is used to scroll to last word if last word is modified - - if ((this.lastWord?.candidates !== word.candidates) && (this.lastWord?.label !== word.label)) { - this.lastWord = word - } - if(this.wordToChange?.id === index.toString()) - { - span.classList.add("modified-word") - this.wordToChange = undefined - } - else - { - span.classList.add("added-word") - } - this.#prompterTextElement.appendChild(span) - this.#prompterContainerElement.scrollLeft = span.offsetLeft - this.#logger.debug("update => populatePrompter", { span }) - this.#logger.debug("update => populatePrompter", this.lastWord) - } - }) - } - } - populatePrompter() - if (this.jiix?.words?.length) { - this.#show() - } - } - - clear(): void { - this.#logger.info("clear") - this.#prompterTextElement.innerHTML = "" - this.#candidatesElement.innerHTML = "" - this.#hide() - } - - destroy(): void { - this.#logger.info("destroy") - this.#removeListeners() - this.#smartGuideElement.remove() - } -} diff --git a/src/style/DefaultPenStyle.ts b/src/style/DefaultPenStyle.ts deleted file mode 100644 index d6b60dc49..000000000 --- a/src/style/DefaultPenStyle.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { TPenStyle } from "../@types/style/PenStyle" - -export const DefaultPenStyle: TPenStyle = {} \ No newline at end of file diff --git a/src/style/DefaultTheme.ts b/src/style/DefaultTheme.ts deleted file mode 100644 index 6dedb4401..000000000 --- a/src/style/DefaultTheme.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { TTheme } from "../@types/style/Theme" - -export const DefaultTheme: TTheme = { - ink: { - color: "#000000", - width: 1, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - }, - ".math": { - "font-family": "STIXGeneral" - }, - ".math-solved": { - "font-family": "STIXGeneral", - color: "#A8A8A8FF" - }, - ".text": { - "font-family": "MyScriptInter", - "font-size": 10 - } -} diff --git a/src/style/StyleHelper.ts b/src/style/StyleHelper.ts deleted file mode 100644 index 39ce56c4b..000000000 --- a/src/style/StyleHelper.ts +++ /dev/null @@ -1,51 +0,0 @@ -import JsonCSS from "json-css" -import { TPenStyle } from "../@types/style/PenStyle" -import { TTheme } from "../@types/style/Theme" - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const parser: any = new JsonCSS() - -export const StyleHelper = { - themeToCSS(json: TTheme): string - { - return parser.toCSS(json) as string - // css = css.replace( /[\r\n]+/gm, "" ) - // return css - }, - themeToJSON(style: string): TTheme - { - const theme = parser.toJSON(style) as TTheme - theme[".text"]["font-size"] = Number(theme[".text"]["font-size"]) - theme.ink["-myscript-pen-width"] = Number(theme.ink["-myscript-pen-width"]) - theme.ink.width = Number(theme.ink.width) - return theme - }, - penStyleToCSS (penStyle: TPenStyle): string { - let css = parser.toCSS({ css: penStyle }) as string - css = css.substring(6, css.length - 3) - return css - }, - penStyleToJSON (penStyleString: string): TPenStyle { - const penStyle = parser.toJSON(`css {${penStyleString}}`).css as TPenStyle - if (penStyle.width) { - penStyle.width = Number(penStyle.width) - } else { - delete penStyle.width - } - if (penStyle["-myscript-pen-width"]) { - penStyle["-myscript-pen-width"] = Number(penStyle["-myscript-pen-width"]) - } else { - delete penStyle["-myscript-pen-width"] - } - return penStyle - }, - - stringToJSON(style: string): {[key: string]: string} - { - return parser.toJSON(`css {${style}}`).css - }, - JSONToString(style: {[key: string]: string}): string - { - return Object.entries(style).map(([k, v]) => `${k}:${v}`).join(";") - } -} diff --git a/src/style/StyleManager.ts b/src/style/StyleManager.ts deleted file mode 100644 index 8061ce433..000000000 --- a/src/style/StyleManager.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { TTheme } from "../@types/style/Theme" -import { TPenStyle } from "../@types/style/PenStyle" - -import { mergeDeep } from "../utils/MergeHelper" - -import { DefaultPenStyle } from "./DefaultPenStyle" -import { DefaultTheme } from "./DefaultTheme" -import { LoggerManager } from "../logger" -import { LoggerClass } from "../Constants" - -export class StyleManager -{ - #penStyle!: TPenStyle - #theme!: TTheme - #penStyleClasses!: string - #currentPenStyle!: TPenStyle - #logger = LoggerManager.getLogger(LoggerClass.STYLEMANAGER) - - constructor(penStyle?: TPenStyle, theme?: TTheme) - { - this.#logger.info("constructor", { penStyle, theme }) - this.setTheme(theme) - this.setPenStyleClasses() - this.setPenStyle(penStyle) - } - - get currentPenStyle(): TPenStyle - { - return this.#currentPenStyle || this.#penStyle - } - - get penStyle(): TPenStyle - { - return this.#penStyle - } - setPenStyle(style?: TPenStyle) - { - this.#logger.info("setPenStyle", { style }) - this.#penStyle = mergeDeep(structuredClone(DefaultPenStyle), style || {}) as TPenStyle - this.#currentPenStyle = style || (this.theme[`.${ this.#penStyleClasses }`]) as TPenStyle - this.#logger.debug("setPenStyle", this.#currentPenStyle) - } - - get theme(): TTheme - { - return this.#theme - } - setTheme(theme?: TTheme) - { - this.#logger.info("setTheme", { theme }) - this.#theme = mergeDeep(structuredClone(DefaultTheme), theme || {}) as TTheme - this.#logger.debug("setTheme", this.#theme) - } - - get penStyleClasses(): string - { - return this.#penStyleClasses - } - setPenStyleClasses(penStyleClass = "") - { - this.#logger.info("setPenStyleClasses", { penStyleClass }) - this.#penStyleClasses = penStyleClass - this.#currentPenStyle = (this.theme[`.${ this.#penStyleClasses }`]) as TPenStyle - this.#logger.debug("setPenStyleClasses", this.#currentPenStyle) - } - -} diff --git a/src/style/index.ts b/src/style/index.ts deleted file mode 100644 index 151f2b336..000000000 --- a/src/style/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { DefaultPenStyle } from "./DefaultPenStyle" -export { DefaultTheme } from "./DefaultTheme" -export { StyleHelper } from "./StyleHelper" -export { StyleManager } from "./StyleManager" diff --git a/src/undo-redo/UndoRedoContext.ts b/src/undo-redo/UndoRedoContext.ts deleted file mode 100644 index 82b54c84f..000000000 --- a/src/undo-redo/UndoRedoContext.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { IModel } from "../@types/model/Model" -import { TUndoRedoContext } from "../@types/undo-redo/UndoRedoContext" - -export class UndoRedoContext implements TUndoRedoContext -{ - canUndo: boolean - canRedo: boolean - empty: boolean - stackIndex: number - possibleUndoCount: number - stack: IModel[] - - constructor(model: IModel) - { - this.stackIndex = 0 - this.possibleUndoCount = 0 - this.canRedo = false - this.canUndo = false - this.empty = true - this.stack = [model.getClone()] - } -} diff --git a/src/undo-redo/UndoRedoManager.ts b/src/undo-redo/UndoRedoManager.ts deleted file mode 100644 index 6eb5a731b..000000000 --- a/src/undo-redo/UndoRedoManager.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { TUndoRedoConfiguration } from "../@types/configuration/UndoRedoConfiguration" -import { IModel } from "../@types/model/Model" -import { InternalEvent } from "../event/InternalEvent" -import { UndoRedoContext } from "./UndoRedoContext" -import { LoggerManager } from "../logger" -import { LoggerClass } from "../Constants" - -export class UndoRedoManager -{ - context: UndoRedoContext - configuration: TUndoRedoConfiguration - #logger = LoggerManager.getLogger(LoggerClass.UNDOREDO_MANAGER) - - constructor(configuration: TUndoRedoConfiguration, model: IModel) - { - this.#logger.info("constructor", { configuration, model }) - this.configuration = configuration - this.context = new UndoRedoContext(model) - } - - get internalEvent(): InternalEvent - { - return InternalEvent.getInstance() - } - - private updateCanUndoRedo(): void - { - this.context.canRedo = this.context.stack.length - 1 > this.context.stackIndex - this.context.canUndo = this.context.stackIndex > 0 - const currentModel = this.context.stack[this.context.stackIndex] - this.context.empty = currentModel.rawStrokes.length === 0 - } - - addModelToStack(model: IModel): void - { - this.#logger.info("addModelToStack", { model }) - if (this.context.stackIndex + 1 < this.context.stack.length) { - this.context.stack.splice(this.context.stackIndex + 1) - } - - this.context.stack.push(model.getClone()) - this.context.stackIndex = this.context.stack.length - 1 - - if (this.context.stack.length > this.configuration.maxStackSize) { - this.context.stack.shift() - this.context.stackIndex-- - } - - this.updateCanUndoRedo() - this.internalEvent.emitContextChange(this.context) - } - - removeLastModelInStack(): void - { - this.#logger.info("removeLastModelInStack") - if (this.context.stackIndex === this.context.stack.length - 1) { - this.context.stackIndex-- - } - this.context.stack.pop() - this.updateCanUndoRedo() - } - - updateModelInStack(model: IModel): void - { - this.#logger.info("updateModelInStack", { model }) - const index = this.context.stack.findIndex(m => m.modificationDate === model.modificationDate) - if (index > -1) { - this.context.stack.splice(index, 1, model.getClone()) - } - this.internalEvent.emitContextChange(this.context) - } - - undo(): IModel - { - this.#logger.info("undo") - if (this.context.canUndo) { - this.context.stackIndex-- - this.updateCanUndoRedo() - this.internalEvent.emitContextChange(this.context) - } - const previousModel = this.context.stack[this.context.stackIndex].getClone() - this.#logger.debug("undo", previousModel) - return previousModel - } - - redo(): IModel - { - this.#logger.info("redo") - if (this.context.canRedo) { - this.context.stackIndex++ - this.updateCanUndoRedo() - this.internalEvent.emitContextChange(this.context) - } - const nextModel = this.context.stack[this.context.stackIndex].getClone() - this.#logger.debug("redo", nextModel) - return nextModel - } - - reset(model: IModel): void - { - this.#logger.info("reset", { model }) - this.context = new UndoRedoContext(model) - this.internalEvent.emitContextChange(this.context) - } - -} diff --git a/src/undo-redo/index.ts b/src/undo-redo/index.ts deleted file mode 100644 index 407c8949a..000000000 --- a/src/undo-redo/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { UndoRedoContext } from "./UndoRedoContext" -export { UndoRedoManager } from "./UndoRedoManager" diff --git a/src/utils/CryptoHelper.ts b/src/utils/CryptoHelper.ts deleted file mode 100644 index 2847de7ca..000000000 --- a/src/utils/CryptoHelper.ts +++ /dev/null @@ -1,7 +0,0 @@ -import Hex from "crypto-js/enc-hex" -import HmacSHA512 from "crypto-js/hmac-sha512" - -export function computeHmac (message: string, applicationKey: string, hmacKey: string): string { - const hmac = new HmacSHA512(message, applicationKey + hmacKey) - return hmac.toString(Hex) as string -} diff --git a/src/utils/DeferredPromise.ts b/src/utils/DeferredPromise.ts deleted file mode 100644 index 86c0afd59..000000000 --- a/src/utils/DeferredPromise.ts +++ /dev/null @@ -1,32 +0,0 @@ - -export class DeferredPromise { - promise: Promise - resolve!: (value: T) => void - reject!: (value: Error) => void - - isFullFilled: boolean - isPending: boolean - - - constructor() - { - this.isFullFilled = false - this.isPending = true - - this.promise = new Promise((resolve, reject) => - { - this.reject = async (v: unknown) => - { - this.isFullFilled = true - this.isPending = false - return reject(v) - } - this.resolve = async (v: unknown) => - { - this.isFullFilled = true - this.isPending = false - return resolve(v as T) - } - }) - } -} diff --git a/src/utils/MergeHelper.ts b/src/utils/MergeHelper.ts deleted file mode 100644 index d884ac3e1..000000000 --- a/src/utils/MergeHelper.ts +++ /dev/null @@ -1,26 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export const mergeDeep = (target: any, ...sources: any[]): any => - { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const isObject = (item: any) => - { - return (item && typeof item === "object" && !Array.isArray(item)) - } - if (!sources.length) return target - const source = sources.shift() - - if (isObject(target) && isObject(source)) { - for (const key in source) { - if (isObject(source[key])) { - if (!target[key]) { - Object.assign(target, { [key]: {} }) - } - mergeDeep(target[key], source[key]) - } else { - Object.assign(target, { [key]: source[key] }) - } - } - } - - return mergeDeep(target, ...sources) - } diff --git a/src/utils/font.ts b/src/utils/font.ts deleted file mode 100644 index c75d5eebd..000000000 --- a/src/utils/font.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { TConfigurationClient } from "../@types/configuration" - -export async function getAvailableFontList(configuration: TConfigurationClient): Promise> -{ - if (!configuration?.server?.scheme && !configuration?.server?.host) { - return Promise.reject("Failed to get fonts: configuration.server.scheme & configuration.server.host are required!") - } - if (!configuration?.recognition?.lang) { - return Promise.reject("Failed to get fonts: configuration.recognition.lang is required!") - } - const serverConfig = configuration.server - const response = await fetch(`${ serverConfig.scheme }://${ serverConfig.host }/api/v4.0/iink/font/google/language/` + configuration.recognition.lang) - const { result } = await response.json() - return result.sort() -} diff --git a/src/utils/geometric.ts b/src/utils/geometric.ts deleted file mode 100644 index c0911494b..000000000 --- a/src/utils/geometric.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { TPoint } from "../@types/geometry" - -export function computeDistance(p1: TPoint, p2: TPoint): number -{ - const distance = Math.hypot(p2.y - p1.y, p2.x - p1.x) - return isNaN(distance) ? 0 : distance -} diff --git a/src/utils/index.ts b/src/utils/index.ts deleted file mode 100644 index 4f47fee3e..000000000 --- a/src/utils/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { DeferredPromise } from "./DeferredPromise" -export * as geometric from "./geometric" -export * as version from "./version" -export * as crypto from "../utils/CryptoHelper" -export { getAvailableFontList } from "./font" -export { getAvailableLanguageList } from "./language" diff --git a/src/utils/language.ts b/src/utils/language.ts deleted file mode 100644 index 0b9aad3e3..000000000 --- a/src/utils/language.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { TConfigurationClient } from "../@types/configuration" - -export async function getAvailableLanguageList(configuration: TConfigurationClient): Promise>> -{ - if (configuration?.server?.scheme && configuration?.server?.host) { - const serverConfig = configuration.server - const response = await fetch(`${ serverConfig.scheme }://${ serverConfig.host }/api/v4.0/iink/availableLanguageList`) - return response.json() - } else { - return Promise.reject("Failed to get languages: configuration.server.scheme & configuration.server.host are required!") - } -} diff --git a/src/utils/version.ts b/src/utils/version.ts deleted file mode 100644 index 8e97eb7fa..000000000 --- a/src/utils/version.ts +++ /dev/null @@ -1,14 +0,0 @@ - -export const isVersionSuperiorOrEqual = (source: string, target: string): boolean => -{ - const sourceParts = source.split(".") - const targetParts = target.split(".") - - for (let i = 0; i < targetParts.length; i++) { - const a = Number(targetParts[i]) - const b = Number(sourceParts[i]) - if (a > b) return false - if (a < b) return true - } - return true -} diff --git a/test/.eslintrc.js b/test/.eslintrc.js deleted file mode 100644 index 2c4bdaf9d..000000000 --- a/test/.eslintrc.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = { - globals: { - browser: true, - page: true, - expect: true - }, - extends: [ - 'standard' - ], - parserOptions: { - ecmaVersion: 2018, - sourceType: 'module' - } -} diff --git a/test/integration/01-home/home.test.js b/test/integration/01-home/home.test.js deleted file mode 100644 index cf5348689..000000000 --- a/test/integration/01-home/home.test.js +++ /dev/null @@ -1,90 +0,0 @@ -describe('Home Page', () => -{ - beforeAll(async () => { - await page.goto('/examples/index.html') - }) - - test('should have title', async () => - { - const title = await page.title() - expect(title).toMatch('iinkTS: Examples') - }) - - test('should display table of content', async () => - { - const tableOfContent = await page.locator('#table-of-content') - expect(await tableOfContent.isVisible()).toBe(true) - }) - - test('each table of contents link must be associated with a section part', async () => - { - const links = await page.locator('#table-of-content li') - const sectionParts = await page.locator('.title') - const linksCount = await links.count() - const secctionPartsCount = await sectionParts.count() - expect(linksCount).toBe(secctionPartsCount) - - for (let i = 0; i < linksCount; i++) { - const linkHref = await links.nth(i).locator('a').getAttribute('href') - const sectionPartName = await sectionParts.nth(i).getAttribute('name') - expect(linkHref).toBe('#' + sectionPartName) - } - }) - - test('each example-item should have 2 links', async () => - { - const exampleItems = await page.locator('.example-item') - - for (let i = 0; i < await exampleItems.count(); i++) { - const exampleItemsTitle = await exampleItems.nth(i).locator('p strong').textContent() - expect(exampleItemsTitle).toBeDefined() - - const links = await exampleItems.nth(i).locator('a') - expect(await links.count()).toBe(2) - - const exampleLink = links.nth(0) - const codeLink = links.nth(1) - - const exampleLinkText = await exampleLink.allInnerTexts() - expect(exampleLinkText.length).toBe(1) - expect(exampleLinkText[0].trim()).toBe('View example') - - const codeLinkText = await codeLink.allInnerTexts() - expect(codeLinkText.length).toBe(1) - expect(codeLinkText[0].trim()).toBe('Get source code') - expect(await codeLink.getAttribute('href')).toContain('https://github.com/MyScript') - } - }) - - test('each "View example" link should ok', async () => - { - const exampleLink = await page.locator('text=View example') - const linksInErrors = [] - for (let i = 0; i < await exampleLink.count(); i++) { - const link = exampleLink.nth(i) - const href = await link.getAttribute('href') - - const [response] = await Promise.all([ - page.waitForResponse((response) => response.url().includes(href)), - link.click() - ]) - await page.waitForLoadState("networkidle") - - if (response.status() >= 400) { - linksInErrors.push(href) - } - await page.goBack() - } - expect(linksInErrors).toStrictEqual([]) - }) - test('each "Get source code" link should ok', async () => - { - const codeLinks = await page.locator('text=Get source code') - const exampleLinks = await page.locator('text=View example') - for(let i = 0; i < await exampleLinks.count(); i++) { - const exampleHref = await exampleLinks.nth(i).getAttribute('href') - const linkHref = await codeLinks.nth(i).getAttribute("href") - expect(linkHref).toEqual(`https://github.com/MyScript/iinkTS/blob/master/examples/${exampleHref}`) - } - }) -}) diff --git a/test/integration/02-rest/rest-diagram.test.js b/test/integration/02-rest/rest-diagram.test.js deleted file mode 100644 index b690a3158..000000000 --- a/test/integration/02-rest/rest-diagram.test.js +++ /dev/null @@ -1,166 +0,0 @@ -const { - waitForEditorRest, - write, - getDatasFromExportedEvent, - setEditorConfiguration, - getEditorConfiguration, - getExportsFromEditorModel, -} = require('../helper') -const { rectangle, line } = require('../strokesDatas') - -describe('Rest Diagram', () => { - - beforeAll(async () => { - await page.goto('/examples/rest/rest_diagram_iink.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorRest(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Rest Diagram') - }) - - test('should display application/vnd.myscript.jiix into result', async () => { - const [lineExportedDatas] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [rectangle.strokes[0]]), - ]) - const lineResultText = await page.locator('#result').textContent() - const lineResultJson = JSON.parse(lineResultText) - expect(lineResultJson).toEqual(lineExportedDatas) - expect(lineExportedDatas['application/vnd.myscript.jiix']).toMatchObject(rectangle.exports[0]['application/vnd.myscript.jiix']) - - const [rectExportedDatas] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [rectangle.strokes[1]]), - ]) - const rectResultText = await page.locator('#result').textContent() - const rectResultJson = JSON.parse(rectResultText) - expect(rectResultJson).toEqual(rectExportedDatas) - expect(rectExportedDatas['application/vnd.myscript.jiix']).toMatchObject(rectangle.exports[1]['application/vnd.myscript.jiix']) - }) - - describe('Request sent', () => { - let mimeTypeRequest = [] - const countMimeType = async (request) => { - if ( - request.url().includes('api/v4.0/iink/batch') && - request.method() === 'POST' - ) { - const headers = await request.allHeaders() - mimeTypeRequest.push(headers.accept) - } - } - - beforeEach(async () => { - page.on('request', countMimeType) - mimeTypeRequest = [] - }) - - afterEach(async () => { - await page.removeListener('request', countMimeType) - }) - - test('should only request application/vnd.myscript.jiix by default', async () => { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, line.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(1) - expect(mimeTypeRequest[0]).toContain('application/vnd.myscript.jiix') - }) - - test('should only request application/vnd.openxmlformats-officedocument.presentationml.presentation', async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.diagram.mimeTypes = [ - 'application/vnd.openxmlformats-officedocument.presentationml.presentation', - ] - await setEditorConfiguration(page, configuration) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, line.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(1) - expect(mimeTypeRequest[0]).toContain('application/vnd.openxmlformats-officedocument.presentationml.presentation') - }) - - test('should request application/vnd.myscript.jiix & application/vnd.openxmlformats-officedocument.presentationml.presentation', async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.diagram.mimeTypes = [ - 'application/vnd.myscript.jiix', - 'application/vnd.openxmlformats-officedocument.presentationml.presentation', - ] - await setEditorConfiguration(page, configuration) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, line.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(2) - const allMimeTypesRequested = mimeTypeRequest.join(' ') - expect(allMimeTypesRequested).toContain('application/vnd.myscript.jiix') - expect(allMimeTypesRequested).toContain('application/vnd.openxmlformats-officedocument.presentationml.presentation') - }) - }) - - describe('Nav actions', () => { - test('should clear', async () => { - const [exportedDatas] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, line.strokes), - ]) - const resultText = await page.locator('#result').textContent() - const rectResultJson = JSON.parse(resultText) - expect(exportedDatas['application/vnd.myscript.jiix']).toEqual(rectResultJson['application/vnd.myscript.jiix']) - expect(rectResultJson['application/vnd.myscript.jiix']).toMatchObject(line.exports[0]['application/vnd.myscript.jiix']) - - expect(await getExportsFromEditorModel(page)).toBeDefined() - - const promisesResult = await Promise.all([ - getDatasFromExportedEvent(page), - page.click('#clear'), - ]) - expect(promisesResult[0]).toBeNull() - expect(await getExportsFromEditorModel(page)).toBeNull() - - expect(await page.locator('#result').textContent()).toBe('{}') - }) - - test('should undo/redo', async () => { - const editorEl = await page.waitForSelector('#editor') - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [rectangle.strokes[0]]) - ]) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [rectangle.strokes[1]]) - ]) - let resultText = await page.locator('#result').textContent() - let rectResultJson = JSON.parse(resultText) - expect(rectResultJson['application/vnd.myscript.jiix']).toMatchObject(rectangle.exports.at(-1)['application/vnd.myscript.jiix']) - - let raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toEqual(rectangle.strokes.length) - - await Promise.all([getDatasFromExportedEvent(page), page.click('#undo')]) - resultText = await page.locator('#result').textContent() - rectResultJson = JSON.parse(resultText) - expect(rectResultJson['application/vnd.myscript.jiix']).toMatchObject(rectangle.exports.at(-2)['application/vnd.myscript.jiix']) - - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toEqual(rectangle.strokes.length - 1) - - await Promise.all([getDatasFromExportedEvent(page), page.click('#redo')]) - resultText = await page.locator('#result').textContent() - rectResultJson = JSON.parse(resultText) - expect(rectResultJson['application/vnd.myscript.jiix']).toMatchObject(rectangle.exports.at(-1)['application/vnd.myscript.jiix']) - - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toEqual(rectangle.strokes.length) - }) - }) -}) diff --git a/test/integration/02-rest/rest-math.test.js b/test/integration/02-rest/rest-math.test.js deleted file mode 100644 index 06577dbca..000000000 --- a/test/integration/02-rest/rest-math.test.js +++ /dev/null @@ -1,149 +0,0 @@ -const { - waitForEditorRest, - write, - getDatasFromExportedEvent, - setEditorConfiguration, - getEditorConfiguration, - getExportsFromEditorModel, - getExportsTypeFromEditorModel, - waitEditorIdle, - writePointers, -} = require('../helper') -const { equation1, one } = require('../strokesDatas') - -describe('Rest Math', () => { - - beforeAll(async () => { - await page.goto('/examples/rest/rest_math_iink.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorRest(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Rest Math') - }) - - test('should display katex-html into result', async () => { - let exportedDatas - for (let s of equation1.strokes) { - [exportedDatas] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [s]), - ]) - } - - const resultElement = page.locator('#result') - const htmlKatexResult = await resultElement.locator('.katex-html').textContent() - - const modelExports = await getExportsFromEditorModel(page) - expect(exportedDatas['application/x-latex']).toStrictEqual(equation1.exports.LATEX.at(-1)) - expect(modelExports['application/x-latex']).toStrictEqual(equation1.exports.LATEX.at(-1)) - expect(htmlKatexResult).toStrictEqual(equation1.exports.LATEX.at(-1)) - }) - - describe('Request sent', () => { - let mimeTypeRequest = [] - const countMimeType = async (request) => { - if ( - request.url().includes('api/v4.0/iink/batch') && - request.method() === 'POST' - ) { - const headers = await request.allHeaders() - mimeTypeRequest.push(headers.accept) - } - } - - beforeEach(async () => { - page.on('request', countMimeType) - mimeTypeRequest = [] - }) - - afterEach(async () => { - await page.removeListener('request', countMimeType) - }) - - test('should only request application/x-latex by default', async () => { - await Promise.all([ - getDatasFromExportedEvent(page), - writePointers(page, one.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(1) - expect(mimeTypeRequest[0]).toContain('application/x-latex') - }) - - test('should only request application/mathml+xml', async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.math.mimeTypes = ['application/mathml+xml'] - await setEditorConfiguration(page, configuration) - - await Promise.all([ - getDatasFromExportedEvent(page), - writePointers(page, one.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(1) - expect(mimeTypeRequest[0]).toContain('application/mathml+xml') - }) - - test('should request application/mathml+xml & application/x-latex', async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.math.mimeTypes = [ - 'application/mathml+xml', - 'application/x-latex', - ] - await setEditorConfiguration(page, configuration) - - await Promise.all([ - getDatasFromExportedEvent(page), - writePointers(page, one.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(2) - const allMimeTypesRequested = mimeTypeRequest.join(' ') - expect(allMimeTypesRequested).toContain('application/mathml+xml') - expect(allMimeTypesRequested).toContain('application/x-latex') - }) - }) - - describe('Nav actions', () => { - test('should clear', async () => { - const [exportedDatas] = await Promise.all([ - getDatasFromExportedEvent(page), - writePointers(page, one.strokes) - ]) - - expect(exportedDatas['application/x-latex']).toStrictEqual(one.exports.LATEX.at(-1)) - - const promisesResult = await Promise.all([ - getDatasFromExportedEvent(page), - page.click('#clear'), - ]) - expect(promisesResult[0]).toBeNull() - - const resultElement = page.locator('#result') - const resultText = await resultElement.textContent() - expect(resultText).toBe('') - }) - - test('should undo/redo', async () => { - const editorEl = await page.waitForSelector('#editor') - - await write(page, equation1.strokes) - await waitEditorIdle(page) - - await Promise.all([getDatasFromExportedEvent(page), page.click('#undo')]) - let raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(equation1.strokes.length - 1) - - await Promise.all([getDatasFromExportedEvent(page), page.click('#undo')]) - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(equation1.strokes.length - 2) - - await Promise.all([getDatasFromExportedEvent(page), page.click('#redo')]) - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(equation1.strokes.length - 1) - }) - }) -}) diff --git a/test/integration/02-rest/rest-text.test.js b/test/integration/02-rest/rest-text.test.js deleted file mode 100644 index 7b35d6450..000000000 --- a/test/integration/02-rest/rest-text.test.js +++ /dev/null @@ -1,173 +0,0 @@ -const { - waitForEditorRest, - write, - getDatasFromExportedEvent, - setEditorConfiguration, - getEditorConfiguration, - waitEditorLoaded, - getExportsFromEditorModel, -} = require('../helper') -const { h, hello } = require('../strokesDatas') - -describe('Rest Text', () => { - - beforeAll(async () => { - await page.goto('/examples/rest/rest_text_iink.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorRest(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Rest Text') - }) - - test('should display text/plain into result', async () => { - const [exportedDatas] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - const resultText = await page.locator('#result').textContent() - expect(resultText).toStrictEqual(exportedDatas['text/plain']) - expect(resultText).toStrictEqual(h.exports['text/plain'].at(-1)) - }) - - describe('Request sent', () => { - let mimeTypeRequest = [] - const countMimeType = async (request) => { - if ( - request.url().includes('api/v4.0/iink/batch') && - request.method() === 'POST' - ) { - const headers = await request.allHeaders() - mimeTypeRequest.push(headers.accept) - } - } - - beforeEach(async () => { - page.on('request', countMimeType) - mimeTypeRequest = [] - }) - - afterEach(async () => { - await page.removeListener('request', countMimeType) - }) - - test('should only request text/plain by default', async () => { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(1) - expect(mimeTypeRequest[0]).toContain('text/plain') - }) - - test('should only request application/vnd.myscript.jiix', async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.text.mimeTypes = [ - 'application/vnd.myscript.jiix', - ] - await setEditorConfiguration(page, configuration) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(1) - expect(mimeTypeRequest[0]).toContain('application/vnd.myscript.jiix') - }) - - test('should request application/vnd.myscript.jiix & text/plain', async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.text.mimeTypes = [ - 'application/vnd.myscript.jiix', - 'text/plain', - ] - await setEditorConfiguration(page, configuration) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - expect(mimeTypeRequest).toHaveLength(2) - const allMimeTypesRequested = mimeTypeRequest.join(' ') - expect(allMimeTypesRequested).toContain('application/vnd.myscript.jiix') - expect(allMimeTypesRequested).toContain('text/plain') - }) - }) - - describe('Nav actions', () => { - test('should clear', async () => { - const [exportedDatas] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - const resultText = await page.locator('#result').textContent() - expect(resultText).toStrictEqual(exportedDatas['text/plain']) - expect(resultText).toStrictEqual(h.exports['text/plain'].at(-1)) - - expect(await getExportsFromEditorModel(page)).toBeDefined() - - const promisesResult = await Promise.all([ - getDatasFromExportedEvent(page), - page.click('#clear'), - ]) - expect(promisesResult[0]).toBeNull() - expect(await getExportsFromEditorModel(page)).toBeNull() - - expect(await page.locator('#result').textContent()).toBe('') - }) - - test('should undo/redo', async () => { - const editorEl = await page.waitForSelector('#editor') - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, hello.strokes) - ]) - - await page.waitForTimeout(1500) - - expect(await page.locator('#result').textContent()).toStrictEqual(hello.exports['text/plain'].at(-1)) - - let raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length) - - await Promise.all([getDatasFromExportedEvent(page), page.click('#undo')]) - expect(await page.locator('#result').textContent()).toStrictEqual(hello.exports['text/plain'].at(-2)) - - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length - 1) - - await Promise.all([getDatasFromExportedEvent(page), page.click('#undo')]) - expect(await page.locator('#result').textContent()).toStrictEqual(hello.exports['text/plain'].at(-3)) - - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length - 2) - - await Promise.all([getDatasFromExportedEvent(page), page.click('#redo')]) - expect(await page.locator('#result').textContent()).toStrictEqual(hello.exports['text/plain'].at(-2)) - - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length - 1) - }) - - test('should change language', async () => { - const [exportedDatas] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - - const resultText = await page.locator('#result').textContent() - expect(resultText).toStrictEqual(exportedDatas['text/plain']) - expect(resultText).toStrictEqual(h.exports['text/plain'].at(-1)) - - await Promise.all([ - waitEditorLoaded(page), - page.selectOption('#language', 'fr_FR'), - ]) - - expect(await page.locator('#result').textContent()).toBe('') - }) - }) -}) diff --git a/test/integration/03-websocket/websocket-export-on-demand.test.js b/test/integration/03-websocket/websocket-export-on-demand.test.js deleted file mode 100644 index 9afcd9db0..000000000 --- a/test/integration/03-websocket/websocket-export-on-demand.test.js +++ /dev/null @@ -1,31 +0,0 @@ -const { helloHowAreYou } = require('../strokesDatas') -const { waitForEditorWebSocket, waitEditorIdle, getExportsFromEditorModel, write } = require('../helper') - -describe('Websocket on-demand export', function () { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_export_on_demand.html') - await waitForEditorWebSocket(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Websocket on-demand export') - }) - - test('should not export', async () => { - await write(page, helloHowAreYou.strokes) - await waitEditorIdle(page) - const exports = await getExportsFromEditorModel(page) - expect(exports).toBeUndefined() - expect(await page.locator("#result").textContent()).toEqual("") - }) - - test('should export on click', async () => { - await page.click("#export") - await waitEditorIdle(page) - const exports = await getExportsFromEditorModel(page) - const jiix = exports['application/vnd.myscript.jiix'] - expect(jiix.label).toEqual(helloHowAreYou.exports["text/plain"].at(-1)) - expect(await page.locator("#result").textContent()).toEqual(helloHowAreYou.exports["text/plain"].at(-1)) - }) -}) diff --git a/test/integration/03-websocket/websocket-handle_errors.test.js b/test/integration/03-websocket/websocket-handle_errors.test.js deleted file mode 100644 index a96951649..000000000 --- a/test/integration/03-websocket/websocket-handle_errors.test.js +++ /dev/null @@ -1,17 +0,0 @@ - describe("Websocket Text", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_handle_errors.html") - await page.waitForSelector(".message") - }) - - test("should have title", async () => { - - const title = await page.title() - expect(title).toMatch("Handle error") - }) - - test("should have error message", async () => { - const errorMessage = await page.locator(".message.error-msg").textContent() - expect(errorMessage).toContain("Application credentials are invalid. Please check or regenerate your application key and hmackey.") - }) - }) diff --git a/test/integration/03-websocket/websocket-math-custom-resources.test.js b/test/integration/03-websocket/websocket-math-custom-resources.test.js deleted file mode 100644 index 441d70dfb..000000000 --- a/test/integration/03-websocket/websocket-math-custom-resources.test.js +++ /dev/null @@ -1,54 +0,0 @@ -const { waitForEditorWebSocket, writePointers, write, getDatasFromExportedEvent, getExportsTypeFromEditorModel, waitEditorIdle, getEditorConfiguration, setEditorConfiguration } = require("../helper") -const { sumSimple, h } = require("../strokesDatas") - -describe("Websocket Math", function () { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_math_custom_resources.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Custom resources math") - }) - - test("should only export latex by default", async () => { - for (const s of sumSimple.strokes) { - await Promise.all([getDatasFromExportedEvent(page), writePointers(page, [s], 100, 100)]) - } - const jiix = await getExportsTypeFromEditorModel(page, "application/vnd.myscript.jiix") - expect(jiix).toBeUndefined() - const latex = await getExportsTypeFromEditorModel(page, "application/x-latex") - expect(latex).toBeDefined() - const mathml = await getExportsTypeFromEditorModel(page, "application/mathml+xml") - expect(mathml).toBeUndefined() - }) - - test("should not recognize text", async () => { - await Promise.all([getDatasFromExportedEvent(page), write(page, h.strokes)]) - let resultElement = page.locator("#result") - resultText = await resultElement.textContent() - expect(resultText).not.toEqual("h") - }) - - test("should change configuration and recognize text", async () => { - - const config = await getEditorConfiguration(page) - config.recognition.math.customGrammarContent = undefined - await setEditorConfiguration(page, config) - await waitForEditorWebSocket(page) - - const [exportedDatas] = await Promise.all([getDatasFromExportedEvent(page), write(page, h.strokes)]) - let resultElement = page.locator("#result") - resultText = await resultElement.textContent() - const latexReceived = exportedDatas["application/x-latex"] - expect(resultText).toEqual("h") - }) - require("../_partials/math/nav-actions-math-undo-redo-test") - require("../_partials/math/nav-actions-math-clear-test") -}) diff --git a/test/integration/03-websocket/websocket-math-eraser.test.js b/test/integration/03-websocket/websocket-math-eraser.test.js deleted file mode 100644 index b496749cb..000000000 --- a/test/integration/03-websocket/websocket-math-eraser.test.js +++ /dev/null @@ -1,20 +0,0 @@ - -const { waitForEditorWebSocket } = require('../helper') - -describe('Websocket Math Eraser', function () { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_math_iink_eraser.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Websocket Math Eraser') - }) - require("../_partials/math/nav-actions-math-undo-redo-test") - require("../_partials/math/nav-actions-math-clear-test") -}) diff --git a/test/integration/03-websocket/websocket-math-import-jiix.test.js b/test/integration/03-websocket/websocket-math-import-jiix.test.js deleted file mode 100644 index 54fc1fdad..000000000 --- a/test/integration/03-websocket/websocket-math-import-jiix.test.js +++ /dev/null @@ -1,25 +0,0 @@ - -const { waitForEditorWebSocket, waitEditorIdle, getExportsTypeFromEditorModel, haveSameLabels } = require('../helper') - -describe('Websocket Math Import JIIX', function () { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_math_import_jiix.html') - await waitForEditorWebSocket(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Import math with JIIX') - }) - - test('should import JIIX', async () => { - await page.click('#import') - await waitEditorIdle(page) - - const jiix = await getExportsTypeFromEditorModel(page, "application/vnd.myscript.jiix") - const jiixTextToImport = await page.locator("#jiix").textContent() - const jiixToImport = JSON.parse(jiixTextToImport) - expect(haveSameLabels(jiix, jiixToImport)).toEqual(true) - }) - -}) diff --git a/test/integration/03-websocket/websocket-math-inside-page.test.js b/test/integration/03-websocket/websocket-math-inside-page.test.js deleted file mode 100644 index 66c1d60db..000000000 --- a/test/integration/03-websocket/websocket-math-inside-page.test.js +++ /dev/null @@ -1,111 +0,0 @@ -const { haveSameLabels, write, getExportsFromEditorModel, getDatasFromImportedEvent, getDatasFromExportedEvent, waitEditorIdle } = require("../helper") - -const mathContentList = [ - { - id: "eq-1", - latex: "a^{2}+b^{2}=c^{2}", - textContent: "a2+b2=c2", - strokesToWrite: [{ "pointerType": "mouse", "pointerId": 0, "x": [159, 157, 156, 154, 150, 149, 146, 143, 142, 138, 144, 149, 154, 159, 162, 166, 169, 168, 169, 169, 169, 168, 168, 168, 168], "y": [174, 177, 180, 183, 188, 191, 195, 199, 202, 205, 204, 204, 204, 204, 204, 202, 202, 205, 208, 212, 216, 219, 222, 225, 229], "t": [1689858551959, 1689858552062, 1689858552078, 1689858552094, 1689858552112, 1689858552128, 1689858552162, 1689858552194, 1689858552228, 1689858552261, 1689858552711, 1689858552727, 1689858552744, 1689858552761, 1689858552835, 1689858552877, 1689858552910, 1689858553177, 1689858553193, 1689858553227, 1689858553243, 1689858553260, 1689858553277, 1689858553431, 1689858553460], "p": [0.5, 0.81, 0.68, 0.7, 0.77, 0.68, 0.74, 0.74, 0.68, 0.74, 0.77, 0.74, 0.74, 0.74, 0.68, 0.73, 0.68, 0.68, 0.68, 0.71, 0.71, 0.68, 0.68, 0.68, 0.71] }], - latexAfterWriting: "4a^{2}+b^{2}=c^{2}" - }, - { - id: "eq-2", - latex: "c=\\sqrt{a^{2}+b^{2}}", - textContent: "c=a2+b2​", - strokesToWrite: [{ "pointerType": "mouse", "pointerId": 0, "x": [190, 190, 191, 192, 193, 195, 198, 201, 206, 211, 215, 218, 222, 224, 226, 227, 227, 227, 226, 225, 225, 222, 221, 218, 214, 210, 208, 205, 201, 198, 206, 215, 228, 238, 247, 255], "y": [194, 191, 188, 183, 180, 176, 174, 172, 171, 171, 172, 173, 175, 178, 181, 184, 187, 192, 195, 198, 201, 206, 209, 213, 217, 220, 224, 227, 230, 233, 232, 231, 231, 231, 231, 231], "t": [1689859052854, 1689859052908, 1689859052922, 1689859052956, 1689859052972, 1689859052989, 1689859053054, 1689859053092, 1689859053122, 1689859053139, 1689859053155, 1689859053189, 1689859053222, 1689859053238, 1689859053272, 1689859053289, 1689859053306, 1689859053339, 1689859053356, 1689859053372, 1689859053389, 1689859053421, 1689859053438, 1689859053472, 1689859053489, 1689859053522, 1689859053555, 1689859053589, 1689859053621, 1689859053739, 1689859053922, 1689859053938, 1689859053955, 1689859053971, 1689859053988, 1689859054005], "p": [0.5, 0.83, 0.68, 0.75, 0.68, 0.73, 0.7, 0.7, 0.75, 0.74, 0.72, 0.68, 0.73, 0.7, 0.7, 0.68, 0.68, 0.74, 0.68, 0.68, 0.68, 0.76, 0.68, 0.74, 0.76, 0.74, 0.73, 0.72, 0.74, 0.72, 0.8, 0.81, 0.64, 0.68, 0.81, 0.8] }], - latexAfterWriting: "2c=\\sqrt{a^{2}+b^{2}}" - }, - { - id: "eq-3", - latex: "a=\\sqrt{c^{2}-b^{2}}", - textContent: "a=c2−b2​", - strokesToWrite: [{ "pointerType": "mouse", "pointerId": 0, "x": [159, 157, 156, 154, 150, 149, 146, 143, 142, 138, 144, 149, 154, 159, 162, 166, 169, 168, 169, 169, 169, 168, 168, 168, 168], "y": [174, 177, 180, 183, 188, 191, 195, 199, 202, 205, 204, 204, 204, 204, 204, 202, 202, 205, 208, 212, 216, 219, 222, 225, 229], "t": [1689858551959, 1689858552062, 1689858552078, 1689858552094, 1689858552112, 1689858552128, 1689858552162, 1689858552194, 1689858552228, 1689858552261, 1689858552711, 1689858552727, 1689858552744, 1689858552761, 1689858552835, 1689858552877, 1689858552910, 1689858553177, 1689858553193, 1689858553227, 1689858553243, 1689858553260, 1689858553277, 1689858553431, 1689858553460], "p": [0.5, 0.81, 0.68, 0.7, 0.77, 0.68, 0.74, 0.74, 0.68, 0.74, 0.77, 0.74, 0.74, 0.74, 0.68, 0.73, 0.68, 0.68, 0.68, 0.71, 0.71, 0.68, 0.68, 0.68, 0.71] }], - latexAfterWriting: "4a=\\sqrt{c^{2}-b^{2}}" - }, - { - id: "eq-4", - latex: "b=\\sqrt{c^{2}-a^{2}}", - textContent: "b=c2−a2​", - strokesToWrite: [{ "pointerType": "mouse", "pointerId": 0, "x": [190, 190, 191, 192, 193, 195, 198, 201, 206, 211, 215, 218, 222, 224, 226, 227, 227, 227, 226, 225, 225, 222, 221, 218, 214, 210, 208, 205, 201, 198, 206, 215, 228, 238, 247, 255], "y": [194, 191, 188, 183, 180, 176, 174, 172, 171, 171, 172, 173, 175, 178, 181, 184, 187, 192, 195, 198, 201, 206, 209, 213, 217, 220, 224, 227, 230, 233, 232, 231, 231, 231, 231, 231], "t": [1689859052854, 1689859052908, 1689859052922, 1689859052956, 1689859052972, 1689859052989, 1689859053054, 1689859053092, 1689859053122, 1689859053139, 1689859053155, 1689859053189, 1689859053222, 1689859053238, 1689859053272, 1689859053289, 1689859053306, 1689859053339, 1689859053356, 1689859053372, 1689859053389, 1689859053421, 1689859053438, 1689859053472, 1689859053489, 1689859053522, 1689859053555, 1689859053589, 1689859053621, 1689859053739, 1689859053922, 1689859053938, 1689859053955, 1689859053971, 1689859053988, 1689859054005], "p": [0.5, 0.83, 0.68, 0.75, 0.68, 0.73, 0.7, 0.7, 0.75, 0.74, 0.72, 0.68, 0.73, 0.7, 0.7, 0.68, 0.68, 0.74, 0.68, 0.68, 0.68, 0.76, 0.68, 0.74, 0.76, 0.74, 0.73, 0.72, 0.74, 0.72, 0.8, 0.81, 0.64, 0.68, 0.81, 0.8] }], - latexAfterWriting: "2b=\\sqrt{c^{2}-a^{2}}" - }, -] - -describe("Websocket Math Inside Page", function () { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_math_inside_page.html") - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Dynamic math part inside a page") - }) - - mathContentList.forEach(async (mc) => { - describe(`Math content for ${mc.id}`, () => { - let currentExport - let currentTextContent - - beforeAll(async () => { - await page.reload({ waitUntil: 'load' }) - await waitEditorIdle(page) - }) - - test(`should open modal editor`, async () => { - await waitEditorIdle(page) - expect(await page.locator("#editor-modal").isVisible()).toEqual(false) - currentTextContent = await page.locator(`#${mc.id} .katex-html`).textContent() - expect(currentTextContent).toEqual(mc.textContent) - await Promise.all([ - getDatasFromImportedEvent(page), - page.locator(`#${ mc.id }`).click() - ]) - await waitEditorIdle(page) - expect(await page.locator("#editor-modal").isVisible()).toEqual(true) - }) - - test(`should import data-jiix`, async () => { - await waitEditorIdle(page) - currentExport = await getExportsFromEditorModel(page) - const jiixExpected = JSON.parse(await page.locator(`#${ mc.id }`).getAttribute("data-jiix")) - expect(haveSameLabels(currentExport["application/vnd.myscript.jiix"], jiixExpected)).toEqual(true) - expect(currentExport["application/x-latex"]).toEqual(mc.latex) - }) - - test(`should update equation`, async () => { - await waitEditorIdle(page) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, mc.strokesToWrite) - ]) - await waitEditorIdle(page) - currentExport = await getExportsFromEditorModel(page) - expect(currentExport['application/x-latex']).toEqual(mc.latexAfterWriting) - }) - - test(`should close modal editor`, async () => { - await waitEditorIdle(page) - await page.locator("#close").click() - expect(await page.locator("#editor-modal").isVisible()).toEqual(false) - }) - - test(`should update math content`, async () => { - await waitEditorIdle(page) - expect(await page.locator(`#${mc.id} .katex-html`).textContent()).not.toEqual(currentTextContent) - }) - - test(`should re-open modal editor with new equation`, async () => { - await waitEditorIdle(page) - await Promise.all([ - getDatasFromImportedEvent(page), - page.locator(`#${ mc.id }`).click() - ]) - await waitEditorIdle(page) - expect(await page.locator("#editor-modal").isVisible()).toEqual(true) - currentExport = await getExportsFromEditorModel(page) - expect(currentExport['application/x-latex']).toEqual(mc.latexAfterWriting) - }) - }) - }) - -}) diff --git a/test/integration/03-websocket/websocket-math.test.js b/test/integration/03-websocket/websocket-math.test.js deleted file mode 100644 index 88ddbe671..000000000 --- a/test/integration/03-websocket/websocket-math.test.js +++ /dev/null @@ -1,195 +0,0 @@ - -const { - waitForEditorWebSocket, - write, - getDatasFromExportedEvent, - getExportsTypeFromEditorModel, - getEditorConfiguration, - setEditorConfiguration, - getConversionsFromEditorModel, - getDatasFromConvertedEvent, - waitEditorIdle -} = require('../helper') -const { equation1, fence, sum } = require('../strokesDatas') - -describe('Websocket Math', function () { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_math_iink.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Websocket Math') - }) - - test('should only export latex by default', async () => { - for(const s of equation1.strokes) { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [s], 100, 100) - ]) - } - const jiix = await getExportsTypeFromEditorModel(page, 'application/vnd.myscript.jiix') - expect(jiix).toBeUndefined() - const latex = await getExportsTypeFromEditorModel(page, 'application/x-latex') - expect(latex).toBeDefined() - const mathml = await getExportsTypeFromEditorModel(page, 'application/mathml+xml') - expect(mathml).toBeUndefined() - }) - - test('should only export jiix', async () => { - const config = await getEditorConfiguration(page) - config.recognition.math.mimeTypes = ['application/vnd.myscript.jiix'] - await setEditorConfiguration(page, config) - await waitForEditorWebSocket(page) - - for(const s of equation1.strokes) { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [s], 100, 100) - ]) - } - const latex = await getExportsTypeFromEditorModel(page, 'application/x-latex') - expect(latex).toBeUndefined() - const jiix = await getExportsTypeFromEditorModel(page, 'application/vnd.myscript.jiix') - expect(jiix).toBeDefined() - const mathml = await getExportsTypeFromEditorModel(page, 'application/mathml+xml') - expect(mathml).toBeUndefined() - }) - - test('should only export mathml+xml', async () => { - const config = await getEditorConfiguration(page) - config.recognition.math.mimeTypes = ['application/mathml+xml'] - await setEditorConfiguration(page, config) - await waitForEditorWebSocket(page) - - await write(page, equation1.strokes, 100, 100) - await waitEditorIdle(page) - - const latex = await getExportsTypeFromEditorModel(page, 'application/x-latex') - expect(latex).toBeUndefined() - const jiix = await getExportsTypeFromEditorModel(page, 'application/vnd.myscript.jiix') - expect(jiix).toBeUndefined() - const mathml = await getExportsTypeFromEditorModel(page, 'application/mathml+xml') - expect(mathml).toBeDefined() - }) - - test('should export mathml with flavor "standard"', async () => { - const config = await getEditorConfiguration(page) - config.recognition.math.mimeTypes = ['application/mathml+xml'] - config.recognition.export.mathml = { flavor: 'standard' } - await setEditorConfiguration(page, config) - await waitForEditorWebSocket(page) - for(const s of fence.strokes) { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [s]) - ]) - } - const mathml = await getExportsTypeFromEditorModel(page, 'application/mathml+xml') - expect(mathml.trim().replace(/ /g, '')).toEqual(fence.exports.MATHML.STANDARD[fence.exports.MATHML.STANDARD.length - 1].trim().replace(/ /g, '')) - }) - - test('should export mathml with flavor "ms-office"', async () => { - const config = await getEditorConfiguration(page) - config.recognition.math.mimeTypes = ['application/mathml+xml'] - config.recognition.export.mathml = { flavor: 'ms-office' } - await setEditorConfiguration(page, config) - await waitForEditorWebSocket(page) - for(const s of fence.strokes) { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [s]) - ]) - } - const mathml = await getExportsTypeFromEditorModel(page, 'application/mathml+xml') - expect(mathml.trim().replace(/ /g, '')).toEqual(fence.exports.MATHML.MSOFFICE[fence.exports.MATHML.MSOFFICE.length - 1].trim().replace(/ /g, '')) - }) - - test('should convert svg path', async () => { - for(const s of equation1.strokes) { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [s], 100, 100) - ]) - } - const emptyConvert = await getConversionsFromEditorModel(page) - expect(emptyConvert).toBeUndefined() - expect(await page.locator('path').count()).toEqual(equation1.strokes.length) - - await Promise.all([ - getDatasFromConvertedEvent(page), - page.click('#convert') - ]) - - await waitEditorIdle(page) - expect(await page.locator('path').count()).toEqual(equation1.exports.LATEX.at(-1).length) - - const convert = await getConversionsFromEditorModel(page) - const latexExport = await getExportsTypeFromEditorModel(page, 'application/x-latex') - expect(convert['application/x-latex']).toEqual(latexExport) - expect(latexExport).toEqual(equation1.exports.LATEX.at(-1)) - }) - - test('should convert and solve sum by default', async () => { - const config = await getEditorConfiguration(page) - expect(config.recognition.math.solver.enable).toEqual(true) - let numStroke = 0 - for(const s of sum.strokes) { - const [exports] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [s]) - ]) - expect(exports['application/x-latex']).toEqual(sum.exports.LATEX.at(numStroke)) - numStroke++ - } - const emptyConvert = await getConversionsFromEditorModel(page) - expect(emptyConvert).toBeUndefined() - - await Promise.all([ - getDatasFromConvertedEvent(page), - page.click('#convert') - ]) - const convert = await getConversionsFromEditorModel(page) - expect(convert['application/x-latex']).toEqual(sum.converts.LATEX.at(-1)) - expect(await page.locator('#result').locator('.katex-html').textContent()).toEqual(sum.converts.LATEX.at(-1)) - }) - - test('should convert and not solve sum', async () => { - const config = await getEditorConfiguration(page) - config.recognition.math.solver.enable = false - await setEditorConfiguration(page, config) - await waitForEditorWebSocket(page) - - let numStroke = 0 - for(const s of sum.strokes) { - const [exports] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [s]) - ]) - expect(exports['application/x-latex']).toEqual(sum.exports.LATEX.at(numStroke)) - numStroke++ - } - const emptyConvert = await getConversionsFromEditorModel(page) - expect(emptyConvert).toBeUndefined() - - await Promise.all([ - getDatasFromConvertedEvent(page), - page.click('#convert') - ]) - const convert = await getConversionsFromEditorModel(page) - const latexExport = await getExportsTypeFromEditorModel(page, 'application/x-latex') - expect(convert['application/x-latex']).toEqual(latexExport) - expect(latexExport).toEqual(sum.exports.LATEX.at(-1)) - expect(await page.locator('#result').locator('.katex-html').textContent()).toEqual(sum.exports.LATEX.at(-1)) - }) - - - require("../_partials/math/nav-actions-math-undo-redo-test") -}) diff --git a/test/integration/03-websocket/websocket-text-custom-lexicon.test.js b/test/integration/03-websocket/websocket-text-custom-lexicon.test.js deleted file mode 100644 index a36ebbff3..000000000 --- a/test/integration/03-websocket/websocket-text-custom-lexicon.test.js +++ /dev/null @@ -1,41 +0,0 @@ -const { writePointers, waitForEditorWebSocket, getExportsFromEditorModel, waitEditorIdle } = require("../helper") -const { covfefe } = require("../strokesDatas") - -describe("Websocket Text Custom Lexicon", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_custom_lexicon.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Custom lexicon") - }) - - test("should not recognize 'covfefe'", async () => { - await writePointers(page, covfefe.strokes) - await waitEditorIdle(page) - const exports = await getExportsFromEditorModel(page) - const jiixReceived = exports["application/vnd.myscript.jiix"] - expect(jiixReceived.label).not.toEqual(covfefe.exports["text/plain"].at(-1)) - }) - - test("should send lexicon data with jiix", async () => { - await Promise.all([ - waitForEditorWebSocket(page), - page.locator("#lexicon").fill("covfefe"), - page.locator("#reinit").click(), - ]) - await writePointers(page, covfefe.strokes) - await waitEditorIdle(page) - const exports = await getExportsFromEditorModel(page) - const jiixReceived = exports["application/vnd.myscript.jiix"] - expect(jiixReceived.label).toEqual(covfefe.exports["text/plain"].at(-1)) - }) - require("../_partials/text/nav-actions-text-undo-redo-test") -}) diff --git a/test/integration/03-websocket/websocket-text-custom-resources.test.js b/test/integration/03-websocket/websocket-text-custom-resources.test.js deleted file mode 100644 index 933d01405..000000000 --- a/test/integration/03-websocket/websocket-text-custom-resources.test.js +++ /dev/null @@ -1,30 +0,0 @@ -const { write, getDatasFromExportedEvent, waitForEditorWebSocket, waitEditorIdle } = require("../helper") -const { abrausorus } = require("../strokesDatas") - -describe("Websocket Text Custom Resource", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_custom_resources.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Custom pre-loaded resources") - }) - - test("should export application/vnd.myscript.jiix", async () => { - const [exports] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, abrausorus.strokes), - ]) - await waitEditorIdle(page) - const jiixExpected = abrausorus.exports["application/vnd.myscript.jiix"] - const jiixReceived = exports["application/vnd.myscript.jiix"] - expect(jiixReceived.label).toEqual(jiixExpected.label) - }) - require("../_partials/text/nav-actions-text-undo-redo-test") -}) diff --git a/test/integration/03-websocket/websocket-text-customize-editor-css.test.js b/test/integration/03-websocket/websocket-text-customize-editor-css.test.js deleted file mode 100644 index e503986a4..000000000 --- a/test/integration/03-websocket/websocket-text-customize-editor-css.test.js +++ /dev/null @@ -1,19 +0,0 @@ -const { waitForEditorWebSocket } = require("../helper") - -describe("Websocket Text Custom Resource", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_customize_editor_css.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: "networkidle" }) - await waitForEditorWebSocket(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Styling editor style") - }) - - require("../_partials/text/nav-actions-text-undo-redo-test") -}) \ No newline at end of file diff --git a/test/integration/03-websocket/websocket-text-customize-stroke-style.test.js b/test/integration/03-websocket/websocket-text-customize-stroke-style.test.js deleted file mode 100644 index 79680153a..000000000 --- a/test/integration/03-websocket/websocket-text-customize-stroke-style.test.js +++ /dev/null @@ -1,113 +0,0 @@ -const { waitForEditorWebSocket, write, getDatasFromExportedEvent } = require('../helper') -const { h } = require('../strokesDatas') - -function hexToRgbA(hex) { - let c - if (/^#([A-Fa-f0-9]{3}){1,2}$/.test(hex)) { - c = hex.substring(1).split('') - if (c.length == 3) { - c = [c[0], c[0], c[1], c[1], c[2], c[2]] - } - c = '0x' + c.join('') - return ( - 'rgba(' + [(c >> 16) & 255, (c >> 8) & 255, c & 255].join(', ') + ', 1)' - ) - } - throw new Error('Bad Hex') -} - -describe('Websocket Text Customize Stroke Style', () => { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_text_customize_stroke_style.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Websocket Text Styling') - }) - - test('should draw stroke with DefaultTheme', async () => { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - const defaultThemeColor = await page.evaluate('editor.theme.ink.color') - const path = page.locator(`path[fill="${hexToRgbA(defaultThemeColor)}"]`) - expect(await path.count()).toEqual(1) - }) - - test('should draw stroke with penStyleClasses', async () => { - await page.click('#penStyleClasses') - - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - - const editorTheme = await page.evaluate('editor.theme') - const editorPenStyleClasses = await page.evaluate('editor.penStyleClasses') - const penColorExpected = editorTheme[`.${editorPenStyleClasses}`].color - const path = page.locator(`path[fill="${hexToRgbA(penColorExpected)}"]`) - expect(await path.count()).toEqual(1) - }) - - test('should draw stroke with theme', async () => { - await page.selectOption('#theme', 'bold-red'), - - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - - const editorTheme = await page.evaluate('editor.theme') - const penColorExpected = editorTheme.ink.color - const path = page.locator(`path[fill="${hexToRgbA(penColorExpected)}"]`) - expect(await path.count()).toEqual(1) - }) - - test('should draw stroke with default penStyle', async () => { - expect(await page.locator('#pencolor').isDisabled()).toEqual(true) - expect(await page.locator('#penwidth').isDisabled()).toEqual(true) - await page.setChecked('#penenabled', true) - expect(await page.locator('#pencolor').isDisabled()).toEqual(false) - expect(await page.locator('#penwidth').isDisabled()).toEqual(false) - - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - - const editorPenStyle = await page.evaluate('editor.penStyle') - const path = page.locator(`path[fill="${hexToRgbA(editorPenStyle.color)}"]`) - expect(await path.count()).toEqual(1) - - await page.setChecked('#penenabled', false) - expect(await page.locator('#pencolor').isDisabled()).toEqual(true) - expect(await page.locator('#penwidth').isDisabled()).toEqual(true) - }) - - test('should draw stroke with selected penStyle', async () => { - const penColorExpected = '#1a5fb4' - expect(await page.locator('#pencolor').isDisabled()).toEqual(true) - expect(await page.locator('#penwidth').isDisabled()).toEqual(true) - - await page.setChecked('#penenabled', true) - expect(await page.locator('#pencolor').isDisabled()).toEqual(false) - expect(await page.locator('#penwidth').isDisabled()).toEqual(false) - - await page.fill('#pencolor', penColorExpected) - - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - - const path = page.locator(`path[fill="${hexToRgbA(penColorExpected)}"]`) - expect(await path.count()).toEqual(1) - }) -}) diff --git a/test/integration/03-websocket/websocket-text-erase.test.js b/test/integration/03-websocket/websocket-text-erase.test.js deleted file mode 100644 index 20a3b0657..000000000 --- a/test/integration/03-websocket/websocket-text-erase.test.js +++ /dev/null @@ -1,75 +0,0 @@ -const { waitForEditorWebSocket, write, getDatasFromExportedEvent, waitEditorIdle } = require('../helper') -const { ponyErase, ponyErasePrecisely } = require('../strokesDatas') - -describe('Websocket Text erase', () => { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_text_iink_eraser.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Websocket Text Eraser') - }) - - test('should toggle intention writing <-> erasing', async () => { - expect(await page.locator("#pen").isDisabled()).toBe(true) - expect(await page.locator("#eraser").isDisabled()).toBe(false) - expect(await page.locator("#editor").getAttribute('class')).not.toContain('erasing') - await page.click("#eraser") - expect(await page.locator("#pen").isDisabled()).toBe(false) - expect(await page.locator("#eraser").isDisabled()).toBe(true) - expect(await page.locator("#editor").getAttribute('class')).toContain('erasing') - }) - - test('should export erase stroke', async () => { - const [ponyExports] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [ponyErase.strokes[0]]), - ]) - const ponyJiixExpected = ponyErase.exports[0]['application/vnd.myscript.jiix'] - const ponyJiixReceived = ponyExports['application/vnd.myscript.jiix'] - expect(ponyJiixReceived.label).toEqual(ponyJiixExpected.label) - - await page.click("#eraser") - - const [ponyEraseExports] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [ponyErase.strokes[1]]), - ]) - const ponyEraseJiixExpected = ponyErase.exports[1]['application/vnd.myscript.jiix'] - const ponyEraseJiixReceived = ponyEraseExports['application/vnd.myscript.jiix'] - expect(ponyEraseJiixReceived.label).toEqual(ponyEraseJiixExpected.label) - }) - - test('should export erase stroke precisely', async () => { - await Promise.all([ - waitForEditorWebSocket(page), - page.click("#erase-precisely") - ]) - await waitEditorIdle(page) - - const [ponyExports] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [ponyErasePrecisely.strokes[0]]), - ]) - const ponyJiixExpected = ponyErasePrecisely.exports[0]['application/vnd.myscript.jiix'] - const ponyJiixReceived = ponyExports['application/vnd.myscript.jiix'] - expect(ponyJiixReceived.label).toEqual(ponyJiixExpected.label) - - await page.click("#eraser") - - const [ponyEraseExports] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [ponyErasePrecisely.strokes[1]]), - ]) - const ponyEraseJiixExpected = ponyErasePrecisely.exports[1]['application/vnd.myscript.jiix'] - const ponyEraseJiixReceived = ponyEraseExports['application/vnd.myscript.jiix'] - expect(ponyEraseJiixReceived.label).toEqual(ponyEraseJiixExpected.label) - }) - require("../_partials/text/nav-actions-text-undo-redo-test") -}) diff --git a/test/integration/03-websocket/websocket-text-file-export.test.js b/test/integration/03-websocket/websocket-text-file-export.test.js deleted file mode 100644 index 99c3477f8..000000000 --- a/test/integration/03-websocket/websocket-text-file-export.test.js +++ /dev/null @@ -1,72 +0,0 @@ -const { write, getDatasFromExportedEvent, waitForEditorWebSocket, waitEditorIdle } = require("../helper") -const { hello } = require("../strokesDatas") - -describe("Websocket Text file export", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_file_export.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Word Export with iink") - }) - - test("should write and save to word file", async () => { - await waitForEditorWebSocket(page) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, hello.strokes) - ]) - const downloadPromise = page.waitForEvent('download'); - await page.locator("#exportContent").click() - const download = await downloadPromise; - expect(download.suggestedFilename()).toBe("myDocument.docx"); - }) - - test("should write and save to html file", async () => { - await waitForEditorWebSocket(page) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, hello.strokes) - ]) - const downloadPromise = page.waitForEvent('download'); - await page.selectOption('#exportType', 'html'), - await page.locator("#exportContent").click() - const download = await downloadPromise; - expect(download.suggestedFilename()).toBe("myDocument.html"); - }) - - test("should write and save to png file", async () => { - await waitForEditorWebSocket(page) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, hello.strokes) - ]) - const downloadPromise = page.waitForEvent('download'); - await page.selectOption('#exportType', 'png'), - await page.locator("#exportContent").click() - const download = await downloadPromise; - expect(download.suggestedFilename()).toBe("myDocument.png"); - }) - - test("should write and save to jpg file", async () => { - await waitForEditorWebSocket(page) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, hello.strokes) - ]) - const downloadPromise = page.waitForEvent('download'); - await page.selectOption('#exportType', 'jpeg'), - await page.locator("#exportContent").click() - const download = await downloadPromise; - expect(download.suggestedFilename()).toBe("myDocument.jpg"); - }) - require("../_partials/text/nav-actions-text-undo-redo-test") - require("../_partials/text/nav-actions-text-clear-test") -}) diff --git a/test/integration/03-websocket/websocket-text-highlight-words.test.js b/test/integration/03-websocket/websocket-text-highlight-words.test.js deleted file mode 100644 index 92b7deaa7..000000000 --- a/test/integration/03-websocket/websocket-text-highlight-words.test.js +++ /dev/null @@ -1,140 +0,0 @@ -const { waitForEditorWebSocket, write, getDatasFromExportedEvent, waitEditorIdle } = require("../helper") -const { helloOneSurrounded, helloOneStroke } = require("../strokesDatas") - -const getComputedStyle = async (locator) => { - return locator.evaluate((el) => { - const cs = window.getComputedStyle(el) - return { - color: cs.color, - backgroundColor: cs.backgroundColor - } - }) -} - -const colorMap = [ - { - id: "black-btn", - color: "rgb(0, 0, 0)" - }, - { - id: "dark-grey-btn", - color: "rgb(128, 128, 128)" - }, - { - id: "light-grey-btn", - color: "rgb(217, 217, 217)" - }, - { - id: "blue-btn", - color: "rgb(26, 140, 255)" - }, - { - id: "red-btn", - color: "rgb(255, 26, 64)" - }, - { - id: "green-btn", - color: "rgb(43, 217, 101)" - }, - { - id: "yellow-btn", - color: "rgb(255, 221, 51)" - }, - -] - -describe("Websocket Text highlight words", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_highlight_words.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Highlight words') - }) - - test('should write and isn\'t in list', async () => { - await Promise.all([ - write(page, helloOneStroke.strokes), - ]) - await waitEditorIdle(page) - expect(await page.locator("#highlight-list > li").count()).toEqual(0) - }) - - test('should write, surround and is in list', async () => { - await Promise.all([ - write(page, helloOneSurrounded.strokes), - ]) - await waitEditorIdle(page) - expect(await page.locator("#highlight-list > li").count()).toEqual(1) - const style = await getComputedStyle(page.locator("#highlight-list > li")) - expect(style.backgroundColor).toContain("rgb(128, 128, 128)") - }) - - test("should write, surround and is in list then remove from list", async () => { - expect(await page.locator("#highlight-list > li").count()).toEqual(0) - await Promise.all([ - write(page, helloOneSurrounded.strokes), - ]) - await waitEditorIdle(page) - expect(await page.locator("#highlight-list > li").count()).toEqual(1) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [helloOneSurrounded.strokes[1]]) - ]) - expect(await page.locator("#highlight-list > li").count()).toEqual(0) - }) - - for (let index = 0; index < colorMap.length; index++) { - test(`should write text in color${colorMap[index].id} and highlight them`, async () => { - const currentColor = colorMap[index] - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [helloOneSurrounded.strokes[0]]) - ]) - await page.locator(`#${currentColor.id}`).click() - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [helloOneSurrounded.strokes[1]]) - ]) - expect(await page.locator("#highlight-list > li").count()).toEqual(1) - - const style = await getComputedStyle(page.locator("#highlight-list > li")) - expect(style.backgroundColor).toContain(currentColor.color) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [helloOneSurrounded.strokes[1]]) - ]) - expect(await page.locator("#highlight-list > li").count()).toEqual(0) - }) - } - - test("should write in color and surround with another color", async () => { - const strokeColor = colorMap[4] - const highlightColor = colorMap[5] - await page.click(`#${strokeColor.id}`) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [helloOneSurrounded.strokes[0]]) - ]) - await waitEditorIdle(page) - expect(await page.locator("#highlight-list > li").count()).toEqual(0) - - await page.click(`#${highlightColor.id}`) - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, [helloOneSurrounded.strokes[1]]) - ]) - await waitEditorIdle(page) - expect(await page.locator("#highlight-list > li").count()).toEqual(1) - const style = await getComputedStyle(page.locator("#highlight-list > li")) - expect(style.backgroundColor).toContain(highlightColor.color) - expect(style.color).toContain(strokeColor.color) - }) - require("../_partials/text/nav-actions-text-undo-redo-test") -}) diff --git a/test/integration/03-websocket/websocket-text-iink-no-guides.test.js b/test/integration/03-websocket/websocket-text-iink-no-guides.test.js deleted file mode 100644 index 0f59c17b6..000000000 --- a/test/integration/03-websocket/websocket-text-iink-no-guides.test.js +++ /dev/null @@ -1,39 +0,0 @@ -const { write, getDatasFromExportedEvent, waitForEditorWebSocket } = require("../helper") -const { helloOneStroke } = require("../strokesDatas") - - describe("Websocket Text Search Without Smartguide", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_iink_no_guides.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("No guides") - }) - - test("should draw stroke hello", async () => { - const [exports] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, helloOneStroke.strokes), - ]) - - const jiixExpected = helloOneStroke.exports["application/vnd.myscript.jiix"].label - const jiixReceived = exports["application/vnd.myscript.jiix"].label - expect(jiixReceived).toStrictEqual(jiixExpected) - }) - - test("should not see guides", async () => { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, helloOneStroke.strokes), - ]) - const line = await page.locator("line").all() - expect(line.length).toEqual(0) - }) - require("../_partials/text/nav-actions-text-undo-redo-test") - }) diff --git a/test/integration/03-websocket/websocket-text-iink-search.test.js b/test/integration/03-websocket/websocket-text-iink-search.test.js deleted file mode 100644 index 4747b878c..000000000 --- a/test/integration/03-websocket/websocket-text-iink-search.test.js +++ /dev/null @@ -1,47 +0,0 @@ -const { write, getDatasFromExportedEvent, waitForEditorWebSocket } = require("../helper") -const { hello } = require("../strokesDatas") - -describe("Websocket Text search", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_iink_search.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Text search") - }) - - test("should find text", async () => { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, hello.strokes) - ]) - - const inputSearch = page.locator("#searchInput") - await Promise.all([ - inputSearch.type("hello"), - page.click("#searchBtn") - ]) - - //wait for css highlight - await page.waitForTimeout(1000) - const highlight = page.locator(".highlight") - expect(highlight).toBeDefined() - }) - - test("should failed to find", async () => { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, hello.strokes) - ]) - - page.locator("#searchInput").type("test") - await page.click("#searchBtn") - expect(await page.locator(".highlight").count()).toEqual(0) - }) -}) diff --git a/test/integration/03-websocket/websocket-text-import-content.test.js b/test/integration/03-websocket/websocket-text-import-content.test.js deleted file mode 100644 index c12f8370c..000000000 --- a/test/integration/03-websocket/websocket-text-import-content.test.js +++ /dev/null @@ -1,54 +0,0 @@ -const { waitForEditorWebSocket, write, getDatasFromExportedEvent, waitEditorIdle } = require('../helper') -const { h } = require('../strokesDatas') - -describe('Websocket Text Import Content', () => { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_text_import_content.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Import') - }) - - test('should export application/vnd.myscript.jiix', async () => { - const [exports] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - const jiixExpected = h.exports['application/vnd.myscript.jiix'] - const jiixReceived = exports['application/vnd.myscript.jiix'] - expect(jiixReceived).toEqual(jiixExpected) - }) - - test('should import text hello', async () => { - await Promise.all([ - page.locator("#importContentField").fill("hello"), - page.locator("#importContent").click(), - getDatasFromExportedEvent(page), - ]) - - const prompterText = await page.waitForSelector('.prompter-text') - const textContent = await prompterText.evaluate((node) => node.textContent) - expect(textContent).toEqual("hello") - }) - - test('should import text pony', async () => { - await Promise.all([ - page.locator("#importContentField").fill("pony"), - page.locator("#importContent").click(), - getDatasFromExportedEvent(page), - ]) - - const prompterText = await page.waitForSelector('.prompter-text') - const textContent = await prompterText.evaluate((node) => node.textContent) - expect(textContent).toEqual("pony") - }) - require("../_partials/text/nav-actions-text-undo-redo-test") -}) diff --git a/test/integration/03-websocket/websocket-text-interact.test.js b/test/integration/03-websocket/websocket-text-interact.test.js deleted file mode 100644 index 57c74a6f8..000000000 --- a/test/integration/03-websocket/websocket-text-interact.test.js +++ /dev/null @@ -1,89 +0,0 @@ -const { writePointers, getDatasFromExportedEvent, waitForEditorWebSocket, waitEditorIdle, getExportsTypeFromEditorModel } = require("../helper") -const { paris, tokyo, madrid, rome, buenosAires } = require("../strokesDatas") - - -describe("Websocket Text interact", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_interact.html") - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Interact with your app") - }) - - test(`should ask teh capital of France`, async () => { - const question = await page.locator("#question").textContent() - expect(question).toEqual("What is the capital of France?") - }) - - test(`should answer question capital of France`, async () => { - await writePointers(page, paris.strokes) - await waitEditorIdle(page) - const textExpected = paris.exports["text/plain"].at(-1) - const textReceived = await getExportsTypeFromEditorModel(page, "text/plain") - expect(textReceived).toStrictEqual(textExpected) - }) - - test(`should go next question`, async () => { - await page.locator("#next-btn").click() - await waitEditorIdle(page) - const question = await page.locator("#question").textContent() - expect(question).toContain("Italy") - }) - - test(`should answer question capital of Italy`, async () => { - await writePointers(page, rome.strokes) - await waitEditorIdle(page) - const textExpected = rome.exports["text/plain"].at(-1) - const textReceived = await getExportsTypeFromEditorModel(page, "text/plain") - expect(textReceived).toStrictEqual(textExpected) - }) - - test(`should go next question`, async () => { - await page.locator("#next-btn").click() - await waitEditorIdle(page) - const question = await page.locator("#question").textContent() - expect(question).toContain("Spain") - }) - - test(`should answer question capital of Spain`, async () => { - await writePointers(page, madrid.strokes) - await waitEditorIdle(page) - const textExpected = madrid.exports["text/plain"].at(-1) - const textReceived = await getExportsTypeFromEditorModel(page, "text/plain") - expect(textReceived).toStrictEqual(textExpected) - }) - - test(`should go next question`, async () => { - await page.locator("#next-btn").click() - await waitEditorIdle(page) - const question = await page.locator("#question").textContent() - expect(question).toContain("Argentina") - }) - - test(`should answer question capital of Argentina`, async () => { - await writePointers(page, buenosAires.strokes) - await waitEditorIdle(page) - const textExpected = buenosAires.exports["text/plain"].at(-1) - const textReceived = await getExportsTypeFromEditorModel(page, "text/plain") - expect(textReceived).toStrictEqual(textExpected) - }) - - test(`should go next question`, async () => { - await page.locator("#next-btn").click() - await waitEditorIdle(page) - const question = await page.locator("#question").textContent() - expect(question).toContain("Japan") - }) - - test(`should answer question capital of Japan`, async () => { - await writePointers(page, tokyo.strokes) - await waitEditorIdle(page) - const textExpected = tokyo.exports["text/plain"].at(-1) - const textReceived = await getExportsTypeFromEditorModel(page, "text/plain") - expect(textReceived).toStrictEqual(textExpected) - }) -}) diff --git a/test/integration/03-websocket/websocket-text-local-storage.test.js b/test/integration/03-websocket/websocket-text-local-storage.test.js deleted file mode 100644 index 4bfbbf2ae..000000000 --- a/test/integration/03-websocket/websocket-text-local-storage.test.js +++ /dev/null @@ -1,41 +0,0 @@ -const { waitForEditorWebSocket, write, getDatasFromExportedEvent, getExportsTypeFromEditorModel, waitEditorIdle } = require("../helper"); -const { helloOneStroke } = require("../strokesDatas"); - -describe("Websocket Text local storage", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_local_storage_text.html"); - }); - - beforeEach(async () => { - await page.reload({ waitUntil: "load" }); - await waitForEditorWebSocket(page); - }); - - test("should have title", async () => { - const title = await page.title(); - expect(title).toMatch("WEBSOCKET Text iink"); - }); - - test("should export text/plain", async () => { - const [exports] = await Promise.all([getDatasFromExportedEvent(page), write(page, helloOneStroke.strokes)]); - //add delay to save text in localstorage - await page.waitForTimeout(400); - const jiixExpected = helloOneStroke.exports["text/plain"][0]; - const jiixReceived = exports["text/plain"]; - await page.locator("#clear-storage").click(); - expect(jiixReceived).toStrictEqual(jiixExpected); - }); - - test("should get hello in localstorage", async () => { - await page.click("#clear-storage"); - await Promise.all([getDatasFromExportedEvent(page), write(page, helloOneStroke.strokes)]); - - await page.reload({ waitUntil: "load" }); - await waitForEditorWebSocket(page); - - const exports = await page.locator(".added-word").textContent(); - expect(exports).toEqual("hello"); - await page.click("#clear-storage"); - }); - require("../_partials/text/nav-actions-text-undo-redo-test"); -}); diff --git a/test/integration/03-websocket/websocket-text-multiple-inputs.test.js b/test/integration/03-websocket/websocket-text-multiple-inputs.test.js deleted file mode 100644 index 21e364eae..000000000 --- a/test/integration/03-websocket/websocket-text-multiple-inputs.test.js +++ /dev/null @@ -1,111 +0,0 @@ -const { waitForEditorWebSocket, writePointers, waitEditorIdle } = require('../helper') -const { centralProcessingUnit, oneThousandNineHundredAndFortyThree, oneThousandNineHundredAndNintyThree } = require('../strokesDatas') - -const switchToOtherQuestion = async (page, inputId) => { - return Promise.all([ - page.locator(`#${inputId}`).click(), - waitEditorIdle(page) - ]) -} - -const getAnswerText = async (page, answerId) => { - return (await page.locator(`#${answerId}`).textContent()).replace(/[\r\n]+/gm, " ").replace(" ", " ").toLocaleLowerCase() -} - -describe('Websocket Text Multiple Inputs', () => { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_text_multiple_inputs.html') - await waitForEditorWebSocket(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Multiple inputs') - }) - - const data0 = { - inputId: "input-0", - answerId: "answer-0", - text: centralProcessingUnit, - } - - test('should answer the first question', async () => { - await writePointers(page, data0.text.strokes) - await waitEditorIdle(page) - const answerText = await getAnswerText(page, data0.answerId) - expect(answerText).toEqual(data0.text.exports["text/plain"]) - }) - - test('should validate the first answer', async () => { - expect(await page.locator(`#${data0.answerId}`).getAttribute('class')).not.toContain('success') - await page.click("#validate-answers") - expect(await page.locator(`#${data0.answerId}`).getAttribute('class')).toContain('success') - }) - - const data1 = { - inputId: "input-1", - answerId: "answer-1", - text: oneThousandNineHundredAndFortyThree, - } - - test("should answer the second question", async () => { - await switchToOtherQuestion(page, data1.inputId) - await writePointers(page, data1.text.strokes) - await waitEditorIdle(page) - const answerText = await getAnswerText(page, data1.answerId) - expect(answerText).toEqual(data1.text.exports["text/plain"]) - }) - - test("should validate the second answer", async () => { - expect(await page.locator(`#${data1.answerId}`).getAttribute('class')).not.toContain('success') - expect(await page.locator(`#${data1.answerId}`).getAttribute('class')).toContain('error') - await page.locator("#validate-answers").click() - expect(await page.locator(`#${data1.answerId}`).getAttribute('class')).toContain('success') - expect(await page.locator(`#${data1.answerId}`).getAttribute('class')).not.toContain('error') - }) - - const data2 = { - inputId: "input-2", - answerId: "answer-2", - text: oneThousandNineHundredAndFortyThree - } - - test("should answer the second question", async () => { - await switchToOtherQuestion(page, data2.inputId) - await writePointers(page, data2.text.strokes) - await waitEditorIdle(page) - const answerText = await getAnswerText(page, data2.answerId) - expect(answerText).toEqual(data2.text.exports["text/plain"]) - }) - - test("should validate the second answer", async () => { - expect(await page.locator(`#${data2.answerId}`).getAttribute('class')).not.toContain('success') - expect(await page.locator(`#${data2.answerId}`).getAttribute('class')).toContain('error') - await page.locator("#validate-answers").click() - expect(await page.locator(`#${data2.answerId}`).getAttribute('class')).not.toContain('success') - expect(await page.locator(`#${data2.answerId}`).getAttribute('class')).toContain('error') - }) - - const data3 = { - inputId: "input-3", - answerId: "answer-3", - text: oneThousandNineHundredAndNintyThree, - } - - test("should answer the second question", async () => { - await switchToOtherQuestion(page, data3.inputId) - await writePointers(page, data3.text.strokes) - await waitEditorIdle(page) - const answerText = await getAnswerText(page, data3.answerId) - expect(answerText).toEqual(data3.text.exports["text/plain"]) - }) - - test("should validate the second answer", async () => { - expect(await page.locator(`#${data3.answerId}`).getAttribute('class')).not.toContain('success') - expect(await page.locator(`#${data3.answerId}`).getAttribute('class')).toContain('error') - await page.locator("#validate-answers").click() - expect(await page.locator(`#${data3.answerId}`).getAttribute('class')).toContain('success') - expect(await page.locator(`#${data3.answerId}`).getAttribute('class')).not.toContain('error') - }) - -}) diff --git a/test/integration/03-websocket/websocket-text-pointer-events.test.js b/test/integration/03-websocket/websocket-text-pointer-events.test.js deleted file mode 100644 index ef0f93a00..000000000 --- a/test/integration/03-websocket/websocket-text-pointer-events.test.js +++ /dev/null @@ -1,38 +0,0 @@ -const { waitForEditorWebSocket, write, getDatasFromExportedEvent, waitEditorIdle } = require('../helper') -const { h } = require('../strokesDatas') - -describe('Websocket Text Pointer Events', () => { - beforeAll(async () => { - await page.goto('/examples/websocket/websocket_text_pointer_events.html') - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test('should have title', async () => { - const title = await page.title() - expect(title).toMatch('Pointer events') - }) - - test('should export application/vnd.myscript.jiix', async () => { - const [exports] = await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - const jiixExpected = h.exports['application/vnd.myscript.jiix'] - const jiixReceived = exports['application/vnd.myscript.jiix'] - expect(jiixReceived).toEqual(jiixExpected) - }) - - test('should import points with button', async () => { - const [exports] = await Promise.all([ - getDatasFromExportedEvent(page), - page.locator('#pointerEvents').click(), - ]) - const jiixReceived = exports['application/vnd.myscript.jiix'] - expect(jiixReceived.label).toStrictEqual("A") - }) -}) diff --git a/test/integration/03-websocket/websocket-text.test.js b/test/integration/03-websocket/websocket-text.test.js deleted file mode 100644 index f2ff04f77..000000000 --- a/test/integration/03-websocket/websocket-text.test.js +++ /dev/null @@ -1,200 +0,0 @@ -const { - waitForEditorWebSocket, - write, - getDatasFromExportedEvent, - getExportsTypeFromEditorModel, - getEditorConfiguration, - setEditorConfiguration, - getConversionsFromEditorModel, - waitEditorIdle -} = require("../helper") -const { h, hello, helloOneStroke, helloStrikeStroke } = require("../strokesDatas") - -describe("Websocket Text", () => { - beforeAll(async () => { - await page.goto("/examples/websocket/websocket_text_iink.html") - }) - - beforeEach(async () => { - await page.reload({ waitUntil: 'load' }) - await waitForEditorWebSocket(page) - await waitEditorIdle(page) - }) - - test("should have title", async () => { - const title = await page.title() - expect(title).toMatch("Websocket Text") - }) - - test("should export application/vnd.myscript.jiix", async () => { - const [exports] = await Promise.all([getDatasFromExportedEvent(page), write(page, h.strokes)]) - const jiixExpected = h.exports["application/vnd.myscript.jiix"] - const jiixReceived = exports["application/vnd.myscript.jiix"] - const modelExportJiixReceived = await getExportsTypeFromEditorModel(page, "application/vnd.myscript.jiix") - expect(jiixReceived).toEqual(modelExportJiixReceived) - expect(jiixReceived).toEqual(jiixExpected) - }) - - describe("Gesture", () => { - test("should apply gesture", async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.gesture.enable = true - setEditorConfiguration(page, configuration) - await waitForEditorWebSocket(page) - - const [firstModelExports] = await Promise.all([getDatasFromExportedEvent(page), write(page, [helloStrikeStroke.strokes[0]])]) - const firstJiixExport = firstModelExports["application/vnd.myscript.jiix"] - expect(firstJiixExport.label).toEqual(helloStrikeStroke.exports["text/plain"][0]) - - const [secondModelExports] = await Promise.all([getDatasFromExportedEvent(page), write(page, [helloStrikeStroke.strokes[1]])]) - const secondJiixExport = secondModelExports["application/vnd.myscript.jiix"] - expect(secondJiixExport.label).toEqual("") - }) - - test("should not apply gesture", async () => { - const configuration = await getEditorConfiguration(page) - configuration.recognition.gesture.enable = false - setEditorConfiguration(page, configuration) - await waitForEditorWebSocket(page) - - const [firstModelExports] = await Promise.all([getDatasFromExportedEvent(page), write(page, [helloStrikeStroke.strokes[0]])]) - const firstJiixExport = firstModelExports["application/vnd.myscript.jiix"] - expect(firstJiixExport.label).toEqual(helloStrikeStroke.exports["text/plain"][0]) - - const [secondModelExports] = await Promise.all([getDatasFromExportedEvent(page), write(page, [helloStrikeStroke.strokes[1]])]) - const secondJiixExport = secondModelExports["application/vnd.myscript.jiix"] - expect(secondJiixExport.label).not.toEqual("") - }) - }) - - describe("SmartGuide", () => { - test("should not display", async () => { - const configuration = await getEditorConfiguration(page) - configuration.rendering.smartGuide.enable = false - setEditorConfiguration(page, configuration) - await waitForEditorWebSocket(page) - - await Promise.all([getDatasFromExportedEvent(page), write(page, h.strokes)]) - - // wait css animation - await page.waitForTimeout(1000) - expect(await page.locator(".prompter-text").isVisible()).toBe(false) - expect(await page.locator(".candidates").isVisible()).toBe(false) - }) - - test("should display", async () => { - const configuration = await getEditorConfiguration(page) - configuration.rendering.smartGuide.enable = true - setEditorConfiguration(page, configuration) - await waitForEditorWebSocket(page) - - await Promise.all([getDatasFromExportedEvent(page), write(page, h.strokes)]) - - // wait css animation - await page.waitForTimeout(1000) - expect(await page.locator(".prompter-text").isVisible()).toBe(true) - expect(await page.locator(".candidates").isVisible()).toBe(false) - }) - - test("should display text into", async () => { - await Promise.all([getDatasFromExportedEvent(page), write(page, h.strokes)]) - - const textExpected = h.exports["text/plain"].at(-1) - const textExpectedWithNbsp = textExpected.replace(/\s/g, "\u00A0") - - const prompterText = await page.waitForSelector(".prompter-text") - const textContent = await prompterText.evaluate((node) => node.textContent) - - expect(textExpectedWithNbsp).toEqual(textContent) - }) - - test("should select candidate", async () => { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, hello.strokes) - ]) - await waitEditorIdle(page) - const jiixExport = await getExportsTypeFromEditorModel(page, "application/vnd.myscript.jiix") - expect(await page.innerText(".prompter-text")).toBe(jiixExport.label) - expect(await page.locator(".candidates").isVisible()).toBe(false) - - // wait css animation - await page.waitForTimeout(1000) - await page.click(`.prompter-text > span`) - expect(await page.locator(".candidates").isVisible()).toBe(true) - const candidate = jiixExport.words[0].candidates[2] - - await Promise.all([getDatasFromExportedEvent(page), page.click(`.candidates > span >> text=${candidate}`)]) - - expect(await page.innerText(".prompter-text")).toBe(candidate) - expect(await page.locator(".candidates").isVisible()).toBe(false) - }) - - test("should convert", async () => { - await Promise.all([getDatasFromExportedEvent(page), write(page, helloOneStroke.strokes)]) - const emptyConvert = await getConversionsFromEditorModel(page) - expect(emptyConvert).toBeUndefined() - expect(await page.locator(".more-menu.close").isVisible()).toBe(false) - const wrotePath = await page.locator("path").first().getAttribute("d") - - await page.click(`.ellipsis`) - // wait for css animation - await page.waitForTimeout(1000) - expect(await page.locator(".more-menu.open").isVisible()).toBe(true) - - await Promise.all([getDatasFromExportedEvent(page), page.click(`.more-menu > button >> text=Convert`)]) - - const convert = await getConversionsFromEditorModel(page) - expect(convert).toBeDefined() - - const convertedPath = await page.locator("path").first().getAttribute("d") - expect(wrotePath).not.toEqual(convertedPath) - }) - - test.skip("should Copy", async () => { - await write(page, h.strokes) - await getDatasFromExportedEvent(page) - expect(await page.locator(".more-menu.close").isVisible()).toBe(false) - - let pathElements = page.locator("path") - expect(await pathElements.count()).toEqual(1) - - await page.click(`.ellipsis`) - // wait for css animation - await page.waitForTimeout(1000) - - expect(await page.locator(".more-menu.open").isVisible()).toBe(true) - await page.click(`.more-menu > button >> text=Copy`) - - const clipboardCopy = page.evaluate(`(async () => { return await navigator.clipboard.readText() })()`) - expect(clipboardCopy).toEqual(h.label) - }) - - test("should Delete", async () => { - await Promise.all([getDatasFromExportedEvent(page), write(page, h.strokes)]) - - expect(await page.locator(".more-menu.close").isVisible()).toBe(false) - - let pathElements = page.locator("path") - expect(await pathElements.count()).toEqual(1) - - await page.click(`.ellipsis`) - // wait for css animation - await page.waitForTimeout(1000) - - expect(await page.locator(".more-menu.open").isVisible()).toBe(true) - - await Promise.all([getDatasFromExportedEvent(page), page.click(`.more-menu > button >> text=Delete`)]) - - // wait for css animation - await page.waitForTimeout(1000) - - pathElements = page.locator("path") - expect(await pathElements.count()).toEqual(0) - }) - }) - - require("../_partials/text/nav-actions-text-clear-test") - require("../_partials/text/nav-actions-text-language-test") - require("../_partials/text/nav-actions-text-undo-redo-test") -}) diff --git a/test/integration/_partials/math/nav-actions-math-clear-test.js b/test/integration/_partials/math/nav-actions-math-clear-test.js deleted file mode 100644 index fa08de4df..000000000 --- a/test/integration/_partials/math/nav-actions-math-clear-test.js +++ /dev/null @@ -1,20 +0,0 @@ -const { writePointers, getDatasFromExportedEvent, getEditorModelExportsType } = require("../../helper") -const { sumSimple } = require("../../strokesDatas") - -describe('Nav actions math clear', () => { - test("should clear", async () => { - await Promise.all([getDatasFromExportedEvent(page), writePointers(page, sumSimple.strokes)]) - let resultElement = page.locator("#result") - resultText = await resultElement.textContent() - expect(resultText).toBeDefined() - - const [clearExport] = await Promise.all([getDatasFromExportedEvent(page), page.click("#clear")]) - const emptyLatex = "" - const LatexReceived = clearExport["application/x-latex"] - expect(LatexReceived).toEqual(emptyLatex) - - resultElement = page.locator("#result") - resultText = await resultElement.textContent() - expect(resultText).toBe("") - }) -}) diff --git a/test/integration/_partials/math/nav-actions-math-undo-redo-test.js b/test/integration/_partials/math/nav-actions-math-undo-redo-test.js deleted file mode 100644 index 0298e2df9..000000000 --- a/test/integration/_partials/math/nav-actions-math-undo-redo-test.js +++ /dev/null @@ -1,99 +0,0 @@ -const { - waitForEditorWebSocket, - write, - getDatasFromExportedEvent, - getExportsTypeFromEditorModel, - getEditorConfiguration, - setEditorConfiguration, - getExportsFromEditorModel, - waitEditorIdle -} = require("../../helper"); -const { equation1 } = require("../../strokesDatas"); - -describe("Nav actions math undo/redo", () => { - test('should undo/redo in mode "stroke" by default', async () => { - const config = await getEditorConfiguration(page); - expect(config.recognition.math["undo-redo"].mode).toEqual("stroke"); - - config.recognition.math.customGrammarContent = undefined - await setEditorConfiguration(page, config) - await waitForEditorWebSocket(page) - - let latex; - await write(page, equation1.strokes, 100, 100); - await waitEditorIdle(page); - - const [clearExport] = await Promise.all([getDatasFromExportedEvent(page), page.click("#clear")]); - const modelExportCleared = await getExportsFromEditorModel(page); - if (modelExportCleared) { - expect(modelExportCleared["application/x-latex"]).toEqual(""); - expect(clearExport["application/x-latex"]).toEqual(""); - } - - const [undo1Export] = await Promise.all([getDatasFromExportedEvent(page), page.click("#undo")]); - latex = await getExportsTypeFromEditorModel(page, "application/x-latex"); - expect(undo1Export["application/x-latex"]).toEqual(latex); - expect(equation1.exports.LATEX.at(-1)).toEqual(undo1Export["application/x-latex"]); - - await waitEditorIdle(page); - const [undo2Export] = await Promise.all([getDatasFromExportedEvent(page), page.click("#undo")]); - latex = await getExportsTypeFromEditorModel(page, "application/x-latex"); - expect(undo2Export["application/x-latex"]).toEqual(latex); - expect(equation1.exports.LATEX.at(-2)).toEqual(undo2Export["application/x-latex"]); - - await waitEditorIdle(page); - const [undo3Export] = await Promise.all([getDatasFromExportedEvent(page), page.click("#undo")]); - latex = await getExportsTypeFromEditorModel(page, "application/x-latex"); - expect(undo3Export["application/x-latex"]).toEqual(latex); - expect(equation1.exports.LATEX.at(-3)).toEqual(undo3Export["application/x-latex"]); - - await waitEditorIdle(page); - const [redoExport] = await Promise.all([getDatasFromExportedEvent(page), page.click("#redo")]); - latex = await getExportsTypeFromEditorModel(page, "application/x-latex"); - expect(redoExport["application/x-latex"]).toEqual(latex); - expect(equation1.exports.LATEX.at(-2)).toEqual(redoExport["application/x-latex"]); - }); - - test('should undo/redo in mode "session"', async () => { - const config = await getEditorConfiguration(page); - config.recognition.math.mimeTypes = ["application/x-latex"]; - config.recognition.math["undo-redo"].mode = "session"; - // 5000 = time to write equation1 - config.recognition.math["session-time"] = 5000; - - config.recognition.math.customGrammarContent = undefined - await setEditorConfiguration(page, config); - await waitForEditorWebSocket(page); - - let latex; - await write(page, equation1.strokes); - await waitEditorIdle(page); - latex = await getExportsTypeFromEditorModel(page, "application/x-latex"); - expect(latex).toEqual(equation1.exports.LATEX.at(-1)); - - const [clearExport] = await Promise.all([getDatasFromExportedEvent(page), page.click("#clear")]); - const modelExportCleared = await getExportsFromEditorModel(page); - if (modelExportCleared) { - expect(modelExportCleared["application/x-latex"]).toEqual(""); - expect(clearExport["application/x-latex"]).toEqual(""); - } - - await waitEditorIdle(page); - const [undo1Export] = await Promise.all([getDatasFromExportedEvent(page), page.click("#undo")]); - latex = await getExportsTypeFromEditorModel(page, "application/x-latex"); - expect(undo1Export["application/x-latex"]).toEqual(latex); - expect(undo1Export["application/x-latex"]).toEqual(equation1.exports.LATEX.at(-1)); - - await waitEditorIdle(page); - const [undo2Export] = await Promise.all([getDatasFromExportedEvent(page), page.click("#undo")]); - latex = await getExportsTypeFromEditorModel(page, "application/x-latex"); - expect(undo2Export["application/x-latex"]).toEqual(latex); - expect(latex).toEqual(""); - - await waitEditorIdle(page); - const [redoExport] = await Promise.all([getDatasFromExportedEvent(page), page.click("#redo")]); - latex = await getExportsTypeFromEditorModel(page, "application/x-latex"); - expect(redoExport["application/x-latex"]).toEqual(latex); - expect(redoExport["application/x-latex"]).toEqual(equation1.exports.LATEX.at(-1)); - }); -}); diff --git a/test/integration/_partials/text/nav-actions-text-clear-test.js b/test/integration/_partials/text/nav-actions-text-clear-test.js deleted file mode 100644 index ebabf92b7..000000000 --- a/test/integration/_partials/text/nav-actions-text-clear-test.js +++ /dev/null @@ -1,20 +0,0 @@ -const { writePointers, getDatasFromExportedEvent, getExportsFromEditorModel } = require("../../helper") -const { one } = require("../../strokesDatas") - -describe('Nav actions text clear', () => { - test('should clear', async () => { - const [exportBeforeClear] = await Promise.all([ - getDatasFromExportedEvent(page), - writePointers(page, one.strokes, 100) - ]) - expect(exportBeforeClear["application/vnd.myscript.jiix"].label).toStrictEqual("1") - - const [exportAfterClear] = await Promise.all([ - getDatasFromExportedEvent(page), - page.click("#clear") - ]) - const emptyJiix = { "type": "Text", "label": "", "words": [ ], "version": "3", "id": "MainBlock"} - expect(exportAfterClear["application/vnd.myscript.jiix"]).toEqual(emptyJiix) - expect(exportAfterClear["application/vnd.myscript.jiix"].label).toStrictEqual('') - }) -}) diff --git a/test/integration/_partials/text/nav-actions-text-language-test.js b/test/integration/_partials/text/nav-actions-text-language-test.js deleted file mode 100644 index 3edd8c606..000000000 --- a/test/integration/_partials/text/nav-actions-text-language-test.js +++ /dev/null @@ -1,28 +0,0 @@ -const { getDatasFromExportedEvent, write, waitEditorIdle } = require("../../helper") -const { h } = require("../../strokesDatas") - -describe('Nav actions text language', () => { - test('should change language', async () => { - await Promise.all([ - getDatasFromExportedEvent(page), - write(page, h.strokes), - ]) - - await waitEditorIdle(page) - - let resultElement = page.locator('#result') - resultText = await resultElement.textContent() - expect(resultText).toStrictEqual(h.exports['text/plain'].at(-1)) - - await Promise.all([ - getDatasFromExportedEvent(page), - page.selectOption('#language', 'fr_FR'), - ]) - - await waitEditorIdle(page) - - resultElement = page.locator('#result') - resultText = await resultElement.textContent() - expect(resultText).toBe('') - }) -}) \ No newline at end of file diff --git a/test/integration/_partials/text/nav-actions-text-undo-redo-test.js b/test/integration/_partials/text/nav-actions-text-undo-redo-test.js deleted file mode 100644 index eed3b875a..000000000 --- a/test/integration/_partials/text/nav-actions-text-undo-redo-test.js +++ /dev/null @@ -1,36 +0,0 @@ -const { getExportsFromEditorModel, write } = require("../../helper") -const { hello } = require("../../strokesDatas") - -describe('Nav actions text undo/redo', () => { - test('should undo/redo', async () => { - const editorEl = await page.waitForSelector('#editor') - for(const s of hello.strokes) { - await Promise.all([ - write(page, [s]), - getExportsFromEditorModel(page), - ]) - } - let resultElement = await getExportsFromEditorModel(page) - expect(resultElement['application/vnd.myscript.jiix'].label).toStrictEqual(hello.exports['text/plain'].at(-1)) - let raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length) - - await Promise.all([getExportsFromEditorModel(page), page.click('#undo')]) - resultElement = await getExportsFromEditorModel(page) - expect(resultElement['application/vnd.myscript.jiix'].label).toStrictEqual(hello.exports['text/plain'].at(-2)) - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length - 1) - - await Promise.all([getExportsFromEditorModel(page), page.click('#undo')]) - resultElement = await getExportsFromEditorModel(page) - expect(resultElement['application/vnd.myscript.jiix'].label).toStrictEqual(hello.exports['text/plain'].at(-3)) - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length - 2) - - await Promise.all([getExportsFromEditorModel(page), page.click('#redo')]) - resultElement = await getExportsFromEditorModel(page) - expect(resultElement['application/vnd.myscript.jiix'].label).toStrictEqual(hello.exports['text/plain'].at(-2)) - raw = await editorEl.evaluate((node) => node.editor.model.rawStrokes) - expect(raw.length).toStrictEqual(hello.strokes.length - 1) - }) -}) \ No newline at end of file diff --git a/test/integration/helper.js b/test/integration/helper.js deleted file mode 100644 index 712b4a113..000000000 --- a/test/integration/helper.js +++ /dev/null @@ -1,246 +0,0 @@ -/** - * @param {Page} page - Playwright Page - * @param {Array} strokes - * @param {Object} strokes[0] - * @param {Array} strokes[0].x - * @param {Number} strokes[0].x[0] - * @param {Array} strokes[0].y - * @param {Number} strokes[0].y[0] - * @param {Array} [strokes[0].t] - * @param {Number} strokes[0].t[0] - * @param {Number} [offsetTop=0] - * @param {Number} [offsetLeft=0] - */ -module.exports.write = async (page, strokes, offsetTop = 0, offsetLeft = 0) => { - - const editorEl = await page.waitForSelector('#editor') - const offsetX = offsetLeft + await editorEl.evaluate((node) => node.offsetLeft) - const offsetY = offsetTop + await editorEl.evaluate((node) => node.offsetTop) - - for (const { x, y, t } of strokes) { - const hasTimeStamp = t && t.length === x.length - await page.mouse.move(offsetX + x[0], offsetY + y[0]) - await page.mouse.down() - - let oldTimestamp = hasTimeStamp ? t[0] : null - for (let p = 0; p < x.length; p++) { - let waitTime = 0 - if (hasTimeStamp) { - waitTime = t[p] - oldTimestamp - oldTimestamp = t[p] - } - await page.waitForTimeout(waitTime) - await page.mouse.move(offsetX + x[p], offsetY + y[p]) - } - await page.mouse.up() - await page.waitForTimeout(500) - } -} - -/** - * @param {Page} page - Playwright Page - * @param {Array} strokes - * @param {Object} strokes[0] - * @param {Array} strokes[0].pointers - * @param {Object} strokes[0].pointers[0] - * @param {Number} strokes[0].pointers[0].x - * @param {Number} strokes[0].pointers[0].y - * @param {Number} strokes[0].pointers[0].t - * @param {Number} strokes[0].pointers[0].p - * @param {Number} [offsetTop=0] - * @param {Number} [offsetLeft=0] - */ -module.exports.writePointers = async (page, strokes, offsetTop = 0, offsetLeft = 0) => { - const editorEl = await page.waitForSelector('#editor') - const boundingBox = await editorEl.evaluate((node) => node.getBoundingClientRect()) - const offsetX = offsetLeft + boundingBox.x - const offsetY = offsetTop + boundingBox.y - for(s of strokes) { - const firstPointer = s.pointers[0] - let oldTimestamp = firstPointer.t - await page.mouse.move(offsetX + firstPointer.x, offsetY + firstPointer.y) - await page.mouse.down() - for(p of s.pointers) { - let waitTime = 0 - waitTime = p.t - oldTimestamp - oldTimestamp = p.t - await page.waitForTimeout(waitTime) - await page.mouse.move(offsetX + p.x, offsetY + p.y) - } - await page.mouse.up() - await page.waitForTimeout(500) - } -} - -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ -module.exports.getEditor = async (page) => { - return page.evaluate('editor') -} - -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ -module.exports.getEditorConfiguration = async (page) => { - return page.evaluate('editor.configuration') -} - -/** - * @param {Page} page - Playwright Page - * @param {Configuration} configuration - Editor configuration - * @returns Promise - */ -module.exports.setEditorConfiguration = async (page, configuration) => { - return page.evaluate(`editor.configuration = ${JSON.stringify(configuration)};`) -} - -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ - module.exports.getExportsFromEditorModel = async (page) => { - return page.evaluate('editor.model.exports') -} -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ - module.exports.getConversionsFromEditorModel = async (page) => { - return page.evaluate('editor.model.converts') -} -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ - module.exports.getExportsTypeFromEditorModel = async (page, type) => { - return page.evaluate(`editor.model.exports['${type}']`) -} - -const exported = `(async () => { - return new Promise((resolve, reject) => { - editor.events.addEventListener('exported', (e) => { - resolve(e.detail); - }); - }); -})()` - -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ -module.exports.getDatasFromExportedEvent = async (page) => { - return page.evaluate(exported) -} - -const imported = `(async () => { - return new Promise((resolve, reject) => { - editor.events.addEventListener('imported', (e) => { - resolve(e.detail); - }); - }); -})()` - -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ -module.exports.getDatasFromImportedEvent = async (page) => { - return page.evaluate(imported) -} - -const converted = `(async () => { - return new Promise((resolve, reject) => { - editor.events.addEventListener('converted', (e) => { - resolve(e.detail); - }); - }); -})()` - -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ -module.exports.getDatasFromConvertedEvent = async (page) => { - await page.waitForFunction(() => !!window.editor) - return page.evaluate(converted) -} - -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ -module.exports.waitEditorIdle = async (page) => { - await page.waitForFunction(() => !!window.editor) - return page.evaluate("editor.waitForIdle()") -} - -const loaded = `(async () => { - return new Promise((resolve, reject) => { - editor.events.addEventListener('loaded', (e) => { - resolve(); - }); - }); -})()` -/** - * @param {Page} page - Playwright Page - * @returns Promise - */ -module.exports.waitEditorLoaded = async (page) => { - await page.waitForFunction(() => !!window.editor) - return page.evaluate(loaded) -} - -module.exports.waitForEditorRest = async (page) => { - await Promise.all([ - page.waitForSelector('#ms-rendering-canvas'), - page.waitForSelector('#ms-capture-canvas'), - ]) - return page.evaluate('editor.initializationPromise') -} - -module.exports.waitForEditorWebSocket = async (page) => { - await Promise.all([ - page.waitForSelector('svg[data-layer="CAPTURE"]'), - page.waitForSelector('svg[data-layer="MODEL"]'), - ]) - return page.evaluate('editor.initializationPromise') -} - -function findValuesByKey (obj, key, list = []) { - if (!obj) return list - if (obj instanceof Array) { - Object.keys(obj).forEach((k) => { - list = list.concat(findValuesByKey(obj[k], key, [])) - }) - return list - } - if (obj[key]) { - if (obj[key] instanceof Array) { - Object.keys(obj[key]).forEach((l) => { - list.push(obj[key][l]) - }) - } else { - list.push(obj[key]) - } - } - - if (typeof obj === 'object') { - const children = Object.keys(obj) - if (children.length > 0) { - children.forEach((child) => { - list = list.concat(findValuesByKey(obj[child], key, [])) - }) - } - } - return list -} -module.exports.findValuesByKey = findValuesByKey - -module.exports.haveSameLabels = (jiix1, jiix2) => { - const labels1 = findValuesByKey(jiix1, 'label') - const labels2 = findValuesByKey(jiix2, 'label') - return JSON.stringify(labels1) === JSON.stringify(labels2) -} diff --git a/test/integration/jest.setup.js b/test/integration/jest.setup.js deleted file mode 100644 index 9df84ff26..000000000 --- a/test/integration/jest.setup.js +++ /dev/null @@ -1,6 +0,0 @@ -jest.retryTimes(0) -jest.setTimeout(30 * 1000) - -afterAll(() => { - browser.close() -}) diff --git a/test/integration/strokes/abrausorus.json b/test/integration/strokes/abrausorus.json deleted file mode 100644 index 24dbc17a7..000000000 --- a/test/integration/strokes/abrausorus.json +++ /dev/null @@ -1,69 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 201, 198, 191, 188, 185, 182, 177, 174, 171, 172, 174, 177, 184, 188, 192, 196, 199, 202, 204, 206, 207, 209, 210, 209, 205, 204, 206, 209, 211, - 217, 223, 230, 235, 240, 247, 250, 255, 260, 263, 266, 267, 267, 265, 262, 259, 255, 252, 250, 249, 249, 250, 252, 254, 259, 263, 268, 273, 277, - 283, 288, 293, 298, 302, 303, 303, 303, 300, 297, 294, 291, 290, 292, 297, 300, 303, 307, 311, 314, 319, 323, 324, 324, 319, 316, 321, 326, 331, - 335, 338, 340, 340, 339, 337, 337, 341, 344, 351, 357, 362, 367, 370, 375, 377, 376, 373, 369, 364, 359, 356, 353, 352, 352, 355, 359, 363, 367, - 372, 375, 378, 379, 378, 375, 374, 377, 381, 387, 391, 394, 398, 401, 403, 404, 401, 401, 401, 408, 411, 414, 418, 423, 425, 426, 426, 424, 424, - 426, 429, 434, 438, 442, 448, 452, 455, 456, 455, 457, 463, 467, 471, 474, 474, 470, 467, 471, 475, 486, 493, 498, 502, 506, 504, 499, 495, 494, - 494, 496, 499, 503, 507, 513, 518, 520, 521, 520, 514, 510, 507, 504, 503, 504, 509, 513, 517, 522, 525, 529, 531, 534, 538, 543, 548, 550, 550, - 550, 552, 556, 559, 562, 565, 569, 570, 570, 567, 568, 572, 575, 578, 581, 586, 589, 591, 589, 590, 594, 597, 600, 602, 604, 606, 609, 614, 618, - 621, 623, 624, 621, 617, 614 - ], - "y": [ - 160, 159, 159, 159, 159, 160, 162, 164, 168, 172, 175, 177, 180, 180, 180, 180, 178, 176, 173, 169, 166, 161, 158, 155, 150, 154, 159, 165, 168, - 173, 175, 176, 176, 176, 175, 174, 169, 161, 155, 149, 144, 140, 133, 127, 124, 121, 121, 127, 133, 142, 148, 153, 159, 167, 170, 173, 175, 176, - 177, 177, 175, 171, 165, 161, 157, 154, 152, 151, 150, 150, 153, 156, 157, 157, 156, 154, 152, 152, 151, 147, 144, 141, 140, 142, 143, 143, 144, - 145, 147, 150, 155, 158, 161, 164, 166, 167, 166, 165, 163, 160, 158, 153, 149, 146, 145, 145, 145, 148, 151, 156, 159, 163, 169, 172, 173, 173, - 173, 171, 165, 161, 157, 153, 159, 163, 168, 172, 172, 172, 169, 164, 158, 154, 154, 158, 162, 166, 167, 167, 165, 161, 157, 154, 150, 153, 156, - 163, 167, 169, 170, 170, 167, 164, 159, 154, 149, 153, 157, 161, 165, 170, 177, 180, 177, 172, 169, 165, 162, 160, 159, 155, 152, 152, 157, 162, - 167, 173, 175, 176, 176, 172, 168, 164, 160, 156, 152, 151, 151, 152, 156, 159, 163, 164, 165, 164, 163, 158, 155, 152, 150, 150, 155, 158, 164, - 168, 172, 171, 170, 168, 165, 160, 157, 154, 157, 161, 166, 169, 170, 170, 167, 162, 157, 161, 165, 168, 169, 168, 165, 161, 156, 157, 160, 163, - 165, 168, 172, 174, 175, 175 - ], - "t": [ - 1692198864522, 1692198864757, 1692198864791, 1692198864807, 1692198864824, 1692198864841, 1692198864874, 1692198864907, 1692198864941, - 1692198864974, 1692198864991, 1692198865007, 1692198865024, 1692198865040, 1692198865057, 1692198865074, 1692198865091, 1692198865107, - 1692198865124, 1692198865141, 1692198865158, 1692198865174, 1692198865191, 1692198865208, 1692198865240, 1692198865307, 1692198865325, - 1692198865357, 1692198865374, 1692198865392, 1692198865408, 1692198865424, 1692198865441, 1692198865457, 1692198865474, 1692198865491, - 1692198865524, 1692198865541, 1692198865558, 1692198865574, 1692198865591, 1692198865608, 1692198865624, 1692198865641, 1692198865658, - 1692198865674, 1692198865708, 1692198865741, 1692198865757, 1692198865774, 1692198865791, 1692198865808, 1692198865824, 1692198865841, - 1692198865857, 1692198865875, 1692198865891, 1692198865908, 1692198865924, 1692198865941, 1692198865958, 1692198865976, 1692198865991, - 1692198866008, 1692198866024, 1692198866042, 1692198866058, 1692198866074, 1692198866091, 1692198866125, 1692198866158, 1692198866193, - 1692198866225, 1692198866241, 1692198866258, 1692198866275, 1692198866325, 1692198866358, 1692198866408, 1692198866441, 1692198866458, - 1692198866475, 1692198866508, 1692198866541, 1692198866575, 1692198866592, 1692198866609, 1692198866625, 1692198866641, 1692198866659, - 1692198866692, 1692198866708, 1692198866725, 1692198866742, 1692198866775, 1692198866792, 1692198866808, 1692198866825, 1692198866842, - 1692198866859, 1692198866875, 1692198866892, 1692198866926, 1692198866942, 1692198866959, 1692198866976, 1692198866992, 1692198867009, - 1692198867025, 1692198867042, 1692198867059, 1692198867075, 1692198867092, 1692198867109, 1692198867125, 1692198867142, 1692198867160, - 1692198867176, 1692198867194, 1692198867209, 1692198867225, 1692198867259, 1692198867342, 1692198867359, 1692198867376, 1692198867393, - 1692198867409, 1692198867426, 1692198867443, 1692198867459, 1692198867476, 1692198867493, 1692198867559, 1692198867576, 1692198867593, - 1692198867626, 1692198867642, 1692198867659, 1692198867676, 1692198867692, 1692198867709, 1692198867726, 1692198867759, 1692198867810, - 1692198867826, 1692198867843, 1692198867859, 1692198867876, 1692198867893, 1692198867910, 1692198867926, 1692198867943, 1692198867960, - 1692198867977, 1692198867993, 1692198868060, 1692198868076, 1692198868093, 1692198868110, 1692198868127, 1692198868143, 1692198868177, - 1692198868227, 1692198868260, 1692198868276, 1692198868293, 1692198868310, 1692198868326, 1692198868343, 1692198868376, 1692198868410, - 1692198868444, 1692198868478, 1692198868494, 1692198868510, 1692198868527, 1692198868543, 1692198868560, 1692198868577, 1692198868594, - 1692198868610, 1692198868627, 1692198868643, 1692198868660, 1692198868693, 1692198868710, 1692198868727, 1692198868743, 1692198868777, - 1692198868794, 1692198868810, 1692198868827, 1692198868844, 1692198868861, 1692198868877, 1692198868894, 1692198868993, 1692198869027, - 1692198869111, 1692198869127, 1692198869161, 1692198869177, 1692198869194, 1692198869211, 1692198869244, 1692198869277, 1692198869294, - 1692198869311, 1692198869327, 1692198869344, 1692198869360, 1692198869394, 1692198869461, 1692198869478, 1692198869494, 1692198869511, - 1692198869529, 1692198869545, 1692198869561, 1692198869578, 1692198869595, 1692198869678, 1692198869694, 1692198869711, 1692198869728, - 1692198869745, 1692198869761, 1692198869778, 1692198869795, 1692198869862, 1692198869878, 1692198869895, 1692198869912, 1692198869928, - 1692198869945, 1692198869962, 1692198869978, 1692198869995 - ], - "p": [ - 0.5, 0.82, 0.78, 0.68, 0.68, 0.68, 0.75, 0.7, 0.74, 0.72, 0.7, 0.7, 0.79, 0.71, 0.71, 0.71, 0.7, 0.7, 0.7, 0.73, 0.68, 0.75, 0.68, 0.68, 0.77, - 0.72, 0.75, 0.78, 0.7, 0.8, 0.77, 0.79, 0.74, 0.74, 0.79, 0.68, 0.79, 0.82, 0.78, 0.78, 0.75, 0.71, 0.79, 0.78, 0.72, 0.74, 0.68, 0.77, 0.77, - 0.81, 0.77, 0.75, 0.77, 0.82, 0.74, 0.76, 0.75, 0.72, 0.77, 0.74, 0.75, 0.77, 0.79, 0.72, 0.71, 0.68, 0.7, 0.68, 0.68, 0.68, 0.68, 0.7, 0.75, - 0.68, 0.68, 0.73, 0.73, 0.68, 0.75, 0.76, 0.68, 0.68, 0.75, 0.7, 0.75, 0.74, 0.75, 0.72, 0.7, 0.7, 0.74, 0.68, 0.7, 0.68, 0.73, 0.68, 0.79, - 0.77, 0.75, 0.76, 0.7, 0.79, 0.73, 0.68, 0.68, 0.71, 0.74, 0.76, 0.72, 0.76, 0.68, 0.71, 0.78, 0.74, 0.72, 0.71, 0.74, 0.7, 0.78, 0.72, 0.72, - 0.74, 0.77, 0.74, 0.77, 0.79, 0.71, 0.68, 0.74, 0.76, 0.77, 0.72, 0.68, 0.71, 0.71, 0.8, 0.68, 0.68, 0.73, 0.77, 0.73, 0.68, 0.71, 0.7, 0.68, - 0.79, 0.74, 0.75, 0.72, 0.71, 0.78, 0.74, 0.76, 0.75, 0.75, 0.73, 0.79, 0.76, 0.76, 0.76, 0.78, 0.74, 0.72, 0.77, 0.74, 0.66, 0.79, 0.75, 0.72, - 0.76, 0.7, 0.74, 0.77, 0.75, 0.74, 0.77, 0.7, 0.72, 0.71, 0.79, 0.77, 0.73, 0.72, 0.72, 0.79, 0.72, 0.68, 0.68, 0.72, 0.68, 0.77, 0.72, 0.72, - 0.75, 0.68, 0.77, 0.7, 0.72, 0.73, 0.74, 0.79, 0.7, 0.77, 0.71, 0.73, 0.72, 0.68, 0.7, 0.72, 0.77, 0.68, 0.68, 0.72, 0.72, 0.77, 0.72, 0.68, - 0.68, 0.76, 0.76, 0.75, 0.73, 0.72, 0.74, 0.68, 0.68, 0.7, 0.73, 0.75, 0.68, 0.76, 0.74, 0.7, 0.7, 0.72, 0.7, 0.72, 0.68 - ] - } -] diff --git a/test/integration/strokes/covfefe.json b/test/integration/strokes/covfefe.json deleted file mode 100644 index e38c20e20..000000000 --- a/test/integration/strokes/covfefe.json +++ /dev/null @@ -1,782 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 173, - "y": 216, - "t": 1695827135476, - "p": 0.1 - }, - { - "x": 170, - "y": 216, - "t": 1695827135512, - "p": 0.68 - }, - { - "x": 166, - "y": 216, - "t": 1695827135528, - "p": 0.71 - }, - { - "x": 161, - "y": 218, - "t": 1695827135545, - "p": 0.75 - }, - { - "x": 157, - "y": 220, - "t": 1695827135561, - "p": 0.73 - }, - { - "x": 153, - "y": 223, - "t": 1695827135578, - "p": 0.74 - }, - { - "x": 149, - "y": 226, - "t": 1695827135595, - "p": 0.74 - }, - { - "x": 145, - "y": 229, - "t": 1695827135611, - "p": 0.74 - }, - { - "x": 143, - "y": 233, - "t": 1695827135628, - "p": 0.73 - }, - { - "x": 142, - "y": 238, - "t": 1695827135661, - "p": 0.75 - }, - { - "x": 146, - "y": 241, - "t": 1695827135694, - "p": 0.74 - }, - { - "x": 152, - "y": 242, - "t": 1695827135727, - "p": 0.77 - }, - { - "x": 157, - "y": 242, - "t": 1695827135744, - "p": 0.74 - }, - { - "x": 164, - "y": 243, - "t": 1695827135761, - "p": 0.79 - }, - { - "x": 170, - "y": 243, - "t": 1695827135778, - "p": 0.77 - }, - { - "x": 176, - "y": 243, - "t": 1695827135793, - "p": 0.77 - }, - { - "x": 180, - "y": 243, - "t": 1695827135827, - "p": 0.71 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 188, - "y": 223, - "t": 1695827136162, - "p": 0.1 - }, - { - "x": 184, - "y": 226, - "t": 1695827136178, - "p": 0.74 - }, - { - "x": 181, - "y": 229, - "t": 1695827136194, - "p": 0.72 - }, - { - "x": 180, - "y": 232, - "t": 1695827136211, - "p": 0.68 - }, - { - "x": 181, - "y": 236, - "t": 1695827136244, - "p": 0.72 - }, - { - "x": 185, - "y": 237, - "t": 1695827136260, - "p": 0.72 - }, - { - "x": 191, - "y": 237, - "t": 1695827136277, - "p": 0.77 - }, - { - "x": 200, - "y": 237, - "t": 1695827136294, - "p": 0.81 - }, - { - "x": 209, - "y": 236, - "t": 1695827136311, - "p": 0.81 - }, - { - "x": 216, - "y": 235, - "t": 1695827136328, - "p": 0.79 - }, - { - "x": 219, - "y": 234, - "t": 1695827136344, - "p": 0.68 - }, - { - "x": 222, - "y": 233, - "t": 1695827136361, - "p": 0.68 - }, - { - "x": 217, - "y": 229, - "t": 1695827136394, - "p": 0.77 - }, - { - "x": 207, - "y": 225, - "t": 1695827136410, - "p": 0.67 - }, - { - "x": 198, - "y": 224, - "t": 1695827136428, - "p": 0.81 - }, - { - "x": 194, - "y": 223, - "t": 1695827136444, - "p": 0.72 - }, - { - "x": 191, - "y": 225, - "t": 1695827136560, - "p": 0.7 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 228, - "y": 215, - "t": 1695827136988, - "p": 0.1 - }, - { - "x": 227, - "y": 219, - "t": 1695827137011, - "p": 0.72 - }, - { - "x": 226, - "y": 224, - "t": 1695827137026, - "p": 0.75 - }, - { - "x": 225, - "y": 231, - "t": 1695827137044, - "p": 0.79 - }, - { - "x": 227, - "y": 235, - "t": 1695827137059, - "p": 0.73 - }, - { - "x": 229, - "y": 238, - "t": 1695827137092, - "p": 0.7 - }, - { - "x": 233, - "y": 239, - "t": 1695827137143, - "p": 0.72 - }, - { - "x": 236, - "y": 236, - "t": 1695827137193, - "p": 0.72 - }, - { - "x": 239, - "y": 234, - "t": 1695827137210, - "p": 0.7 - }, - { - "x": 244, - "y": 228, - "t": 1695827137226, - "p": 0.8 - }, - { - "x": 250, - "y": 222, - "t": 1695827137260, - "p": 0.81 - }, - { - "x": 253, - "y": 216, - "t": 1695827137276, - "p": 0.78 - }, - { - "x": 255, - "y": 213, - "t": 1695827137293, - "p": 0.7 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 269, - "y": 248, - "t": 1695827137679, - "p": 0.1 - }, - { - "x": 268, - "y": 243, - "t": 1695827137742, - "p": 0.75 - }, - { - "x": 267, - "y": 233, - "t": 1695827137759, - "p": 0.68 - }, - { - "x": 267, - "y": 227, - "t": 1695827137775, - "p": 0.77 - }, - { - "x": 267, - "y": 222, - "t": 1695827137792, - "p": 0.74 - }, - { - "x": 270, - "y": 216, - "t": 1695827137808, - "p": 0.78 - }, - { - "x": 273, - "y": 210, - "t": 1695827137826, - "p": 0.78 - }, - { - "x": 277, - "y": 206, - "t": 1695827137842, - "p": 0.76 - }, - { - "x": 279, - "y": 203, - "t": 1695827137859, - "p": 0.7 - }, - { - "x": 282, - "y": 201, - "t": 1695827137876, - "p": 0.7 - }, - { - "x": 286, - "y": 198, - "t": 1695827137892, - "p": 0.74 - }, - { - "x": 289, - "y": 196, - "t": 1695827137909, - "p": 0.7 - }, - { - "x": 292, - "y": 195, - "t": 1695827137925, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 274, - "y": 222, - "t": 1695827138250, - "p": 0.1 - }, - { - "x": 278, - "y": 220, - "t": 1695827138326, - "p": 0.73 - }, - { - "x": 282, - "y": 219, - "t": 1695827138343, - "p": 0.72 - }, - { - "x": 286, - "y": 219, - "t": 1695827138359, - "p": 0.71 - }, - { - "x": 289, - "y": 220, - "t": 1695827138376, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 289, - "y": 231, - "t": 1695827138671, - "p": 0.1 - }, - { - "x": 293, - "y": 231, - "t": 1695827138725, - "p": 0.71 - }, - { - "x": 296, - "y": 230, - "t": 1695827138742, - "p": 0.68 - }, - { - "x": 300, - "y": 229, - "t": 1695827138759, - "p": 0.72 - }, - { - "x": 306, - "y": 227, - "t": 1695827138792, - "p": 0.77 - }, - { - "x": 307, - "y": 224, - "t": 1695827138825, - "p": 0.68 - }, - { - "x": 304, - "y": 223, - "t": 1695827138876, - "p": 0.68 - }, - { - "x": 300, - "y": 224, - "t": 1695827138891, - "p": 0.72 - }, - { - "x": 295, - "y": 226, - "t": 1695827138909, - "p": 0.75 - }, - { - "x": 290, - "y": 230, - "t": 1695827138924, - "p": 0.77 - }, - { - "x": 288, - "y": 233, - "t": 1695827138942, - "p": 0.7 - }, - { - "x": 287, - "y": 236, - "t": 1695827138958, - "p": 0.68 - }, - { - "x": 289, - "y": 239, - "t": 1695827138992, - "p": 0.7 - }, - { - "x": 292, - "y": 240, - "t": 1695827139008, - "p": 0.68 - }, - { - "x": 295, - "y": 240, - "t": 1695827139025, - "p": 0.68 - }, - { - "x": 298, - "y": 240, - "t": 1695827139059, - "p": 0.68 - }, - { - "x": 301, - "y": 240, - "t": 1695827139074, - "p": 0.68 - }, - { - "x": 304, - "y": 240, - "t": 1695827139092, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 329, - "y": 242, - "t": 1695827139299, - "p": 0.1 - }, - { - "x": 325, - "y": 239, - "t": 1695827139341, - "p": 0.74 - }, - { - "x": 323, - "y": 236, - "t": 1695827139358, - "p": 0.7 - }, - { - "x": 321, - "y": 232, - "t": 1695827139375, - "p": 0.73 - }, - { - "x": 320, - "y": 228, - "t": 1695827139391, - "p": 0.72 - }, - { - "x": 321, - "y": 224, - "t": 1695827139408, - "p": 0.72 - }, - { - "x": 322, - "y": 220, - "t": 1695827139424, - "p": 0.72 - }, - { - "x": 324, - "y": 216, - "t": 1695827139441, - "p": 0.73 - }, - { - "x": 326, - "y": 212, - "t": 1695827139458, - "p": 0.73 - }, - { - "x": 330, - "y": 208, - "t": 1695827139474, - "p": 0.76 - }, - { - "x": 338, - "y": 201, - "t": 1695827139492, - "p": 0.67 - }, - { - "x": 343, - "y": 198, - "t": 1695827139508, - "p": 0.76 - }, - { - "x": 351, - "y": 192, - "t": 1695827139525, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 330, - "y": 224, - "t": 1695827140057, - "p": 0.1 - }, - { - "x": 325, - "y": 224, - "t": 1695827140123, - "p": 0.74 - }, - { - "x": 326, - "y": 221, - "t": 1695827140207, - "p": 0.68 - }, - { - "x": 330, - "y": 219, - "t": 1695827140241, - "p": 0.73 - }, - { - "x": 335, - "y": 219, - "t": 1695827140258, - "p": 0.74 - }, - { - "x": 338, - "y": 219, - "t": 1695827140273, - "p": 0.68 - }, - { - "x": 341, - "y": 218, - "t": 1695827140291, - "p": 0.68 - }, - { - "x": 344, - "y": 218, - "t": 1695827140307, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 347, - "y": 235, - "t": 1695827140569, - "p": 0.1 - }, - { - "x": 353, - "y": 232, - "t": 1695827140640, - "p": 0.78 - }, - { - "x": 359, - "y": 230, - "t": 1695827140657, - "p": 0.77 - }, - { - "x": 362, - "y": 229, - "t": 1695827140674, - "p": 0.68 - }, - { - "x": 365, - "y": 227, - "t": 1695827140707, - "p": 0.7 - }, - { - "x": 359, - "y": 224, - "t": 1695827140773, - "p": 0.78 - }, - { - "x": 355, - "y": 225, - "t": 1695827140790, - "p": 0.72 - }, - { - "x": 352, - "y": 226, - "t": 1695827140806, - "p": 0.68 - }, - { - "x": 349, - "y": 230, - "t": 1695827140840, - "p": 0.74 - }, - { - "x": 348, - "y": 233, - "t": 1695827140856, - "p": 0.68 - }, - { - "x": 349, - "y": 237, - "t": 1695827140907, - "p": 0.72 - }, - { - "x": 352, - "y": 237, - "t": 1695827140922, - "p": 0.68 - }, - { - "x": 355, - "y": 237, - "t": 1695827140940, - "p": 0.68 - }, - { - "x": 358, - "y": 237, - "t": 1695827140956, - "p": 0.68 - }, - { - "x": 361, - "y": 237, - "t": 1695827140973, - "p": 0.68 - }, - { - "x": 364, - "y": 237, - "t": 1695827140990, - "p": 0.68 - }, - { - "x": 367, - "y": 238, - "t": 1695827141006, - "p": 0.68 - } - ] - } -] diff --git a/test/integration/strokes/equation1.json b/test/integration/strokes/equation1.json deleted file mode 100644 index d23d6813e..000000000 --- a/test/integration/strokes/equation1.json +++ /dev/null @@ -1,402 +0,0 @@ -[ - { - "x": [ - 73, - 74, - 74, - 75, - 75, - 76, - 77, - 82, - 85, - 89, - 93, - 95, - 95, - 95, - 96, - 96, - 96, - 96, - 95, - 94, - 93, - 92, - 92, - 92, - 92, - 92, - 92, - 92, - 92, - 92, - 91, - 87, - 83, - 78, - 73, - 69, - 69, - 69, - 70, - 72, - 77, - 81, - 84, - 90, - 94, - 97, - 101, - 107, - 110, - 113, - 119, - 122 - ], - "y": [ - 168, - 173, - 176, - 179, - 182, - 185, - 188, - 189, - 188, - 185, - 182, - 177, - 173, - 170, - 165, - 161, - 164, - 168, - 172, - 176, - 181, - 188, - 191, - 198, - 205, - 214, - 224, - 233, - 240, - 244, - 249, - 252, - 252, - 250, - 246, - 242, - 238, - 234, - 231, - 228, - 223, - 220, - 219, - 217, - 214, - 213, - 211, - 209, - 208, - 206, - 202, - 201 - ] - }, - { - "x": [ - 176, - 184, - 189, - 195, - 199 - ], - "y": [ - 171, - 170, - 168, - 167, - 166 - ] - }, - { - "x": [ - 170, - 176, - 185, - 194, - 199, - 202, - 205, - 211, - 214 - ], - "y": [ - 189, - 189, - 189, - 188, - 187, - 187, - 187, - 187, - 187 - ] - }, - { - "x": [ - 270, - 276, - 279, - 282, - 285, - 286, - 286, - 286, - 286, - 283, - 278, - 274, - 271, - 267, - 271, - 274, - 276, - 277, - 278, - 278, - 272, - 269, - 265, - 262, - 259, - 255 - ], - "y": [ - 145, - 145, - 145, - 146, - 149, - 152, - 156, - 161, - 164, - 167, - 168, - 169, - 170, - 170, - 170, - 172, - 175, - 178, - 181, - 184, - 187, - 189, - 191, - 191, - 192, - 192 - ] - }, - { - "x": [ - 311, - 314, - 317, - 321, - 324, - 327, - 331, - 335, - 337, - 337, - 337, - 334, - 331, - 326, - 323, - 320, - 315 - ], - "y": [ - 180, - 175, - 171, - 168, - 167, - 167, - 168, - 171, - 174, - 177, - 181, - 183, - 185, - 186, - 186, - 187, - 187 - ] - }, - { - "x": [ - 349, - 344, - 341, - 338, - 336, - 335, - 335, - 337, - 340, - 343, - 347, - 351, - 354, - 357 - ], - "y": [ - 170, - 170, - 170, - 172, - 175, - 178, - 181, - 184, - 185, - 186, - 186, - 186, - 186, - 186 - ] - }, - { - "x": [ - 381, - 386, - 393, - 400, - 403, - 407, - 410, - 415, - 419 - ], - "y": [ - 181, - 181, - 181, - 181, - 180, - 180, - 180, - 180, - 180 - ] - }, - { - "x": [ - 402, - 401, - 401, - 401, - 401, - 401, - 401, - 401 - ], - "y": [ - 169, - 175, - 178, - 181, - 186, - 190, - 193, - 196 - ] - }, - { - "x": [ - 461, - 457, - 456, - 455, - 455, - 461, - 465, - 469, - 473, - 476, - 478, - 479, - 480, - 481, - 481, - 481, - 480, - 478, - 476, - 473, - 470, - 465, - 460, - 457, - 455, - 462, - 470, - 476, - 480, - 485, - 491, - 495, - 498 - ], - "y": [ - 165, - 160, - 157, - 152, - 149, - 147, - 147, - 147, - 147, - 147, - 150, - 154, - 158, - 162, - 165, - 168, - 171, - 174, - 177, - 181, - 184, - 184, - 186, - 187, - 191, - 193, - 193, - 193, - 193, - 193, - 193, - 193, - 193 - ] - } -] \ No newline at end of file diff --git a/test/integration/strokes/equation2.json b/test/integration/strokes/equation2.json deleted file mode 100644 index 119692948..000000000 --- a/test/integration/strokes/equation2.json +++ /dev/null @@ -1,67 +0,0 @@ -[ - { - "x": [ - 73, 74, 74, 75, 75, 76, 77, 82, 85, 89, 93, 95, 95, 95, 96, 96, 96, 96, - 95, 94, 93, 92, 92, 92, 92, 92, 92, 92, 92, 92, 91, 87, 83, 78, 73, 69, - 69, 69, 70, 72, 77, 81, 84, 90, 94, 97, 101, 107, 110, 113, 119, 122 - ], - "y": [ - 168, 173, 176, 179, 182, 185, 188, 189, 188, 185, 182, 177, 173, 170, 165, - 161, 164, 168, 172, 176, 181, 188, 191, 198, 205, 214, 224, 233, 240, 244, - 249, 252, 252, 250, 246, 242, 238, 234, 231, 228, 223, 220, 219, 217, 214, - 213, 211, 209, 208, 206, 202, 201 - ] - }, - { - "x": [176, 184, 189, 195, 199], - "y": [171, 170, 168, 167, 166] - }, - { - "x": [170, 176, 185, 194, 199, 202, 205, 211, 214], - "y": [189, 189, 189, 188, 187, 187, 187, 187, 187] - }, - { - "x": [ - 270, 276, 279, 282, 285, 286, 286, 286, 286, 283, 278, 274, 271, 267, 271, - 274, 276, 277, 278, 278, 272, 269, 265, 262, 259, 255 - ], - "y": [ - 145, 145, 145, 146, 149, 152, 156, 161, 164, 167, 168, 169, 170, 170, 170, - 172, 175, 178, 181, 184, 187, 189, 191, 191, 192, 192 - ] - }, - { - "x": [ - 311, 314, 317, 321, 324, 327, 331, 335, 337, 337, 337, 334, 331, 326, 323, - 320, 315 - ], - "y": [ - 180, 175, 171, 168, 167, 167, 168, 171, 174, 177, 181, 183, 185, 186, 186, - 187, 187 - ] - }, - { - "x": [349, 344, 341, 338, 336, 335, 335, 337, 340, 343, 347, 351, 354, 357], - "y": [170, 170, 170, 172, 175, 178, 181, 184, 185, 186, 186, 186, 186, 186] - }, - { - "x": [381, 386, 393, 400, 403, 407, 410, 415, 419], - "y": [181, 181, 181, 181, 180, 180, 180, 180, 180] - }, - { - "x": [402, 401, 401, 401, 401, 401, 401, 401], - "y": [169, 175, 178, 181, 186, 190, 193, 196] - }, - { - "x": [ - 461, 457, 456, 455, 455, 461, 465, 469, 473, 476, 478, 479, 480, 481, 481, - 481, 480, 478, 476, 473, 470, 465, 460, 457, 455, 462, 470, 476, 480, 485, - 491, 495, 498 - ], - "y": [ - 165, 160, 157, 152, 149, 147, 147, 147, 147, 147, 150, 154, 158, 162, 165, - 168, 171, 174, 177, 181, 184, 184, 186, 187, 191, 193, 193, 193, 193, 193, - 193, 193, 193 - ] - } -] diff --git a/test/integration/strokes/fence.json b/test/integration/strokes/fence.json deleted file mode 100644 index 4d8150690..000000000 --- a/test/integration/strokes/fence.json +++ /dev/null @@ -1,466 +0,0 @@ -[ - { - "x": [ - 234, - 237, - 238, - 239, - 242, - 244, - 246, - 247, - 249, - 250, - 252, - 253, - 253, - 253, - 253, - 253, - 253, - 253, - 253, - 253, - 253, - 253, - 254, - 255, - 257, - 258, - 258, - 262, - 266, - 273, - 283, - 297, - 313, - 325, - 338, - 345, - 349, - 353 - ], - "y": [ - 90, - 94, - 98, - 103, - 110, - 114, - 118, - 122, - 125, - 128, - 131, - 127, - 123, - 119, - 114, - 109, - 105, - 101, - 98, - 95, - 91, - 87, - 82, - 77, - 71, - 68, - 65, - 64, - 64, - 64, - 64, - 64, - 64, - 64, - 64, - 64, - 64, - 64 - ] - }, - { - "x": [ - 297, - 301, - 305, - 310, - 313, - 317, - 322, - 324, - 324, - 324, - 322, - 319, - 315, - 311, - 314, - 318, - 322, - 326, - 326, - 326, - 322, - 317, - 312, - 307, - 302, - 298, - 294, - 290 - ], - "y": [ - 82, - 82, - 82, - 81, - 81, - 82, - 83, - 86, - 89, - 93, - 96, - 98, - 98, - 98, - 100, - 102, - 105, - 107, - 110, - 113, - 114, - 117, - 118, - 119, - 121, - 121, - 121, - 120 - ] - }, - { - "x": [ - 250, - 250, - 253, - 255, - 258, - 260, - 263, - 266, - 268, - 270, - 273, - 274, - 277, - 277, - 277, - 277, - 277, - 278, - 279, - 280, - 280, - 280, - 280, - 286, - 294, - 302, - 312, - 326, - 344, - 365, - 385, - 401, - 413, - 416 - ], - "y": [ - 198, - 202, - 209, - 215, - 222, - 229, - 237, - 243, - 250, - 256, - 262, - 265, - 260, - 254, - 246, - 236, - 223, - 208, - 198, - 194, - 189, - 185, - 182, - 181, - 181, - 181, - 181, - 181, - 181, - 181, - 181, - 181, - 181, - 181 - ] - }, - { - "x": [ - 361, - 358, - 353, - 349, - 346, - 342, - 336, - 334, - 330, - 328, - 326, - 324, - 323, - 323, - 323, - 323, - 323, - 326, - 327, - 330, - 334, - 337, - 341, - 345, - 348, - 350, - 350, - 347, - 343, - 340, - 332, - 327, - 324, - 319 - ], - "y": [ - 212, - 210, - 209, - 208, - 208, - 208, - 211, - 214, - 218, - 221, - 225, - 230, - 234, - 242, - 247, - 254, - 258, - 264, - 267, - 269, - 270, - 270, - 268, - 266, - 262, - 259, - 254, - 253, - 251, - 250, - 248, - 248, - 248, - 248 - ] - }, - { - "x": [ - 229, - 226, - 223, - 220, - 216, - 213, - 210, - 206, - 205, - 202, - 201, - 200, - 199, - 199, - 199, - 199, - 199, - 199, - 199, - 199, - 199, - 199, - 198, - 196, - 194, - 190, - 186, - 182, - 176, - 169, - 163, - 156, - 151, - 146, - 143, - 139, - 136, - 134, - 133, - 133, - 135, - 138, - 142, - 146, - 150, - 151, - 154, - 156, - 157, - 157, - 157, - 157, - 157, - 157, - 157, - 154, - 151, - 148, - 145, - 140, - 135, - 134, - 134, - 134, - 134, - 135, - 136, - 136, - 138, - 144, - 151, - 162, - 174, - 183, - 193, - 202, - 214, - 222, - 228, - 233, - 236, - 241, - 244 - ], - "y": [ - 35, - 34, - 33, - 33, - 33, - 33, - 33, - 35, - 38, - 41, - 45, - 48, - 54, - 64, - 76, - 87, - 98, - 107, - 116, - 130, - 142, - 155, - 171, - 186, - 202, - 219, - 236, - 252, - 268, - 278, - 288, - 295, - 297, - 295, - 293, - 291, - 289, - 286, - 283, - 278, - 275, - 275, - 277, - 283, - 288, - 294, - 302, - 312, - 317, - 321, - 326, - 331, - 337, - 342, - 350, - 358, - 370, - 385, - 402, - 432, - 453, - 470, - 487, - 503, - 515, - 528, - 532, - 535, - 538, - 539, - 540, - 540, - 540, - 540, - 540, - 539, - 537, - 535, - 532, - 530, - 527, - 525, - 522 - ] - } -] \ No newline at end of file diff --git a/test/integration/strokes/h.json b/test/integration/strokes/h.json deleted file mode 100644 index 6ce8f758d..000000000 --- a/test/integration/strokes/h.json +++ /dev/null @@ -1,12 +0,0 @@ -[ - { - "x": [ - 397, 400, 404, 408, 411, 414, 417, 418, 418, 419, 419, 418, 414, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 413, 417, - 418, 419, 419, 421, 425, 426 - ], - "y": [ - 254, 249, 247, 242, 240, 235, 231, 227, 224, 220, 216, 211, 210, 213, 217, 221, 226, 230, 234, 238, 243, 247, 251, 255, 252, 248, 244, 241, 240, - 243, 247, 251, 254, 253, 250 - ] - } -] diff --git a/test/integration/strokes/hello.json b/test/integration/strokes/hello.json deleted file mode 100644 index 02810bbfc..000000000 --- a/test/integration/strokes/hello.json +++ /dev/null @@ -1,264 +0,0 @@ -[ - { - "x": [ - 397, - 400, - 404, - 408, - 411, - 414, - 417, - 418, - 418, - 419, - 419, - 418, - 414, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 412, - 413, - 417, - 418, - 419, - 419, - 421, - 425, - 426 - ], - "y": [ - 254, - 249, - 247, - 242, - 240, - 235, - 231, - 227, - 224, - 220, - 216, - 211, - 210, - 213, - 217, - 221, - 226, - 230, - 234, - 238, - 243, - 247, - 251, - 255, - 252, - 248, - 244, - 241, - 240, - 243, - 247, - 251, - 254, - 253, - 250 - ] - }, - { - "x": [ - 427, - 433, - 437, - 440, - 439, - 435, - 430, - 428, - 428, - 429, - 432, - 436, - 440, - 443 - ], - "y": [ - 244, - 248, - 245, - 242, - 238, - 238, - 240, - 245, - 249, - 253, - 253, - 253, - 251, - 251 - ] - }, - { - "x": [ - 443, - 450, - 453, - 456, - 459, - 460, - 461, - 461, - 461, - 460, - 456, - 452, - 450, - 450, - 450, - 450, - 450, - 450, - 450, - 450, - 449, - 449, - 451, - 455, - 460, - 463, - 464 - ], - "y": [ - 242, - 242, - 242, - 238, - 236, - 233, - 230, - 226, - 222, - 217, - 214, - 214, - 219, - 223, - 227, - 231, - 234, - 238, - 242, - 246, - 249, - 253, - 257, - 257, - 255, - 252, - 249 - ] - }, - { - "x": [ - 464, - 466, - 469, - 471, - 472, - 474, - 475, - 473, - 469, - 465, - 465, - 465, - 465, - 465, - 465, - 465, - 465, - 465, - 466, - 467, - 470, - 474, - 480, - 482 - ], - "y": [ - 243, - 236, - 234, - 230, - 227, - 223, - 219, - 216, - 215, - 216, - 220, - 225, - 229, - 233, - 237, - 240, - 244, - 248, - 252, - 255, - 256, - 254, - 250, - 247 - ] - }, - { - "x": [ - 489, - 483, - 482, - 482, - 482, - 485, - 489, - 494, - 495, - 495, - 492, - 490, - 494, - 497, - 501, - 504 - ], - "y": [ - 238, - 242, - 245, - 249, - 253, - 254, - 252, - 248, - 244, - 239, - 238, - 242, - 242, - 239, - 238, - 236 - ] - } -] \ No newline at end of file diff --git a/test/integration/strokes/helloHowAreYou.json b/test/integration/strokes/helloHowAreYou.json deleted file mode 100644 index 622f263d4..000000000 --- a/test/integration/strokes/helloHowAreYou.json +++ /dev/null @@ -1,762 +0,0 @@ -[ - { - "x": [ - 306, - 311, - 315, - 320, - 323, - 326, - 330, - 331, - 332, - 334, - 335, - 335, - 335, - 331, - 327, - 326, - 326, - 326, - 326, - 326, - 326, - 327, - 328, - 328, - 329, - 329, - 330, - 330, - 331, - 331, - 331, - 332, - 334, - 338, - 340, - 340, - 341, - 345, - 348, - 352, - 357, - 360, - 363, - 364, - 363, - 359, - 356, - 353, - 353, - 353, - 358, - 363, - 367, - 371, - 376, - 379, - 382, - 383, - 384, - 386, - 386, - 386, - 386, - 386, - 383, - 378, - 378, - 378, - 378, - 378, - 378, - 378, - 378, - 378, - 379, - 383, - 388, - 391, - 393, - 396, - 399, - 401, - 402, - 402, - 402, - 402, - 402, - 399, - 396, - 393, - 393, - 393, - 393, - 393, - 393, - 393, - 393, - 393, - 393, - 393, - 395, - 399, - 402, - 404, - 407, - 410, - 412, - 414, - 411, - 410, - 410, - 411, - 415, - 418, - 421, - 424, - 425, - 426, - 426, - 422, - 418, - 416, - 419, - 423, - 428, - 432, - 436, - 440 - ], - "y": [ - 255, - 257, - 254, - 250, - 246, - 241, - 235, - 232, - 228, - 224, - 220, - 216, - 212, - 210, - 214, - 217, - 221, - 225, - 228, - 231, - 234, - 237, - 242, - 246, - 250, - 253, - 258, - 262, - 259, - 256, - 252, - 248, - 243, - 243, - 247, - 251, - 256, - 258, - 257, - 255, - 252, - 248, - 245, - 241, - 238, - 240, - 242, - 246, - 249, - 253, - 254, - 254, - 254, - 254, - 252, - 248, - 242, - 238, - 234, - 229, - 226, - 223, - 219, - 215, - 213, - 215, - 218, - 223, - 228, - 232, - 235, - 238, - 242, - 247, - 251, - 251, - 252, - 249, - 246, - 244, - 239, - 234, - 230, - 226, - 222, - 219, - 216, - 212, - 212, - 215, - 220, - 224, - 228, - 232, - 235, - 239, - 243, - 247, - 250, - 254, - 258, - 258, - 258, - 255, - 253, - 249, - 246, - 242, - 242, - 246, - 249, - 253, - 253, - 253, - 253, - 252, - 249, - 245, - 240, - 236, - 236, - 241, - 242, - 242, - 242, - 242, - 240, - 240 - ] - }, - { - "x": [ - 483, - 489, - 493, - 496, - 500, - 503, - 506, - 508, - 511, - 511, - 511, - 508, - 504, - 502, - 502, - 502, - 502, - 502, - 502, - 502, - 503, - 503, - 503, - 503, - 503, - 504, - 509, - 511, - 512, - 512, - 515, - 520, - 523, - 524, - 525, - 526, - 526, - 526, - 526, - 530, - 534, - 538, - 540, - 540, - 539, - 536, - 533, - 528, - 525, - 524, - 527, - 530, - 533, - 537, - 541, - 546, - 550, - 554, - 552, - 552, - 552, - 552, - 552, - 554, - 557, - 560, - 563, - 564, - 564, - 564, - 564, - 564, - 564, - 564, - 564, - 567, - 571, - 576, - 580, - 582, - 582, - 582, - 582, - 579, - 580, - 585, - 588 - ], - "y": [ - 240, - 240, - 240, - 240, - 240, - 238, - 233, - 230, - 224, - 221, - 217, - 215, - 216, - 221, - 226, - 229, - 232, - 236, - 240, - 243, - 248, - 252, - 256, - 253, - 249, - 244, - 243, - 247, - 251, - 254, - 256, - 257, - 254, - 251, - 248, - 244, - 248, - 252, - 255, - 257, - 257, - 254, - 249, - 245, - 242, - 239, - 237, - 237, - 240, - 244, - 244, - 243, - 243, - 242, - 242, - 242, - 239, - 236, - 241, - 244, - 247, - 251, - 254, - 258, - 255, - 254, - 249, - 245, - 242, - 239, - 235, - 238, - 241, - 245, - 249, - 253, - 254, - 256, - 252, - 248, - 245, - 242, - 237, - 235, - 238, - 238, - 238 - ] - }, - { - "x": [ - 661, - 656, - 654, - 654, - 654, - 655, - 658, - 661, - 665, - 669, - 672, - 675, - 675, - 674, - 670, - 666, - 662, - 659, - 655, - 655 - ], - "y": [ - 234, - 234, - 238, - 241, - 245, - 249, - 254, - 254, - 254, - 252, - 249, - 245, - 241, - 238, - 234, - 232, - 232, - 232, - 236, - 239 - ] - }, - { - "x": [ - 677, - 677, - 677, - 677, - 680, - 684, - 688, - 693, - 694, - 694, - 695, - 694, - 697, - 701, - 704, - 707, - 710, - 710, - 710, - 710, - 712, - 716, - 719, - 722, - 725, - 730, - 732, - 735, - 735, - 733, - 729, - 725, - 725, - 725, - 725, - 733, - 740, - 743, - 750, - 753, - 759, - 763, - 770, - 774 - ], - "y": [ - 236, - 242, - 246, - 251, - 253, - 254, - 254, - 252, - 248, - 244, - 241, - 238, - 233, - 233, - 233, - 232, - 234, - 237, - 241, - 245, - 248, - 249, - 249, - 249, - 249, - 246, - 243, - 241, - 237, - 232, - 231, - 237, - 241, - 245, - 248, - 254, - 256, - 256, - 255, - 253, - 250, - 250, - 250, - 250 - ] - }, - { - "x": [ - 829, - 829, - 830, - 832, - 837, - 841, - 844, - 847, - 848, - 846, - 846, - 846, - 848, - 850, - 851, - 851, - 852, - 853, - 853, - 853, - 850, - 845, - 841, - 841, - 843, - 845, - 848, - 852, - 854, - 858, - 863, - 866, - 868, - 864, - 864, - 864, - 865, - 868, - 871, - 871, - 873, - 874, - 871, - 867, - 867, - 871, - 875, - 880, - 884, - 885, - 884, - 884, - 886, - 889, - 891, - 894, - 895, - 897, - 897, - 897, - 897, - 899, - 903, - 908, - 913 - ], - "y": [ - 231, - 241, - 246, - 249, - 249, - 245, - 240, - 237, - 232, - 237, - 243, - 249, - 254, - 260, - 263, - 267, - 271, - 274, - 277, - 282, - 284, - 281, - 278, - 273, - 269, - 263, - 259, - 255, - 251, - 248, - 243, - 241, - 238, - 238, - 243, - 246, - 250, - 252, - 250, - 247, - 244, - 239, - 235, - 236, - 239, - 240, - 239, - 238, - 236, - 240, - 244, - 247, - 252, - 251, - 248, - 244, - 241, - 237, - 241, - 244, - 251, - 255, - 260, - 259, - 256 - ] - }, - { - "x": [ - 951, - 948, - 948, - 949, - 952, - 956, - 960, - 963, - 963, - 961, - 959, - 954, - 953, - 953 - ], - "y": [ - 233, - 228, - 225, - 221, - 217, - 217, - 217, - 222, - 226, - 230, - 233, - 237, - 240, - 244 - ] - }, - { - "x": [ - 955 - ], - "y": [ - 255 - ] - } -] \ No newline at end of file diff --git a/test/integration/strokes/helloOneStroke.json b/test/integration/strokes/helloOneStroke.json deleted file mode 100644 index 761ac9bbc..000000000 --- a/test/integration/strokes/helloOneStroke.json +++ /dev/null @@ -1,442 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 335, - 340, - 352, - 359, - 366, - 368, - 367, - 363, - 359, - 356, - 352, - 349, - 345, - 341, - 340, - 341, - 341, - 341, - 342, - 342, - 344, - 342, - 342, - 343, - 345, - 346, - 349, - 351, - 357, - 359, - 360, - 360, - 360, - 363, - 366, - 372, - 376, - 380, - 383, - 382, - 378, - 375, - 372, - 372, - 371, - 372, - 375, - 380, - 383, - 390, - 396, - 400, - 403, - 405, - 403, - 400, - 398, - 395, - 393, - 392, - 392, - 392, - 393, - 395, - 399, - 402, - 408, - 412, - 417, - 421, - 423, - 424, - 422, - 420, - 417, - 414, - 412, - 409, - 409, - 410, - 413, - 414, - 416, - 417, - 417, - 419, - 422, - 425, - 430, - 434, - 437, - 438, - 437, - 436, - 440, - 443, - 446, - 442, - 439, - 436, - 433, - 437, - 441, - 448, - 452, - 455, - 458 - ], - "y": [ - 229, - 224, - 216, - 210, - 204, - 196, - 191, - 187, - 184, - 184, - 187, - 193, - 202, - 211, - 218, - 223, - 226, - 231, - 234, - 238, - 242, - 239, - 234, - 231, - 228, - 225, - 222, - 219, - 223, - 226, - 232, - 237, - 241, - 243, - 242, - 238, - 236, - 232, - 228, - 224, - 224, - 225, - 229, - 232, - 235, - 238, - 240, - 242, - 242, - 240, - 237, - 232, - 227, - 218, - 213, - 204, - 200, - 199, - 207, - 212, - 220, - 229, - 238, - 241, - 243, - 243, - 241, - 238, - 234, - 231, - 226, - 222, - 216, - 213, - 211, - 209, - 206, - 205, - 212, - 217, - 222, - 228, - 232, - 236, - 239, - 242, - 243, - 242, - 242, - 241, - 239, - 236, - 233, - 236, - 239, - 239, - 238, - 234, - 231, - 230, - 230, - 226, - 226, - 226, - 226, - 227, - 226 - ], - "t": [ - 1689715440342, - 1689715440389, - 1689715440405, - 1689715440421, - 1689715440438, - 1689715440455, - 1689715440471, - 1689715440488, - 1689715440505, - 1689715440521, - 1689715440574, - 1689715440588, - 1689715440605, - 1689715440621, - 1689715440638, - 1689715440655, - 1689715440671, - 1689715440687, - 1689715440704, - 1689715440738, - 1689715441024, - 1689715441154, - 1689715441170, - 1689715441204, - 1689715441237, - 1689715441254, - 1689715441271, - 1689715441304, - 1689715441403, - 1689715441437, - 1689715441454, - 1689715441471, - 1689715441487, - 1689715441520, - 1689715441620, - 1689715441636, - 1689715441654, - 1689715441671, - 1689715441686, - 1689715441721, - 1689715441753, - 1689715441770, - 1689715441820, - 1689715441836, - 1689715441853, - 1689715441870, - 1689715441887, - 1689715441903, - 1689715441920, - 1689715441953, - 1689715441970, - 1689715441986, - 1689715442003, - 1689715442020, - 1689715442037, - 1689715442053, - 1689715442069, - 1689715442170, - 1689715442187, - 1689715442203, - 1689715442219, - 1689715442237, - 1689715442253, - 1689715442269, - 1689715442353, - 1689715442370, - 1689715442402, - 1689715442419, - 1689715442436, - 1689715442453, - 1689715442469, - 1689715442486, - 1689715442503, - 1689715442519, - 1689715442536, - 1689715442553, - 1689715442587, - 1689715442669, - 1689715442686, - 1689715442702, - 1689715442719, - 1689715442736, - 1689715442752, - 1689715442769, - 1689715442786, - 1689715442819, - 1689715442869, - 1689715442902, - 1689715442919, - 1689715442936, - 1689715442969, - 1689715443002, - 1689715443052, - 1689715443145, - 1689715443185, - 1689715443202, - 1689715443219, - 1689715443335, - 1689715443352, - 1689715443368, - 1689715443385, - 1689715443535, - 1689715443552, - 1689715443569, - 1689715443585, - 1689715443602, - 1689715443685 - ], - "p": [ - 0.5, - 0.73, - 0.66, - 0.81, - 0.81, - 0.8, - 0.75, - 0.76, - 0.74, - 0.68, - 0.74, - 0.78, - 0.82, - 0.82, - 0.79, - 0.75, - 0.68, - 0.74, - 0.68, - 0.71, - 0.73, - 0.7, - 0.74, - 0.68, - 0.7, - 0.68, - 0.72, - 0.7, - 0.79, - 0.7, - 0.77, - 0.74, - 0.71, - 0.7, - 0.68, - 0.79, - 0.73, - 0.76, - 0.74, - 0.72, - 0.71, - 0.68, - 0.74, - 0.68, - 0.68, - 0.68, - 0.7, - 0.75, - 0.68, - 0.79, - 0.78, - 0.77, - 0.76, - 0.81, - 0.75, - 0.82, - 0.73, - 0.68, - 0.8, - 0.75, - 0.8, - 0.81, - 0.81, - 0.7, - 0.73, - 0.68, - 0.77, - 0.74, - 0.77, - 0.74, - 0.75, - 0.72, - 0.77, - 0.7, - 0.7, - 0.7, - 0.7, - 0.68, - 0.78, - 0.75, - 0.76, - 0.77, - 0.73, - 0.72, - 0.68, - 0.7, - 0.68, - 0.68, - 0.74, - 0.72, - 0.7, - 0.68, - 0.68, - 0.68, - 0.74, - 0.68, - 0.68, - 0.76, - 0.72, - 0.68, - 0.68, - 0.76, - 0.71, - 0.78, - 0.71, - 0.68, - 0.68 - ] - } -] diff --git a/test/integration/strokes/helloOneStrokeSurrounded.json b/test/integration/strokes/helloOneStrokeSurrounded.json deleted file mode 100644 index e8e3d0a5d..000000000 --- a/test/integration/strokes/helloOneStrokeSurrounded.json +++ /dev/null @@ -1,70 +0,0 @@ -[ - { - "x": [ - 335, 340, 352, 359, 366, 368, 367, 363, 359, 356, 352, 349, 345, 341, 340, 341, 341, 341, 342, 342, 344, 342, 342, 343, 345, 346, 349, 351, 357, - 359, 360, 360, 360, 363, 366, 372, 376, 380, 383, 382, 378, 375, 372, 372, 371, 372, 375, 380, 383, 390, 396, 400, 403, 405, 403, 400, 398, 395, - 393, 392, 392, 392, 393, 395, 399, 402, 408, 412, 417, 421, 423, 424, 422, 420, 417, 414, 412, 409, 409, 410, 413, 414, 416, 417, 417, 419, 422, - 425, 430, 434, 437, 438, 437, 436, 440, 443, 446, 442, 439, 436, 433, 437, 441, 448, 452, 455, 458 - ], - "y": [ - 229, 224, 216, 210, 204, 196, 191, 187, 184, 184, 187, 193, 202, 211, 218, 223, 226, 231, 234, 238, 242, 239, 234, 231, 228, 225, 222, 219, 223, - 226, 232, 237, 241, 243, 242, 238, 236, 232, 228, 224, 224, 225, 229, 232, 235, 238, 240, 242, 242, 240, 237, 232, 227, 218, 213, 204, 200, 199, - 207, 212, 220, 229, 238, 241, 243, 243, 241, 238, 234, 231, 226, 222, 216, 213, 211, 209, 206, 205, 212, 217, 222, 228, 232, 236, 239, 242, 243, - 242, 242, 241, 239, 236, 233, 236, 239, 239, 238, 234, 231, 230, 230, 226, 226, 226, 226, 227, 226 - ], - "t": [ - 1689715440342, 1689715440389, 1689715440405, 1689715440421, 1689715440438, 1689715440455, 1689715440471, 1689715440488, 1689715440505, - 1689715440521, 1689715440574, 1689715440588, 1689715440605, 1689715440621, 1689715440638, 1689715440655, 1689715440671, 1689715440687, - 1689715440704, 1689715440738, 1689715441024, 1689715441154, 1689715441170, 1689715441204, 1689715441237, 1689715441254, 1689715441271, - 1689715441304, 1689715441403, 1689715441437, 1689715441454, 1689715441471, 1689715441487, 1689715441520, 1689715441620, 1689715441636, - 1689715441654, 1689715441671, 1689715441686, 1689715441721, 1689715441753, 1689715441770, 1689715441820, 1689715441836, 1689715441853, - 1689715441870, 1689715441887, 1689715441903, 1689715441920, 1689715441953, 1689715441970, 1689715441986, 1689715442003, 1689715442020, - 1689715442037, 1689715442053, 1689715442069, 1689715442170, 1689715442187, 1689715442203, 1689715442219, 1689715442237, 1689715442253, - 1689715442269, 1689715442353, 1689715442370, 1689715442402, 1689715442419, 1689715442436, 1689715442453, 1689715442469, 1689715442486, - 1689715442503, 1689715442519, 1689715442536, 1689715442553, 1689715442587, 1689715442669, 1689715442686, 1689715442702, 1689715442719, - 1689715442736, 1689715442752, 1689715442769, 1689715442786, 1689715442819, 1689715442869, 1689715442902, 1689715442919, 1689715442936, - 1689715442969, 1689715443002, 1689715443052, 1689715443145, 1689715443185, 1689715443202, 1689715443219, 1689715443335, 1689715443352, - 1689715443368, 1689715443385, 1689715443535, 1689715443552, 1689715443569, 1689715443585, 1689715443602, 1689715443685 - ], - "p": [ - 0.5, 0.73, 0.66, 0.81, 0.81, 0.8, 0.75, 0.76, 0.74, 0.68, 0.74, 0.78, 0.82, 0.82, 0.79, 0.75, 0.68, 0.74, 0.68, 0.71, 0.73, 0.7, 0.74, 0.68, - 0.7, 0.68, 0.72, 0.7, 0.79, 0.7, 0.77, 0.74, 0.71, 0.7, 0.68, 0.79, 0.73, 0.76, 0.74, 0.72, 0.71, 0.68, 0.74, 0.68, 0.68, 0.68, 0.7, 0.75, 0.68, - 0.79, 0.78, 0.77, 0.76, 0.81, 0.75, 0.82, 0.73, 0.68, 0.8, 0.75, 0.8, 0.81, 0.81, 0.7, 0.73, 0.68, 0.77, 0.74, 0.77, 0.74, 0.75, 0.72, 0.77, - 0.7, 0.7, 0.7, 0.7, 0.68, 0.78, 0.75, 0.76, 0.77, 0.73, 0.72, 0.68, 0.7, 0.68, 0.68, 0.74, 0.72, 0.7, 0.68, 0.68, 0.68, 0.74, 0.68, 0.68, 0.76, - 0.72, 0.68, 0.68, 0.76, 0.71, 0.78, 0.71, 0.68, 0.68 - ] - }, - { - "x": [ - 386, 382, 368, 360, 352, 347, 343, 339, 335, 332, 328, 325, 323, 319, 317, 314, 311, 309, 309, 308, 308, 307, 307, 307, 307, 307, 307, 307, 308, - 311, 315, 323, 330, 334, 339, 345, 350, 356, 362, 365, 374, 377, 382, 385, 388, 391, 396, 399, 403, 407, 412, 419, 428, 438, 442, 446, 451, 454, - 458, 461, 465, 469, 469, 470, 471, 471, 471, 471, 470, 468, 466, 464, 462, 460, 457, 455, 451, 445, 440, 437, 429, 425, 421, 418, 415, 410, 404, - 396, 392, 389, 384, 381, 376, 373 - ], - "y": [ - 168, 168, 168, 168, 168, 168, 169, 169, 170, 171, 174, 176, 180, 182, 185, 191, 197, 203, 207, 212, 216, 219, 225, 228, 231, 238, 244, 247, 251, - 254, 256, 256, 257, 258, 258, 258, 258, 260, 260, 260, 261, 262, 263, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 263, 263, 262, - 261, 259, 256, 251, 248, 245, 242, 237, 233, 230, 225, 222, 219, 215, 212, 208, 205, 202, 196, 191, 188, 184, 181, 179, 178, 177, 177, 176, 174, - 172, 172, 171, 170, 169, 168, 167 - ], - "t": [ - 1689777777997, 1689777778043, 1689777778095, 1689777778112, 1689777778131, 1689777778145, 1689777778162, 1689777778195, 1689777778212, - 1689777778229, 1689777778262, 1689777778279, 1689777778295, 1689777778312, 1689777778328, 1689777778345, 1689777778361, 1689777778395, - 1689777778411, 1689777778428, 1689777778462, 1689777778478, 1689777778512, 1689777778528, 1689777778545, 1689777778578, 1689777778612, - 1689777778628, 1689777778645, 1689777778679, 1689777778695, 1689777778728, 1689777778746, 1689777778762, 1689777778779, 1689777778795, - 1689777778812, 1689777778829, 1689777778846, 1689777778862, 1689777778879, 1689777778896, 1689777778913, 1689777778929, 1689777778946, - 1689777778979, 1689777779013, 1689777779046, 1689777779079, 1689777779096, 1689777779113, 1689777779129, 1689777779146, 1689777779162, - 1689777779179, 1689777779196, 1689777779212, 1689777779229, 1689777779246, 1689777779330, 1689777779363, 1689777779396, 1689777779412, - 1689777779430, 1689777779446, 1689777779462, 1689777779480, 1689777779496, 1689777779529, 1689777779547, 1689777779563, 1689777779597, - 1689777779612, 1689777779646, 1689777779679, 1689777779696, 1689777779730, 1689777779763, 1689777779797, 1689777779813, 1689777779847, - 1689777779863, 1689777779880, 1689777779896, 1689777779913, 1689777779946, 1689777779980, 1689777779997, 1689777780013, 1689777780030, - 1689777780063, 1689777780097, 1689777780130, 1689777780163 - ], - "p": [ - 0.5, 0.8, 0.56, 0.8, 0.8, 0.74, 0.72, 0.71, 0.72, 0.68, 0.74, 0.7, 0.73, 0.73, 0.7, 0.78, 0.78, 0.77, 0.71, 0.75, 0.71, 0.68, 0.77, 0.68, 0.68, - 0.78, 0.77, 0.68, 0.72, 0.72, 0.73, 0.8, 0.79, 0.72, 0.74, 0.77, 0.74, 0.77, 0.77, 0.68, 0.81, 0.68, 0.75, 0.68, 0.68, 0.68, 0.74, 0.68, 0.71, - 0.71, 0.74, 0.78, 0.81, 0.68, 0.71, 0.72, 0.74, 0.68, 0.72, 0.7, 0.74, 0.77, 0.68, 0.68, 0.68, 0.74, 0.71, 0.68, 0.75, 0.7, 0.7, 0.73, 0.7, - 0.73, 0.72, 0.7, 0.79, 0.8, 0.76, 0.74, 0.81, 0.73, 0.72, 0.68, 0.68, 0.75, 0.77, 0.8, 0.71, 0.68, 0.75, 0.68, 0.75, 0.68 - ] - } -] diff --git a/test/integration/strokes/helloStrike.json b/test/integration/strokes/helloStrike.json deleted file mode 100644 index 6f0a0b12b..000000000 --- a/test/integration/strokes/helloStrike.json +++ /dev/null @@ -1,410 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 261, - 262, - 265, - 270, - 276, - 280, - 282, - 283, - 280, - 273, - 269, - 266, - 266, - 264, - 263, - 264, - 264, - 264, - 264, - 264, - 264, - 265, - 268, - 271, - 275, - 277, - 281, - 286, - 290, - 293, - 293, - 290, - 287, - 287, - 290, - 295, - 299, - 304, - 313, - 325, - 331, - 332, - 328, - 323, - 319, - 318, - 316, - 315, - 315, - 315, - 318, - 320, - 323, - 327, - 331, - 334, - 337, - 342, - 347, - 349, - 348, - 346, - 343, - 341, - 340, - 338, - 337, - 338, - 338, - 340, - 345, - 348, - 352, - 353, - 352, - 357, - 361, - 364, - 367, - 370, - 370, - 369, - 365, - 361, - 368, - 376, - 382, - 386 - ], - "y": [ - 292, - 289, - 285, - 282, - 273, - 263, - 258, - 251, - 247, - 244, - 249, - 256, - 261, - 267, - 272, - 279, - 285, - 291, - 294, - 291, - 288, - 285, - 282, - 281, - 286, - 289, - 293, - 288, - 287, - 285, - 282, - 283, - 284, - 287, - 290, - 291, - 291, - 289, - 284, - 275, - 267, - 260, - 250, - 244, - 246, - 252, - 259, - 265, - 271, - 278, - 284, - 288, - 291, - 292, - 293, - 292, - 288, - 281, - 272, - 263, - 256, - 252, - 253, - 256, - 260, - 265, - 273, - 279, - 286, - 289, - 292, - 292, - 289, - 284, - 289, - 292, - 291, - 290, - 288, - 286, - 283, - 279, - 277, - 277, - 277, - 277, - 278, - 279 - ], - "t": [ - 1691512951866, - 1691512951913, - 1691512951935, - 1691512951952, - 1691512951968, - 1691512951985, - 1691512952001, - 1691512952018, - 1691512952036, - 1691512952051, - 1691512952085, - 1691512952102, - 1691512952118, - 1691512952135, - 1691512952152, - 1691512952168, - 1691512952186, - 1691512952202, - 1691512952262, - 1691512952385, - 1691512952402, - 1691512952419, - 1691512952452, - 1691512952486, - 1691512952536, - 1691512952552, - 1691512952585, - 1691512952668, - 1691512952686, - 1691512952702, - 1691512952735, - 1691512952752, - 1691512952785, - 1691512952819, - 1691512952852, - 1691512952885, - 1691512952902, - 1691512952918, - 1691512952935, - 1691512952952, - 1691512952968, - 1691512952985, - 1691512953002, - 1691512953018, - 1691512953068, - 1691512953085, - 1691512953102, - 1691512953118, - 1691512953136, - 1691512953152, - 1691512953168, - 1691512953185, - 1691512953202, - 1691512953218, - 1691512953252, - 1691512953269, - 1691512953286, - 1691512953302, - 1691512953319, - 1691512953335, - 1691512953352, - 1691512953368, - 1691512953436, - 1691512953452, - 1691512953469, - 1691512953485, - 1691512953502, - 1691512953518, - 1691512953535, - 1691512953552, - 1691512953585, - 1691512953602, - 1691512953672, - 1691512953702, - 1691512953785, - 1691512953818, - 1691512953835, - 1691512953852, - 1691512953868, - 1691512953885, - 1691512953902, - 1691512953919, - 1691512953935, - 1691512953952, - 1691512954085, - 1691512954102, - 1691512954119, - 1691512954135 - ], - "p": [ - 0.5, - 0.82, - 0.74, - 0.76, - 0.67, - 0.67, - 0.75, - 0.79, - 0.74, - 0.79, - 0.77, - 0.79, - 0.74, - 0.77, - 0.75, - 0.79, - 0.77, - 0.77, - 0.68, - 0.68, - 0.68, - 0.68, - 0.72, - 0.68, - 0.77, - 0.7, - 0.76, - 0.79, - 0.72, - 0.7, - 0.68, - 0.68, - 0.68, - 0.68, - 0.72, - 0.75, - 0.71, - 0.75, - 0.68, - 0.61, - 0.68, - 0.79, - 0.67, - 0.8, - 0.73, - 0.77, - 0.79, - 0.77, - 0.77, - 0.78, - 0.78, - 0.73, - 0.72, - 0.72, - 0.72, - 0.68, - 0.74, - 0.81, - 0.68, - 0.81, - 0.79, - 0.73, - 0.68, - 0.7, - 0.72, - 0.75, - 0.8, - 0.77, - 0.78, - 0.7, - 0.76, - 0.68, - 0.74, - 0.75, - 0.75, - 0.76, - 0.72, - 0.68, - 0.7, - 0.7, - 0.68, - 0.72, - 0.73, - 0.71, - 0.78, - 0.8, - 0.77, - 0.72 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 252, - 255, - 275, - 313, - 355, - 388, - 395, - 391 - ], - "y": [ - 287, - 287, - 290, - 290, - 283, - 279, - 278, - 276 - ], - "t": [ - 1691512954733, - 1691512954752, - 1691512954769, - 1691512954786, - 1691512954803, - 1691512954819, - 1691512954836, - 1691512954885 - ], - "p": [ - 0.5, - 0.83, - 0.45, - 0.38, - 0.35, - 0.42, - 0.79, - 0.73 - ] - } -] diff --git a/test/integration/strokes/interact/buenosAires.json b/test/integration/strokes/interact/buenosAires.json deleted file mode 100644 index 989714234..000000000 --- a/test/integration/strokes/interact/buenosAires.json +++ /dev/null @@ -1,1082 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 108, - "y": 140, - "t": 1695826051889, - "p": 0.1 - }, - { - "x": 108, - "y": 143, - "t": 1695826051956, - "p": 0.68 - }, - { - "x": 109, - "y": 147, - "t": 1695826051972, - "p": 0.72 - }, - { - "x": 110, - "y": 152, - "t": 1695826051989, - "p": 0.75 - }, - { - "x": 110, - "y": 158, - "t": 1695826052005, - "p": 0.77 - }, - { - "x": 111, - "y": 165, - "t": 1695826052023, - "p": 0.79 - }, - { - "x": 112, - "y": 169, - "t": 1695826052039, - "p": 0.72 - }, - { - "x": 112, - "y": 172, - "t": 1695826052055, - "p": 0.68 - }, - { - "x": 112, - "y": 175, - "t": 1695826052072, - "p": 0.68 - }, - { - "x": 112, - "y": 179, - "t": 1695826052089, - "p": 0.71 - }, - { - "x": 113, - "y": 183, - "t": 1695826052122, - "p": 0.72 - }, - { - "x": 113, - "y": 179, - "t": 1695826052405, - "p": 0.71 - }, - { - "x": 113, - "y": 176, - "t": 1695826052421, - "p": 0.68 - }, - { - "x": 113, - "y": 173, - "t": 1695826052455, - "p": 0.68 - }, - { - "x": 115, - "y": 170, - "t": 1695826052488, - "p": 0.7 - }, - { - "x": 117, - "y": 167, - "t": 1695826052522, - "p": 0.7 - }, - { - "x": 120, - "y": 166, - "t": 1695826052588, - "p": 0.68 - }, - { - "x": 124, - "y": 168, - "t": 1695826052605, - "p": 0.73 - }, - { - "x": 127, - "y": 171, - "t": 1695826052622, - "p": 0.72 - }, - { - "x": 130, - "y": 173, - "t": 1695826052638, - "p": 0.7 - }, - { - "x": 132, - "y": 176, - "t": 1695826052655, - "p": 0.7 - }, - { - "x": 133, - "y": 179, - "t": 1695826052705, - "p": 0.68 - }, - { - "x": 132, - "y": 182, - "t": 1695826052739, - "p": 0.68 - }, - { - "x": 127, - "y": 185, - "t": 1695826052772, - "p": 0.76 - }, - { - "x": 119, - "y": 189, - "t": 1695826052789, - "p": 0.81 - }, - { - "x": 112, - "y": 191, - "t": 1695826052805, - "p": 0.79 - }, - { - "x": 109, - "y": 192, - "t": 1695826052878, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 141, - "y": 161, - "t": 1695826053292, - "p": 0.1 - }, - { - "x": 140, - "y": 165, - "t": 1695826053337, - "p": 0.72 - }, - { - "x": 139, - "y": 169, - "t": 1695826053354, - "p": 0.72 - }, - { - "x": 139, - "y": 173, - "t": 1695826053371, - "p": 0.71 - }, - { - "x": 139, - "y": 177, - "t": 1695826053388, - "p": 0.71 - }, - { - "x": 139, - "y": 181, - "t": 1695826053404, - "p": 0.71 - }, - { - "x": 139, - "y": 184, - "t": 1695826053438, - "p": 0.68 - }, - { - "x": 143, - "y": 183, - "t": 1695826053520, - "p": 0.72 - }, - { - "x": 146, - "y": 179, - "t": 1695826053537, - "p": 0.74 - }, - { - "x": 150, - "y": 172, - "t": 1695826053554, - "p": 0.8 - }, - { - "x": 152, - "y": 167, - "t": 1695826053587, - "p": 0.75 - }, - { - "x": 153, - "y": 164, - "t": 1695826053620, - "p": 0.68 - }, - { - "x": 153, - "y": 169, - "t": 1695826053687, - "p": 0.74 - }, - { - "x": 153, - "y": 172, - "t": 1695826053704, - "p": 0.68 - }, - { - "x": 153, - "y": 176, - "t": 1695826053721, - "p": 0.71 - }, - { - "x": 154, - "y": 179, - "t": 1695826053737, - "p": 0.68 - }, - { - "x": 155, - "y": 182, - "t": 1695826053771, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 164, - "y": 177, - "t": 1695826054104, - "p": 0.1 - }, - { - "x": 167, - "y": 175, - "t": 1695826054204, - "p": 0.7 - }, - { - "x": 171, - "y": 174, - "t": 1695826054219, - "p": 0.72 - }, - { - "x": 174, - "y": 173, - "t": 1695826054237, - "p": 0.68 - }, - { - "x": 178, - "y": 171, - "t": 1695826054253, - "p": 0.73 - }, - { - "x": 179, - "y": 168, - "t": 1695826054286, - "p": 0.68 - }, - { - "x": 175, - "y": 167, - "t": 1695826054387, - "p": 0.72 - }, - { - "x": 171, - "y": 168, - "t": 1695826054403, - "p": 0.72 - }, - { - "x": 168, - "y": 170, - "t": 1695826054421, - "p": 0.7 - }, - { - "x": 165, - "y": 173, - "t": 1695826054454, - "p": 0.72 - }, - { - "x": 165, - "y": 176, - "t": 1695826054486, - "p": 0.68 - }, - { - "x": 168, - "y": 178, - "t": 1695826054503, - "p": 0.7 - }, - { - "x": 172, - "y": 180, - "t": 1695826054537, - "p": 0.73 - }, - { - "x": 176, - "y": 182, - "t": 1695826054570, - "p": 0.73 - }, - { - "x": 179, - "y": 182, - "t": 1695826054603, - "p": 0.68 - }, - { - "x": 182, - "y": 183, - "t": 1695826054637, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 191, - "y": 167, - "t": 1695826054845, - "p": 0.1 - }, - { - "x": 190, - "y": 171, - "t": 1695826054869, - "p": 0.72 - }, - { - "x": 190, - "y": 175, - "t": 1695826054887, - "p": 0.71 - }, - { - "x": 190, - "y": 178, - "t": 1695826054903, - "p": 0.68 - }, - { - "x": 190, - "y": 181, - "t": 1695826054920, - "p": 0.68 - }, - { - "x": 191, - "y": 178, - "t": 1695826055070, - "p": 0.68 - }, - { - "x": 192, - "y": 174, - "t": 1695826055086, - "p": 0.72 - }, - { - "x": 193, - "y": 170, - "t": 1695826055103, - "p": 0.72 - }, - { - "x": 196, - "y": 166, - "t": 1695826055136, - "p": 0.74 - }, - { - "x": 199, - "y": 167, - "t": 1695826055202, - "p": 0.68 - }, - { - "x": 201, - "y": 170, - "t": 1695826055220, - "p": 0.7 - }, - { - "x": 204, - "y": 174, - "t": 1695826055235, - "p": 0.74 - }, - { - "x": 205, - "y": 177, - "t": 1695826055253, - "p": 0.68 - }, - { - "x": 207, - "y": 182, - "t": 1695826055286, - "p": 0.75 - }, - { - "x": 208, - "y": 185, - "t": 1695826055319, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 217, - "y": 175, - "t": 1695826055635, - "p": 0.1 - }, - { - "x": 217, - "y": 178, - "t": 1695826055669, - "p": 0.68 - }, - { - "x": 217, - "y": 181, - "t": 1695826055686, - "p": 0.68 - }, - { - "x": 218, - "y": 185, - "t": 1695826055703, - "p": 0.72 - }, - { - "x": 220, - "y": 188, - "t": 1695826055736, - "p": 0.7 - }, - { - "x": 223, - "y": 187, - "t": 1695826055752, - "p": 0.68 - }, - { - "x": 226, - "y": 186, - "t": 1695826055785, - "p": 0.68 - }, - { - "x": 229, - "y": 184, - "t": 1695826055802, - "p": 0.7 - }, - { - "x": 235, - "y": 180, - "t": 1695826055820, - "p": 0.79 - }, - { - "x": 236, - "y": 177, - "t": 1695826055835, - "p": 0.68 - }, - { - "x": 232, - "y": 174, - "t": 1695826055868, - "p": 0.74 - }, - { - "x": 229, - "y": 173, - "t": 1695826055886, - "p": 0.68 - }, - { - "x": 225, - "y": 172, - "t": 1695826055902, - "p": 0.72 - }, - { - "x": 221, - "y": 172, - "t": 1695826055919, - "p": 0.71 - }, - { - "x": 217, - "y": 173, - "t": 1695826055935, - "p": 0.72 - }, - { - "x": 214, - "y": 175, - "t": 1695826055952, - "p": 0.7 - }, - { - "x": 211, - "y": 177, - "t": 1695826055985, - "p": 0.7 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 254, - "y": 166, - "t": 1695826056453, - "p": 0.1 - }, - { - "x": 248, - "y": 169, - "t": 1695826056485, - "p": 0.78 - }, - { - "x": 245, - "y": 171, - "t": 1695826056502, - "p": 0.7 - }, - { - "x": 243, - "y": 175, - "t": 1695826056534, - "p": 0.73 - }, - { - "x": 246, - "y": 176, - "t": 1695826056585, - "p": 0.68 - }, - { - "x": 251, - "y": 177, - "t": 1695826056618, - "p": 0.75 - }, - { - "x": 255, - "y": 180, - "t": 1695826056652, - "p": 0.74 - }, - { - "x": 254, - "y": 183, - "t": 1695826056701, - "p": 0.68 - }, - { - "x": 249, - "y": 186, - "t": 1695826056734, - "p": 0.76 - }, - { - "x": 245, - "y": 188, - "t": 1695826056752, - "p": 0.73 - }, - { - "x": 242, - "y": 190, - "t": 1695826056768, - "p": 0.7 - }, - { - "x": 239, - "y": 191, - "t": 1695826056801, - "p": 0.68 - }, - { - "x": 235, - "y": 192, - "t": 1695826056835, - "p": 0.72 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 293, - "y": 174, - "t": 1695826057890, - "p": 0.1 - }, - { - "x": 289, - "y": 178, - "t": 1695826057917, - "p": 0.76 - }, - { - "x": 289, - "y": 181, - "t": 1695826057934, - "p": 0.68 - }, - { - "x": 293, - "y": 183, - "t": 1695826057967, - "p": 0.73 - }, - { - "x": 296, - "y": 184, - "t": 1695826057984, - "p": 0.68 - }, - { - "x": 299, - "y": 184, - "t": 1695826058000, - "p": 0.68 - }, - { - "x": 303, - "y": 183, - "t": 1695826058018, - "p": 0.72 - }, - { - "x": 306, - "y": 182, - "t": 1695826058033, - "p": 0.68 - }, - { - "x": 310, - "y": 179, - "t": 1695826058051, - "p": 0.74 - }, - { - "x": 312, - "y": 175, - "t": 1695826058084, - "p": 0.73 - }, - { - "x": 307, - "y": 171, - "t": 1695826058117, - "p": 0.77 - }, - { - "x": 302, - "y": 170, - "t": 1695826058133, - "p": 0.75 - }, - { - "x": 297, - "y": 169, - "t": 1695826058151, - "p": 0.75 - }, - { - "x": 293, - "y": 169, - "t": 1695826058167, - "p": 0.71 - }, - { - "x": 289, - "y": 172, - "t": 1695826058200, - "p": 0.74 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 312, - "y": 168, - "t": 1695826058669, - "p": 0.1 - }, - { - "x": 313, - "y": 173, - "t": 1695826058699, - "p": 0.75 - }, - { - "x": 313, - "y": 177, - "t": 1695826058716, - "p": 0.71 - }, - { - "x": 313, - "y": 181, - "t": 1695826058733, - "p": 0.71 - }, - { - "x": 314, - "y": 184, - "t": 1695826058750, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 326, - "y": 166, - "t": 1695826059196, - "p": 0.1 - }, - { - "x": 327, - "y": 172, - "t": 1695826059283, - "p": 0.77 - }, - { - "x": 327, - "y": 175, - "t": 1695826059299, - "p": 0.68 - }, - { - "x": 327, - "y": 178, - "t": 1695826059316, - "p": 0.68 - }, - { - "x": 328, - "y": 181, - "t": 1695826059365, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 324, - "y": 152, - "t": 1695826059729, - "p": 0.1 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 338, - "y": 171, - "t": 1695826060147, - "p": 0.1 - }, - { - "x": 337, - "y": 174, - "t": 1695826060166, - "p": 0.68 - }, - { - "x": 337, - "y": 179, - "t": 1695826060198, - "p": 0.74 - }, - { - "x": 339, - "y": 183, - "t": 1695826060232, - "p": 0.73 - }, - { - "x": 336, - "y": 177, - "t": 1695826060431, - "p": 0.78 - }, - { - "x": 336, - "y": 174, - "t": 1695826060449, - "p": 0.68 - }, - { - "x": 338, - "y": 171, - "t": 1695826060464, - "p": 0.7 - }, - { - "x": 341, - "y": 169, - "t": 1695826060481, - "p": 0.7 - }, - { - "x": 344, - "y": 167, - "t": 1695826060498, - "p": 0.7 - }, - { - "x": 347, - "y": 166, - "t": 1695826060549, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 353, - "y": 173, - "t": 1695826060888, - "p": 0.1 - }, - { - "x": 356, - "y": 173, - "t": 1695826060948, - "p": 0.68 - }, - { - "x": 359, - "y": 173, - "t": 1695826060981, - "p": 0.68 - }, - { - "x": 363, - "y": 171, - "t": 1695826061014, - "p": 0.73 - }, - { - "x": 364, - "y": 168, - "t": 1695826061081, - "p": 0.68 - }, - { - "x": 357, - "y": 170, - "t": 1695826061131, - "p": 0.79 - }, - { - "x": 353, - "y": 171, - "t": 1695826061147, - "p": 0.72 - }, - { - "x": 350, - "y": 173, - "t": 1695826061165, - "p": 0.7 - }, - { - "x": 350, - "y": 176, - "t": 1695826061214, - "p": 0.68 - }, - { - "x": 352, - "y": 179, - "t": 1695826061248, - "p": 0.7 - }, - { - "x": 356, - "y": 182, - "t": 1695826061281, - "p": 0.74 - }, - { - "x": 359, - "y": 184, - "t": 1695826061314, - "p": 0.7 - }, - { - "x": 363, - "y": 183, - "t": 1695826061364, - "p": 0.72 - }, - { - "x": 366, - "y": 182, - "t": 1695826061381, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 386, - "y": 168, - "t": 1695826061719, - "p": 0.1 - }, - { - "x": 382, - "y": 168, - "t": 1695826061764, - "p": 0.71 - }, - { - "x": 378, - "y": 169, - "t": 1695826061780, - "p": 0.72 - }, - { - "x": 375, - "y": 172, - "t": 1695826061813, - "p": 0.72 - }, - { - "x": 376, - "y": 175, - "t": 1695826061864, - "p": 0.68 - }, - { - "x": 381, - "y": 177, - "t": 1695826061913, - "p": 0.75 - }, - { - "x": 384, - "y": 179, - "t": 1695826061946, - "p": 0.7 - }, - { - "x": 386, - "y": 182, - "t": 1695826061997, - "p": 0.7 - }, - { - "x": 384, - "y": 185, - "t": 1695826062030, - "p": 0.7 - }, - { - "x": 381, - "y": 187, - "t": 1695826062047, - "p": 0.7 - }, - { - "x": 375, - "y": 189, - "t": 1695826062063, - "p": 0.77 - }, - { - "x": 369, - "y": 191, - "t": 1695826062080, - "p": 0.77 - } - ] - } -] diff --git a/test/integration/strokes/interact/madrid.json b/test/integration/strokes/interact/madrid.json deleted file mode 100644 index 23ecb9360..000000000 --- a/test/integration/strokes/interact/madrid.json +++ /dev/null @@ -1,560 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 158, - "y": 184, - "t": 1695826930199, - "p": 0.1 - }, - { - "x": 158, - "y": 181, - "t": 1695826930381, - "p": 0.68 - }, - { - "x": 157, - "y": 178, - "t": 1695826930397, - "p": 0.68 - }, - { - "x": 159, - "y": 173, - "t": 1695826930431, - "p": 0.75 - }, - { - "x": 162, - "y": 173, - "t": 1695826930465, - "p": 0.68 - }, - { - "x": 165, - "y": 175, - "t": 1695826930531, - "p": 0.7 - }, - { - "x": 167, - "y": 178, - "t": 1695826930581, - "p": 0.7 - }, - { - "x": 169, - "y": 182, - "t": 1695826930615, - "p": 0.73 - }, - { - "x": 169, - "y": 187, - "t": 1695826930648, - "p": 0.74 - }, - { - "x": 167, - "y": 184, - "t": 1695826930781, - "p": 0.7 - }, - { - "x": 167, - "y": 180, - "t": 1695826930798, - "p": 0.71 - }, - { - "x": 167, - "y": 177, - "t": 1695826930814, - "p": 0.68 - }, - { - "x": 170, - "y": 174, - "t": 1695826930831, - "p": 0.72 - }, - { - "x": 172, - "y": 171, - "t": 1695826930848, - "p": 0.7 - }, - { - "x": 175, - "y": 170, - "t": 1695826930882, - "p": 0.68 - }, - { - "x": 177, - "y": 174, - "t": 1695826930931, - "p": 0.73 - }, - { - "x": 178, - "y": 177, - "t": 1695826930948, - "p": 0.68 - }, - { - "x": 179, - "y": 180, - "t": 1695826930981, - "p": 0.68 - }, - { - "x": 179, - "y": 184, - "t": 1695826931014, - "p": 0.71 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 188, - "y": 178, - "t": 1695826931372, - "p": 0.1 - }, - { - "x": 185, - "y": 181, - "t": 1695826931413, - "p": 0.72 - }, - { - "x": 185, - "y": 184, - "t": 1695826931447, - "p": 0.68 - }, - { - "x": 190, - "y": 186, - "t": 1695826931480, - "p": 0.75 - }, - { - "x": 193, - "y": 185, - "t": 1695826931497, - "p": 0.68 - }, - { - "x": 196, - "y": 185, - "t": 1695826931513, - "p": 0.68 - }, - { - "x": 199, - "y": 184, - "t": 1695826931547, - "p": 0.68 - }, - { - "x": 200, - "y": 181, - "t": 1695826931597, - "p": 0.68 - }, - { - "x": 196, - "y": 178, - "t": 1695826931630, - "p": 0.74 - }, - { - "x": 191, - "y": 176, - "t": 1695826931664, - "p": 0.75 - }, - { - "x": 188, - "y": 177, - "t": 1695826931697, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 197, - "y": 176, - "t": 1695826932140, - "p": 0.1 - }, - { - "x": 197, - "y": 179, - "t": 1695826932180, - "p": 0.68 - }, - { - "x": 197, - "y": 182, - "t": 1695826932196, - "p": 0.68 - }, - { - "x": 199, - "y": 187, - "t": 1695826932230, - "p": 0.75 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 208, - "y": 180, - "t": 1695826932608, - "p": 0.1 - }, - { - "x": 207, - "y": 185, - "t": 1695826932679, - "p": 0.75 - }, - { - "x": 208, - "y": 188, - "t": 1695826932697, - "p": 0.68 - }, - { - "x": 211, - "y": 189, - "t": 1695826932713, - "p": 0.68 - }, - { - "x": 214, - "y": 189, - "t": 1695826932746, - "p": 0.68 - }, - { - "x": 217, - "y": 188, - "t": 1695826932779, - "p": 0.68 - }, - { - "x": 218, - "y": 183, - "t": 1695826932813, - "p": 0.75 - }, - { - "x": 213, - "y": 179, - "t": 1695826932846, - "p": 0.77 - }, - { - "x": 210, - "y": 177, - "t": 1695826932880, - "p": 0.7 - }, - { - "x": 204, - "y": 180, - "t": 1695826932929, - "p": 0.78 - }, - { - "x": 200, - "y": 183, - "t": 1695826932946, - "p": 0.74 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 215, - "y": 152, - "t": 1695826933235, - "p": 0.1 - }, - { - "x": 215, - "y": 155, - "t": 1695826933262, - "p": 0.68 - }, - { - "x": 215, - "y": 160, - "t": 1695826933278, - "p": 0.74 - }, - { - "x": 217, - "y": 167, - "t": 1695826933296, - "p": 0.79 - }, - { - "x": 217, - "y": 174, - "t": 1695826933312, - "p": 0.78 - }, - { - "x": 218, - "y": 179, - "t": 1695826933329, - "p": 0.75 - }, - { - "x": 219, - "y": 183, - "t": 1695826933345, - "p": 0.72 - }, - { - "x": 219, - "y": 188, - "t": 1695826933362, - "p": 0.74 - }, - { - "x": 220, - "y": 194, - "t": 1695826933378, - "p": 0.77 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 229, - "y": 191, - "t": 1695826933768, - "p": 0.1 - }, - { - "x": 228, - "y": 187, - "t": 1695826933829, - "p": 0.72 - }, - { - "x": 227, - "y": 184, - "t": 1695826933845, - "p": 0.68 - }, - { - "x": 228, - "y": 178, - "t": 1695826933878, - "p": 0.77 - }, - { - "x": 232, - "y": 175, - "t": 1695826933912, - "p": 0.74 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 246, - "y": 175, - "t": 1695826934210, - "p": 0.1 - }, - { - "x": 243, - "y": 181, - "t": 1695826934245, - "p": 0.78 - }, - { - "x": 242, - "y": 185, - "t": 1695826934261, - "p": 0.72 - }, - { - "x": 241, - "y": 188, - "t": 1695826934278, - "p": 0.68 - }, - { - "x": 242, - "y": 191, - "t": 1695826934361, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 242, - "y": 158, - "t": 1695826934598, - "p": 0.1 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 260, - "y": 175, - "t": 1695826935051, - "p": 0.1 - }, - { - "x": 257, - "y": 177, - "t": 1695826935110, - "p": 0.7 - }, - { - "x": 256, - "y": 180, - "t": 1695826935128, - "p": 0.68 - }, - { - "x": 257, - "y": 183, - "t": 1695826935161, - "p": 0.68 - }, - { - "x": 261, - "y": 183, - "t": 1695826935194, - "p": 0.71 - }, - { - "x": 265, - "y": 183, - "t": 1695826935228, - "p": 0.71 - }, - { - "x": 268, - "y": 181, - "t": 1695826935294, - "p": 0.7 - }, - { - "x": 269, - "y": 178, - "t": 1695826935344, - "p": 0.68 - }, - { - "x": 263, - "y": 173, - "t": 1695826935378, - "p": 0.8 - }, - { - "x": 257, - "y": 172, - "t": 1695826935393, - "p": 0.77 - }, - { - "x": 255, - "y": 175, - "t": 1695826935478, - "p": 0.7 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 269, - "y": 155, - "t": 1695826935764, - "p": 0.1 - }, - { - "x": 268, - "y": 158, - "t": 1695826935793, - "p": 0.68 - }, - { - "x": 266, - "y": 168, - "t": 1695826935810, - "p": 0.68 - }, - { - "x": 265, - "y": 175, - "t": 1695826935827, - "p": 0.79 - }, - { - "x": 264, - "y": 180, - "t": 1695826935843, - "p": 0.75 - }, - { - "x": 264, - "y": 183, - "t": 1695826935860, - "p": 0.68 - }, - { - "x": 264, - "y": 186, - "t": 1695826935960, - "p": 0.68 - } - ] - } -] diff --git a/test/integration/strokes/interact/paris.json b/test/integration/strokes/interact/paris.json deleted file mode 100644 index 33a0d37bd..000000000 --- a/test/integration/strokes/interact/paris.json +++ /dev/null @@ -1,500 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 102, - "y": 187, - "t": 1695825896206, - "p": 0.1 - }, - { - "x": 108, - "y": 183, - "t": 1695825896289, - "p": 0.79 - }, - { - "x": 113, - "y": 180, - "t": 1695825896306, - "p": 0.76 - }, - { - "x": 115, - "y": 176, - "t": 1695825896321, - "p": 0.73 - }, - { - "x": 117, - "y": 173, - "t": 1695825896339, - "p": 0.7 - }, - { - "x": 118, - "y": 170, - "t": 1695825896356, - "p": 0.68 - }, - { - "x": 118, - "y": 167, - "t": 1695825896372, - "p": 0.68 - }, - { - "x": 117, - "y": 176, - "t": 1695825896505, - "p": 0.81 - }, - { - "x": 117, - "y": 182, - "t": 1695825896522, - "p": 0.77 - }, - { - "x": 117, - "y": 189, - "t": 1695825896538, - "p": 0.78 - }, - { - "x": 117, - "y": 194, - "t": 1695825896555, - "p": 0.74 - }, - { - "x": 117, - "y": 200, - "t": 1695825896571, - "p": 0.77 - }, - { - "x": 116, - "y": 205, - "t": 1695825896589, - "p": 0.75 - }, - { - "x": 117, - "y": 208, - "t": 1695825896638, - "p": 0.68 - }, - { - "x": 115, - "y": 203, - "t": 1695825896755, - "p": 0.75 - }, - { - "x": 115, - "y": 199, - "t": 1695825896772, - "p": 0.71 - }, - { - "x": 115, - "y": 194, - "t": 1695825896788, - "p": 0.74 - }, - { - "x": 116, - "y": 190, - "t": 1695825896805, - "p": 0.72 - }, - { - "x": 117, - "y": 187, - "t": 1695825896822, - "p": 0.68 - }, - { - "x": 117, - "y": 184, - "t": 1695825896838, - "p": 0.68 - }, - { - "x": 118, - "y": 180, - "t": 1695825896872, - "p": 0.72 - }, - { - "x": 119, - "y": 177, - "t": 1695825896905, - "p": 0.68 - }, - { - "x": 121, - "y": 174, - "t": 1695825896938, - "p": 0.7 - }, - { - "x": 123, - "y": 177, - "t": 1695825897088, - "p": 0.7 - }, - { - "x": 124, - "y": 180, - "t": 1695825897106, - "p": 0.68 - }, - { - "x": 125, - "y": 184, - "t": 1695825897139, - "p": 0.72 - }, - { - "x": 128, - "y": 184, - "t": 1695825897205, - "p": 0.68 - }, - { - "x": 132, - "y": 183, - "t": 1695825897239, - "p": 0.72 - }, - { - "x": 136, - "y": 179, - "t": 1695825897272, - "p": 0.76 - }, - { - "x": 137, - "y": 176, - "t": 1695825897305, - "p": 0.68 - }, - { - "x": 135, - "y": 181, - "t": 1695825897422, - "p": 0.75 - }, - { - "x": 139, - "y": 185, - "t": 1695825897455, - "p": 0.76 - }, - { - "x": 142, - "y": 184, - "t": 1695825897489, - "p": 0.68 - }, - { - "x": 145, - "y": 184, - "t": 1695825897505, - "p": 0.68 - }, - { - "x": 148, - "y": 183, - "t": 1695825897521, - "p": 0.68 - }, - { - "x": 151, - "y": 181, - "t": 1695825897554, - "p": 0.7 - }, - { - "x": 148, - "y": 178, - "t": 1695825897587, - "p": 0.72 - }, - { - "x": 144, - "y": 176, - "t": 1695825897605, - "p": 0.73 - }, - { - "x": 140, - "y": 175, - "t": 1695825897620, - "p": 0.72 - }, - { - "x": 137, - "y": 174, - "t": 1695825897638, - "p": 0.68 - }, - { - "x": 141, - "y": 177, - "t": 1695825897737, - "p": 0.74 - }, - { - "x": 145, - "y": 178, - "t": 1695825897771, - "p": 0.72 - }, - { - "x": 149, - "y": 179, - "t": 1695825897788, - "p": 0.72 - }, - { - "x": 152, - "y": 179, - "t": 1695825897821, - "p": 0.68 - }, - { - "x": 153, - "y": 183, - "t": 1695825897871, - "p": 0.72 - }, - { - "x": 157, - "y": 185, - "t": 1695825897904, - "p": 0.73 - }, - { - "x": 161, - "y": 183, - "t": 1695825897954, - "p": 0.73 - }, - { - "x": 166, - "y": 178, - "t": 1695825897988, - "p": 0.79 - }, - { - "x": 169, - "y": 174, - "t": 1695825898004, - "p": 0.74 - }, - { - "x": 171, - "y": 169, - "t": 1695825898037, - "p": 0.75 - }, - { - "x": 170, - "y": 166, - "t": 1695825898070, - "p": 0.68 - }, - { - "x": 174, - "y": 168, - "t": 1695825898170, - "p": 0.73 - }, - { - "x": 177, - "y": 173, - "t": 1695825898204, - "p": 0.76 - }, - { - "x": 177, - "y": 177, - "t": 1695825898220, - "p": 0.71 - }, - { - "x": 177, - "y": 181, - "t": 1695825898237, - "p": 0.71 - }, - { - "x": 177, - "y": 184, - "t": 1695825898254, - "p": 0.68 - }, - { - "x": 180, - "y": 186, - "t": 1695825898287, - "p": 0.7 - }, - { - "x": 184, - "y": 185, - "t": 1695825898321, - "p": 0.72 - }, - { - "x": 188, - "y": 182, - "t": 1695825898354, - "p": 0.74 - }, - { - "x": 191, - "y": 179, - "t": 1695825898371, - "p": 0.72 - }, - { - "x": 196, - "y": 172, - "t": 1695825898404, - "p": 0.81 - }, - { - "x": 197, - "y": 169, - "t": 1695825898437, - "p": 0.68 - }, - { - "x": 195, - "y": 173, - "t": 1695825898554, - "p": 0.73 - }, - { - "x": 195, - "y": 177, - "t": 1695825898587, - "p": 0.71 - }, - { - "x": 196, - "y": 181, - "t": 1695825898620, - "p": 0.72 - }, - { - "x": 198, - "y": 185, - "t": 1695825898671, - "p": 0.73 - }, - { - "x": 201, - "y": 186, - "t": 1695825898737, - "p": 0.68 - }, - { - "x": 204, - "y": 184, - "t": 1695825898803, - "p": 0.7 - }, - { - "x": 209, - "y": 180, - "t": 1695825898836, - "p": 0.77 - }, - { - "x": 212, - "y": 177, - "t": 1695825898854, - "p": 0.72 - }, - { - "x": 213, - "y": 174, - "t": 1695825898887, - "p": 0.68 - }, - { - "x": 217, - "y": 175, - "t": 1695825899003, - "p": 0.72 - }, - { - "x": 221, - "y": 179, - "t": 1695825899020, - "p": 0.76 - }, - { - "x": 225, - "y": 181, - "t": 1695825899053, - "p": 0.73 - }, - { - "x": 228, - "y": 183, - "t": 1695825899088, - "p": 0.7 - }, - { - "x": 225, - "y": 183, - "t": 1695825899170, - "p": 0.68 - }, - { - "x": 220, - "y": 183, - "t": 1695825899187, - "p": 0.74 - }, - { - "x": 212, - "y": 182, - "t": 1695825899203, - "p": 0.8 - }, - { - "x": 205, - "y": 180, - "t": 1695825899220, - "p": 0.79 - }, - { - "x": 201, - "y": 179, - "t": 1695825899236, - "p": 0.72 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 199, - "y": 150, - "t": 1695825899936, - "p": 0.1 - } - ] - } -] diff --git a/test/integration/strokes/interact/rome.json b/test/integration/strokes/interact/rome.json deleted file mode 100644 index a65915de5..000000000 --- a/test/integration/strokes/interact/rome.json +++ /dev/null @@ -1,434 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 101, - "y": 173, - "t": 1695825959660, - "p": 0.1 - }, - { - "x": 101, - "y": 170, - "t": 1695825959709, - "p": 0.68 - }, - { - "x": 104, - "y": 167, - "t": 1695825959760, - "p": 0.72 - }, - { - "x": 109, - "y": 164, - "t": 1695825959793, - "p": 0.76 - }, - { - "x": 110, - "y": 160, - "t": 1695825959809, - "p": 0.72 - }, - { - "x": 109, - "y": 157, - "t": 1695825959826, - "p": 0.68 - }, - { - "x": 106, - "y": 155, - "t": 1695825959842, - "p": 0.7 - }, - { - "x": 111, - "y": 157, - "t": 1695825959925, - "p": 0.75 - }, - { - "x": 115, - "y": 157, - "t": 1695825959942, - "p": 0.71 - }, - { - "x": 119, - "y": 158, - "t": 1695825959959, - "p": 0.72 - }, - { - "x": 122, - "y": 164, - "t": 1695825959992, - "p": 0.78 - }, - { - "x": 120, - "y": 168, - "t": 1695825960009, - "p": 0.73 - }, - { - "x": 118, - "y": 172, - "t": 1695825960025, - "p": 0.73 - }, - { - "x": 116, - "y": 176, - "t": 1695825960060, - "p": 0.73 - }, - { - "x": 120, - "y": 178, - "t": 1695825960144, - "p": 0.73 - }, - { - "x": 123, - "y": 178, - "t": 1695825960159, - "p": 0.68 - }, - { - "x": 126, - "y": 178, - "t": 1695825960193, - "p": 0.68 - }, - { - "x": 129, - "y": 178, - "t": 1695825960209, - "p": 0.68 - }, - { - "x": 134, - "y": 177, - "t": 1695825960226, - "p": 0.75 - }, - { - "x": 138, - "y": 175, - "t": 1695825960242, - "p": 0.73 - }, - { - "x": 138, - "y": 180, - "t": 1695825960409, - "p": 0.74 - }, - { - "x": 144, - "y": 180, - "t": 1695825960443, - "p": 0.77 - }, - { - "x": 149, - "y": 180, - "t": 1695825960476, - "p": 0.74 - }, - { - "x": 147, - "y": 176, - "t": 1695825960559, - "p": 0.73 - }, - { - "x": 141, - "y": 173, - "t": 1695825960575, - "p": 0.78 - }, - { - "x": 137, - "y": 172, - "t": 1695825960592, - "p": 0.72 - }, - { - "x": 141, - "y": 172, - "t": 1695825960675, - "p": 0.71 - }, - { - "x": 146, - "y": 172, - "t": 1695825960692, - "p": 0.74 - }, - { - "x": 150, - "y": 172, - "t": 1695825960708, - "p": 0.71 - }, - { - "x": 153, - "y": 172, - "t": 1695825960725, - "p": 0.68 - }, - { - "x": 156, - "y": 172, - "t": 1695825960772, - "p": 0.68 - }, - { - "x": 159, - "y": 170, - "t": 1695825960792, - "p": 0.7 - }, - { - "x": 162, - "y": 166, - "t": 1695825960808, - "p": 0.74 - }, - { - "x": 165, - "y": 163, - "t": 1695825960825, - "p": 0.72 - }, - { - "x": 168, - "y": 162, - "t": 1695825960841, - "p": 0.68 - }, - { - "x": 172, - "y": 164, - "t": 1695825960908, - "p": 0.73 - }, - { - "x": 175, - "y": 168, - "t": 1695825960925, - "p": 0.74 - }, - { - "x": 176, - "y": 175, - "t": 1695825960942, - "p": 0.79 - }, - { - "x": 176, - "y": 180, - "t": 1695825960959, - "p": 0.74 - }, - { - "x": 176, - "y": 183, - "t": 1695825960975, - "p": 0.68 - }, - { - "x": 177, - "y": 180, - "t": 1695825961075, - "p": 0.68 - }, - { - "x": 178, - "y": 176, - "t": 1695825961091, - "p": 0.72 - }, - { - "x": 180, - "y": 173, - "t": 1695825961108, - "p": 0.7 - }, - { - "x": 182, - "y": 169, - "t": 1695825961125, - "p": 0.73 - }, - { - "x": 185, - "y": 166, - "t": 1695825961141, - "p": 0.72 - }, - { - "x": 188, - "y": 171, - "t": 1695825961241, - "p": 0.76 - }, - { - "x": 188, - "y": 175, - "t": 1695825961258, - "p": 0.71 - }, - { - "x": 187, - "y": 180, - "t": 1695825961275, - "p": 0.75 - }, - { - "x": 187, - "y": 183, - "t": 1695825961307, - "p": 0.68 - }, - { - "x": 188, - "y": 177, - "t": 1695825961374, - "p": 0.77 - }, - { - "x": 191, - "y": 170, - "t": 1695825961392, - "p": 0.79 - }, - { - "x": 195, - "y": 166, - "t": 1695825961407, - "p": 0.76 - }, - { - "x": 198, - "y": 163, - "t": 1695825961425, - "p": 0.72 - }, - { - "x": 199, - "y": 166, - "t": 1695825961497, - "p": 0.68 - }, - { - "x": 199, - "y": 169, - "t": 1695825961508, - "p": 0.68 - }, - { - "x": 199, - "y": 174, - "t": 1695825961524, - "p": 0.74 - }, - { - "x": 199, - "y": 177, - "t": 1695825961542, - "p": 0.68 - }, - { - "x": 199, - "y": 180, - "t": 1695825961557, - "p": 0.68 - }, - { - "x": 203, - "y": 180, - "t": 1695825961608, - "p": 0.71 - }, - { - "x": 207, - "y": 179, - "t": 1695825961624, - "p": 0.72 - }, - { - "x": 212, - "y": 177, - "t": 1695825961642, - "p": 0.75 - }, - { - "x": 222, - "y": 173, - "t": 1695825961657, - "p": 0.67 - }, - { - "x": 228, - "y": 171, - "t": 1695825961675, - "p": 0.77 - }, - { - "x": 231, - "y": 169, - "t": 1695825961724, - "p": 0.7 - }, - { - "x": 227, - "y": 170, - "t": 1695825961795, - "p": 0.72 - }, - { - "x": 218, - "y": 173, - "t": 1695825961825, - "p": 0.82 - }, - { - "x": 214, - "y": 175, - "t": 1695825961840, - "p": 0.73 - }, - { - "x": 220, - "y": 175, - "t": 1695825961891, - "p": 0.77 - }, - { - "x": 223, - "y": 176, - "t": 1695825961908, - "p": 0.68 - }, - { - "x": 226, - "y": 177, - "t": 1695825961924, - "p": 0.68 - }, - { - "x": 230, - "y": 177, - "t": 1695825961941, - "p": 0.71 - } - ] - } -] diff --git a/test/integration/strokes/interact/tokyo.json b/test/integration/strokes/interact/tokyo.json deleted file mode 100644 index 6a96ba5dd..000000000 --- a/test/integration/strokes/interact/tokyo.json +++ /dev/null @@ -1,578 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 120, - "y": 140, - "t": 1695826076775, - "p": 0.1 - }, - { - "x": 120, - "y": 145, - "t": 1695826076841, - "p": 0.74 - }, - { - "x": 119, - "y": 150, - "t": 1695826076858, - "p": 0.75 - }, - { - "x": 119, - "y": 154, - "t": 1695826076875, - "p": 0.71 - }, - { - "x": 119, - "y": 161, - "t": 1695826076891, - "p": 0.78 - }, - { - "x": 119, - "y": 169, - "t": 1695826076908, - "p": 0.8 - }, - { - "x": 119, - "y": 173, - "t": 1695826076924, - "p": 0.71 - }, - { - "x": 119, - "y": 176, - "t": 1695826076942, - "p": 0.68 - }, - { - "x": 120, - "y": 179, - "t": 1695826076975, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 117, - "y": 161, - "t": 1695826077479, - "p": 0.1 - }, - { - "x": 121, - "y": 159, - "t": 1695826077525, - "p": 0.73 - }, - { - "x": 125, - "y": 159, - "t": 1695826077574, - "p": 0.71 - }, - { - "x": 128, - "y": 157, - "t": 1695826077624, - "p": 0.7 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 131, - "y": 167, - "t": 1695826078034, - "p": 0.1 - }, - { - "x": 126, - "y": 173, - "t": 1695826078074, - "p": 0.8 - }, - { - "x": 126, - "y": 176, - "t": 1695826078107, - "p": 0.68 - }, - { - "x": 130, - "y": 179, - "t": 1695826078140, - "p": 0.74 - }, - { - "x": 133, - "y": 179, - "t": 1695826078157, - "p": 0.68 - }, - { - "x": 138, - "y": 179, - "t": 1695826078174, - "p": 0.74 - }, - { - "x": 142, - "y": 179, - "t": 1695826078191, - "p": 0.71 - }, - { - "x": 145, - "y": 178, - "t": 1695826078207, - "p": 0.68 - }, - { - "x": 148, - "y": 178, - "t": 1695826078224, - "p": 0.68 - }, - { - "x": 148, - "y": 175, - "t": 1695826078257, - "p": 0.68 - }, - { - "x": 144, - "y": 172, - "t": 1695826078273, - "p": 0.74 - }, - { - "x": 138, - "y": 170, - "t": 1695826078290, - "p": 0.77 - }, - { - "x": 135, - "y": 169, - "t": 1695826078324, - "p": 0.68 - }, - { - "x": 130, - "y": 173, - "t": 1695826078357, - "p": 0.77 - }, - { - "x": 130, - "y": 176, - "t": 1695826078423, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 155, - "y": 143, - "t": 1695826078713, - "p": 0.1 - }, - { - "x": 155, - "y": 147, - "t": 1695826078740, - "p": 0.71 - }, - { - "x": 155, - "y": 155, - "t": 1695826078756, - "p": 0.8 - }, - { - "x": 156, - "y": 162, - "t": 1695826078774, - "p": 0.79 - }, - { - "x": 156, - "y": 167, - "t": 1695826078789, - "p": 0.74 - }, - { - "x": 156, - "y": 171, - "t": 1695826078806, - "p": 0.71 - }, - { - "x": 156, - "y": 175, - "t": 1695826078823, - "p": 0.71 - }, - { - "x": 157, - "y": 178, - "t": 1695826078840, - "p": 0.68 - }, - { - "x": 158, - "y": 181, - "t": 1695826078873, - "p": 0.68 - }, - { - "x": 158, - "y": 178, - "t": 1695826079057, - "p": 0.68 - }, - { - "x": 158, - "y": 173, - "t": 1695826079073, - "p": 0.74 - }, - { - "x": 158, - "y": 168, - "t": 1695826079090, - "p": 0.74 - }, - { - "x": 158, - "y": 164, - "t": 1695826079106, - "p": 0.71 - }, - { - "x": 159, - "y": 161, - "t": 1695826079123, - "p": 0.68 - }, - { - "x": 161, - "y": 158, - "t": 1695826079139, - "p": 0.7 - }, - { - "x": 165, - "y": 157, - "t": 1695826079173, - "p": 0.72 - }, - { - "x": 169, - "y": 158, - "t": 1695826079206, - "p": 0.72 - }, - { - "x": 171, - "y": 162, - "t": 1695826079239, - "p": 0.73 - }, - { - "x": 170, - "y": 165, - "t": 1695826079256, - "p": 0.68 - }, - { - "x": 169, - "y": 168, - "t": 1695826079272, - "p": 0.68 - }, - { - "x": 166, - "y": 170, - "t": 1695826079306, - "p": 0.7 - }, - { - "x": 169, - "y": 174, - "t": 1695826079456, - "p": 0.74 - }, - { - "x": 172, - "y": 176, - "t": 1695826079489, - "p": 0.7 - }, - { - "x": 176, - "y": 177, - "t": 1695826079523, - "p": 0.72 - }, - { - "x": 180, - "y": 177, - "t": 1695826079539, - "p": 0.71 - }, - { - "x": 183, - "y": 177, - "t": 1695826079557, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 187, - "y": 163, - "t": 1695826079925, - "p": 0.1 - }, - { - "x": 187, - "y": 168, - "t": 1695826079973, - "p": 0.74 - }, - { - "x": 187, - "y": 173, - "t": 1695826079988, - "p": 0.74 - }, - { - "x": 189, - "y": 177, - "t": 1695826080005, - "p": 0.73 - }, - { - "x": 192, - "y": 179, - "t": 1695826080039, - "p": 0.7 - }, - { - "x": 195, - "y": 179, - "t": 1695826080072, - "p": 0.68 - }, - { - "x": 199, - "y": 176, - "t": 1695826080122, - "p": 0.74 - }, - { - "x": 203, - "y": 173, - "t": 1695826080138, - "p": 0.74 - }, - { - "x": 206, - "y": 169, - "t": 1695826080155, - "p": 0.74 - }, - { - "x": 208, - "y": 166, - "t": 1695826080188, - "p": 0.7 - }, - { - "x": 205, - "y": 168, - "t": 1695826080255, - "p": 0.7 - }, - { - "x": 201, - "y": 174, - "t": 1695826080271, - "p": 0.79 - }, - { - "x": 196, - "y": 181, - "t": 1695826080288, - "p": 0.81 - }, - { - "x": 193, - "y": 188, - "t": 1695826080305, - "p": 0.79 - }, - { - "x": 191, - "y": 193, - "t": 1695826080322, - "p": 0.75 - }, - { - "x": 189, - "y": 196, - "t": 1695826080338, - "p": 0.7 - }, - { - "x": 186, - "y": 200, - "t": 1695826080355, - "p": 0.74 - }, - { - "x": 184, - "y": 204, - "t": 1695826080371, - "p": 0.73 - }, - { - "x": 189, - "y": 200, - "t": 1695826080496, - "p": 0.77 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 219, - "y": 173, - "t": 1695826080817, - "p": 0.1 - }, - { - "x": 216, - "y": 173, - "t": 1695826080838, - "p": 0.68 - }, - { - "x": 213, - "y": 177, - "t": 1695826080855, - "p": 0.74 - }, - { - "x": 212, - "y": 181, - "t": 1695826080872, - "p": 0.72 - }, - { - "x": 212, - "y": 184, - "t": 1695826080905, - "p": 0.68 - }, - { - "x": 215, - "y": 184, - "t": 1695826080938, - "p": 0.68 - }, - { - "x": 218, - "y": 184, - "t": 1695826080955, - "p": 0.68 - }, - { - "x": 222, - "y": 184, - "t": 1695826080971, - "p": 0.71 - }, - { - "x": 227, - "y": 184, - "t": 1695826080988, - "p": 0.74 - }, - { - "x": 231, - "y": 183, - "t": 1695826081004, - "p": 0.72 - }, - { - "x": 234, - "y": 181, - "t": 1695826081022, - "p": 0.7 - }, - { - "x": 233, - "y": 177, - "t": 1695826081055, - "p": 0.72 - }, - { - "x": 229, - "y": 173, - "t": 1695826081088, - "p": 0.76 - }, - { - "x": 225, - "y": 172, - "t": 1695826081121, - "p": 0.72 - }, - { - "x": 222, - "y": 172, - "t": 1695826081137, - "p": 0.68 - }, - { - "x": 216, - "y": 175, - "t": 1695826081170, - "p": 0.78 - }, - { - "x": 213, - "y": 177, - "t": 1695826081188, - "p": 0.7 - } - ] - } -] diff --git a/test/integration/strokes/line.json b/test/integration/strokes/line.json deleted file mode 100644 index 4fd10495c..000000000 --- a/test/integration/strokes/line.json +++ /dev/null @@ -1,56 +0,0 @@ -[ - { - "p": [ - 0.5, - 0.77, - 0.63, - 0.59, - 0.55, - 0.53, - 0.5, - 0.52, - 0.63, - 0.75, - 0.68 - ], - "t": [ - 1688462301914, - 1688462302006, - 1688462302021, - 1688462302038, - 1688462302055, - 1688462302072, - 1688462302088, - 1688462302105, - 1688462302121, - 1688462302138, - 1688462302180 - ], - "x": [ - 227, - 232, - 244, - 261, - 281, - 303, - 328, - 351, - 365, - 370, - 373 - ], - "y": [ - 177, - 178, - 179, - 179, - 179, - 179, - 179, - 179, - 178, - 177, - 176 - ] - } -] diff --git a/test/integration/strokes/multiple-inputs/1943.json b/test/integration/strokes/multiple-inputs/1943.json deleted file mode 100644 index 8f1c2732a..000000000 --- a/test/integration/strokes/multiple-inputs/1943.json +++ /dev/null @@ -1,688 +0,0 @@ -[ - { - "id": "mouse-1694171176026", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 165, - "y": 80, - "t": 1694171176026, - "p": 0.1 - }, - { - "x": 168, - "y": 78, - "t": 1694171176066, - "p": 0.7 - }, - { - "x": 174, - "y": 74, - "t": 1694171176084, - "p": 0.79 - }, - { - "x": 206, - "y": 50, - "t": 1694171176099, - "p": 0.37 - }, - { - "x": 220, - "y": 38, - "t": 1694171176116, - "p": 0.57 - }, - { - "x": 227, - "y": 29, - "t": 1694171176132, - "p": 0.66 - }, - { - "x": 230, - "y": 24, - "t": 1694171176149, - "p": 0.76 - }, - { - "x": 231, - "y": 20, - "t": 1694171176167, - "p": 0.72 - }, - { - "x": 229, - "y": 23, - "t": 1694171176216, - "p": 0.7 - }, - { - "x": 229, - "y": 43, - "t": 1694171176234, - "p": 0.55 - }, - { - "x": 231, - "y": 61, - "t": 1694171176249, - "p": 0.57 - }, - { - "x": 231, - "y": 76, - "t": 1694171176267, - "p": 0.61 - }, - { - "x": 230, - "y": 87, - "t": 1694171176283, - "p": 0.67 - }, - { - "x": 228, - "y": 97, - "t": 1694171176300, - "p": 0.68 - } - ], - "length": 351.94248431746627, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694171176928", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 262, - "y": 33, - "t": 1694171176928, - "p": 0.1 - }, - { - "x": 255, - "y": 37, - "t": 1694171176948, - "p": 0.8 - }, - { - "x": 251, - "y": 41, - "t": 1694171176966, - "p": 0.76 - }, - { - "x": 249, - "y": 44, - "t": 1694171176982, - "p": 0.7 - }, - { - "x": 248, - "y": 48, - "t": 1694171176999, - "p": 0.72 - }, - { - "x": 252, - "y": 52, - "t": 1694171177015, - "p": 0.76 - }, - { - "x": 256, - "y": 53, - "t": 1694171177032, - "p": 0.72 - }, - { - "x": 260, - "y": 53, - "t": 1694171177049, - "p": 0.71 - }, - { - "x": 272, - "y": 54, - "t": 1694171177066, - "p": 0.65 - }, - { - "x": 291, - "y": 56, - "t": 1694171177082, - "p": 0.56 - }, - { - "x": 300, - "y": 54, - "t": 1694171177099, - "p": 0.81 - }, - { - "x": 304, - "y": 51, - "t": 1694171177115, - "p": 0.74 - }, - { - "x": 306, - "y": 48, - "t": 1694171177132, - "p": 0.7 - }, - { - "x": 304, - "y": 43, - "t": 1694171177148, - "p": 0.75 - }, - { - "x": 297, - "y": 40, - "t": 1694171177166, - "p": 0.79 - }, - { - "x": 291, - "y": 36, - "t": 1694171177181, - "p": 0.79 - }, - { - "x": 288, - "y": 35, - "t": 1694171177216, - "p": 0.68 - }, - { - "x": 285, - "y": 34, - "t": 1694171177232, - "p": 0.68 - }, - { - "x": 281, - "y": 31, - "t": 1694171177249, - "p": 0.74 - }, - { - "x": 274, - "y": 29, - "t": 1694171177266, - "p": 0.79 - }, - { - "x": 271, - "y": 29, - "t": 1694171177281, - "p": 0.68 - }, - { - "x": 265, - "y": 31, - "t": 1694171177299, - "p": 0.77 - } - ], - "length": 396.41071971359753, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694171177782", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 301, - "y": 37, - "t": 1694171177782, - "p": 0.1 - }, - { - "x": 300, - "y": 42, - "t": 1694171177832, - "p": 0.75 - }, - { - "x": 306, - "y": 50, - "t": 1694171177849, - "p": 0.68 - }, - { - "x": 308, - "y": 54, - "t": 1694171177865, - "p": 0.73 - }, - { - "x": 310, - "y": 57, - "t": 1694171177881, - "p": 0.7 - }, - { - "x": 312, - "y": 60, - "t": 1694171177898, - "p": 0.7 - }, - { - "x": 312, - "y": 63, - "t": 1694171177914, - "p": 0.68 - }, - { - "x": 312, - "y": 67, - "t": 1694171177932, - "p": 0.71 - }, - { - "x": 311, - "y": 71, - "t": 1694171177947, - "p": 0.72 - }, - { - "x": 309, - "y": 76, - "t": 1694171177982, - "p": 0.75 - }, - { - "x": 305, - "y": 80, - "t": 1694171177998, - "p": 0.76 - }, - { - "x": 301, - "y": 85, - "t": 1694171178015, - "p": 0.77 - }, - { - "x": 295, - "y": 88, - "t": 1694171178031, - "p": 0.78 - }, - { - "x": 290, - "y": 90, - "t": 1694171178048, - "p": 0.75 - }, - { - "x": 284, - "y": 91, - "t": 1694171178064, - "p": 0.77 - }, - { - "x": 281, - "y": 91, - "t": 1694171178082, - "p": 0.68 - }, - { - "x": 276, - "y": 92, - "t": 1694171178097, - "p": 0.75 - }, - { - "x": 268, - "y": 92, - "t": 1694171178115, - "p": 0.8 - }, - { - "x": 261, - "y": 92, - "t": 1694171178131, - "p": 0.78 - }, - { - "x": 270, - "y": 92, - "t": 1694171178214, - "p": 0.81 - }, - { - "x": 280, - "y": 92, - "t": 1694171178218, - "p": 0.68 - } - ], - "length": 418.89121791708436, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694171178666", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 351, - "y": 32, - "t": 1694171178666, - "p": 0.1 - }, - { - "x": 349, - "y": 35, - "t": 1694171178730, - "p": 0.7 - }, - { - "x": 347, - "y": 39, - "t": 1694171178748, - "p": 0.73 - }, - { - "x": 345, - "y": 42, - "t": 1694171178764, - "p": 0.7 - }, - { - "x": 343, - "y": 45, - "t": 1694171178781, - "p": 0.7 - }, - { - "x": 341, - "y": 49, - "t": 1694171178797, - "p": 0.73 - }, - { - "x": 339, - "y": 53, - "t": 1694171178815, - "p": 0.73 - }, - { - "x": 339, - "y": 56, - "t": 1694171178831, - "p": 0.68 - }, - { - "x": 343, - "y": 57, - "t": 1694171178981, - "p": 0.72 - }, - { - "x": 350, - "y": 55, - "t": 1694171178997, - "p": 0.79 - }, - { - "x": 353, - "y": 56, - "t": 1694171179015, - "p": 0.68 - }, - { - "x": 357, - "y": 56, - "t": 1694171179084, - "p": 0.71 - }, - { - "x": 362, - "y": 56, - "t": 1694171179097, - "p": 0.74 - }, - { - "x": 369, - "y": 55, - "t": 1694171179113, - "p": 0.79 - }, - { - "x": 374, - "y": 55, - "t": 1694171179131, - "p": 0.74 - }, - { - "x": 372, - "y": 60, - "t": 1694171179231, - "p": 0.75 - }, - { - "x": 370, - "y": 63, - "t": 1694171179264, - "p": 0.7 - }, - { - "x": 368, - "y": 66, - "t": 1694171179281, - "p": 0.7 - }, - { - "x": 367, - "y": 69, - "t": 1694171179298, - "p": 0.68 - }, - { - "x": 367, - "y": 72, - "t": 1694171179314, - "p": 0.68 - }, - { - "x": 367, - "y": 78, - "t": 1694171179347, - "p": 0.77 - }, - { - "x": 368, - "y": 81, - "t": 1694171179364, - "p": 0.68 - }, - { - "x": 369, - "y": 84, - "t": 1694171179381, - "p": 0.68 - } - ], - "length": 446.40839398843275, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694171179854", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 388, - "y": 39, - "t": 1694171179854, - "p": 0.1 - }, - { - "x": 393, - "y": 35, - "t": 1694171179954, - "p": 0.77 - }, - { - "x": 397, - "y": 34, - "t": 1694171179970, - "p": 0.72 - }, - { - "x": 401, - "y": 33, - "t": 1694171179988, - "p": 0.72 - }, - { - "x": 403, - "y": 38, - "t": 1694171180088, - "p": 0.75 - }, - { - "x": 400, - "y": 44, - "t": 1694171180103, - "p": 0.78 - }, - { - "x": 399, - "y": 47, - "t": 1694171180121, - "p": 0.68 - }, - { - "x": 396, - "y": 49, - "t": 1694171180154, - "p": 0.7 - }, - { - "x": 400, - "y": 48, - "t": 1694171180221, - "p": 0.72 - }, - { - "x": 403, - "y": 48, - "t": 1694171180237, - "p": 0.68 - }, - { - "x": 407, - "y": 48, - "t": 1694171180270, - "p": 0.71 - }, - { - "x": 412, - "y": 49, - "t": 1694171180287, - "p": 0.75 - }, - { - "x": 415, - "y": 51, - "t": 1694171180303, - "p": 0.7 - }, - { - "x": 417, - "y": 54, - "t": 1694171180321, - "p": 0.7 - }, - { - "x": 418, - "y": 57, - "t": 1694171180353, - "p": 0.68 - }, - { - "x": 415, - "y": 62, - "t": 1694171180387, - "p": 0.76 - }, - { - "x": 412, - "y": 65, - "t": 1694171180420, - "p": 0.72 - }, - { - "x": 408, - "y": 67, - "t": 1694171180436, - "p": 0.73 - }, - { - "x": 403, - "y": 70, - "t": 1694171180453, - "p": 0.76 - }, - { - "x": 400, - "y": 71, - "t": 1694171180470, - "p": 0.68 - }, - { - "x": 397, - "y": 71, - "t": 1694171180588, - "p": 0.68 - } - ], - "length": 476.60012222966833, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - } -] diff --git a/test/integration/strokes/multiple-inputs/1993.json b/test/integration/strokes/multiple-inputs/1993.json deleted file mode 100644 index ceca2c6c3..000000000 --- a/test/integration/strokes/multiple-inputs/1993.json +++ /dev/null @@ -1,722 +0,0 @@ -[ - { - "id": "mouse-1694173367053", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 234, - "y": 78, - "t": 1694173367053, - "p": 0.1 - }, - { - "x": 242, - "y": 70, - "t": 1694173367121, - "p": 0.66 - }, - { - "x": 253, - "y": 55, - "t": 1694173367136, - "p": 0.57 - }, - { - "x": 259, - "y": 46, - "t": 1694173367154, - "p": 0.67 - }, - { - "x": 264, - "y": 37, - "t": 1694173367171, - "p": 0.68 - }, - { - "x": 267, - "y": 28, - "t": 1694173367187, - "p": 0.82 - }, - { - "x": 267, - "y": 23, - "t": 1694173367204, - "p": 0.74 - }, - { - "x": 267, - "y": 36, - "t": 1694173367270, - "p": 0.64 - }, - { - "x": 267, - "y": 51, - "t": 1694173367286, - "p": 0.61 - }, - { - "x": 267, - "y": 64, - "t": 1694173367304, - "p": 0.64 - }, - { - "x": 268, - "y": 72, - "t": 1694173367319, - "p": 0.8 - }, - { - "x": 269, - "y": 81, - "t": 1694173367337, - "p": 0.81 - }, - { - "x": 270, - "y": 87, - "t": 1694173367353, - "p": 0.77 - }, - { - "x": 272, - "y": 90, - "t": 1694173367371, - "p": 0.7 - } - ], - "length": 379.9775148699389, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694173367903", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 292, - "y": 38, - "t": 1694173367903, - "p": 0.1 - }, - { - "x": 286, - "y": 41, - "t": 1694173367937, - "p": 0.78 - }, - { - "x": 282, - "y": 46, - "t": 1694173367954, - "p": 0.77 - }, - { - "x": 280, - "y": 50, - "t": 1694173367970, - "p": 0.73 - }, - { - "x": 282, - "y": 53, - "t": 1694173368004, - "p": 0.7 - }, - { - "x": 288, - "y": 54, - "t": 1694173368019, - "p": 0.77 - }, - { - "x": 294, - "y": 54, - "t": 1694173368037, - "p": 0.77 - }, - { - "x": 299, - "y": 52, - "t": 1694173368054, - "p": 0.75 - }, - { - "x": 303, - "y": 50, - "t": 1694173368070, - "p": 0.73 - }, - { - "x": 305, - "y": 44, - "t": 1694173368120, - "p": 0.77 - }, - { - "x": 303, - "y": 39, - "t": 1694173368137, - "p": 0.75 - }, - { - "x": 301, - "y": 36, - "t": 1694173368153, - "p": 0.7 - }, - { - "x": 299, - "y": 33, - "t": 1694173368170, - "p": 0.7 - }, - { - "x": 292, - "y": 32, - "t": 1694173368204, - "p": 0.79 - }, - { - "x": 285, - "y": 32, - "t": 1694173368219, - "p": 0.78 - }, - { - "x": 282, - "y": 34, - "t": 1694173368237, - "p": 0.7 - }, - { - "x": 279, - "y": 37, - "t": 1694173368252, - "p": 0.72 - }, - { - "x": 278, - "y": 40, - "t": 1694173368286, - "p": 0.68 - }, - { - "x": 288, - "y": 40, - "t": 1694173368353, - "p": 0.68 - } - ], - "length": 391.5936604914115, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694173368722", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 301, - "y": 37, - "t": 1694173368722, - "p": 0.1 - }, - { - "x": 303, - "y": 42, - "t": 1694173368771, - "p": 0.75 - }, - { - "x": 317, - "y": 54, - "t": 1694173368788, - "p": 0.57 - }, - { - "x": 327, - "y": 63, - "t": 1694173368804, - "p": 0.63 - }, - { - "x": 332, - "y": 69, - "t": 1694173368822, - "p": 0.8 - }, - { - "x": 333, - "y": 75, - "t": 1694173368837, - "p": 0.77 - }, - { - "x": 333, - "y": 78, - "t": 1694173368855, - "p": 0.68 - }, - { - "x": 334, - "y": 81, - "t": 1694173368889, - "p": 0.68 - }, - { - "x": 330, - "y": 84, - "t": 1694173368904, - "p": 0.74 - }, - { - "x": 325, - "y": 87, - "t": 1694173368921, - "p": 0.76 - }, - { - "x": 314, - "y": 93, - "t": 1694173368937, - "p": 0.65 - }, - { - "x": 303, - "y": 97, - "t": 1694173368955, - "p": 0.66 - }, - { - "x": 300, - "y": 97, - "t": 1694173368971, - "p": 0.68 - }, - { - "x": 297, - "y": 95, - "t": 1694173369022, - "p": 0.7 - } - ], - "length": 402.26989499669963, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694173369439", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 345, - "y": 37, - "t": 1694173369439, - "p": 0.1 - }, - { - "x": 343, - "y": 41, - "t": 1694173369455, - "p": 0.73 - }, - { - "x": 341, - "y": 45, - "t": 1694173369488, - "p": 0.73 - }, - { - "x": 340, - "y": 48, - "t": 1694173369505, - "p": 0.68 - }, - { - "x": 344, - "y": 51, - "t": 1694173369539, - "p": 0.74 - }, - { - "x": 348, - "y": 52, - "t": 1694173369554, - "p": 0.72 - }, - { - "x": 352, - "y": 52, - "t": 1694173369571, - "p": 0.71 - }, - { - "x": 356, - "y": 51, - "t": 1694173369587, - "p": 0.72 - }, - { - "x": 360, - "y": 49, - "t": 1694173369604, - "p": 0.73 - }, - { - "x": 366, - "y": 45, - "t": 1694173369621, - "p": 0.79 - }, - { - "x": 369, - "y": 41, - "t": 1694173369638, - "p": 0.74 - }, - { - "x": 370, - "y": 38, - "t": 1694173369655, - "p": 0.68 - }, - { - "x": 368, - "y": 34, - "t": 1694173369671, - "p": 0.73 - }, - { - "x": 365, - "y": 31, - "t": 1694173369688, - "p": 0.72 - }, - { - "x": 357, - "y": 31, - "t": 1694173369704, - "p": 0.8 - }, - { - "x": 344, - "y": 33, - "t": 1694173369721, - "p": 0.64 - }, - { - "x": 335, - "y": 36, - "t": 1694173369738, - "p": 0.82 - }, - { - "x": 329, - "y": 40, - "t": 1694173369754, - "p": 0.79 - }, - { - "x": 326, - "y": 42, - "t": 1694173369787, - "p": 0.7 - }, - { - "x": 330, - "y": 44, - "t": 1694173369854, - "p": 0.73 - }, - { - "x": 338, - "y": 46, - "t": 1694173369865, - "p": 0.8 - } - ], - "length": 459.06621957468275, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694173370316", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 367, - "y": 33, - "t": 1694173370316, - "p": 0.1 - }, - { - "x": 368, - "y": 36, - "t": 1694173370349, - "p": 0.68 - }, - { - "x": 370, - "y": 48, - "t": 1694173370382, - "p": 0.65 - }, - { - "x": 373, - "y": 57, - "t": 1694173370399, - "p": 0.82 - }, - { - "x": 375, - "y": 63, - "t": 1694173370415, - "p": 0.77 - }, - { - "x": 376, - "y": 69, - "t": 1694173370432, - "p": 0.77 - }, - { - "x": 378, - "y": 73, - "t": 1694173370449, - "p": 0.73 - }, - { - "x": 379, - "y": 76, - "t": 1694173370465, - "p": 0.68 - }, - { - "x": 375, - "y": 80, - "t": 1694173370548, - "p": 0.76 - }, - { - "x": 370, - "y": 82, - "t": 1694173370564, - "p": 0.75 - }, - { - "x": 360, - "y": 88, - "t": 1694173370582, - "p": 0.66 - }, - { - "x": 356, - "y": 91, - "t": 1694173370614, - "p": 0.74 - } - ], - "length": 441.04095436363826, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - }, - { - "id": "mouse-1694173371113", - "type": "stroke", - "pointerId": 0, - "pointerType": "mouse", - "pointers": [ - { - "x": 383, - "y": 36, - "t": 1694173371113, - "p": 0.1 - }, - { - "x": 386, - "y": 34, - "t": 1694173371198, - "p": 0.7 - }, - { - "x": 391, - "y": 30, - "t": 1694173371214, - "p": 0.77 - }, - { - "x": 395, - "y": 30, - "t": 1694173371231, - "p": 0.71 - }, - { - "x": 400, - "y": 29, - "t": 1694173371247, - "p": 0.75 - }, - { - "x": 405, - "y": 28, - "t": 1694173371264, - "p": 0.75 - }, - { - "x": 408, - "y": 29, - "t": 1694173371315, - "p": 0.68 - }, - { - "x": 409, - "y": 34, - "t": 1694173371331, - "p": 0.75 - }, - { - "x": 406, - "y": 38, - "t": 1694173371348, - "p": 0.74 - }, - { - "x": 401, - "y": 44, - "t": 1694173371364, - "p": 0.8 - }, - { - "x": 398, - "y": 46, - "t": 1694173371381, - "p": 0.7 - }, - { - "x": 394, - "y": 47, - "t": 1694173371398, - "p": 0.72 - }, - { - "x": 399, - "y": 47, - "t": 1694173371465, - "p": 0.74 - }, - { - "x": 402, - "y": 47, - "t": 1694173371480, - "p": 0.68 - }, - { - "x": 407, - "y": 48, - "t": 1694173371514, - "p": 0.75 - }, - { - "x": 410, - "y": 51, - "t": 1694173371531, - "p": 0.72 - }, - { - "x": 410, - "y": 58, - "t": 1694173371564, - "p": 0.78 - }, - { - "x": 408, - "y": 62, - "t": 1694173371581, - "p": 0.73 - }, - { - "x": 406, - "y": 65, - "t": 1694173371597, - "p": 0.7 - }, - { - "x": 403, - "y": 68, - "t": 1694173371614, - "p": 0.72 - }, - { - "x": 400, - "y": 70, - "t": 1694173371630, - "p": 0.7 - }, - { - "x": 397, - "y": 71, - "t": 1694173371647, - "p": 0.68 - }, - { - "x": 393, - "y": 72, - "t": 1694173371663, - "p": 0.72 - }, - { - "x": 389, - "y": 73, - "t": 1694173371681, - "p": 0.72 - } - ], - "length": 489.371132013743, - "style": { - "color": "#000000", - "width": 1.8897637795275593, - "-myscript-pen-width": 1, - "-myscript-pen-fill-style": "none", - "-myscript-pen-fill-color": "#FFFFFF00" - } - } -] diff --git a/test/integration/strokes/multiple-inputs/centralProcessingUnit.json b/test/integration/strokes/multiple-inputs/centralProcessingUnit.json deleted file mode 100644 index fceddeba6..000000000 --- a/test/integration/strokes/multiple-inputs/centralProcessingUnit.json +++ /dev/null @@ -1,1820 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 29, - "y": 62, - "t": 1695828886232, - "p": 0.17 - }, - { - "x": 26, - "y": 62, - "t": 1695828886313, - "p": 0.68 - }, - { - "x": 21, - "y": 62, - "t": 1695828886347, - "p": 0.74 - }, - { - "x": 17, - "y": 63, - "t": 1695828886364, - "p": 0.72 - }, - { - "x": 14, - "y": 64, - "t": 1695828886381, - "p": 0.68 - }, - { - "x": 11, - "y": 66, - "t": 1695828886414, - "p": 0.7 - }, - { - "x": 10, - "y": 70, - "t": 1695828886463, - "p": 0.72 - }, - { - "x": 8, - "y": 73, - "t": 1695828886497, - "p": 0.7 - }, - { - "x": 10, - "y": 76, - "t": 1695828886547, - "p": 0.7 - }, - { - "x": 15, - "y": 78, - "t": 1695828886580, - "p": 0.75 - }, - { - "x": 19, - "y": 78, - "t": 1695828886613, - "p": 0.71 - }, - { - "x": 22, - "y": 78, - "t": 1695828886630, - "p": 0.68 - }, - { - "x": 25, - "y": 78, - "t": 1695828886647, - "p": 0.68 - }, - { - "x": 28, - "y": 78, - "t": 1695828886664, - "p": 0.68 - }, - { - "x": 31, - "y": 78, - "t": 1695828886697, - "p": 0.68 - }, - { - "x": 34, - "y": 77, - "t": 1695828886795, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 39, - "y": 71, - "t": 1695828887187, - "p": 0.1 - }, - { - "x": 42, - "y": 71, - "t": 1695828887230, - "p": 0.68 - }, - { - "x": 45, - "y": 71, - "t": 1695828887247, - "p": 0.68 - }, - { - "x": 49, - "y": 71, - "t": 1695828887264, - "p": 0.71 - }, - { - "x": 52, - "y": 70, - "t": 1695828887280, - "p": 0.68 - }, - { - "x": 56, - "y": 69, - "t": 1695828887297, - "p": 0.72 - }, - { - "x": 59, - "y": 68, - "t": 1695828887313, - "p": 0.68 - }, - { - "x": 60, - "y": 65, - "t": 1695828887346, - "p": 0.68 - }, - { - "x": 59, - "y": 62, - "t": 1695828887363, - "p": 0.68 - }, - { - "x": 56, - "y": 60, - "t": 1695828887379, - "p": 0.7 - }, - { - "x": 52, - "y": 59, - "t": 1695828887413, - "p": 0.72 - }, - { - "x": 46, - "y": 61, - "t": 1695828887446, - "p": 0.77 - }, - { - "x": 41, - "y": 64, - "t": 1695828887462, - "p": 0.76 - }, - { - "x": 37, - "y": 65, - "t": 1695828887479, - "p": 0.72 - }, - { - "x": 34, - "y": 67, - "t": 1695828887497, - "p": 0.7 - }, - { - "x": 34, - "y": 70, - "t": 1695828887513, - "p": 0.68 - }, - { - "x": 35, - "y": 73, - "t": 1695828887530, - "p": 0.68 - }, - { - "x": 37, - "y": 76, - "t": 1695828887546, - "p": 0.7 - }, - { - "x": 40, - "y": 78, - "t": 1695828887629, - "p": 0.7 - }, - { - "x": 45, - "y": 79, - "t": 1695828887680, - "p": 0.75 - }, - { - "x": 49, - "y": 79, - "t": 1695828887695, - "p": 0.71 - }, - { - "x": 54, - "y": 79, - "t": 1695828887713, - "p": 0.74 - }, - { - "x": 57, - "y": 79, - "t": 1695828887783, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 66, - "y": 66, - "t": 1695828888117, - "p": 0.1 - }, - { - "x": 67, - "y": 71, - "t": 1695828888162, - "p": 0.75 - }, - { - "x": 67, - "y": 75, - "t": 1695828888179, - "p": 0.71 - }, - { - "x": 67, - "y": 78, - "t": 1695828888196, - "p": 0.68 - }, - { - "x": 69, - "y": 75, - "t": 1695828888362, - "p": 0.7 - }, - { - "x": 70, - "y": 72, - "t": 1695828888395, - "p": 0.68 - }, - { - "x": 73, - "y": 69, - "t": 1695828888428, - "p": 0.72 - }, - { - "x": 77, - "y": 72, - "t": 1695828888545, - "p": 0.74 - }, - { - "x": 79, - "y": 76, - "t": 1695828888563, - "p": 0.73 - }, - { - "x": 81, - "y": 80, - "t": 1695828888596, - "p": 0.73 - }, - { - "x": 80, - "y": 83, - "t": 1695828888629, - "p": 0.68 - }, - { - "x": 79, - "y": 77, - "t": 1695828888745, - "p": 0.77 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 83, - "y": 45, - "t": 1695828889101, - "p": 0.1 - }, - { - "x": 85, - "y": 49, - "t": 1695828889178, - "p": 0.73 - }, - { - "x": 86, - "y": 52, - "t": 1695828889195, - "p": 0.68 - }, - { - "x": 87, - "y": 55, - "t": 1695828889211, - "p": 0.68 - }, - { - "x": 88, - "y": 60, - "t": 1695828889244, - "p": 0.75 - }, - { - "x": 89, - "y": 64, - "t": 1695828889262, - "p": 0.72 - }, - { - "x": 90, - "y": 68, - "t": 1695828889278, - "p": 0.72 - }, - { - "x": 91, - "y": 71, - "t": 1695828889311, - "p": 0.68 - }, - { - "x": 91, - "y": 74, - "t": 1695828889455, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 88, - "y": 59, - "t": 1695828889940, - "p": 0.1 - }, - { - "x": 91, - "y": 58, - "t": 1695828889994, - "p": 0.68 - }, - { - "x": 94, - "y": 58, - "t": 1695828890010, - "p": 0.68 - }, - { - "x": 98, - "y": 57, - "t": 1695828890027, - "p": 0.72 - }, - { - "x": 102, - "y": 56, - "t": 1695828890043, - "p": 0.72 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 101, - "y": 79, - "t": 1695828890560, - "p": 0.1 - }, - { - "x": 101, - "y": 76, - "t": 1695828890631, - "p": 0.68 - }, - { - "x": 101, - "y": 72, - "t": 1695828890660, - "p": 0.71 - }, - { - "x": 103, - "y": 69, - "t": 1695828890693, - "p": 0.7 - }, - { - "x": 106, - "y": 64, - "t": 1695828890727, - "p": 0.76 - }, - { - "x": 109, - "y": 63, - "t": 1695828890777, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 118, - "y": 69, - "t": 1695828891143, - "p": 0.1 - }, - { - "x": 116, - "y": 73, - "t": 1695828891210, - "p": 0.73 - }, - { - "x": 116, - "y": 76, - "t": 1695828891259, - "p": 0.68 - }, - { - "x": 120, - "y": 77, - "t": 1695828891326, - "p": 0.72 - }, - { - "x": 123, - "y": 77, - "t": 1695828891343, - "p": 0.68 - }, - { - "x": 127, - "y": 75, - "t": 1695828891392, - "p": 0.73 - }, - { - "x": 127, - "y": 72, - "t": 1695828891443, - "p": 0.68 - }, - { - "x": 123, - "y": 70, - "t": 1695828891477, - "p": 0.73 - }, - { - "x": 117, - "y": 69, - "t": 1695828891510, - "p": 0.77 - }, - { - "x": 112, - "y": 69, - "t": 1695828891542, - "p": 0.74 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 123, - "y": 71, - "t": 1695828892082, - "p": 0.1 - }, - { - "x": 123, - "y": 74, - "t": 1695828892125, - "p": 0.68 - }, - { - "x": 124, - "y": 77, - "t": 1695828892175, - "p": 0.68 - }, - { - "x": 124, - "y": 80, - "t": 1695828892307, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 136, - "y": 45, - "t": 1695828892776, - "p": 0.1 - }, - { - "x": 137, - "y": 51, - "t": 1695828892824, - "p": 0.77 - }, - { - "x": 137, - "y": 56, - "t": 1695828892842, - "p": 0.74 - }, - { - "x": 137, - "y": 60, - "t": 1695828892858, - "p": 0.71 - }, - { - "x": 137, - "y": 64, - "t": 1695828892875, - "p": 0.71 - }, - { - "x": 137, - "y": 67, - "t": 1695828892892, - "p": 0.68 - }, - { - "x": 138, - "y": 70, - "t": 1695828892925, - "p": 0.68 - }, - { - "x": 138, - "y": 73, - "t": 1695828892958, - "p": 0.68 - }, - { - "x": 137, - "y": 76, - "t": 1695828892991, - "p": 0.68 - }, - { - "x": 137, - "y": 81, - "t": 1695828893158, - "p": 0.74 - }, - { - "x": 137, - "y": 84, - "t": 1695828893208, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 166, - "y": 74, - "t": 1695828894357, - "p": 0.1 - }, - { - "x": 167, - "y": 79, - "t": 1695828894423, - "p": 0.75 - }, - { - "x": 167, - "y": 82, - "t": 1695828894440, - "p": 0.68 - }, - { - "x": 167, - "y": 86, - "t": 1695828894457, - "p": 0.71 - }, - { - "x": 167, - "y": 89, - "t": 1695828894473, - "p": 0.68 - }, - { - "x": 168, - "y": 92, - "t": 1695828894507, - "p": 0.68 - }, - { - "x": 165, - "y": 88, - "t": 1695828894691, - "p": 0.74 - }, - { - "x": 164, - "y": 85, - "t": 1695828894707, - "p": 0.68 - }, - { - "x": 164, - "y": 82, - "t": 1695828894724, - "p": 0.68 - }, - { - "x": 165, - "y": 79, - "t": 1695828894740, - "p": 0.68 - }, - { - "x": 166, - "y": 74, - "t": 1695828894773, - "p": 0.75 - }, - { - "x": 168, - "y": 70, - "t": 1695828894807, - "p": 0.73 - }, - { - "x": 172, - "y": 66, - "t": 1695828894839, - "p": 0.76 - }, - { - "x": 175, - "y": 64, - "t": 1695828894873, - "p": 0.7 - }, - { - "x": 179, - "y": 65, - "t": 1695828894923, - "p": 0.72 - }, - { - "x": 182, - "y": 67, - "t": 1695828894940, - "p": 0.7 - }, - { - "x": 185, - "y": 68, - "t": 1695828894956, - "p": 0.68 - }, - { - "x": 185, - "y": 73, - "t": 1695828895006, - "p": 0.74 - }, - { - "x": 183, - "y": 76, - "t": 1695828895023, - "p": 0.7 - }, - { - "x": 178, - "y": 79, - "t": 1695828895056, - "p": 0.76 - }, - { - "x": 174, - "y": 80, - "t": 1695828895073, - "p": 0.72 - }, - { - "x": 170, - "y": 82, - "t": 1695828895090, - "p": 0.73 - }, - { - "x": 167, - "y": 83, - "t": 1695828895123, - "p": 0.68 - }, - { - "x": 169, - "y": 80, - "t": 1695828895227, - "p": 0.7 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 191, - "y": 81, - "t": 1695828895628, - "p": 0.1 - }, - { - "x": 190, - "y": 78, - "t": 1695828895690, - "p": 0.68 - }, - { - "x": 189, - "y": 74, - "t": 1695828895723, - "p": 0.72 - }, - { - "x": 189, - "y": 71, - "t": 1695828895740, - "p": 0.68 - }, - { - "x": 190, - "y": 68, - "t": 1695828895773, - "p": 0.68 - }, - { - "x": 193, - "y": 65, - "t": 1695828895806, - "p": 0.72 - }, - { - "x": 196, - "y": 63, - "t": 1695828895840, - "p": 0.7 - }, - { - "x": 199, - "y": 65, - "t": 1695828895922, - "p": 0.7 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 198, - "y": 72, - "t": 1695828896159, - "p": 0.1 - }, - { - "x": 198, - "y": 75, - "t": 1695828896205, - "p": 0.68 - }, - { - "x": 203, - "y": 76, - "t": 1695828896238, - "p": 0.75 - }, - { - "x": 206, - "y": 77, - "t": 1695828896254, - "p": 0.68 - }, - { - "x": 209, - "y": 77, - "t": 1695828896295, - "p": 0.68 - }, - { - "x": 211, - "y": 72, - "t": 1695828896355, - "p": 0.75 - }, - { - "x": 213, - "y": 69, - "t": 1695828896389, - "p": 0.7 - }, - { - "x": 210, - "y": 67, - "t": 1695828896473, - "p": 0.7 - }, - { - "x": 204, - "y": 67, - "t": 1695828896505, - "p": 0.77 - }, - { - "x": 201, - "y": 68, - "t": 1695828896538, - "p": 0.68 - }, - { - "x": 199, - "y": 71, - "t": 1695828896642, - "p": 0.7 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 230, - "y": 62, - "t": 1695828897180, - "p": 0.1 - }, - { - "x": 227, - "y": 63, - "t": 1695828897238, - "p": 0.68 - }, - { - "x": 223, - "y": 66, - "t": 1695828897271, - "p": 0.74 - }, - { - "x": 220, - "y": 71, - "t": 1695828897304, - "p": 0.76 - }, - { - "x": 219, - "y": 75, - "t": 1695828897321, - "p": 0.72 - }, - { - "x": 218, - "y": 78, - "t": 1695828897354, - "p": 0.68 - }, - { - "x": 221, - "y": 80, - "t": 1695828897420, - "p": 0.7 - }, - { - "x": 226, - "y": 80, - "t": 1695828897472, - "p": 0.74 - }, - { - "x": 231, - "y": 79, - "t": 1695828897505, - "p": 0.75 - }, - { - "x": 235, - "y": 78, - "t": 1695828897520, - "p": 0.72 - }, - { - "x": 240, - "y": 77, - "t": 1695828897554, - "p": 0.75 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 239, - "y": 72, - "t": 1695828897888, - "p": 0.1 - }, - { - "x": 242, - "y": 72, - "t": 1695828897954, - "p": 0.68 - }, - { - "x": 245, - "y": 71, - "t": 1695828897971, - "p": 0.68 - }, - { - "x": 248, - "y": 71, - "t": 1695828897987, - "p": 0.68 - }, - { - "x": 251, - "y": 70, - "t": 1695828898020, - "p": 0.68 - }, - { - "x": 252, - "y": 67, - "t": 1695828898073, - "p": 0.68 - }, - { - "x": 248, - "y": 67, - "t": 1695828898154, - "p": 0.71 - }, - { - "x": 245, - "y": 67, - "t": 1695828898170, - "p": 0.68 - }, - { - "x": 242, - "y": 68, - "t": 1695828898187, - "p": 0.68 - }, - { - "x": 239, - "y": 70, - "t": 1695828898256, - "p": 0.7 - }, - { - "x": 239, - "y": 74, - "t": 1695828898304, - "p": 0.71 - }, - { - "x": 239, - "y": 77, - "t": 1695828898337, - "p": 0.68 - }, - { - "x": 243, - "y": 78, - "t": 1695828898387, - "p": 0.72 - }, - { - "x": 247, - "y": 78, - "t": 1695828898421, - "p": 0.71 - }, - { - "x": 250, - "y": 78, - "t": 1695828898436, - "p": 0.68 - }, - { - "x": 253, - "y": 78, - "t": 1695828898469, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 268, - "y": 61, - "t": 1695828898996, - "p": 0.1 - }, - { - "x": 264, - "y": 62, - "t": 1695828899036, - "p": 0.72 - }, - { - "x": 261, - "y": 65, - "t": 1695828899087, - "p": 0.72 - }, - { - "x": 261, - "y": 68, - "t": 1695828899139, - "p": 0.68 - }, - { - "x": 265, - "y": 69, - "t": 1695828899169, - "p": 0.72 - }, - { - "x": 268, - "y": 69, - "t": 1695828899203, - "p": 0.68 - }, - { - "x": 267, - "y": 72, - "t": 1695828899269, - "p": 0.68 - }, - { - "x": 266, - "y": 76, - "t": 1695828899302, - "p": 0.72 - }, - { - "x": 263, - "y": 79, - "t": 1695828899337, - "p": 0.72 - }, - { - "x": 260, - "y": 81, - "t": 1695828899370, - "p": 0.7 - }, - { - "x": 255, - "y": 83, - "t": 1695828899402, - "p": 0.75 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 283, - "y": 63, - "t": 1695828899938, - "p": 0.1 - }, - { - "x": 280, - "y": 63, - "t": 1695828899969, - "p": 0.68 - }, - { - "x": 275, - "y": 65, - "t": 1695828900003, - "p": 0.75 - }, - { - "x": 272, - "y": 68, - "t": 1695828900052, - "p": 0.72 - }, - { - "x": 272, - "y": 71, - "t": 1695828900085, - "p": 0.68 - }, - { - "x": 275, - "y": 73, - "t": 1695828900152, - "p": 0.7 - }, - { - "x": 277, - "y": 76, - "t": 1695828900218, - "p": 0.7 - }, - { - "x": 278, - "y": 79, - "t": 1695828900286, - "p": 0.68 - }, - { - "x": 274, - "y": 82, - "t": 1695828900319, - "p": 0.74 - }, - { - "x": 271, - "y": 83, - "t": 1695828900335, - "p": 0.68 - }, - { - "x": 267, - "y": 84, - "t": 1695828900368, - "p": 0.72 - }, - { - "x": 264, - "y": 84, - "t": 1695828900451, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 288, - "y": 66, - "t": 1695828900881, - "p": 0.1 - }, - { - "x": 288, - "y": 71, - "t": 1695828900934, - "p": 0.74 - }, - { - "x": 287, - "y": 74, - "t": 1695828900952, - "p": 0.68 - }, - { - "x": 287, - "y": 78, - "t": 1695828900985, - "p": 0.71 - }, - { - "x": 287, - "y": 81, - "t": 1695828901034, - "p": 0.68 - }, - { - "x": 286, - "y": 84, - "t": 1695828901084, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 292, - "y": 49, - "t": 1695828901486, - "p": 0.1 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 295, - "y": 68, - "t": 1695828902006, - "p": 0.1 - }, - { - "x": 296, - "y": 71, - "t": 1695828902067, - "p": 0.68 - }, - { - "x": 295, - "y": 74, - "t": 1695828902084, - "p": 0.68 - }, - { - "x": 295, - "y": 78, - "t": 1695828902117, - "p": 0.71 - }, - { - "x": 295, - "y": 81, - "t": 1695828902150, - "p": 0.68 - }, - { - "x": 292, - "y": 78, - "t": 1695828902350, - "p": 0.72 - }, - { - "x": 291, - "y": 75, - "t": 1695828902367, - "p": 0.68 - }, - { - "x": 293, - "y": 71, - "t": 1695828902383, - "p": 0.73 - }, - { - "x": 296, - "y": 68, - "t": 1695828902416, - "p": 0.72 - }, - { - "x": 299, - "y": 68, - "t": 1695828902517, - "p": 0.68 - }, - { - "x": 302, - "y": 72, - "t": 1695828902550, - "p": 0.74 - }, - { - "x": 303, - "y": 75, - "t": 1695828902583, - "p": 0.68 - }, - { - "x": 304, - "y": 78, - "t": 1695828902634, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 313, - "y": 68, - "t": 1695828903137, - "p": 0.1 - }, - { - "x": 312, - "y": 72, - "t": 1695828903183, - "p": 0.72 - }, - { - "x": 314, - "y": 75, - "t": 1695828903233, - "p": 0.7 - }, - { - "x": 317, - "y": 76, - "t": 1695828903273, - "p": 0.68 - }, - { - "x": 322, - "y": 74, - "t": 1695828903332, - "p": 0.75 - }, - { - "x": 327, - "y": 71, - "t": 1695828903365, - "p": 0.76 - }, - { - "x": 326, - "y": 68, - "t": 1695828903434, - "p": 0.68 - }, - { - "x": 323, - "y": 67, - "t": 1695828903466, - "p": 0.68 - }, - { - "x": 320, - "y": 67, - "t": 1695828903499, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 328, - "y": 66, - "t": 1695828903878, - "p": 0.1 - }, - { - "x": 328, - "y": 70, - "t": 1695828903916, - "p": 0.71 - }, - { - "x": 329, - "y": 73, - "t": 1695828903949, - "p": 0.68 - }, - { - "x": 332, - "y": 78, - "t": 1695828903982, - "p": 0.76 - }, - { - "x": 333, - "y": 81, - "t": 1695828903998, - "p": 0.68 - }, - { - "x": 334, - "y": 84, - "t": 1695828904016, - "p": 0.68 - }, - { - "x": 335, - "y": 87, - "t": 1695828904049, - "p": 0.68 - }, - { - "x": 334, - "y": 91, - "t": 1695828904082, - "p": 0.72 - }, - { - "x": 331, - "y": 94, - "t": 1695828904115, - "p": 0.72 - }, - { - "x": 328, - "y": 96, - "t": 1695828904200, - "p": 0.7 - }, - { - "x": 324, - "y": 94, - "t": 1695828904232, - "p": 0.73 - }, - { - "x": 323, - "y": 89, - "t": 1695828904265, - "p": 0.75 - }, - { - "x": 326, - "y": 84, - "t": 1695828904299, - "p": 0.76 - }, - { - "x": 329, - "y": 81, - "t": 1695828904331, - "p": 0.72 - }, - { - "x": 332, - "y": 77, - "t": 1695828904364, - "p": 0.74 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 363, - "y": 63, - "t": 1695828905623, - "p": 0.1 - }, - { - "x": 362, - "y": 68, - "t": 1695828905680, - "p": 0.75 - }, - { - "x": 361, - "y": 71, - "t": 1695828905714, - "p": 0.68 - }, - { - "x": 361, - "y": 75, - "t": 1695828905747, - "p": 0.71 - }, - { - "x": 365, - "y": 77, - "t": 1695828905814, - "p": 0.73 - }, - { - "x": 369, - "y": 77, - "t": 1695828905863, - "p": 0.71 - }, - { - "x": 373, - "y": 71, - "t": 1695828905914, - "p": 0.79 - }, - { - "x": 376, - "y": 66, - "t": 1695828905947, - "p": 0.76 - }, - { - "x": 377, - "y": 63, - "t": 1695828905980, - "p": 0.68 - }, - { - "x": 377, - "y": 70, - "t": 1695828906114, - "p": 0.78 - }, - { - "x": 377, - "y": 73, - "t": 1695828906129, - "p": 0.68 - }, - { - "x": 377, - "y": 76, - "t": 1695828906164, - "p": 0.68 - }, - { - "x": 379, - "y": 79, - "t": 1695828906197, - "p": 0.7 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 386, - "y": 62, - "t": 1695828906715, - "p": 0.1 - }, - { - "x": 386, - "y": 65, - "t": 1695828906763, - "p": 0.68 - }, - { - "x": 387, - "y": 68, - "t": 1695828906779, - "p": 0.68 - }, - { - "x": 387, - "y": 73, - "t": 1695828906812, - "p": 0.74 - }, - { - "x": 387, - "y": 76, - "t": 1695828906830, - "p": 0.68 - }, - { - "x": 387, - "y": 72, - "t": 1695828907013, - "p": 0.71 - }, - { - "x": 387, - "y": 69, - "t": 1695828907029, - "p": 0.68 - }, - { - "x": 389, - "y": 66, - "t": 1695828907062, - "p": 0.7 - }, - { - "x": 391, - "y": 69, - "t": 1695828907213, - "p": 0.7 - }, - { - "x": 392, - "y": 72, - "t": 1695828907228, - "p": 0.68 - }, - { - "x": 393, - "y": 76, - "t": 1695828907262, - "p": 0.72 - }, - { - "x": 394, - "y": 79, - "t": 1695828907295, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 402, - "y": 62, - "t": 1695828907759, - "p": 0.1 - }, - { - "x": 402, - "y": 66, - "t": 1695828907828, - "p": 0.71 - }, - { - "x": 402, - "y": 71, - "t": 1695828907862, - "p": 0.74 - }, - { - "x": 402, - "y": 75, - "t": 1695828907895, - "p": 0.71 - }, - { - "x": 402, - "y": 79, - "t": 1695828907978, - "p": 0.71 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 402, - "y": 50, - "t": 1695828908403, - "p": 0.1 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 410, - "y": 45, - "t": 1695828908880, - "p": 0.1 - }, - { - "x": 410, - "y": 51, - "t": 1695828908945, - "p": 0.77 - }, - { - "x": 410, - "y": 55, - "t": 1695828908960, - "p": 0.71 - }, - { - "x": 410, - "y": 58, - "t": 1695828908977, - "p": 0.68 - }, - { - "x": 411, - "y": 61, - "t": 1695828908994, - "p": 0.68 - }, - { - "x": 411, - "y": 65, - "t": 1695828909027, - "p": 0.71 - }, - { - "x": 412, - "y": 70, - "t": 1695828909061, - "p": 0.75 - }, - { - "x": 412, - "y": 74, - "t": 1695828909094, - "p": 0.71 - }, - { - "x": 412, - "y": 77, - "t": 1695828909127, - "p": 0.68 - } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 414, - "y": 58, - "t": 1695828909798, - "p": 0.1 - }, - { - "x": 418, - "y": 58, - "t": 1695828909960, - "p": 0.71 - }, - { - "x": 421, - "y": 56, - "t": 1695828910426, - "p": 0.7 - } - ] - } -] diff --git a/test/integration/strokes/one.json b/test/integration/strokes/one.json deleted file mode 100644 index 70d92fe70..000000000 --- a/test/integration/strokes/one.json +++ /dev/null @@ -1,128 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { - "x": 95, - "y": 93, - "t": 1695886395822, - "p": 0.1 - }, - { - "x": 99, - "y": 90, - "t": 1695886395889, - "p": 0.74 - }, - { - "x": 103, - "y": 87, - "t": 1695886395921, - "p": 0.74 - }, - { - "x": 109, - "y": 84, - "t": 1695886395938, - "p": 0.78 - }, - { - "x": 113, - "y": 82, - "t": 1695886395955, - "p": 0.73 - }, - { - "x": 118, - "y": 76, - "t": 1695886395971, - "p": 0.8 - }, - { - "x": 123, - "y": 71, - "t": 1695886395988, - "p": 0.79 - }, - { - "x": 126, - "y": 65, - "t": 1695886396006, - "p": 0.78 - }, - { - "x": 126, - "y": 62, - "t": 1695886396022, - "p": 0.68 - }, - { - "x": 125, - "y": 65, - "t": 1695886396126, - "p": 0.68 - }, - { - "x": 124, - "y": 70, - "t": 1695886396154, - "p": 0.75 - }, - { - "x": 124, - "y": 77, - "t": 1695886396188, - "p": 0.78 - }, - { - "x": 124, - "y": 83, - "t": 1695886396205, - "p": 0.77 - }, - { - "x": 123, - "y": 87, - "t": 1695886396222, - "p": 0.72 - }, - { - "x": 123, - "y": 91, - "t": 1695886396237, - "p": 0.71 - }, - { - "x": 122, - "y": 98, - "t": 1695886396255, - "p": 0.79 - }, - { - "x": 122, - "y": 103, - "t": 1695886396271, - "p": 0.74 - }, - { - "x": 122, - "y": 107, - "t": 1695886396304, - "p": 0.71 - }, - { - "x": 122, - "y": 110, - "t": 1695886396338, - "p": 0.68 - }, - { - "x": 121, - "y": 114, - "t": 1695886396421, - "p": 0.72 - } - ] - } -] diff --git a/test/integration/strokes/ponyErase.json b/test/integration/strokes/ponyErase.json deleted file mode 100644 index 2a3c6cc99..000000000 --- a/test/integration/strokes/ponyErase.json +++ /dev/null @@ -1,434 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 228, - 233, - 237, - 244, - 250, - 254, - 257, - 258, - 259, - 258, - 257, - 254, - 253, - 252, - 252, - 252, - 253, - 254, - 251, - 250, - 249, - 248, - 249, - 250, - 251, - 254, - 257, - 259, - 261, - 262, - 265, - 268, - 273, - 277, - 277, - 274, - 278, - 281, - 284, - 291, - 293, - 294, - 290, - 286, - 280, - 274, - 273, - 278, - 283, - 286, - 289, - 292, - 296, - 299, - 303, - 306, - 310, - 313, - 315, - 316, - 317, - 317, - 317, - 318, - 321, - 323, - 325, - 327, - 329, - 330, - 333, - 336, - 341, - 345, - 345, - 342, - 344, - 346, - 347, - 347, - 351, - 354, - 357, - 360, - 361, - 365, - 367, - 372, - 375, - 377, - 377, - 375, - 372, - 367, - 365, - 366, - 369, - 374, - 379, - 384, - 388 - ], - "y": [ - 353, - 348, - 345, - 340, - 335, - 331, - 327, - 324, - 321, - 330, - 337, - 345, - 352, - 360, - 367, - 372, - 376, - 379, - 375, - 370, - 364, - 354, - 350, - 347, - 344, - 341, - 345, - 348, - 351, - 354, - 355, - 355, - 354, - 351, - 348, - 354, - 357, - 358, - 359, - 358, - 355, - 350, - 347, - 347, - 345, - 344, - 347, - 349, - 350, - 350, - 348, - 348, - 346, - 344, - 339, - 337, - 338, - 342, - 346, - 350, - 353, - 356, - 353, - 349, - 345, - 342, - 345, - 348, - 352, - 356, - 356, - 353, - 349, - 345, - 342, - 340, - 343, - 348, - 351, - 354, - 353, - 351, - 347, - 343, - 346, - 351, - 354, - 358, - 362, - 365, - 369, - 373, - 374, - 370, - 366, - 362, - 357, - 350, - 345, - 342, - 341 - ], - "t": [ - 1691671459764, - 1691671459821, - 1691671459837, - 1691671459854, - 1691671459871, - 1691671459888, - 1691671459904, - 1691671459921, - 1691671459954, - 1691671460037, - 1691671460054, - 1691671460070, - 1691671460087, - 1691671460104, - 1691671460120, - 1691671460137, - 1691671460154, - 1691671460170, - 1691671460304, - 1691671460320, - 1691671460337, - 1691671460370, - 1691671460387, - 1691671460420, - 1691671460437, - 1691671460470, - 1691671460687, - 1691671460704, - 1691671460720, - 1691671460737, - 1691671460754, - 1691671460787, - 1691671460837, - 1691671460870, - 1691671460903, - 1691671461004, - 1691671461037, - 1691671461053, - 1691671461070, - 1691671461087, - 1691671461153, - 1691671461186, - 1691671461219, - 1691671461236, - 1691671461253, - 1691671461269, - 1691671461369, - 1691671461436, - 1691671461453, - 1691671461470, - 1691671461503, - 1691671461519, - 1691671461552, - 1691671461586, - 1691671461619, - 1691671461653, - 1691671461786, - 1691671461803, - 1691671461819, - 1691671461836, - 1691671461853, - 1691671461869, - 1691671462169, - 1691671462202, - 1691671462236, - 1691671462269, - 1691671462419, - 1691671462435, - 1691671462468, - 1691671462503, - 1691671462569, - 1691671462619, - 1691671462668, - 1691671462702, - 1691671462752, - 1691671463021, - 1691671463385, - 1691671463418, - 1691671463468, - 1691671463551, - 1691671463634, - 1691671463734, - 1691671463784, - 1691671463818, - 1691671464101, - 1691671464117, - 1691671464134, - 1691671464167, - 1691671464184, - 1691671464201, - 1691671464217, - 1691671464267, - 1691671464334, - 1691671464351, - 1691671464367, - 1691671464384, - 1691671464400, - 1691671464417, - 1691671464434, - 1691671464450, - 1691671464467 - ], - "p": [ - 0.5, - 0.73, - 0.74, - 0.81, - 0.8, - 0.76, - 0.74, - 0.68, - 0.68, - 0.81, - 0.79, - 0.81, - 0.79, - 0.8, - 0.78, - 0.74, - 0.72, - 0.68, - 0.74, - 0.75, - 0.77, - 0.68, - 0.72, - 0.68, - 0.68, - 0.72, - 0.74, - 0.7, - 0.7, - 0.68, - 0.68, - 0.68, - 0.75, - 0.74, - 0.68, - 0.78, - 0.74, - 0.68, - 0.68, - 0.79, - 0.7, - 0.75, - 0.74, - 0.71, - 0.77, - 0.77, - 0.68, - 0.75, - 0.75, - 0.68, - 0.7, - 0.68, - 0.73, - 0.7, - 0.77, - 0.7, - 0.72, - 0.74, - 0.73, - 0.72, - 0.68, - 0.68, - 0.68, - 0.72, - 0.74, - 0.7, - 0.7, - 0.7, - 0.73, - 0.72, - 0.68, - 0.72, - 0.77, - 0.76, - 0.68, - 0.7, - 0.7, - 0.75, - 0.68, - 0.68, - 0.72, - 0.7, - 0.74, - 0.74, - 0.68, - 0.77, - 0.7, - 0.77, - 0.74, - 0.7, - 0.71, - 0.73, - 0.68, - 0.77, - 0.73, - 0.72, - 0.76, - 0.81, - 0.79, - 0.76, - 0.72 - ] - }, - { - "pointerType": "eraser", - "pointerId": 0, - "x": [ - 231 - ], - "y": [ - 350 - ], - "t": [ - 1691671470393 - ], - "p": [ - 0.5 - ] - } -] diff --git a/test/integration/strokes/rectangle.json b/test/integration/strokes/rectangle.json deleted file mode 100644 index 2146db1bd..000000000 --- a/test/integration/strokes/rectangle.json +++ /dev/null @@ -1,338 +0,0 @@ -[ - { - "p": [ - 0.5, - 0.83, - 0.71, - 0.74, - 0.74, - 0.78, - 0.79, - 0.78, - 0.71, - 0.71, - 0.71, - 0.75, - 0.68, - 0.68, - 0.71, - 0.68, - 0.68, - 0.71 - ], - "t": [ - 1688461352900, - 1688461352959, - 1688461352975, - 1688461352991, - 1688461353008, - 1688461353025, - 1688461353042, - 1688461353058, - 1688461353075, - 1688461353091, - 1688461353108, - 1688461353124, - 1688461353142, - 1688461353159, - 1688461353175, - 1688461353191, - 1688461353317, - 1688461353425 - ], - "x": [ - 217, - 217, - 217, - 217, - 217, - 217, - 216, - 216, - 216, - 216, - 216, - 215, - 215, - 215, - 215, - 214, - 214, - 214 - ], - "y": [ - 197, - 200, - 204, - 209, - 214, - 221, - 228, - 235, - 239, - 243, - 247, - 252, - 255, - 258, - 262, - 265, - 268, - 272 - ] - }, - { - "p": [ - 0.5, - 0.82, - 0.8, - 0.61, - 0.51, - 0.67, - 0.78, - 0.68, - 0.68, - 0.68, - 0.74, - 0.75, - 0.71, - 0.68, - 0.71, - 0.68, - 0.71, - 0.68, - 0.75, - 0.71, - 0.7, - 0.71, - 0.77, - 0.68, - 0.71, - 0.71, - 0.79, - 0.8, - 0.71, - 0.77, - 0.72, - 0.68, - 0.68, - 0.68, - 0.68, - 0.74, - 0.68, - 0.68, - 0.68, - 0.7, - 0.8, - 0.64, - 0.65, - 0.67, - 0.77, - 0.68, - 0.68, - 0.74, - 0.8, - 0.78, - 0.74, - 0.68, - 0.68, - 0.74, - 0.74, - 0.71, - 0.77, - 0.71, - 0.72, - 0.73, - 0.68 - ], - "t": [ - 1688461354290, - 1688461354376, - 1688461354393, - 1688461354409, - 1688461354426, - 1688461354442, - 1688461354459, - 1688461354475, - 1688461354493, - 1688461354509, - 1688461354543, - 1688461354559, - 1688461354576, - 1688461354592, - 1688461354609, - 1688461354642, - 1688461354659, - 1688461354693, - 1688461354776, - 1688461354792, - 1688461354826, - 1688461354876, - 1688461354977, - 1688461354993, - 1688461355010, - 1688461355026, - 1688461355043, - 1688461355059, - 1688461355076, - 1688461355093, - 1688461355109, - 1688461355126, - 1688461355143, - 1688461355177, - 1688461355193, - 1688461355226, - 1688461355243, - 1688461355277, - 1688461355530, - 1688461355578, - 1688461355626, - 1688461355644, - 1688461355661, - 1688461355677, - 1688461355694, - 1688461355710, - 1688461355727, - 1688461355744, - 1688461355760, - 1688461355777, - 1688461355794, - 1688461355811, - 1688461355828, - 1688461355860, - 1688461355878, - 1688461355894, - 1688461355910, - 1688461355927, - 1688461356127, - 1688461356144, - 1688461356177 - ], - "x": [ - 219, - 222, - 230, - 245, - 269, - 280, - 287, - 290, - 293, - 296, - 301, - 306, - 310, - 313, - 317, - 320, - 324, - 327, - 332, - 336, - 339, - 343, - 342, - 341, - 341, - 341, - 340, - 339, - 339, - 339, - 338, - 338, - 337, - 337, - 336, - 336, - 336, - 336, - 336, - 333, - 325, - 312, - 300, - 289, - 283, - 280, - 277, - 272, - 264, - 257, - 252, - 249, - 246, - 241, - 236, - 232, - 226, - 222, - 218, - 214, - 211 - ], - "y": [ - 195, - 196, - 197, - 197, - 200, - 200, - 200, - 200, - 200, - 200, - 200, - 201, - 201, - 201, - 201, - 201, - 201, - 201, - 200, - 200, - 198, - 198, - 204, - 207, - 211, - 215, - 222, - 230, - 234, - 240, - 244, - 247, - 250, - 253, - 256, - 261, - 264, - 267, - 270, - 272, - 270, - 270, - 270, - 270, - 270, - 270, - 270, - 270, - 270, - 270, - 270, - 269, - 270, - 270, - 270, - 270, - 270, - 270, - 271, - 269, - 270 - ] - } -] diff --git a/test/integration/strokes/sum.json b/test/integration/strokes/sum.json deleted file mode 100644 index 0665372a1..000000000 --- a/test/integration/strokes/sum.json +++ /dev/null @@ -1,330 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 255, - 259, - 263, - 268, - 271, - 275, - 279, - 283, - 286, - 286, - 284, - 280, - 276, - 281, - 286, - 296, - 299, - 298, - 294, - 290, - 285, - 281, - 276, - 271, - 265, - 258 - ], - "y": [ - 223, - 221, - 219, - 215, - 214, - 215, - 217, - 220, - 221, - 224, - 230, - 234, - 236, - 236, - 236, - 236, - 236, - 239, - 243, - 247, - 249, - 251, - 254, - 255, - 256, - 258 - ], - "t": [ - 1689748306049, - 1689748306129, - 1689748306146, - 1689748306178, - 1689748306195, - 1689748306212, - 1689748306229, - 1689748306245, - 1689748306262, - 1689748306312, - 1689748306328, - 1689748306362, - 1689748306378, - 1689748306562, - 1689748306578, - 1689748306595, - 1689748306629, - 1689748306661, - 1689748306695, - 1689748306711, - 1689748306728, - 1689748306745, - 1689748306778, - 1689748306794, - 1689748306811, - 1689748306829 - ], - "p": [ - 0.5, - 0.79, - 0.73, - 0.77, - 0.68, - 0.72, - 0.73, - 0.74, - 0.68, - 0.68, - 0.77, - 0.76, - 0.73, - 0.74, - 0.74, - 0.68, - 0.68, - 0.68, - 0.76, - 0.76, - 0.75, - 0.73, - 0.76, - 0.75, - 0.77, - 0.79 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 306, - 312, - 324, - 335, - 341, - 344 - ], - "y": [ - 233, - 232, - 232, - 234, - 234, - 234 - ], - "t": [ - 1689748307331, - 1689748307360, - 1689748307377, - 1689748307394, - 1689748307410, - 1689748307427 - ], - "p": [ - 0.5, - 0.75, - 0.67, - 0.67, - 0.77, - 0.68 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 333, - 331, - 329, - 329, - 330 - ], - "y": [ - 218, - 223, - 232, - 238, - 243 - ], - "t": [ - 1689748307920, - 1689748307977, - 1689748307994, - 1689748308011, - 1689748308027 - ], - "p": [ - 0.5, - 0.77, - 0.81, - 0.77, - 0.75 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 355, - 360, - 363, - 367, - 369, - 371, - 370, - 370, - 370, - 370, - 370, - 372, - 372, - 372 - ], - "y": [ - 228, - 224, - 222, - 220, - 217, - 214, - 211, - 214, - 218, - 222, - 227, - 231, - 234, - 237 - ], - "t": [ - 1689748308672, - 1689748308743, - 1689748308759, - 1689748308776, - 1689748308793, - 1689748308810, - 1689748308860, - 1689748308921, - 1689748308943, - 1689748308960, - 1689748308976, - 1689748308992, - 1689748309009, - 1689748309065 - ], - "p": [ - 0.5, - 0.75, - 0.7, - 0.73, - 0.7, - 0.7, - 0.68, - 0.68, - 0.71, - 0.71, - 0.74, - 0.73, - 0.68, - 0.68 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 393, - 397, - 402, - 409, - 413, - 416 - ], - "y": [ - 224, - 222, - 223, - 223, - 224, - 225 - ], - "t": [ - 1689748309782, - 1689748309825, - 1689748309842, - 1689748309859, - 1689748309876, - 1689748309892 - ], - "p": [ - 0.5, - 0.79, - 0.75, - 0.78, - 0.72, - 0.68 - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "x": [ - 392, - 397, - 400, - 407, - 413, - 417, - 420 - ], - "y": [ - 230, - 228, - 228, - 228, - 229, - 229, - 230 - ], - "t": [ - 1689748310171, - 1689748310225, - 1689748310242, - 1689748310258, - 1689748310275, - 1689748310291, - 1689748310325 - ], - "p": [ - 0.5, - 0.77, - 0.68, - 0.78, - 0.77, - 0.71, - 0.68 - ] - } -] diff --git a/test/integration/strokes/sumSimple.json b/test/integration/strokes/sumSimple.json deleted file mode 100644 index dfbd787a3..000000000 --- a/test/integration/strokes/sumSimple.json +++ /dev/null @@ -1,101 +0,0 @@ -[ - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { "x": 461, "y": 215, "t": 1694506504676, "p": 0.1 }, - { "x": 464, "y": 213, "t": 1694506504695, "p": 0.7 }, - { "x": 471, "y": 206, "t": 1694506504728, "p": 0.82 }, - { "x": 475, "y": 201, "t": 1694506504744, "p": 0.77 }, - { "x": 482, "y": 194, "t": 1694506504760, "p": 0.82 }, - { "x": 486, "y": 185, "t": 1694506504777, "p": 0.82 }, - { "x": 491, "y": 176, "t": 1694506504793, "p": 0.68 }, - { "x": 494, "y": 167, "t": 1694506504809, "p": 0.82 }, - { "x": 496, "y": 172, "t": 1694506504955, "p": 0.75 }, - { "x": 496, "y": 177, "t": 1694506504972, "p": 0.74 }, - { "x": 496, "y": 207, "t": 1694506504988, "p": 0.45 }, - { "x": 497, "y": 232, "t": 1694506505004, "p": 0.5 }, - { "x": 497, "y": 245, "t": 1694506505021, "p": 0.64 }, - { "x": 497, "y": 258, "t": 1694506505036, "p": 0.64 }, - { "x": 497, "y": 267, "t": 1694506505053, "p": 0.81 }, - { "x": 497, "y": 272, "t": 1694506505069, "p": 0.74 }, - { "x": 497, "y": 276, "t": 1694506505086, "p": 0.71 }, - { "x": 498, "y": 281, "t": 1694506505102, "p": 0.75 } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { "x": 583, "y": 180, "t": 1694506505627, "p": 0.1 }, - { "x": 583, "y": 187, "t": 1694506505693, "p": 0.78 }, - { "x": 583, "y": 197, "t": 1694506505708, "p": 0.68 }, - { "x": 580, "y": 231, "t": 1694506505725, "p": 0.42 }, - { "x": 580, "y": 242, "t": 1694506505741, "p": 0.67 }, - { "x": 578, "y": 253, "t": 1694506505757, "p": 0.67 }, - { "x": 578, "y": 260, "t": 1694506505774, "p": 0.78 }, - { "x": 578, "y": 266, "t": 1694506505790, "p": 0.77 } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { "x": 557, "y": 236, "t": 1694506506167, "p": 0.1 }, - { "x": 560, "y": 235, "t": 1694506506196, "p": 0.68 }, - { "x": 564, "y": 234, "t": 1694506506228, "p": 0.72 }, - { "x": 569, "y": 232, "t": 1694506506261, "p": 0.75 }, - { "x": 573, "y": 232, "t": 1694506506277, "p": 0.71 }, - { "x": 576, "y": 232, "t": 1694506506293, "p": 0.68 }, - { "x": 583, "y": 232, "t": 1694506506310, "p": 0.78 }, - { "x": 590, "y": 232, "t": 1694506506326, "p": 0.78 }, - { "x": 595, "y": 231, "t": 1694506506342, "p": 0.75 }, - { "x": 598, "y": 231, "t": 1694506506358, "p": 0.68 }, - { "x": 601, "y": 230, "t": 1694506506374, "p": 0.68 }, - { "x": 605, "y": 229, "t": 1694506506405, "p": 0.72 } - ] - }, - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { "x": 649, "y": 176, "t": 1694506506971, "p": 0.1 }, - { "x": 656, "y": 175, "t": 1694506507003, "p": 0.79 }, - { "x": 659, "y": 174, "t": 1694506507019, "p": 0.68 }, - { "x": 663, "y": 174, "t": 1694506507036, "p": 0.71 }, - { "x": 668, "y": 174, "t": 1694506507052, "p": 0.74 }, - { "x": 671, "y": 174, "t": 1694506507068, "p": 0.68 }, - { "x": 674, "y": 179, "t": 1694506507084, "p": 0.76 }, - { "x": 680, "y": 186, "t": 1694506507101, "p": 0.81 }, - { "x": 683, "y": 191, "t": 1694506507117, "p": 0.76 }, - { "x": 685, "y": 196, "t": 1694506507133, "p": 0.75 }, - { "x": 686, "y": 199, "t": 1694506507149, "p": 0.68 }, - { "x": 686, "y": 202, "t": 1694506507165, "p": 0.68 }, - { "x": 680, "y": 208, "t": 1694506507198, "p": 0.81 }, - { "x": 676, "y": 210, "t": 1694506507215, "p": 0.73 }, - { "x": 666, "y": 216, "t": 1694506507230, "p": 0.66 }, - { "x": 658, "y": 220, "t": 1694506507247, "p": 0.81 }, - { "x": 645, "y": 228, "t": 1694506507263, "p": 0.61 }, - { "x": 640, "y": 229, "t": 1694506507279, "p": 0.75 }, - { "x": 644, "y": 230, "t": 1694506507409, "p": 0.72 }, - { "x": 652, "y": 230, "t": 1694506507425, "p": 0.8 }, - { "x": 660, "y": 230, "t": 1694506507441, "p": 0.8 }, - { "x": 671, "y": 230, "t": 1694506507457, "p": 0.67 }, - { "x": 677, "y": 230, "t": 1694506507474, "p": 0.77 }, - { "x": 682, "y": 230, "t": 1694506507490, "p": 0.74 }, - { "x": 687, "y": 234, "t": 1694506507506, "p": 0.77 }, - { "x": 690, "y": 236, "t": 1694506507522, "p": 0.7 }, - { "x": 693, "y": 240, "t": 1694506507554, "p": 0.74 }, - { "x": 693, "y": 244, "t": 1694506507570, "p": 0.71 }, - { "x": 692, "y": 248, "t": 1694506507603, "p": 0.72 }, - { "x": 687, "y": 252, "t": 1694506507619, "p": 0.77 }, - { "x": 681, "y": 254, "t": 1694506507635, "p": 0.77 }, - { "x": 678, "y": 255, "t": 1694506507651, "p": 0.68 }, - { "x": 664, "y": 257, "t": 1694506507668, "p": 0.62 }, - { "x": 659, "y": 257, "t": 1694506507684, "p": 0.74 }, - { "x": 653, "y": 257, "t": 1694506507700, "p": 0.77 }, - { "x": 649, "y": 257, "t": 1694506507716, "p": 0.71 }, - { "x": 646, "y": 257, "t": 1694506507732, "p": 0.68 } - ] - } -] diff --git a/test/integration/strokesDatas.js b/test/integration/strokesDatas.js deleted file mode 100644 index 3ebad519a..000000000 --- a/test/integration/strokesDatas.js +++ /dev/null @@ -1,523 +0,0 @@ -const hStrokes = require("./strokes/h.json") -module.exports.h = { - type: "TEXT", - strokes: hStrokes, - exports: { - "text/plain": ["h"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "h", - words: [ - { - label: "h", - candidates: ["h", "k", "hi", "hr", "hn"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const helloStrokes = require("./strokes/hello.json") -module.exports.hello = { - type: "TEXT", - strokes: helloStrokes, - exports: { - "text/plain": ["h", "he", "hel", "hell", "hello"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "hello", - words: [ - { - label: "hello", - candidates: ["hello", "kello", "helloo", "hellor", "hello"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const helloStrike = require("./strokes/helloStrike.json") -module.exports.helloStrikeStroke = { - name: "helloStrike", - type: "TEXT", - strokes: helloStrike, - apiVersion: "V4", - exports: { - "text/plain": ["hello", ""], - }, -} - -const helloOne = require("./strokes/helloOneStroke.json") -module.exports.helloOneStroke = { - type: "TEXT", - strokes: helloOne, - exports: { - "text/plain": ["hello"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "hello", - words: [ - { - label: "hello", - candidates: ["hello", "helto", "helts", "kelto", "felto"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const helloHowAreYouStrokes = require("./strokes/helloHowAreYou.json") -module.exports.helloHowAreYou = { - type: "TEXT", - strokes: helloHowAreYouStrokes, - exports: { - "text/plain": [ - "hello", - "hello how", - "hello how o", - "hello how are", - "hello how are you", - "hello how are you?", - "hello how are you?", - ], - }, -} - -const oneStrokes = require("./strokes/one.json") -module.exports.one = { - type: "MATH", - strokes: oneStrokes, - exports: { - LATEX: ["1"], - }, -} - -const equation1Stroke = require("./strokes/equation1.json") -module.exports.equation1 = { - type: "MATH", - strokes: equation1Stroke, - exports: { - LATEX: ['y', 'y-', 'y=', 'y=3', 'y=30', 'y=3x', 'y=3x-', 'y=3x+', 'y=3x+2'], - MATHML: { - STANDARD: ` y = 3 x + 2 ` - } - }, -} - -const equation2Stroke = require('./strokes/equation2.json') -module.exports.equation2 = { - type: 'MATH', - strokes: equation2Stroke, - exports: { - LATEX: ['-', '\\sqrt {2}', 'r', ''] - }, -} - -const fenceStroke = require("./strokes/fence.json") -module.exports.fence = { - type: "MATH", - strokes: fenceStroke, - exports: { - MATHML: { - STANDARD: [ - "\n" + - " \n" + - " { \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " 3 \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " 6 \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "", - ], - MSOFFICE: [ - "\n" + - ' \n' + - " \n" + - " \n" + - " \n" + - " \n" + - " 3 \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " 6 \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "", - ], - }, - }, -} - -const lineStroke = require("./strokes/line.json") -module.exports.line = { - type: "DIAGRAM", - strokes: lineStroke, - exports: [ - { - "application/vnd.myscript.jiix": { - type: "Diagram", - elements: [ - { - type: "Edge", - kind: "line", - connected: [], - ports: [], - x1: 60.0628433, - y1: 47.2759705, - x2: 98.6923065, - y2: 47.0647392, - }, - ], - version: "3", - id: "MainBlock", - }, - }, - ], -} - -const rectangleStroke = require("./strokes/rectangle.json") -module.exports.rectangle = { - type: "DIAGRAM", - strokes: rectangleStroke, - exports: [ - { - "application/vnd.myscript.jiix": { - type: "Diagram", - elements: [ - { - type: "Edge", - kind: "line", - connected: [], - ports: [], - x1: 57.5701027, - y1: 52.1299248, - x2: 56.6754189, - y2: 71.9691315, - }, - ], - version: "3", - id: "MainBlock", - }, - }, - { - "application/vnd.myscript.jiix": { - type: "Diagram", - elements: [ - { - type: "Node", - kind: "rectangle", - x: 56.8398209, - y: 51.9560471, - width: 33.1532364, - height: 19.9649887, - }, - ], - version: "3", - id: "MainBlock", - }, - }, - ], -} - -const ponyEraseStroke = require("./strokes/ponyErase.json") -module.exports.ponyErase = { - type: "TEXT", - strokes: ponyEraseStroke, - exports: [ - { - "application/vnd.myscript.jiix": { - type: "Text", - label: "pony", - words: [ - { - label: "pony", - candidates: ["pony", "Pony", "pong", "pory", "fony"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, - { - "application/vnd.myscript.jiix": { - type: "Text", - label: "ony", - words: [ - { - label: "ony", - }, - ], - version: "3", - id: "MainBlock", - }, - }, - ], -} - -module.exports.ponyErasePrecisely = { - type: "TEXT", - strokes: ponyEraseStroke, - exports: [ - { - "application/vnd.myscript.jiix": { - type: "Text", - label: "pony", - words: [ - { - label: "pony", - candidates: ["pony", "Pony", "pong", "pory", "fony"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, - { - "application/vnd.myscript.jiix": { - type: "Text", - label: "pony", - words: [ - { - label: "pony", - candidates: ["pony", "oony", "rony", "wony", "pony"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, - ], -} - -const sumStroke = require('./strokes/sum.json') -module.exports.sum = { - type: 'MATH', - strokes: sumStroke, - exports: { - LATEX: ['3', '3-', '3+', '3+1', '3+1-', '3+1='] - }, - converts: { - LATEX: ['3+1=4'] - } -} - -const sumSimpleStroke = require('./strokes/sumSimple.json') -module.exports.sumSimple = { - type: 'MATH', - strokes: sumSimpleStroke, - exports: { - LATEX: ['1', '1-', '1+', '1+3'] - }, - converts: { - LATEX: ['1+3=4'] - } -} - -const parisStrokes = require("./strokes/interact/paris.json") -module.exports.paris = { - type: "TEXT", - strokes: parisStrokes, - exports: { - "text/plain": ["paris"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "paris", - words: [ - { - label: "paris", - candidates: ["paris"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const tokyoStrokes = require("./strokes/interact/tokyo.json") -module.exports.tokyo = { - type: "TEXT", - strokes: tokyoStrokes, - exports: { - "text/plain": ["t", "to", "tok", "toky", "tokyo"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "tokyo", - words: [ - { - label: "tokyo", - candidates: ["tokyo"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const madridStrokes = require("./strokes/interact/madrid.json") -module.exports.madrid = { - type: "TEXT", - strokes: madridStrokes, - exports: { - "text/plain": ["madrid"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "madrid", - words: [ - { - label: "madrid", - candidates: ["madrid"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const romeStrokes = require("./strokes/interact/rome.json") -module.exports.rome = { - type: "TEXT", - strokes: romeStrokes, - exports: { - "text/plain": ["rome"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "rome", - words: [ - { - label: "rome", - candidates: ["rome"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const buenosAiresStrokes = require("./strokes/interact/buenosAires.json") -module.exports.buenosAires = { - type: "TEXT", - strokes: buenosAiresStrokes, - exports: { - "text/plain": ["buenos aires"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "buenos aires", - words: [ - { - label: "buenos aires", - candidates: ["buenos aires"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const abrausorusStrokes = require("./strokes/abrausorus.json") -module.exports.abrausorus = { - type: "TEXT", - strokes: abrausorusStrokes, - exports: { - "text/plain": ["abrausorus"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "abrausorus", - words: [ - { - label: "abrausorus", - candidates: ["abrausorus"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const centralProcessingUnitStrokes = require("./strokes/multiple-inputs/centralProcessingUnit.json") -module.exports.centralProcessingUnit = { - type: "TEXT", - strokes: centralProcessingUnitStrokes, - exports: { - "text/plain": "central processing unit", - }, -} - -const Strokes1943 = require("./strokes/multiple-inputs/1943.json") -module.exports.oneThousandNineHundredAndFortyThree = { - type: "TEXT", - strokes: Strokes1943, - exports: { - "text/plain": "1943", - }, -} - -const Strokes1993 = require("./strokes/multiple-inputs/1993.json") -module.exports.oneThousandNineHundredAndNintyThree = { - type: "TEXT", - strokes: Strokes1993, - exports: { - "text/plain": "1993", - }, -} - -const helloOneSurrounded = require("./strokes/helloOneStrokeSurrounded.json") -module.exports.helloOneSurrounded = { - type: "TEXT", - strokes: helloOneSurrounded, - exports: { - "text/plain": ["hello"], - "application/vnd.myscript.jiix": { - type: "Text", - label: "hello", - words: [ - { - label: "hello", - candidates: ["hello", "helto", "helts", "kelto", "felto"], - }, - ], - version: "3", - id: "MainBlock", - }, - }, -} - -const covfefeStrokes = require("./strokes/covfefe.json") -module.exports.covfefe = { - type: "TEXT", - strokes: covfefeStrokes, - exports: { - "text/plain": ["covfefe"], - }, -} diff --git a/test/unit/00-configuration/00-DefaultConfiguration.test.ts b/test/unit/00-configuration/00-DefaultConfiguration.test.ts deleted file mode 100644 index 57389ea15..000000000 --- a/test/unit/00-configuration/00-DefaultConfiguration.test.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { configuration } from "../../../src/iink" - -describe("DefaultConfiguration.ts", () => -{ - const { DefaultConfiguration } = configuration - describe("should have DefaultServerConfiguration", () => - { - test("should have protocol", () => - { - expect(DefaultConfiguration.server.protocol).toStrictEqual("WEBSOCKET") - }) - test("should have scheme", () => - { - expect(DefaultConfiguration.server.scheme).toStrictEqual("https") - }) - test("should have host", () => - { - expect(DefaultConfiguration.server.host).toStrictEqual("cloud.myscript.com") - }) - test("should not have applicationKey", () => - { - expect(DefaultConfiguration.server.applicationKey).toStrictEqual("") - }) - test("should not have hmacKey", () => - { - expect(DefaultConfiguration.server.hmacKey).toStrictEqual("") - }) - test("should not useWindowLocation", () => - { - expect(DefaultConfiguration.server.useWindowLocation).toStrictEqual(false) - }) - }) - - describe("should have DefaultRecognitionConfiguration", () => - { - test("should have type", () => - { - expect(DefaultConfiguration.recognition.type).toStrictEqual("TEXT") - }) - test("should have lang", () => - { - expect(DefaultConfiguration.recognition.lang).toStrictEqual("en_US") - }) - test("should have gesture", () => - { - expect(DefaultConfiguration.recognition.gesture.enable).toStrictEqual(true) - }) - test("should have renderer", () => - { - expect(DefaultConfiguration.recognition.renderer.debug["draw-image-boxes"]).toStrictEqual(false) - expect(DefaultConfiguration.recognition.renderer.debug["draw-image-boxes"]).toStrictEqual(false) - }) - test("should have math", () => - { - expect(DefaultConfiguration.recognition.math.mimeTypes).toStrictEqual(["application/vnd.myscript.jiix"]) - expect(DefaultConfiguration.recognition.math.solver?.enable).toStrictEqual(true) - expect(DefaultConfiguration.recognition.math.eraser?.["erase-precisely"]).toStrictEqual(false) - expect(DefaultConfiguration.recognition.math["undo-redo"]?.mode).toStrictEqual("stroke") - }) - test("should have text", () => - { - expect(DefaultConfiguration.recognition.text.guides?.enable).toStrictEqual(true) - expect(DefaultConfiguration.recognition.text.mimeTypes).toStrictEqual(["application/vnd.myscript.jiix"]) - expect(DefaultConfiguration.recognition.text.eraser?.["erase-precisely"]).toStrictEqual(false) - }) - test("should have diagram", () => - { - expect(DefaultConfiguration.recognition.diagram.mimeTypes).toStrictEqual(["application/vnd.myscript.jiix"]) - expect(DefaultConfiguration.recognition.diagram.eraser?.["erase-precisely"]).toStrictEqual(false) - }) - test("should have raw-content", () => - { - expect(DefaultConfiguration.recognition["raw-content"]).not.toHaveProperty("mimeTypes") - expect(DefaultConfiguration.recognition["raw-content"].recognition?.text).toStrictEqual(true) - expect(DefaultConfiguration.recognition["raw-content"].recognition?.shape).toStrictEqual(true) - expect(DefaultConfiguration.recognition["raw-content"].eraser?.["erase-precisely"]).toStrictEqual(false) - }) - }) - - describe("should have DefaultGrabberConfiguration", () => - { - test("should have listenerOptions", () => - { - expect(DefaultConfiguration.grabber.listenerOptions.capture).toStrictEqual(false) - expect(DefaultConfiguration.grabber.listenerOptions.passive).toStrictEqual(true) - }) - test("should have xyFloatPrecision", () => - { - expect(DefaultConfiguration.grabber.xyFloatPrecision).toStrictEqual(0) - }) - test("should have timestampFloatPrecision", () => - { - expect(DefaultConfiguration.grabber.timestampFloatPrecision).toStrictEqual(0) - }) - }) - - describe("should have DefaultRenderingConfiguration", () => - { - test("should have minHeight", () => - { - expect(DefaultConfiguration.rendering.minHeight).toStrictEqual(100) - }) - test("should have minWidth", () => - { - expect(DefaultConfiguration.rendering.minWidth).toStrictEqual(100) - }) - test("should have smartGuide", () => - { - expect(DefaultConfiguration.rendering.smartGuide.enable).toStrictEqual(true) - expect(DefaultConfiguration.rendering.smartGuide.fadeOut.enable).toStrictEqual(false) - expect(DefaultConfiguration.rendering.smartGuide.fadeOut.duration).toStrictEqual(5000) - }) - }) - - describe("should have DefaultTriggerConfiguration", () => - { - test("should have exportContent", () => - { - expect(DefaultConfiguration.triggers.exportContent).toStrictEqual("POINTER_UP") - }) - test("should have exportContentDelay", () => - { - expect(DefaultConfiguration.triggers.exportContentDelay).toStrictEqual(1000) - }) - test("should have resizeTriggerDelay", () => - { - expect(DefaultConfiguration.triggers.resizeTriggerDelay).toStrictEqual(100) - }) - }) - - describe("should have DefaultEventsConfiguration", () => - { - test("should have processDelay", () => - { - expect(DefaultConfiguration.events.processDelay).toStrictEqual(10) - }) - }) - - describe("should have DefaultUndoRedoConfiguration", () => - { - test("should have maxStackSize", () => - { - expect(DefaultConfiguration["undo-redo"].maxStackSize).toStrictEqual(100) - }) - }) -}) diff --git a/test/unit/00-configuration/01-Configuration.test.ts b/test/unit/00-configuration/01-Configuration.test.ts deleted file mode 100644 index 46343167a..000000000 --- a/test/unit/00-configuration/01-Configuration.test.ts +++ /dev/null @@ -1,190 +0,0 @@ -import -{ - ConfigurationTextWebsocket, - ConfigurationTextRest, - ConfigurationDiagramRest, - ConfigurationRawContentRest, - AllOverrideConfiguration, -} from "../_dataset/configuration.dataset" -import { TConfiguration, TConfigurationClient } from "../../../src/@types" -import { configuration } from "../../../src/iink" - -describe("Configuration.ts", () => -{ - const { Configuration, DefaultConfiguration } = configuration - - test("should be default configuration", () => - { - const configurationDefault = new Configuration() - expect(configurationDefault.events).toStrictEqual(DefaultConfiguration.events) - expect(configurationDefault.grabber).toStrictEqual(DefaultConfiguration.grabber) - expect(configurationDefault.recognition).toStrictEqual(DefaultConfiguration.recognition) - expect(configurationDefault.rendering).toStrictEqual(DefaultConfiguration.rendering) - expect(configurationDefault.server).toStrictEqual(DefaultConfiguration.server) - expect(configurationDefault.triggers).toStrictEqual(DefaultConfiguration.triggers) - expect(configurationDefault["undo-redo"]).toStrictEqual(DefaultConfiguration["undo-redo"]) - }) - - const configurationsClient: { name: string, config: TConfigurationClient }[] = [ - { name: "ConfigurationTextWebsocket", config: ConfigurationTextWebsocket }, - { name: "ConfigurationTextRest", config: ConfigurationTextRest }, - { name: "ConfigurationDiagramRest", config: ConfigurationDiagramRest }, - { name: "ConfigurationRawContentRest", config: ConfigurationRawContentRest } - ] - - configurationsClient.forEach(cc => - { - const configuration: TConfiguration = new Configuration(cc.config) - describe(`should merge ${ cc.name } with DefaultConfiguration`, () => - { - test("should have server.protocol", () => - { - expect(configuration.server.protocol).toStrictEqual(cc.config?.server?.protocol) - }) - test("should have server.scheme", () => - { - expect(configuration.server.scheme).toStrictEqual(cc.config?.server?.scheme) - }) - test("should have server.host", () => - { - expect(configuration.server.host).toStrictEqual(cc.config?.server?.host) - }) - test("should have server.applicationKey", () => - { - expect(configuration.server.applicationKey).toStrictEqual(cc.config?.server?.applicationKey) - }) - test("should have server.hmacKey", () => - { - expect(configuration.server.hmacKey).toStrictEqual(cc.config?.server?.hmacKey) - }) - test("should have default server.websocket", () => - { - expect(configuration.server.websocket).toStrictEqual(DefaultConfiguration.server.websocket) - }) - test("should have recognition.type", () => - { - expect(configuration.recognition.type).toStrictEqual(cc.config?.recognition?.type) - }) - if (cc.config.recognition?.type === "Raw Content") { - test("should not have recognition[raw-content].mimeTypes", () => - { - expect(configuration.recognition["raw-content"]).not.toHaveProperty("raw-content") - }) - } else { - test("should have recognition.text.mimeTypes", () => - { - switch (configuration.recognition.type) { - case "MATH": - expect(configuration.recognition.math.mimeTypes).toStrictEqual(cc.config?.recognition?.math?.mimeTypes) - break - case "DIAGRAM": - expect(configuration.recognition.diagram.mimeTypes).toStrictEqual(cc.config?.recognition?.diagram?.mimeTypes) - break - case "TEXT": - expect(configuration.recognition.text.mimeTypes).toStrictEqual(cc.config?.recognition?.text?.mimeTypes) - break - default: - break - } - }) - } - }) - }) - - describe("should override all values", () => - { - const overrideConfig: TConfiguration = new Configuration(AllOverrideConfiguration) - - test("should override events", () => - { - expect(overrideConfig.events).toStrictEqual(AllOverrideConfiguration.events) - }) - - test("should override grabber", () => - { - expect(overrideConfig.grabber).toStrictEqual(AllOverrideConfiguration.grabber) - }) - - test("should override recognition", () => - { - expect(overrideConfig.recognition).toStrictEqual(AllOverrideConfiguration.recognition) - }) - - test("should override rendering", () => - { - expect(overrideConfig.rendering).toStrictEqual(AllOverrideConfiguration.rendering) - }) - - test("should override server", () => - { - expect(overrideConfig.server).toStrictEqual(AllOverrideConfiguration.server) - }) - - test("should override triggers", () => - { - expect(overrideConfig.triggers).toStrictEqual(AllOverrideConfiguration.triggers) - }) - - test("should override undo-redo", () => - { - expect(overrideConfig["undo-redo"]).toStrictEqual(AllOverrideConfiguration["undo-redo"]) - }) - }) - - describe("specifics rules", () => - { - test("should add mimeType JIIX if rendering.smartGuide = true", () => - { - const conf = JSON.parse(JSON.stringify(DefaultConfiguration)) as TConfiguration - conf.server.protocol = "WEBSOCKET" - conf.recognition.type = "TEXT" - conf.rendering.smartGuide.enable = true - conf.recognition.text.mimeTypes = ["text/plain"] - expect(conf.recognition.text.mimeTypes).not.toContain("application/vnd.myscript.jiix") - const c: TConfiguration = new Configuration(conf) - expect(c.recognition.text.mimeTypes).toContain("application/vnd.myscript.jiix") - }) - - test("should set rendering.smartGuide = false if REST", () => - { - const conf = { ...DefaultConfiguration } - conf.server.protocol = "REST" - conf.rendering.smartGuide.enable = true - const c: TConfiguration = new Configuration(conf) - expect(c.rendering.smartGuide.enable).toStrictEqual(false) - }) - - test("should set triggers.exportContent = QUIET_PERIOD if REST", () => - { - const conf = { ...DefaultConfiguration } - conf.server.protocol = "REST" - conf.triggers.exportContent = "POINTER_UP" - const c: TConfiguration = new Configuration(conf) - expect(c.triggers.exportContent).toStrictEqual("QUIET_PERIOD") - }) - - test("should set rendering.smartGuide = false if not TEXT", () => - { - const conf = { ...DefaultConfiguration } - conf.recognition.type = "MATH" - conf.rendering.smartGuide.enable = true - const c: TConfiguration = new Configuration(conf) - expect(c.rendering.smartGuide.enable).toStrictEqual(false) - }) - - test("should set server.scheme & server.host if server.useWindowLocation = true", () => - { - const conf = { ...DefaultConfiguration } - conf.server.useWindowLocation = true - - Object.defineProperty(window, "location", { - value: new URL("https://localhost:3000") - }) - - const c: TConfiguration = new Configuration(conf) - expect(c.server.scheme).toStrictEqual(window.location.protocol.replace(":", "")) - expect(c.server.host).toStrictEqual(window.location.host) - }) - }) - -}) diff --git a/test/unit/01-grabber/00-PointerEventGrabber.test.ts b/test/unit/01-grabber/00-PointerEventGrabber.test.ts deleted file mode 100644 index 753b6eb29..000000000 --- a/test/unit/01-grabber/00-PointerEventGrabber.test.ts +++ /dev/null @@ -1,283 +0,0 @@ -import { DoubleTouchEventFake, LeftClickEventFake, RightClickEventFake, TouchEventFake } from "../utils/PointerEventFake" -import { TGrabberConfiguration, IGrabber } from "../../../src/@types" -import { configuration, grabber } from "../../../src/iink" - -describe("PointerEventGrabber.ts", () => -{ - const { DefaultConfiguration } = configuration - const { PointerEventGrabber} = grabber - - test("should create with default configuration", () => - { - const grabber: IGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - expect(grabber).toBeDefined() - }) - - describe("should attach & detach", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.width = "100px" - wrapperHTML.style.height = "100px" - document.body.appendChild(wrapperHTML) - - const grabber: IGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - grabber.attach(wrapperHTML) - grabber.onPointerDown = jest.fn() - grabber.onPointerMove = jest.fn() - grabber.onPointerUp = jest.fn() - - const pointerDownEvt = new LeftClickEventFake("pointerdown", { - pointerType: "pen", - clientX: 10, - clientY: 10, - pressure: 1 - }) - - const pointerMoveEvt = new LeftClickEventFake("pointermove", { - pointerType: "pen", - clientX: 15, - clientY: 15, - pressure: 1 - }) - pointerMoveEvt.pointerId = pointerDownEvt.pointerId - - const pointerUpEvt = new LeftClickEventFake("pointerup", { - pointerType: "pen", - clientX: 15, - clientY: 15, - pressure: 1 - }) - pointerUpEvt.pointerId = pointerDownEvt.pointerId - - test("should listen pointerdown event", () => - { - wrapperHTML.dispatchEvent(pointerDownEvt) - expect(grabber.onPointerDown).toBeCalledTimes(1) - }) - - test("should listen pointermove event", () => - { - wrapperHTML.dispatchEvent(pointerMoveEvt) - expect(grabber.onPointerMove).toBeCalledTimes(1) - }) - - test("should listen pointerup event", () => - { - wrapperHTML.dispatchEvent(pointerUpEvt) - expect(grabber.onPointerUp).toBeCalledTimes(1) - }) - - test("should call detach if already attach", () => - { - const g: IGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - g.onPointerDown = jest.fn() - g.onPointerMove = jest.fn() - g.onPointerUp = jest.fn() - g.detach = jest.fn() - g.attach(wrapperHTML) - g.attach(wrapperHTML) - expect(g.detach).toBeCalledTimes(1) - }) - - test("should not listen pointerdown event after detach", () => - { - grabber.detach(wrapperHTML) - wrapperHTML.dispatchEvent(pointerDownEvt) - expect(grabber.onPointerDown).not.toBeCalled() - }) - - test("should not listen pointermove event after detach", () => - { - grabber.detach(wrapperHTML) - wrapperHTML.dispatchEvent(pointerMoveEvt) - expect(grabber.onPointerMove).not.toBeCalled() - }) - - test("should not listen pointerup event after detach", () => - { - grabber.detach(wrapperHTML) - wrapperHTML.dispatchEvent(pointerUpEvt) - expect(grabber.onPointerUp).not.toBeCalled() - }) - }) - - describe("Should extract TPointer from event", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.width = "100px" - wrapperHTML.style.height = "100px" - document.body.appendChild(wrapperHTML) - - const grabber: IGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - grabber.onPointerDown = jest.fn() - grabber.attach(wrapperHTML) - - test("should extract TPointer from mouseEvent", () => - { - const mouseDownEvt = new LeftClickEventFake("pointerdown", { - pointerType: "pen", - clientX: 2705, - clientY: 1989, - pressure: 1 - }) - - wrapperHTML.dispatchEvent(mouseDownEvt) - - expect(grabber.onPointerDown) - .toBeCalledWith( - mouseDownEvt, - expect.objectContaining({ - x: mouseDownEvt.clientX, - y: mouseDownEvt.clientY, - p: mouseDownEvt.pressure - }) - ) - }) - - test("should extract TPointer from touchEvent", () => - { - const touchDownEvt = new TouchEventFake("pointerdown", { - pointerType: "pen", - clientX: 2705, - clientY: 1989, - pressure: 1 - }) - - wrapperHTML.dispatchEvent(touchDownEvt) - - expect(grabber.onPointerDown) - .toBeCalledWith( - touchDownEvt, - expect.objectContaining({ - x: touchDownEvt.changedTouches[0].clientX, - y: touchDownEvt.changedTouches[0].clientY, - p: touchDownEvt.pressure - }) - ) - }) - }) - - describe("Should use configuration", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.width = "100px" - wrapperHTML.style.height = "100px" - document.body.appendChild(wrapperHTML) - - const pointerDownEvt = new LeftClickEventFake("pointerdown", { - pointerType: "pen", - clientX: 2705, - clientY: 1989, - pressure: 1 - }) - - test("should not round values with default configuration", () => - { - const grabber: IGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - grabber.onPointerDown = jest.fn() - grabber.onPointerMove = jest.fn() - grabber.onPointerUp = jest.fn() - grabber.attach(wrapperHTML) - - wrapperHTML.dispatchEvent(pointerDownEvt) - - expect(grabber.onPointerDown) - .toBeCalledWith( - pointerDownEvt, - expect.objectContaining({ - x: pointerDownEvt.clientX, - y: pointerDownEvt.clientY, - p: pointerDownEvt.pressure - }) - ) - grabber.detach() - }) - - test("should round values from configuration", () => - { - const grabberConfig: TGrabberConfiguration = { ...DefaultConfiguration.grabber, xyFloatPrecision: 2 } - const grabber: IGrabber = new PointerEventGrabber(grabberConfig) - grabber.onPointerDown = jest.fn() - grabber.onPointerMove = jest.fn() - grabber.onPointerUp = jest.fn() - grabber.attach(wrapperHTML) - - grabber.onPointerDown = jest.fn() - - wrapperHTML.dispatchEvent(pointerDownEvt) - - expect(grabber.onPointerDown) - .toBeCalledWith( - pointerDownEvt, - expect.objectContaining({ - x: Math.round(pointerDownEvt.clientX / 100) * 100, - y: Math.round(pointerDownEvt.clientY / 100) * 100, - p: pointerDownEvt.pressure - }) - ) - }) - - test("should not round values from configuration if negative precision", () => - { - const grabberConfig: TGrabberConfiguration = { ...DefaultConfiguration.grabber, xyFloatPrecision: -2 } - const grabber: IGrabber = new PointerEventGrabber(grabberConfig) - grabber.onPointerDown = jest.fn() - grabber.onPointerMove = jest.fn() - grabber.onPointerUp = jest.fn() - grabber.attach(wrapperHTML) - - grabber.onPointerDown = jest.fn() - - wrapperHTML.dispatchEvent(pointerDownEvt) - - expect(grabber.onPointerDown) - .toBeCalledWith( - pointerDownEvt, - expect.objectContaining({ - x: pointerDownEvt.clientX, - y: pointerDownEvt.clientY, - p: pointerDownEvt.pressure - }) - ) - }) - }) - - describe("Should ignore Event", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.width = "100px" - wrapperHTML.style.height = "100px" - document.body.appendChild(wrapperHTML) - - const grabber: IGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - grabber.attach(wrapperHTML) - grabber.onPointerDown = jest.fn() - - test("should not listen right click event", () => - { - const pointerDownEvt = new RightClickEventFake("pointerdown", { - pointerType: "pen", - clientX: 300, - clientY: 500, - pressure: 1 - }) - wrapperHTML.dispatchEvent(pointerDownEvt) - expect(grabber.onPointerDown).not.toBeCalled() - grabber.detach(wrapperHTML) - }) - - test("should not listen right click event", () => - { - const pointerDownEvt = new DoubleTouchEventFake("pointerdown", { - pointerType: "pen", - clientX: 300, - clientY: 500, - pressure: 1 - }) - wrapperHTML.dispatchEvent(pointerDownEvt) - expect(grabber.onPointerDown).not.toBeCalled() - grabber.detach(wrapperHTML) - }) - }) - -}) diff --git a/test/unit/02-model/00-Stroke.test.ts b/test/unit/02-model/00-Stroke.test.ts deleted file mode 100644 index 8d4b95d9b..000000000 --- a/test/unit/02-model/00-Stroke.test.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { TStroke, TPenStyle } from "../../../src/@types" -import { model, style } from "../../../src/iink" - -describe("Stroke.ts", () => -{ - const { Stroke } = model - const { DefaultPenStyle } = style - test("should create with default pointerType", () => - { - const stroke: TStroke = new Stroke(DefaultPenStyle, 12) - expect(stroke).toBeDefined() - expect(stroke.style["-myscript-pen-fill-color"]).toBe(DefaultPenStyle["-myscript-pen-fill-color"]) - expect(stroke.style["-myscript-pen-fill-style"]).toBe(DefaultPenStyle["-myscript-pen-fill-style"]) - expect(stroke.style["-myscript-pen-width"]).toBe(DefaultPenStyle["-myscript-pen-width"]) - expect(stroke.style.color).toBe(DefaultPenStyle.color) - expect(stroke.style.width).toBe(DefaultPenStyle.width) - expect(stroke.elementType).toBeUndefined() - expect(stroke.pointers).toHaveLength(0) - expect(stroke.pointerId).toBe(12) - expect(stroke.pointerType).toBe("pen") - expect(stroke.type).toBe("stroke") - }) - - test("should create with pointerType mouse", () => - { - const stroke: TStroke = new Stroke(DefaultPenStyle, 12, "mouse") - expect(stroke.pointerType).toBe("mouse") - }) - - test("should create with custom PenStyle", () => - { - const penStyle: TPenStyle = { - "-myscript-pen-fill-color": "red", - "-myscript-pen-fill-style": "purple", - "-myscript-pen-width": 12, - color: "green", - width: 42 - } - - const stroke: TStroke = new Stroke(penStyle, 12) - expect(stroke).toBeDefined() - expect(stroke.style["-myscript-pen-fill-color"]).toBe(penStyle["-myscript-pen-fill-color"]) - expect(stroke.style["-myscript-pen-fill-style"]).toBe(penStyle["-myscript-pen-fill-style"]) - expect(stroke.style["-myscript-pen-width"]).toBe(penStyle["-myscript-pen-width"]) - expect(stroke.style.color).toBe(penStyle.color) - expect(stroke.style.width).toBe(penStyle.width) - }) -}) diff --git a/test/unit/02-model/01-Model.test.ts b/test/unit/02-model/01-Model.test.ts deleted file mode 100644 index 566bece57..000000000 --- a/test/unit/02-model/01-Model.test.ts +++ /dev/null @@ -1,592 +0,0 @@ -import { delay } from "../utils/helpers" -import { IModel, TExport, TPointer } from "../../../src/@types" -import { model, style } from "../../../src/iink" - -describe("Model.ts", () => -{ - const { Model, Stroke } = model - const { DefaultPenStyle } = style - const width = 100, height = 100 - test("should create", () => - { - const model: IModel = new Model(width, height) - expect(model).toBeDefined() - }) - - describe("mergeExport", () => - { - test("should initialize export if toBeUndefined", () => - { - const model: IModel = new Model(width, height) - const e: TExport = { "text/plain": "poney" } - expect(model.exports).toBeUndefined() - model.mergeExport(e) - expect(model.exports).toEqual(e) - }) - test("should merge export", () => - { - const model: IModel = new Model(width, height) - const originExport: TExport = { - "application/vnd.myscript.jiix": { - "type": "Text", - "label": "poney", - "words": [ - { - "label": "poney", - "candidates": ["poney", "Poney", "ponay", "ponex", "pony"] - } - ], - "version": "3", - "id": "MainBlock" - } - } - model.exports = originExport - const e: TExport = { "text/plain": "poney" } - - model.mergeExport(e) - expect(model.exports).toMatchObject(originExport) - expect(model.exports).toMatchObject(e) - }) - }) - - describe("mergeConvert", () => - { - test("should initialize export if toBeUndefined", () => - { - const model: IModel = new Model(width, height) - const e: TExport = { "text/plain": "poney" } - expect(model.converts).toBeUndefined() - model.mergeConvert(e) - expect(model.converts).toEqual(e) - }) - test("should merge export", () => - { - const model: IModel = new Model(width, height) - const originExport: TExport = { - "application/vnd.myscript.jiix": { - "type": "Text", - "label": "poney", - "words": [ - { - "label": "poney", - "candidates": ["poney", "Poney", "ponay", "ponex", "pony"] - } - ], - "version": "3", - "id": "MainBlock" - } - } - model.converts = originExport - const e: TExport = { "text/plain": "poney" } - - model.mergeConvert(e) - expect(model.converts).toMatchObject(originExport) - expect(model.converts).toMatchObject(e) - }) - }) - - describe("addPoint", () => - { - const model: IModel = new Model(width, height) - test("should add point to x, y, t & t array", () => - { - const stroke = new Stroke(DefaultPenStyle, 1) - const point: TPointer = { - t: 1, - p: 0.5, - x: 1, - y: 1 - } - model.addPoint(stroke, point) - - expect(stroke.pointers).toHaveLength(1) - expect(stroke.pointers[0].x).toBe(point.x) - expect(stroke.pointers[0].y).toBe(point.y) - expect(stroke.pointers[0].p).toBe(point.p) - expect(stroke.pointers[0].t).toBe(point.t) - }) - - test("should not add point if x is too close", () => - { - const stroke = new Stroke(DefaultPenStyle, 1) - const point: TPointer = { - t: 10, - p: 10, - x: 1, - y: 10 - } - model.addPoint(stroke, point) - expect(stroke.pointers).toHaveLength(1) - model.addPoint(stroke, point) - expect(stroke.pointers).toHaveLength(1) - }) - - test("should not add point if y is too close", () => - { - const stroke = new Stroke(DefaultPenStyle, 1) - const point: TPointer = { - t: 10, - p: 10, - x: 10, - y: 1 - } - model.addPoint(stroke, point) - expect(stroke.pointers).toHaveLength(1) - model.addPoint(stroke, point) - expect(stroke.pointers).toHaveLength(1) - }) - }) - - describe("updateStroke", () => - { - test("should updateStroke", () => - { - const model: IModel = new Model(width, height) - const stroke = new Stroke(DefaultPenStyle, 1) - for (let index = 0; index < 10; index++) { - stroke.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke) - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0]).toStrictEqual(stroke) - const strokeUpdated = new Stroke(DefaultPenStyle, 1) - strokeUpdated.id = stroke.id - strokeUpdated.pointers.push({ p: 0.5, t: 0.5, x: 100, y: 27 }) - model.updateStroke(strokeUpdated) - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0]).toStrictEqual(strokeUpdated) - }) - test("should not updateStroke if id not exist", () => - { - const model: IModel = new Model(width, height) - const stroke = new Stroke(DefaultPenStyle, 1) - for (let index = 0; index < 10; index++) { - stroke.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke) - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0]).toStrictEqual(stroke) - const strokeUpdated = new Stroke(DefaultPenStyle, 1) - strokeUpdated.id = "pouette" - strokeUpdated.pointers.push({ p: 0.5, t: 0.5, x: 100, y: 27 }) - model.updateStroke(strokeUpdated) - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0]).not.toStrictEqual(strokeUpdated) - expect(model.rawStrokes[0]).toStrictEqual(stroke) - }) - }) - - describe("removeStroke", () => - { - test("should removeStroke", () => - { - const model: IModel = new Model(width, height) - const stroke = new Stroke(DefaultPenStyle, 1) - for (let index = 0; index < 10; index++) { - stroke.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke) - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0]).toStrictEqual(stroke) - model.removeStroke(stroke.id) - expect(model.rawStrokes).toHaveLength(0) - }) - test("should not removeStroke if id not exist", () => - { - const model: IModel = new Model(width, height) - const stroke = new Stroke(DefaultPenStyle, 1) - for (let index = 0; index < 10; index++) { - stroke.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke) - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0]).toStrictEqual(stroke) - model.removeStroke("pouette") - expect(model.rawStrokes).toHaveLength(1) - }) - }) - - describe("rawStrokes", () => - { - test("should addStrokes", () => - { - const model: IModel = new Model(width, height) - const stroke = new Stroke(DefaultPenStyle, 1) - model.addStroke(stroke) - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0]).toStrictEqual(stroke) - }) - - test("should extractUnsentStrokes", () => - { - const model: IModel = new Model(width, height) - const stroke = new Stroke(DefaultPenStyle, 1) - model.addStroke(stroke) - expect(model.rawStrokes).toHaveLength(1) - const extractStroke = model.extractUnsentStrokes() - expect(extractStroke).toHaveLength(1) - expect(extractStroke[0]).toStrictEqual(stroke) - expect(model.rawStrokes).toHaveLength(1) - }) - }) - - describe("currentStroke", () => - { - const model: IModel = new Model(width, height) - test("should initCurrentStroke", async () => - { - expect(model.currentStroke).toBeUndefined() - const point: TPointer = { - t: 1, - p: 0.5, - x: 1, - y: 1 - } - expect(model.creationTime).toStrictEqual(model.modificationDate) - await delay(100) - model.initCurrentStroke(point, 42, "mouse", DefaultPenStyle) - expect(model.modificationDate - model.creationTime).toBeGreaterThanOrEqual(100) - expect(model.currentStroke).toBeDefined() - expect(model.currentStroke?.style["-myscript-pen-fill-color"]).toBe(DefaultPenStyle["-myscript-pen-fill-color"]) - expect(model.currentStroke?.style["-myscript-pen-fill-style"]).toBe(DefaultPenStyle["-myscript-pen-fill-style"]) - expect(model.currentStroke?.style["-myscript-pen-width"]).toBe(DefaultPenStyle["-myscript-pen-width"]) - expect(model.currentStroke?.style.color).toBe(DefaultPenStyle.color) - expect(model.currentStroke?.style.width).toBe(DefaultPenStyle.width) - expect(model.currentStroke?.pointers).toHaveLength(1) - expect(model.currentStroke?.pointers[0].x).toBe(point.x) - expect(model.currentStroke?.pointers[0].y).toBe(point.y) - expect(model.currentStroke?.pointers[0].t).toBe(point.t) - expect(model.currentStroke?.pointers[0].p).toBe(point.p) - }) - test("should initCurrentStroke with -myscript-pen-width", async () => - { - const _model: IModel = new Model(width, height) - const point: TPointer = { - t: 1, - p: 0.5, - x: 1, - y: 1 - } - const style = { ...DefaultPenStyle } - style["-myscript-pen-width"] = 2 - expect(_model.creationTime).toStrictEqual(_model.modificationDate) - await delay(101) - _model.initCurrentStroke(point, 42, "mouse", style) - expect(_model.modificationDate - _model.creationTime).toBeGreaterThanOrEqual(100) - expect(_model.currentStroke).toBeDefined() - expect(_model.currentStroke?.style["-myscript-pen-fill-color"]).toBe(style["-myscript-pen-fill-color"]) - expect(_model.currentStroke?.style["-myscript-pen-fill-style"]).toBe(style["-myscript-pen-fill-style"]) - expect(_model.currentStroke?.style["-myscript-pen-width"]).toBe(style["-myscript-pen-width"]) - expect(_model.currentStroke?.style.color).toBe(style.color) - expect(_model.currentStroke?.style.width).toBe(style.width) - expect(model.currentStroke?.pointers).toHaveLength(1) - expect(model.currentStroke?.pointers[0].x).toBe(point.x) - expect(model.currentStroke?.pointers[0].y).toBe(point.y) - expect(model.currentStroke?.pointers[0].t).toBe(point.t) - expect(model.currentStroke?.pointers[0].p).toBe(point.p) - }) - - test("should appendToCurrentStroke", () => - { - expect(model.currentStroke).toBeDefined() - const point: TPointer = { - t: 15, - p: 15, - x: 15, - y: 15 - } - model.appendToCurrentStroke(point) - expect(model.currentStroke?.style["-myscript-pen-fill-color"]).toBe(DefaultPenStyle["-myscript-pen-fill-color"]) - expect(model.currentStroke?.style["-myscript-pen-fill-style"]).toBe(DefaultPenStyle["-myscript-pen-fill-style"]) - expect(model.currentStroke?.style["-myscript-pen-width"]).toBe(DefaultPenStyle["-myscript-pen-width"]) - expect(model.currentStroke?.style.color).toBe(DefaultPenStyle.color) - expect(model.currentStroke?.style.width).toBe(DefaultPenStyle.width) - expect(model.currentStroke?.pointers).toHaveLength(2) - expect(model.currentStroke?.pointers[1].x).toBe(point.x) - expect(model.currentStroke?.pointers[1].y).toBe(point.y) - expect(model.currentStroke?.pointers[1].t).toBe(point.t) - expect(model.currentStroke?.pointers[1].p).toBe(point.p) - }) - - test("should endCurrentStroke", () => - { - model.addPoint = jest.fn() - model.addStroke = jest.fn() - expect(model.currentStroke).toBeDefined() - const currentStroke = { ...model.currentStroke } - const point: TPointer = { - t: 25, - p: 25, - x: 25, - y: 25 - } - model.endCurrentStroke(point) - expect(model.currentStroke).toBeUndefined() - expect(model.addPoint).toBeCalledTimes(1) - expect(model.addPoint).toBeCalledWith(currentStroke, point) - expect(model.addStroke).toBeCalledTimes(1) - expect(model.addStroke).toBeCalledWith(currentStroke) - }) - }) - - describe("appendSelectedStrokesFromPoint", () => - { - const model: IModel = new Model(27, 5) - const stroke1 = new Stroke(DefaultPenStyle, 1) - stroke1.id = "stroke-1" - for (let index = 0; index < 20; index++) { - stroke1.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke1) - const stroke2 = new Stroke(DefaultPenStyle, 1) - stroke2.id = "stroke-2" - for (let index = 30; index < 40; index++) { - stroke2.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke2) - test("shoud select stroke when point on stroke", () => - { - model.appendSelectedStrokesFromPoint({ x: 1, y: 1 }) - expect(model.selectedStrokes).toHaveLength(1) - expect(model.selectedStrokes[0].id).toEqual("stroke-1") - }) - test("shoud reset selectedStrokes", () => - { - expect(model.selectedStrokes).toHaveLength(1) - model.resetSelectedStrokes() - expect(model.selectedStrokes).toHaveLength(0) - }) - test("should select the stroke when the point is at a distance less than 10", () => - { - expect(model.selectedStrokes).toHaveLength(0) - model.appendSelectedStrokesFromPoint({ x: 36, y: 41 }) - expect(model.selectedStrokes).toHaveLength(1) - expect(model.selectedStrokes[0].id).toEqual("stroke-2") - }) - test("should not select the stroke when the point is at a distance less than 10", () => - { - model.resetSelectedStrokes() - expect(model.selectedStrokes).toHaveLength(0) - model.appendSelectedStrokesFromPoint({ x: 56, y: 51 }) - expect(model.selectedStrokes).toHaveLength(0) - }) - test("should not select the same stroke twice", () => - { - model.resetSelectedStrokes() - expect(model.selectedStrokes).toHaveLength(0) - model.appendSelectedStrokesFromPoint({ x: 36, y: 41 }) - expect(model.selectedStrokes).toHaveLength(1) - expect(model.selectedStrokes[0].id).toEqual("stroke-2") - model.appendSelectedStrokesFromPoint({ x: 36, y: 40 }) - expect(model.selectedStrokes).toHaveLength(1) - expect(model.selectedStrokes[0].id).toEqual("stroke-2") - }) - }) - - describe("removeStrokesFromPoint", () => - { - test("shoud remove stroke when point on stroke", () => - { - const model: IModel = new Model(27, 5) - const stroke1 = new Stroke(DefaultPenStyle, 1) - stroke1.id = "stroke-1" - for (let index = 0; index < 20; index++) { - stroke1.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke1) - const stroke2 = new Stroke(DefaultPenStyle, 1) - stroke2.id = "stroke-2" - for (let index = 30; index < 40; index++) { - stroke2.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke2) - expect(model.rawStrokes).toHaveLength(2) - const idsRemoves = model.removeStrokesFromPoint({ x: 1, y: 1 }) - expect(idsRemoves).toHaveLength(1) - expect(idsRemoves[0]).toEqual("stroke-1") - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0].id).toEqual("stroke-2") - }) - test("should remove the stroke when the point is at a distance less than 10", () => - { - const model: IModel = new Model(27, 5) - const stroke1 = new Stroke(DefaultPenStyle, 1) - stroke1.id = "stroke-1" - for (let index = 0; index < 20; index++) { - stroke1.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke1) - const stroke2 = new Stroke(DefaultPenStyle, 1) - stroke2.id = "stroke-2" - for (let index = 30; index < 40; index++) { - stroke2.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke2) - expect(model.rawStrokes).toHaveLength(2) - const idsRemoves = model.removeStrokesFromPoint({ x: 36, y: 41 }) - expect(idsRemoves).toHaveLength(1) - expect(idsRemoves[0]).toEqual("stroke-2") - expect(model.rawStrokes).toHaveLength(1) - expect(model.rawStrokes[0].id).toEqual("stroke-1") - }) - test("should not remove the stroke when the point is at a distance less than 10", () => - { - const model: IModel = new Model(27, 5) - const stroke1 = new Stroke(DefaultPenStyle, 1) - stroke1.id = "stroke-1" - for (let index = 0; index < 20; index++) { - stroke1.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke1) - const stroke2 = new Stroke(DefaultPenStyle, 1) - stroke2.id = "stroke-2" - for (let index = 30; index < 40; index++) { - stroke2.pointers.push({ - p: 1, - t: index, - x: index, - y: index - }) - } - model.addStroke(stroke2) - expect(model.rawStrokes).toHaveLength(2) - const idsRemoves = model.removeStrokesFromPoint({ x: 56, y: 51 }) - expect(idsRemoves).toHaveLength(0) - expect(model.rawStrokes).toHaveLength(2) - }) - }) - - describe("position", () => - { - const model: IModel = new Model(width, height) - test("should initialize position", () => - { - expect(model.positions.lastReceivedPosition).toBe(0) - expect(model.positions.lastSentPosition).toBe(0) - }) - test("should updatePositionSent", () => - { - model.updatePositionSent(5) - expect(model.positions.lastSentPosition).toBe(5) - }) - test("should updatePositionReceived", () => - { - model.updatePositionReceived() - expect(model.positions.lastReceivedPosition).toBe(model.positions.lastSentPosition) - }) - }) - - describe("clone", () => - { - const model: IModel = new Model(27, 5) - const stroke = new Stroke(DefaultPenStyle, 1) - model.addStroke(stroke) - const point: TPointer = { - t: 1, - p: 0.5, - x: 1, - y: 1 - } - model.initCurrentStroke(point, 666, "pen", DefaultPenStyle) - model.exports = { "text/plain": "M" } - test("should getClone", () => - { - const clone = model.getClone() - expect(clone != model).toBeTruthy() - expect(clone.currentStroke).toEqual(model.currentStroke) - expect(clone.currentStroke).not.toBe(model.currentStroke) - - expect(clone.exports).toEqual(model.exports) - expect(clone.exports).not.toBe(model.exports) - - expect(clone.height).toEqual(model.height) - - expect(clone.idle).toEqual(model.idle) - - expect(clone.positions).toEqual(model.positions) - expect(clone.positions).not.toBe(model.positions) - - expect(clone.rawStrokes).toEqual(model.rawStrokes) - expect(clone.rawStrokes).not.toBe(model.rawStrokes) - - expect(clone.width).toEqual(model.width) - }) - }) - - describe("clear", () => - { - test("should clear model", () => - { - const model: IModel = new Model(width, height) - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 10, x: 10, y: 10 } - const p3: TPointer = { t: 10, p: 10, x: 10, y: 10 } - - model.initCurrentStroke(p1, 42, "mouse", DefaultPenStyle) - model.endCurrentStroke(p2) - model.initCurrentStroke(p3, 51, "mouse", DefaultPenStyle) - expect(model.currentStroke).toBeDefined() - expect(model.rawStrokes).toHaveLength(1) - - model.clear() - expect(model.currentStroke).toBeUndefined() - expect(model.rawStrokes).toHaveLength(0) - }) - }) - -}) diff --git a/test/unit/03-renderer/00-QuadraticUtils.test.ts b/test/unit/03-renderer/00-QuadraticUtils.test.ts deleted file mode 100644 index 91649a1b2..000000000 --- a/test/unit/03-renderer/00-QuadraticUtils.test.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { TPointer } from "../../../src/@types" -import { renderer } from "../../../src/iink" - -describe("QuadraticUtils.ts", () => -{ - const { quadradicsUtils } = renderer - const p1: TPointer = { - p: 1, - t: 1, - x: 1, - y: 1 - } - const p2: TPointer = { - p: 1, - t: 1, - x: 2, - y: 5 - } - test("should computeLinksPoints", () => - { - const points = quadradicsUtils.computeLinksPoints(p1, 90, 1) - expect(points).toStrictEqual([ - { - x: 0.10600333639944215, - y: 0.5519263838708298 - }, - { - x: 1.8939966636005579, - y: 1.4480736161291703 - } - ]) - }) - - test("should computeMiddlePoint", () => - { - const point = quadradicsUtils.computeMiddlePoint(p1, p2) - expect(point).toStrictEqual({ x: 1.5, y: 3, p: 1, t: 1 }) - }) - - test('should computeAxeAngle', () => - { - const angle = quadradicsUtils.computeAxeAngle(p1, p2) - expect(angle).toBe(1.3258176636680326) - }) - -}) diff --git a/test/unit/03-renderer/01-CanvasRenderer.test.ts b/test/unit/03-renderer/01-CanvasRenderer.test.ts deleted file mode 100644 index 3e2597819..000000000 --- a/test/unit/03-renderer/01-CanvasRenderer.test.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { TRenderingConfiguration } from "../../../src/@types" -import { renderer } from "../../../src/iink" - -describe("CanvasRenderer.ts", () => -{ - const { CanvasRenderer, CanvasStroker } = renderer - const height = 10, width = 10 - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = `${ height }px` - wrapperHTML.style.width = `${ width }px` - - const stroker = new CanvasStroker() - stroker.drawStroke = jest.fn() - - const conf: TRenderingConfiguration = { - minHeight: 100, - minWidth: 100, - smartGuide: { - enable: true, - fadeOut: { - enable: false, - duration: 100 - } - }, - guides: { - enable: true, - gap: 50 - } - } - const canvasRenderer = new CanvasRenderer(conf) - - test("should set configuration when instanciate", () => - { - expect(canvasRenderer.config).toStrictEqual(conf) - }) - - test("should init", () => - { - canvasRenderer.init(wrapperHTML) - expect(wrapperHTML.querySelector(".ms-rendering-canvas")).toBeDefined() - expect(wrapperHTML.querySelector(".ms-capture-canvas")).toBeDefined() - expect(canvasRenderer.context).toBeDefined() - }) - - test("should destroy", () => - { - canvasRenderer.destroy() - expect(wrapperHTML.querySelector(".ms-rendering-canvas")).toBeNull() - expect(wrapperHTML.querySelector(".ms-capture-canvas")).toBeNull() - }) -}) diff --git a/test/unit/03-renderer/02-CanvasStroker.test.ts b/test/unit/03-renderer/02-CanvasStroker.test.ts deleted file mode 100644 index 6185839c4..000000000 --- a/test/unit/03-renderer/02-CanvasStroker.test.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { renderer, model, style } from "../../../src/iink" - -describe("CanvasStroker.ts", () => -{ - const { CanvasStroker } = renderer - const { Stroke } = model - const { DefaultPenStyle } = style - const canvas: HTMLCanvasElement = document.createElement("canvas") - - const context = { - canvas, - canvasContext: canvas.getContext("2d") as CanvasRenderingContext2D - } - - test("should instanciate CanvasStroker", () => - { - const stroker = new CanvasStroker() - expect(stroker).toBeDefined() - }) - - test("should drawStroke", () => - { - const stroker = new CanvasStroker() - const stroke = new Stroke(DefaultPenStyle, 1) - for (let i = 0; i < 5; i++) { - stroke.pointers.push({ - p: 0.5, - t: 1, - x: i, - y: i - }) - } - stroker.drawStroke(context.canvasContext, stroke) - }) - - -}) diff --git a/test/unit/03-renderer/03-CanvasRendererShapeSymbol.test.ts b/test/unit/03-renderer/03-CanvasRendererShapeSymbol.test.ts deleted file mode 100644 index d16af26f7..000000000 --- a/test/unit/03-renderer/03-CanvasRendererShapeSymbol.test.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { TLineSymbol, TShapeSymbol } from "../../../src/@types" -import { renderer, style } from "../../../src/iink" - -describe("CanvasRendererShapeSymbol.ts", () => -{ - const { canvasRendererShape } = renderer - const { DefaultPenStyle } = style - - const canvas: HTMLCanvasElement = document.createElement("canvas") - const canvasContext = canvas.getContext("2d") as CanvasRenderingContext2D - - canvasContext.moveTo = jest.fn() - canvasContext.lineTo = jest.fn() - const p1 = { x: 1, y: 2 } - const p2 = { x: 3, y: 4 } - - - test("should drawLine", () => - { - canvasRendererShape.drawLine(canvasContext, p1, p2) - expect(canvasContext.moveTo).toBeCalledTimes(1) - expect(canvasContext.moveTo).toBeCalledWith(p1.x, p1.y) - - expect(canvasContext.lineTo).toBeCalledTimes(1) - expect(canvasContext.lineTo).toBeCalledWith(p2.x, p2.y) - }) - - test("should drawShapeSymbol with type line", () => - { - const lineSymbol: TLineSymbol = { - elementType: "line", - type: "pen", - style: DefaultPenStyle, - data: { p1, p2 } - } - canvasRendererShape.drawShapeSymbol(canvasContext, lineSymbol) - expect(canvasContext.moveTo).toBeCalledTimes(1) - expect(canvasContext.moveTo).toBeCalledWith(p1.x, p1.y) - - expect(canvasContext.lineTo).toBeCalledTimes(1) - expect(canvasContext.lineTo).toBeCalledWith(p2.x, p2.y) - }) - - test("should drawShapeSymbol with type shape", () => - { - const lineSymbol: TLineSymbol = { - elementType: "line", - type: "pen", - style: DefaultPenStyle, - data: { p1, p2 } - } - const shapeSymbol: TShapeSymbol = { - elementType: "shape", - type: "pen", - style: DefaultPenStyle, - selectedCandidateIndex: 0, - candidates: [lineSymbol] - } - canvasRendererShape.drawShapeSymbol(canvasContext, shapeSymbol) - expect(canvasContext.moveTo).toBeCalledTimes(1) - expect(canvasContext.moveTo).toBeCalledWith(p1.x, p1.y) - - expect(canvasContext.lineTo).toBeCalledTimes(1) - expect(canvasContext.lineTo).toBeCalledWith(p2.x, p2.y) - }) -}) diff --git a/test/unit/03-renderer/04-CanvasRendererStrokeSymbol.test.ts b/test/unit/03-renderer/04-CanvasRendererStrokeSymbol.test.ts deleted file mode 100644 index 981f77394..000000000 --- a/test/unit/03-renderer/04-CanvasRendererStrokeSymbol.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { TStroke } from "../../../src/@types" -import { renderer, style } from "../../../src/iink" - -describe("CanvasRendererStrokeSymbol.ts", () => -{ - const { CanvasStroker, canvasRendererStroke } = renderer - const { DefaultPenStyle } = style - - const canvas: HTMLCanvasElement = document.createElement("canvas") - const canvasContext = canvas.getContext("2d") as CanvasRenderingContext2D - - canvasContext.moveTo = jest.fn() - canvasContext.lineTo = jest.fn() - const stroker = new CanvasStroker() - stroker.drawStroke = jest.fn() - - - test("should drawStroke", () => - { - //@ts-ignore - const stroke: TStroke = { - id: "test-id", - type: "pen", - pointerType: "pen", - pointerId: 0, - style: DefaultPenStyle, - "pointers": [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ] - } - canvasRendererStroke.drawStroke(canvasContext, stroke, stroker) - expect(stroker.drawStroke).toBeCalledTimes(1) - expect(stroker.drawStroke).toBeCalledWith(canvasContext, stroke) - }) - - test("should not drawStroke if eraser", () => - { - //@ts-ignore - const stroke: TStroke = { - id: "test-id", - type: "pen", - pointerType: "eraser", - pointerId: 0, - style: DefaultPenStyle, - "pointers": [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ] - } - canvasRendererStroke.drawStroke(canvasContext, stroke, stroker) - expect(stroker.drawStroke).toBeCalledTimes(0) - }) - - -}) diff --git a/test/unit/03-renderer/05-WSSVGRenderer.test.ts b/test/unit/03-renderer/05-WSSVGRenderer.test.ts deleted file mode 100644 index da86f8964..000000000 --- a/test/unit/03-renderer/05-WSSVGRenderer.test.ts +++ /dev/null @@ -1,567 +0,0 @@ -import { delay } from "../utils/helpers" -import -{ - TUpdatePatchAppendChild, - TUpdatePatchInsertBefore, - TUpdatePatchRemoveAttribut, - TUpdatePatchRemoveChild, - TUpdatePatchRemoveElement, - TUpdatePatchReplaceAll, - TUpdatePatchReplaceELement, - TUpdatePatchSetAttribut, - TStroke -} from "../../../src/@types" -import { renderer, configuration, model, style } from "../../../src/iink" - -describe("WSSVGRenderer.ts", () => -{ - const { WSSVGRenderer } = renderer - const { Model } = model - const { DefaultRenderingConfiguration } = configuration - const { DefaultPenStyle } = style - - const stroke: TStroke = { - type: 'pen', - pointerType: 'pen', - pointerId: 0, - id: 'test', - style: DefaultPenStyle, - pointers: [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ], - length: 4 - } - - test("should instanciate", () => - { - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - expect(renderer).toBeDefined() - expect(renderer.config).toStrictEqual(DefaultRenderingConfiguration) - expect(renderer.stroker).toBeDefined() - }) - - test("should initialise context", () => - { - const domElement = document.createElement("div") as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.init(domElement) - - expect(renderer.context.parent).toBe(domElement) - }) - - test("should updatesLayer when type = REPLACE_ALL on layer CAPTURE", () => - { - const domElement = document.createElement("div") as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: "REPLACE_ALL", - svg: '' - } - renderer.updatesLayer("CAPTURE", [update]) - - expect(domElement.children).toHaveLength(1) - const layerCapture = domElement.querySelector('svg[data-layer="CAPTURE"') - expect(layerCapture).toBeDefined() - }) - - test('should updatesLayer when type = REPLACE_ALL on layer MODEL', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - "type": "REPLACE_ALL", - svg: '' - } - renderer.updatesLayer('MODEL', [update]) - - expect(domElement.children).toHaveLength(1) - const layerCapture = domElement.querySelector('svg[data-layer="MODEL"') - expect(layerCapture).toBeDefined() - const pendingGroup = layerCapture?.querySelector('#pendingStrokes') - expect(pendingGroup).toBeDefined() - }) - - test('should updatesLayer when type = REPLACE_ELEMENT', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - - const updateReplaceElement: TUpdatePatchReplaceELement = { - type: 'REPLACE_ELEMENT', - id: "CAPTURE-ps0", - svg: '' - } - renderer.updatesLayer('CAPTURE', [updateReplaceElement]) - - const parendNode = domElement.querySelector('svg[data-layer="CAPTURE"]') - expect(parendNode?.children).toHaveLength(1) - - const elementReplaced = domElement.querySelector(`#${ updateReplaceElement.id }`) - expect(parendNode?.children.item(0)).toBe(elementReplaced) - }) - - test('should updatesLayer when type = REMOVE_ELEMENT on layer CAPTURE', async () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - let elementToRemove = domElement.querySelector('#CAPTURE-dg7f8d807ab560') - expect(elementToRemove).toBeDefined() - - const updateRemove: TUpdatePatchRemoveElement = { - type: 'REMOVE_ELEMENT', - id: 'CAPTURE-dg7f8d807ab560' - } - renderer.updatesLayer('MODEL', [updateRemove]) - elementToRemove = domElement.querySelector('#CAPTURE-dg7f8d807ab560') - expect(elementToRemove?.classList).toContain('removed-stroke') - - await delay(100) - elementToRemove = domElement.querySelector('#CAPTURE-dg7f8d807ab560') - expect(elementToRemove).toBeNull() - }) - - test('should updatesLayer when type = REMOVE_ELEMENT on layer MODEL', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - ` - } - renderer.updatesLayer('MODEL', [update]) - let elementToRemove = domElement.querySelector('#MODEL-dg7f8d807ab560') - expect(elementToRemove).toBeDefined() - - const updateRemove: TUpdatePatchRemoveElement = { - type: 'REMOVE_ELEMENT', - id: 'MODEL-dg7f8d807ab560' - } - renderer.updatesLayer('MODEL', [updateRemove]) - elementToRemove = domElement.querySelector('#MODEL-dg7f8d807ab560') - expect(elementToRemove).toBeNull() - }) - - test('should updatesLayer when type = APPEND_CHILD with parentId', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - ` - } - renderer.updatesLayer('MODEL', [update]) - - const updateAppendChild: TUpdatePatchAppendChild = { - type: "APPEND_CHILD", - parentId: "MODEL-dg7f8d807ab560", - svg: '' - } - renderer.updatesLayer('MODEL', [updateAppendChild]) - - const parendNode = domElement.querySelector('#MODEL-dg7f8d807ab560') - expect(parendNode?.children).toHaveLength(1) - const elementInserted = domElement.querySelector(`#test`) - expect(parendNode?.children.item(0)).toBe(elementInserted) - }) - - test('should updatesLayer when type = APPEND_CHILD without parentId', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - - const updateAppendChild: TUpdatePatchAppendChild = { - type: "APPEND_CHILD", - svg: '' - } - renderer.updatesLayer('CAPTURE', [updateAppendChild]) - - const parendNode = domElement.querySelector('svg') - expect(parendNode?.children).toHaveLength(2) - const elementInserted = domElement.querySelector(`#test`) - expect(parendNode?.children.item(1)).toBe(elementInserted) - }) - - test('should updatesLayer when type = REMOVE_CHILD', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - - - ` - } - renderer.updatesLayer('MODEL', [update]) - - const updateRmoveChild: TUpdatePatchRemoveChild = { - type: 'REMOVE_CHILD', - parentId: 'MODEL-dg7f6394110df0', - index: 2 - } - renderer.updatesLayer('MODEL', [updateRmoveChild]) - - const parendNode = domElement.querySelector(`#${ updateRmoveChild.parentId }`) - expect(parendNode?.children).toHaveLength(2) - }) - - test('should updatesLayer when type = INSERT_BEFORE', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - - const updateInsertBefore: TUpdatePatchInsertBefore = { - type: 'INSERT_BEFORE', - refId: 'CAPTURE-pc9a1234856ze6', - svg: '' - } - renderer.updatesLayer('CAPTURE', [updateInsertBefore]) - - const parendNode = domElement.querySelector('#CAPTURE-dg7f6394110df0') - expect(parendNode?.children).toHaveLength(2) - - const elementInserted = domElement.querySelector(`#test`) - expect(parendNode?.children?.item(0)).toBe(elementInserted) - }) - - test('should updatesLayer when type = SET_ATTRIBUTE with id', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - - const updateSetAttribut: TUpdatePatchSetAttribut = { - type: 'SET_ATTRIBUTE', - id: 'CAPTURE-pc9a1234856ze6', - name: 'data-test', - value: 'value-test' - } - renderer.updatesLayer('CAPTURE', [updateSetAttribut]) - - const element = domElement.querySelector(`#${ updateSetAttribut.id }`) - expect(element?.getAttribute(updateSetAttribut.name)).toBe(updateSetAttribut.value) - }) - - test('should updatesLayer when type = SET_ATTRIBUTE without id', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - - const updateSetAttribut: TUpdatePatchSetAttribut = { - type: 'SET_ATTRIBUTE', - name: 'data-test', - value: 'value-test' - } - renderer.updatesLayer('CAPTURE', [updateSetAttribut]) - - const element = domElement.querySelector('svg') - expect(element?.getAttribute(updateSetAttribut.name)).toBe(updateSetAttribut.value) - }) - - test('should updatesLayer when type = REMOVE_ATTRIBUTE with id', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - - const updateRemoveAttribut: TUpdatePatchRemoveAttribut = { - type: 'REMOVE_ATTRIBUTE', - id: 'CAPTURE-pc9a1234856ze6', - name: 'data-test', - } - renderer.updatesLayer('CAPTURE', [updateRemoveAttribut]) - - const element = domElement.querySelector(updateRemoveAttribut.id as string) - expect(element?.getAttribute(updateRemoveAttribut.name)).toBeUndefined() - }) - - test('should updatesLayer when type = REMOVE_ATTRIBUTE without id', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const update: TUpdatePatchReplaceAll = { - type: 'REPLACE_ALL', - svg: ` - - - - ` - } - renderer.updatesLayer('CAPTURE', [update]) - - const updateRemoveAttribut: TUpdatePatchRemoveAttribut = { - type: 'REMOVE_ATTRIBUTE', - name: 'data-test', - } - renderer.updatesLayer('CAPTURE', [updateRemoveAttribut]) - - const element = domElement.querySelector('svg') - expect(element?.getAttribute(updateRemoveAttribut.name)).toBeNull() - }) - - test('should drawPendingStroke', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const svgModelElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - svgModelElement.setAttribute('data-layer', 'MODEL') - const pendingStrokesGroup = document.createElementNS("http://www.w3.org/2000/svg", 'g') - pendingStrokesGroup.id = 'pendingStrokes' - svgModelElement.appendChild(pendingStrokesGroup) - domElement.appendChild(svgModelElement) - - renderer.drawPendingStroke(stroke) - - expect(renderer.stroker.drawStroke).toBeCalledTimes(1) - expect(renderer.stroker.drawStroke).toBeCalledWith(pendingStrokesGroup, stroke, [{ name: "style", value: "fill:undefined;stroke:transparent;" }]) - }) - - test('should drawPendingStroke when pointerType = eraser', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.stroker.drawStroke = jest.fn() - renderer.init(domElement) - - const svgModelElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - svgModelElement.setAttribute('data-layer', 'MODEL') - const pendingStrokesGroup = document.createElementNS("http://www.w3.org/2000/svg", 'g') - pendingStrokesGroup.id = 'pendingStrokes' - svgModelElement.appendChild(pendingStrokesGroup) - domElement.appendChild(svgModelElement) - - const eraseStroke: TStroke = { - type: 'pen', - pointerType: 'eraser', - pointerId: 0, - id: 'test', - style: DefaultPenStyle, - pointers: [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ], - length: 4 - } - renderer.drawPendingStroke(eraseStroke) - - expect(renderer.stroker.drawStroke).toBeCalledTimes(1) - expect(renderer.stroker.drawStroke).toBeCalledWith(pendingStrokesGroup, eraseStroke, [{ name: "style", value: "fill:grey;stroke:transparent;shadowBlur:5;opacity:0.2;" }]) - }) - - test('should delete erasing strokes', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.init(domElement) - - const svgModelElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - svgModelElement.setAttribute('data-layer', 'MODEL') - const pendingStrokesGroup = document.createElementNS("http://www.w3.org/2000/svg", 'g') - pendingStrokesGroup.id = 'pendingStrokes' - svgModelElement.appendChild(pendingStrokesGroup) - domElement.appendChild(svgModelElement) - - const eraseStroke: TStroke = { - type: 'pen', - pointerType: 'eraser', - pointerId: 0, - id: 'test', - style: DefaultPenStyle, - pointers: [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ], - length: 4 - } - renderer.drawPendingStroke(eraseStroke) - expect(domElement.querySelectorAll("[type=eraser]").length).toStrictEqual(1) - renderer.clearPendingStroke() - expect(domElement.querySelectorAll("[type=eraser]").length).toStrictEqual(0) - }) - - test('should clearPendingStroke', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.init(domElement) - - const svgModelElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - svgModelElement.setAttribute('data-layer', 'MODEL') - const pendingStrokesGroup = document.createElementNS("http://www.w3.org/2000/svg", 'g') - pendingStrokesGroup.id = 'pendingStrokes' - svgModelElement.appendChild(pendingStrokesGroup) - domElement.appendChild(svgModelElement) - - const svgCaptureElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - svgCaptureElement.setAttribute('data-layer', 'CAPTURE') - domElement.appendChild(svgCaptureElement) - - renderer.drawPendingStroke(stroke) - expect(pendingStrokesGroup.children).toHaveLength(1) - - renderer.clearPendingStroke() - - expect(pendingStrokesGroup.children).toHaveLength(0) - }) - - test('should resize', () => - { - const width = 100, height = 50 - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - const model = new Model(width, height) - renderer.init(domElement) - - const svgModelElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - svgModelElement.setAttribute('data-layer', 'MODEL') - svgModelElement.setAttribute('viewBox', `0 0 ${ width }, ${ height }`) - svgModelElement.setAttribute('width', `${ width }px`) - svgModelElement.setAttribute('height', `${ height }px`) - domElement.appendChild(svgModelElement) - - const svgCaptureElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - svgCaptureElement.setAttribute('data-layer', 'CAPTURE') - svgCaptureElement.setAttribute('viewBox', `0 0 ${ width }, ${ height }`) - svgCaptureElement.setAttribute('width', `${ width }px`) - svgCaptureElement.setAttribute('height', `${ height }px`) - domElement.appendChild(svgCaptureElement) - - model.width += 42 - model.height += 50 - renderer.resize(model) - - expect(svgCaptureElement.getAttribute('width')).toBe(`${ model.width }px`) - expect(svgCaptureElement.getAttribute('height')).toBe(`${ model.height }px`) - }) - - test('should destroy', () => - { - const domElement = document.createElement('div') as HTMLElement - const renderer = new WSSVGRenderer(DefaultRenderingConfiguration) - renderer.init(domElement) - - const svgModelElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - domElement.appendChild(svgModelElement) - - const svgCaptureElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", 'svg') as SVGElement - domElement.appendChild(svgCaptureElement) - - renderer.destroy() - - expect(domElement.children).toHaveLength(0) - }) -}) diff --git a/test/unit/03-renderer/06-SVGStroker.test.ts b/test/unit/03-renderer/06-SVGStroker.test.ts deleted file mode 100644 index d1706e8e0..000000000 --- a/test/unit/03-renderer/06-SVGStroker.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { TStroke } from "../../../src/@types" -import { renderer } from "../../../src/iink" - -describe("SVGStroker.ts", () => -{ - const { SVGStroker } = renderer - - //@ts-ignore - const stroke: TStroke = { - type: "pen", - pointerType: "pen", - pointerId: 0, - id: "test", - style: { - "-myscript-pen-fill-color": "red", - "-myscript-pen-fill-style": "none", - "-myscript-pen-width": 1, - color: "red", - width: 1, - }, - "pointers": [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ] - } - - test("should instanciate", () => - { - const stroker = new SVGStroker() - expect(stroker).toBeDefined() - }) - - test("should drawStroke", () => - { - const svgElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", "svg") as SVGElement - const stroker = new SVGStroker() - stroker.drawStroke(svgElement, stroke) - const pathElement = svgElement.querySelector("path") - expect(pathElement?.getAttribute("id")).toEqual(stroke.id) - expect(pathElement?.getAttribute("type")).toEqual("pen") - }) - - test("should drawStroke with attrs", () => - { - const svgElement: SVGElement = document.createElementNS("http://www.w3.org/2000/svg", "svg") as SVGElement - const stroker = new SVGStroker() - stroker.drawStroke(svgElement, stroke, [{ name: "style", value: `fill:${ stroke.style.color };stroke:transparent;` }]) - const pathElement = svgElement.querySelector("path") - expect(pathElement?.getAttribute("id")).toEqual(stroke.id) - expect(pathElement?.getAttribute("type")).toEqual("pen") - expect(pathElement?.getAttribute("style")).toEqual(`fill:${ stroke.style.color };stroke:transparent;`) - }) -}) diff --git a/test/unit/04-style/00-StyleHelper.test.ts b/test/unit/04-style/00-StyleHelper.test.ts deleted file mode 100644 index 6a8ba2cc1..000000000 --- a/test/unit/04-style/00-StyleHelper.test.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { TPenStyle, TTheme } from "../../../src/@types" -import { style } from "../../../src/iink" - -const DefaultPenStyleString = "" -const DefaultThemeString = `ink {color: #000000;width: 1;-myscript-pen-width: 1;-myscript-pen-fill-style: none;-myscript-pen-fill-color: #FFFFFF00;}.math {font-family: STIXGeneral;}.math-solved {font-family: STIXGeneral;color: #A8A8A8FF;}.text {font-family: MyScriptInter;font-size: 10;}` - -describe("StyleHelper.ts", () => -{ - const { StyleHelper, DefaultPenStyle, DefaultTheme } = style - test("should penStyleToCSS for DefaultPenStyle", () => - { - const styleString = StyleHelper.penStyleToCSS(DefaultPenStyle) - const styleStringInline = styleString.replace(/[\r\n]+/gm, "") - expect(styleStringInline).toEqual(DefaultPenStyleString) - }) - - test("should penStyleToCSS for customPenStyle", () => - { - const penStyle: TPenStyle = { - "-myscript-pen-fill-color": "red", - "-myscript-pen-fill-style": "none", - "-myscript-pen-width": 1, - color: "green", - width: 2 - } - const penStyleStringExpected = `-myscript-pen-fill-color: red;-myscript-pen-fill-style: none;-myscript-pen-width: 1;color: green;width: 2;` - - const styleString = StyleHelper.penStyleToCSS(penStyle) - const styleStringInline = styleString.replace(/[\r\n]+/gm, "") - - expect(styleStringInline).toEqual(penStyleStringExpected) - }) - - test("should penStyleToJSON for DefaultPenStyle", () => - { - const style = StyleHelper.penStyleToJSON(DefaultPenStyleString) - expect(style).toEqual(DefaultPenStyle) - }) - - test("should penStyleToJSON for customPenStyle", () => - { - const penStyle: TPenStyle = { - "-myscript-pen-fill-color": "red", - "-myscript-pen-fill-style": "purple", - "-myscript-pen-width": 1, - color: "green", - width: 2 - } - const penStyleString = `-myscript-pen-fill-color: red;-myscript-pen-fill-style: purple;-myscript-pen-width: 1;color: green;width: 2;` - const style = StyleHelper.penStyleToJSON(penStyleString) - expect(style).toEqual(penStyle) - }) - - test("should themeToCSS for DefaultTheme", () => - { - const styleString = StyleHelper.themeToCSS(DefaultTheme) - const styleStringInline = styleString.replace(/[\r\n]+/gm, "") - expect(styleStringInline).toStrictEqual(DefaultThemeString) - }) - - test("should themeToCSS for CustomTheme", () => - { - const theme: TTheme = { - ink: { - color: "#2E7D32", - "-myscript-pen-width": 2, - "-myscript-pen-fill-style": "purple", - "-myscript-pen-fill-color": "#FFFFFF00" - }, - ".math": { - "font-family": "STIXGeneral" - }, - ".math-solved": { - "font-family": "STIXGeneral", - color: "blue" - }, - ".text": { - "font-family": "Rubik Distressed", - "font-size": 10 - } - } - const themeStringExpected = "ink {color: #2E7D32;-myscript-pen-width: 2;-myscript-pen-fill-style: purple;-myscript-pen-fill-color: #FFFFFF00;}.math {font-family: STIXGeneral;}.math-solved {font-family: STIXGeneral;color: blue;}.text {font-family: Rubik Distressed;font-size: 10;}" - const themeString = StyleHelper.themeToCSS(theme) - const themeStringInline = themeString.replace(/[\r\n]+/gm, "") - expect(themeStringInline).toStrictEqual(themeStringExpected) - }) - - test("should themeToJSON for DefaultTheme", () => - { - const style = StyleHelper.themeToJSON(DefaultThemeString) - expect(style).toStrictEqual(DefaultTheme) - }) - - test("should themeToJSON for v", () => - { - const theme: TTheme = { - ink: { - width: 42, - color: "#2E7D32", - "-myscript-pen-width": 2, - "-myscript-pen-fill-style": "purple", - "-myscript-pen-fill-color": "#FFFFFF00" - }, - ".math": { - "font-family": "STIXGeneral" - }, - ".math-solved": { - "font-family": "STIXGeneral", - color: "blue" - }, - ".text": { - "font-family": "Rubik Distressed", - "font-size": 10 - } - } - const themeString = "ink {width: 42;color: #2E7D32;-myscript-pen-width: 2;-myscript-pen-fill-style: purple;-myscript-pen-fill-color: #FFFFFF00;}.math {font-family: STIXGeneral;}.math-solved {font-family: STIXGeneral;color: blue;}.text {font-family: Rubik Distressed;font-size: 10;}" - - const style = StyleHelper.themeToJSON(themeString) - expect(style).toStrictEqual(theme) - }) -}) diff --git a/test/unit/04-style/01-StyleManager.test.ts b/test/unit/04-style/01-StyleManager.test.ts deleted file mode 100644 index ca099f4d3..000000000 --- a/test/unit/04-style/01-StyleManager.test.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { style } from "../../../src/iink" - -describe("StyleManager.ts", () => -{ - const { StyleManager, DefaultPenStyle, DefaultTheme } = style - describe("constructor", () => - { - test("should instanciate with DefaultPenStyle & DefaultTheme", () => - { - const styleManager = new StyleManager() - expect(styleManager.penStyle).toStrictEqual(DefaultPenStyle) - expect(styleManager.theme).toStrictEqual(DefaultTheme) - }) - test("should instanciate and override DefaultPenStyle", () => - { - const customPenStyle = { ...DefaultPenStyle } - customPenStyle["-myscript-pen-fill-color"] = "yellow" - customPenStyle["-myscript-pen-width"] = 12 - customPenStyle.color = "red" - customPenStyle.width = 42 - const styleManager = new StyleManager(customPenStyle, undefined) - expect(styleManager.penStyle).toStrictEqual(customPenStyle) - }) - test("should instanciate and override DefaultTheme", () => - { - const customTheme = { ...DefaultTheme } - customTheme[".math"]["font-family"] = "math" - customTheme[".math-solved"].color = "yellow" - customTheme[".text"]["font-family"] = "Verdana, Arial, Helvetica, sans-serif" - customTheme[".text"]["font-size"] = 42 - customTheme.ink["-myscript-pen-fill-color"] = "red" - customTheme.ink["-myscript-pen-width"] = 27 - customTheme.ink.color = ".ink.color" - customTheme.ink.width = 5 - const styleManager = new StyleManager(undefined, customTheme) - expect(styleManager.theme).toStrictEqual(customTheme) - }) - }) - - describe("penStyle", () => - { - test("should override DefaultPenStyle", () => - { - const styleManager = new StyleManager() - const customPenStyle = { ...DefaultPenStyle } - customPenStyle["-myscript-pen-fill-color"] = "yellow" - customPenStyle["-myscript-pen-width"] = 12 - customPenStyle.color = "red" - customPenStyle.width = 42 - styleManager.setPenStyle(customPenStyle) - expect(styleManager.penStyle).toStrictEqual(customPenStyle) - }) - - test("should define currentPenStyle", () => - { - const styleManager = new StyleManager() - const customPenStyle = { ...DefaultPenStyle } - customPenStyle["-myscript-pen-fill-color"] = "yellow" - customPenStyle["-myscript-pen-width"] = 12 - customPenStyle.color = "red" - customPenStyle.width = 42 - styleManager.setPenStyle(customPenStyle) - expect(styleManager.currentPenStyle).toStrictEqual(customPenStyle) - }) - }) - - describe("theme", () => - { - test("should override DefaultTheme", () => - { - const styleManager = new StyleManager() - const customTheme = { ...DefaultTheme } - customTheme[".math"]["font-family"] = "math" - customTheme[".math-solved"].color = "yellow" - customTheme[".text"]["font-family"] = "Verdana, Arial, Helvetica, sans-serif" - customTheme[".text"]["font-size"] = 42 - customTheme.ink["-myscript-pen-fill-color"] = "red" - customTheme.ink["-myscript-pen-width"] = 27 - customTheme.ink.color = ".ink.color" - customTheme.ink.width = 5 - styleManager.setTheme(customTheme) - expect(styleManager.theme).toStrictEqual(customTheme) - }) - }) - - describe("penStyleClasses", () => - { - test("should set penStyleClasses", () => - { - const styleManager = new StyleManager() - styleManager.setPenStyleClasses("pouet") - expect(styleManager.penStyleClasses).toStrictEqual("pouet") - }) - test("should define currentPenStyle", () => - { - const styleManager = new StyleManager() - const customTheme = { ...DefaultTheme } - customTheme[".math"]["font-family"] = "math" - customTheme[".math-solved"].color = "yellow" - customTheme[".text"]["font-family"] = "Verdana, Arial, Helvetica, sans-serif" - customTheme[".text"]["font-size"] = 42 - customTheme.ink["-myscript-pen-fill-color"] = "red" - customTheme.ink["-myscript-pen-width"] = 27 - customTheme.ink.color = ".ink.color" - customTheme.ink.width = 5 - styleManager.setPenStyleClasses("math") - expect(styleManager.currentPenStyle).toStrictEqual(customTheme[".math"]) - }) - }) - - -}) diff --git a/test/unit/05-recognizer/01-RestRecognizer.test.ts b/test/unit/05-recognizer/01-RestRecognizer.test.ts deleted file mode 100644 index e8ac6899d..000000000 --- a/test/unit/05-recognizer/01-RestRecognizer.test.ts +++ /dev/null @@ -1,118 +0,0 @@ -import fetchMock from "jest-fetch-mock" -import -{ - IModel, - TPointer, - TRecognitionConfiguration, - TRecognitionType -} from "../../../src/@types" -import { recognizer, configuration, style, model } from "../../../src/iink" - -describe("RestRecognizer.ts", () => -{ - const { RestRecognizer } = recognizer - const { DefaultRecognitionConfiguration, DefaultServerConfiguration } = configuration - const { DefaultPenStyle } = style - const { Model } = model - const height = 100, width = 100 - - beforeAll(() => - { - fetchMock.enableMocks() - }) - afterEach(() => - { - fetchMock.resetMocks() - }) - - test("should instanciate RestRecognizer", () => - { - const rr = new RestRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - expect(rr).toBeDefined() - }) - - const recognitionTypeList: TRecognitionType[] = ["TEXT", "DIAGRAM", "MATH", "Raw Content"] - recognitionTypeList.forEach((recognitionType: TRecognitionType) => - { - test(`should export ${ recognitionType }`, async () => - { - const model: IModel = new Model(width, height) - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 1, x: 100, y: 1 } - model.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - model.endCurrentStroke(p2) - const recognitionConfig: TRecognitionConfiguration = { - ...DefaultRecognitionConfiguration, - type: recognitionType - } - const rr = new RestRecognizer(DefaultServerConfiguration, recognitionConfig) - const newModel = await rr.export(model) - model.exports = {} - - let mimeType = "" - switch (recognitionType) { - case "TEXT": - mimeType = DefaultRecognitionConfiguration.text.mimeTypes[0] - break - case "DIAGRAM": - mimeType = DefaultRecognitionConfiguration.diagram.mimeTypes[0] - break - case "MATH": - mimeType = DefaultRecognitionConfiguration.math.mimeTypes[0] - break - case "Raw Content": - mimeType = "application/vnd.myscript.jiix" - break - - default: - throw new Error("invalid recognition type") - } - expect(fetchMock).toHaveBeenCalledTimes(1) - model.exports[mimeType] = "" - expect(newModel).toEqual(model) - }) - }) - - recognitionTypeList.forEach((recognitionType: TRecognitionType) => - { - test(`should convert ${ recognitionType }`, async () => - { - const model: IModel = new Model(width, height) - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 1, x: 100, y: 1 } - model.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - model.endCurrentStroke(p2) - const recognitionConfig: TRecognitionConfiguration = { - ...DefaultRecognitionConfiguration, - type: recognitionType - } - const rr = new RestRecognizer(DefaultServerConfiguration, recognitionConfig) - const newModel = await rr.convert(model, "DIGITAL_EDIT") - model.converts = {} - - let mimeType = "" - switch (recognitionType) { - case "TEXT": - mimeType = DefaultRecognitionConfiguration.text.mimeTypes[0] - break - case "DIAGRAM": - mimeType = DefaultRecognitionConfiguration.diagram.mimeTypes[0] - break - case "MATH": - mimeType = DefaultRecognitionConfiguration.math.mimeTypes[0] - break - case "Raw Content": - mimeType = "application/vnd.myscript.jiix" - break - - default: - throw new Error("invalid recognition type") - } - - expect(fetchMock).toHaveBeenCalledTimes(1) - model.converts[mimeType] = "" - expect(model).toEqual(newModel) - }) - }) - -}) diff --git a/test/unit/05-recognizer/02-WSRecognizer.test.ts b/test/unit/05-recognizer/02-WSRecognizer.test.ts deleted file mode 100644 index a9112851e..000000000 --- a/test/unit/05-recognizer/02-WSRecognizer.test.ts +++ /dev/null @@ -1,1046 +0,0 @@ -//@ts-nocheck -import Server from "jest-websocket-mock" -import { DeserializedMessage } from "jest-websocket-mock/lib/websocket" -import { delay } from "../utils/helpers" -import -{ - TWebSocketEvent, - IModel, - TTheme, - TPenStyle, - TServerConfiguration, - TConverstionState, - TRecognitionConfiguration, - TRecognitionType, -} from "../../../src/@types" - -import { recognizer, configuration, style, model, constants } from "../../../src/iink" - -const { WSRecognizer } = recognizer -const { DefaultRecognitionConfiguration, DefaultServerConfiguration } = configuration -const { DefaultPenStyle } = style -const { Model, Stroke } = model - -const ackMessage = { "type": "ack", "hmacChallenge": "1f434e8b-cc46-4a8c-be76-708eea2ff305", "iinkSessionId": "c7e72186-6299-4782-b612-3e725aa126f1" } -const contentPackageDescriptionMessage = { "type": "contentPackageDescription", "contentPartCount": 0 } -const partChangeMessage = { "type": "partChanged", "partIdx": 0, "partId": "yyrrutgk", "partCount": 1 } -const newPartMessage = { "type": "newPart", "idx": 0, "id": "lqrcoxjl" } - -const emptyJIIX = { - "type": "Text", - "label": "", - "words": [], -} -const emptyExportedMessage = { - "type": "exported", - "partId": "wyybaqsp", - "exports": { - "application/vnd.myscript.jiix": JSON.stringify(emptyJIIX) - } -} -const hJIIX = { - "type": "Text", - "label": "hello", - "words": [{ - "label": "H", - "candidates": ["h"] - }] -} -const hExportedMessage = { - "type": "exported", - "partid": 0, - "exports": { - "application/vnd.myscript.jiix": JSON.stringify(hJIIX) - } -} -const svgPatchMessage = { - "type": "svgPatch", - "updates": [ - { - "type": "REMOVE_ELEMENT", - "id": "MODEL-dg7f8894033c80" - }, - { - "type": "SET_ATTRIBUTE", - "name": "viewBox", - "value": "0 0 967 790" - }, - { - "type": "SET_ATTRIBUTE", - "name": "width", - "value": "967px" - }, - { - "type": "INSERT_BEFORE", - "refId": "G7f8814290820-", - "svg": "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" - }, - { - "type": "REMOVE_ELEMENT", - "id": "G7f8814290820-" - } - ], - "layer": "MODEL" -} -const errorMessage = { "type": "error", "message": "Access not granted", "code": "access.not.granted" } -const recognitionTypeList: TRecognitionType[] = ["TEXT", "DIAGRAM", "MATH", "Raw Content"] - -const getMessages = (messages: DeserializedMessage[], type: string): DeserializedMessage[] => -{ - return messages.filter((m: DeserializedMessage) => - { - const parseMessage = JSON.parse(m as string) as TWebSocketEvent - return parseMessage.type === type - }) -} - -describe("WSRecognizer.ts", () => -{ - let mockServer: Server - const height = 100, width = 100 - beforeEach(() => - { - mockServer = new Server(`wss://${ DefaultServerConfiguration.host }/api/v4.0/iink/document`, {}) - - mockServer.on("connection", (socket) => - { - socket.on("message", (message: string | Blob | ArrayBuffer | ArrayBufferView) => - { - const parsedMessage: TWebSocketEvent = JSON.parse(message as string) - switch (parsedMessage.type) { - case "newContentPackage": - socket.send(JSON.stringify(ackMessage)) - break - case "hmac": - socket.send(JSON.stringify(contentPackageDescriptionMessage)) - break - case "configuration": - socket.send(JSON.stringify(partChangeMessage)) - break - case "newContentPart": - socket.send(JSON.stringify(newPartMessage)) - break - default: - break - } - }) - }) - }) - - afterEach(() => - { - Server.clean() - }) - - test("should instanciate WSRecognizer", () => - { - const wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - expect(wsr).toBeDefined() - }) - - describe("Properties", () => - { - test("should get url", () => - { - const serverConfig = { - ...DefaultServerConfiguration, - scheme: "http", - host: "pony", - applicationKey: "applicationKey" - } as TServerConfiguration - const wsr = new WSRecognizer(serverConfig, DefaultRecognitionConfiguration) - expect(wsr.url).toEqual("ws://pony/api/v4.0/iink/document?applicationKey=applicationKey") - }) - recognitionTypeList.forEach(recognitionType => - { - test(`should get mimeTypes for ${ recognitionType }`, () => - { - const recognitionConfig: TRecognitionConfiguration = { - ...DefaultRecognitionConfiguration, - type: recognitionType - } - const wsr = new WSRecognizer(DefaultServerConfiguration, recognitionConfig) - let mimeTypes: string[] - switch (recognitionType) { - case "TEXT": - mimeTypes = recognitionConfig.text.mimeTypes - break - case "DIAGRAM": - mimeTypes = recognitionConfig.diagram.mimeTypes - break - case "MATH": - mimeTypes = recognitionConfig.math.mimeTypes - break - case "Raw Content": - mimeTypes = [] - break - default: - throw new Error("invalid recognition type") - } - expect(wsr.mimeTypes).toEqual(mimeTypes) - }) - }) - }) - - describe("init", () => - { - const serverConfigToCloseTest: TServerConfiguration = { - ...DefaultServerConfiguration, - host: "init-test" - } - let addStroMockServerForInitTest: Server - let wsr: typeof WSRecognizer - let spyEmitError: jest.SpyInstance - - beforeEach(() => - { - addStroMockServerForInitTest = new Server(`wss://${ serverConfigToCloseTest.host }/api/v4.0/iink/document`, {}) - wsr = new WSRecognizer(serverConfigToCloseTest, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - spyEmitError.mockResolvedValue(() => Promise.resolve()) - }) - afterEach(async () => - { - await wsr.destroy() - addStroMockServerForInitTest.close() - }) - test("should sent newContentPackage message", async () => - { - expect.assertions(2) - expect(getMessages(addStroMockServerForInitTest.messages, "newContentPackage")).toHaveLength(0) - wsr.init(height, width) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - expect(getMessages(addStroMockServerForInitTest.messages, "newContentPackage")).toHaveLength(1) - }) - test("should sent hmac message when receive hmacChallenge message", async () => - { - expect.assertions(2) - wsr.init(height, width) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - expect(getMessages(addStroMockServerForInitTest.messages, "hmac")).toHaveLength(0) - addStroMockServerForInitTest.send(JSON.stringify(ackMessage)) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - expect(getMessages(addStroMockServerForInitTest.messages, "hmac")).toHaveLength(1) - }) - test("should sent hmac & newPart messages when receive hmacChallenge message", async () => - { - expect.assertions(4) - wsr.init(height, width) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - expect(getMessages(addStroMockServerForInitTest.messages, "configuration")).toHaveLength(0) - expect(getMessages(addStroMockServerForInitTest.messages, "newContentPart")).toHaveLength(0) - addStroMockServerForInitTest.send(JSON.stringify(contentPackageDescriptionMessage)) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - expect(getMessages(addStroMockServerForInitTest.messages, "configuration")).toHaveLength(1) - expect(getMessages(addStroMockServerForInitTest.messages, "newContentPart")).toHaveLength(1) - }) - test.skip("should resolve when receive newPart message", async () => - { - expect.assertions(1) - const promise = wsr.init(height, width) - addStroMockServerForInitTest.send(JSON.stringify(newPartMessage)) - await promise - expect(1).toEqual(1) - }) - test.skip("should reject if receive error message", async () => - { - expect.assertions(3) - const promise = wsr.init(height, width) - addStroMockServerForInitTest.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("Ping", () => - { - test("should send ping message", async () => - { - expect.assertions(2) - const conf = JSON.parse(JSON.stringify(DefaultServerConfiguration)) as TServerConfiguration - conf.websocket.pingDelay = 200 - const wsr = new WSRecognizer(conf, DefaultRecognitionConfiguration) - await wsr.init(height, width) - await delay(conf.websocket.pingDelay) - await delay(100) - expect(getMessages(mockServer.messages, "ping")).toHaveLength(1) - await delay(conf.websocket.pingDelay) - expect(getMessages(mockServer.messages, "ping")).toHaveLength(2) - }) - test("should not send ping message", async () => - { - expect.assertions(2) - const conf = JSON.parse(JSON.stringify(DefaultServerConfiguration)) as TServerConfiguration - conf.websocket.pingDelay = 200 - conf.websocket.pingEnabled = false - const wsr = new WSRecognizer(conf, DefaultRecognitionConfiguration) - await wsr.init(height, width) - await delay(conf.websocket.pingDelay) - await delay(100) - expect(getMessages(mockServer.messages, "ping")).toHaveLength(0) - await delay(conf.websocket.pingDelay) - expect(getMessages(mockServer.messages, "ping")).toHaveLength(0) - }) - }) - - describe("send", () => - { - let wsr: typeof WSRecognizer - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - const testDataToSend = { type: "test", data: "test-data" } - await expect(wsr.send(testDataToSend)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const testDataToSend = { type: "test", data: "test-data" } - await wsr.send(testDataToSend) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const messageSent = JSON.parse(mockServer.messages[mockServer.messages.length - 1] as string) - expect(messageSent).toEqual(testDataToSend) - }) - //TODO fix test - test.skip("should reconnect before send message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - await wsr.close(1000, "CLOSE_RECOGNIZER") - const testDataToSend = { type: "test", data: "test-data" } - await wsr.send(testDataToSend) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const messageSent = JSON.parse(mockServer.messages[mockServer.messages.length - 1] as string) - expect(messageSent).toEqual(testDataToSend) - }) - }) - - describe("addStrokes", () => - { - let wsr: typeof WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - const stroke = new Stroke(DefaultPenStyle, 1) - stroke.pointers.push({ p: 1, t: 1, x: 1, y: 1}) - await expect(wsr.addStrokes([stroke])).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send addStrokes message", async () => - { - expect.assertions(1) - const stroke = new Stroke(DefaultPenStyle, 1) - stroke.pointers.push({ p: 1, t: 1, x: 1, y: 1}) - stroke.pointers.push({ p: 2, t: 4, x: 8, y: 16}) - await wsr.init(height, width) - wsr.addStrokes([stroke]) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const addStrokesMessageSent = JSON.parse(mockServer.messages[mockServer.messages.length - 1] as string) - const addStrokesMessageSentToTest = { - type: "addStrokes", - strokes: [{ - "p": [1, 2], - "pointerType": "pen", - "t": [1, 4], - "x": [1, 8], - "y": [1, 16], - }] - } - await expect(addStrokesMessageSent).toMatchObject(addStrokesMessageSentToTest) - }) - test("should not send addStrokes message if model.extractUnsentStrokes return 0 strokes", async () => - { - expect.assertions(1) - await wsr.init(height, width) - await wsr.addStrokes([]) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const addStrokesMessageSent = JSON.parse(mockServer.messages[mockServer.messages.length - 1] as string) - await expect(addStrokesMessageSent.type).not.toEqual("addStrokes") - }) - test("should resolve when receive exported message", async () => - { - expect.assertions(1) - const stroke = new Stroke(DefaultPenStyle, 1) - stroke.pointers.push({ p: 1, t: 1, x: 1, y: 1}) - stroke.pointers.push({ p: 2, t: 4, x: 8, y: 16}) - await wsr.init(height, width) - const promise = wsr.addStrokes([stroke]) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(emptyExportedMessage)) - await promise - await expect(promise).resolves.toEqual( - expect.objectContaining({ - "application/vnd.myscript.jiix": emptyJIIX - }) - ) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - const stroke = new Stroke(DefaultPenStyle, 1) - stroke.pointers.push({ p: 1, t: 1, x: 1, y: 1}) - stroke.pointers.push({ p: 2, t: 4, x: 8, y: 16}) - await wsr.init(height, width) - const promise = wsr.addStrokes([stroke]) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("Style", () => - { - let wsr: typeof WSRecognizer - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should setPenStyle", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const CustomPenStyle: TPenStyle = { color: "#d1d1d1" } - await wsr.setPenStyle(CustomPenStyle) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const setPenStyle = mockServer.messages[mockServer.messages.length - 1] - const setPenStyleToTest = JSON.stringify({ - type: "setPenStyle", - style: "color: #d1d1d1;" - }) - expect(setPenStyle).toContain(setPenStyleToTest) - }) - test("should setPenStyleClasses", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const styleClasses = "pony" - await wsr.setPenStyleClasses(styleClasses) - await delay(100) - //¯\_(ツ)_/¯ required to wait server received message - const setPenStyleClasses = mockServer.messages[mockServer.messages.length - 1] - const setPenStyleClassesToTest = JSON.stringify({ - type: "setPenStyleClasses", - styleClasses - }) - expect(setPenStyleClasses).toContain(setPenStyleClassesToTest) - }) - test("should setTheme", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const theme: TTheme = { - ink: { - width: 42, - color: "#2E7D32", - "-myscript-pen-width": 2, - "-myscript-pen-fill-style": "purple", - "-myscript-pen-fill-color": "#FFFFFF00" - }, - ".math": { - "font-family": "STIXGeneral" - }, - ".math-solved": { - "font-family": "STIXGeneral", - color: "blue" - }, - ".text": { - "font-family": "Rubik Distressed", - "font-size": 10 - } - } - await wsr.setTheme(theme) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - - const setThemeMessageSent = mockServer.messages[mockServer.messages.length - 1] - const setThemeMessageSentToTest = "{\"type\":\"setTheme\",\"theme\":\"ink {\\nwidth: 42;\\ncolor: #2E7D32;\\n-myscript-pen-width: 2;\\n-myscript-pen-fill-style: purple;\\n-myscript-pen-fill-color: #FFFFFF00;\\n}\\n.math {\\nfont-family: STIXGeneral;\\n}\\n.math-solved {\\nfont-family: STIXGeneral;\\ncolor: blue;\\n}\\n.text {\\nfont-family: Rubik Distressed;\\nfont-size: 10;\\n}\\n\"}" - expect(setThemeMessageSent).toContain(setThemeMessageSentToTest) - }) - }) - - describe("export", () => - { - const model: IModel = new Model(width, height) - let wsr: typeof WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - await expect(wsr.export(model)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - recognitionTypeList.forEach((recognitionType: TRecognitionType) => - { - test(`should send export message for ${ recognitionType }`, async () => - { - expect.assertions(1) - const recognitionConfig: TRecognitionConfiguration = { - ...DefaultRecognitionConfiguration, - type: recognitionType - } - const my_wsr = new WSRecognizer(DefaultServerConfiguration, recognitionConfig) - await my_wsr.init(height, width) - my_wsr.export(model) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const exportMessageSent = mockServer.messages[mockServer.messages.length - 1] - let mimeTypes: string[] - switch (recognitionType) { - case "TEXT": - mimeTypes = DefaultRecognitionConfiguration.text.mimeTypes - break - case "DIAGRAM": - mimeTypes = DefaultRecognitionConfiguration.diagram.mimeTypes - break - case "MATH": - mimeTypes = DefaultRecognitionConfiguration.math.mimeTypes - break - case "Raw Content": - mimeTypes = ["application/vnd.myscript.jiix"] - break - default: - throw new Error("invalid recognition type") - } - - const exportMessageSentToTest = JSON.stringify({ - type: "export", - partId: partChangeMessage.partId, - mimeTypes - }) - expect(exportMessageSent).toContain(exportMessageSentToTest) - my_wsr.destroy() - }) - }) - test("should resolve when receive fileChunckAck message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const promise = wsr.export(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(hExportedMessage)) - await expect(promise).resolves.toEqual( - expect.objectContaining({ - exports: { - "application/vnd.myscript.jiix": hJIIX - } - }) - ) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - await wsr.init(height, width) - const promise = wsr.export(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("import", () => - { - const model: IModel = new Model(width, height) - let wsr: typeof WSRecognizer - let spyEmitError: jest.SpyInstance - const mimeType = "text/plain" - const textImport = "winter is comming" - const blobToImport = new Blob([textImport]) - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - await expect(wsr.import(model, blobToImport, mimeType)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send import message", async () => - { - await wsr.init(height, width) - wsr.import(model, blobToImport, mimeType) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const parsedMessage = mockServer.messages.map((m: DeserializedMessage) => - { - return JSON.parse(m as string) as TWebSocketEvent - }) - await expect(parsedMessage.filter(m => m.type === "importFile")).toHaveLength(1) - await expect(parsedMessage.filter(m => m.type === "importFile")[0]).toEqual( - expect.objectContaining({ - type: "importFile", - mimeType - }) - ) - await expect(parsedMessage.filter(m => m.type === "fileChunk")).toHaveLength(1) - await expect(parsedMessage.filter(m => m.type === "fileChunk")[0]).toEqual( - expect.objectContaining({ - type: "fileChunk", - data: textImport - }) - ) - }) - test("should resolve when receive exported message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const promise = wsr.import(model, blobToImport, mimeType) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(emptyExportedMessage)) - await expect(promise).resolves.toEqual( - expect.objectContaining({ - exports: { - "application/vnd.myscript.jiix": emptyJIIX - } - }) - ) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - await wsr.init(height, width) - const promise = wsr.import(model, blobToImport, mimeType) - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("resize", () => - { - const model: IModel = new Model(width, height) - let wsr: typeof WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - await expect(wsr.resize(model)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send resize message", async () => - { - expect.assertions(1) - model.height = 27 - model.width = 5 - await wsr.init(height, width) - wsr.resize(model) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const resizeMessageSent = mockServer.messages[mockServer.messages.length - 1] - const resizeMessageSentToTest = JSON.stringify({ type: "changeViewSize", height: model.height, width: model.width }) - await expect(resizeMessageSent).toEqual(resizeMessageSentToTest) - }) - test("should resolve when receive svg patch message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const promise = wsr.resize(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(svgPatchMessage)) - await expect(promise).resolves.toEqual(model) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - await wsr.init(height, width) - const promise = wsr.resize(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("convert", () => - { - const model: IModel = new Model(width, height) - let wsr: typeof WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - await expect(wsr.convert(model)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send convert message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const conversionState: TConverstionState = "DIGITAL_EDIT" - wsr.convert(model, conversionState) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const resizeMessageSent = mockServer.messages[mockServer.messages.length - 1] - const resizeMessageSentToTest = JSON.stringify({ type: "convert", conversionState }) - await expect(resizeMessageSent).toEqual(resizeMessageSentToTest) - }) - test("should resolve when receive exported message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const promise = wsr.convert(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(emptyExportedMessage)) - await expect(promise).resolves.toEqual( - expect.objectContaining({ - converts: { - "application/vnd.myscript.jiix": emptyJIIX - } - }) - ) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - await wsr.init(height, width) - const promise = wsr.convert(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("undo", () => - { - const model: IModel = new Model(width, height) - let wsr: typeof WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - await expect(wsr.undo(model)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send undo message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - wsr.undo(model) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const resizeMessageSent = mockServer.messages[mockServer.messages.length - 1] - const resizeMessageSentToTest = JSON.stringify({ type: "undo" }) - await expect(resizeMessageSent).toEqual(resizeMessageSentToTest) - }) - test("should resolve when receive exported message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const promise = wsr.undo(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(emptyExportedMessage)) - await expect(promise).resolves.toEqual( - expect.objectContaining({ - exports: { - "application/vnd.myscript.jiix": emptyJIIX - } - }) - ) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - await wsr.init(height, width) - const promise = wsr.undo(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("redo", () => - { - const model: IModel = new Model(width, height) - let wsr: typeof WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - await expect(wsr.redo(model)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send redo message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - wsr.redo(model) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const resizeMessageSent = mockServer.messages[mockServer.messages.length - 1] - const resizeMessageSentToTest = JSON.stringify({ type: "redo" }) - await expect(resizeMessageSent).toEqual(resizeMessageSentToTest) - }) - test("should resolve when receive exported message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const promise = wsr.redo(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(emptyExportedMessage)) - await expect(promise).resolves.toEqual( - expect.objectContaining({ - exports: { - "application/vnd.myscript.jiix": emptyJIIX - } - }) - ) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - await wsr.init(height, width) - const promise = wsr.redo(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("clear", () => - { - const model: IModel = new Model(width, height) - let wsr: typeof WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(async () => - { - wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - await wsr.destroy() - }) - test("should throw error if recognizer has not been initialize", async () => - { - expect.assertions(1) - await expect(wsr.clear(model)).rejects.toEqual(new Error("Recognizer must be initilized")) - }) - test("should send clear message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - wsr.clear(model) - //¯\_(ツ)_/¯ required to wait server received message - await delay(100) - const resizeMessageSent = mockServer.messages[mockServer.messages.length - 1] - const resizeMessageSentToTest = JSON.stringify({ type: "clear" }) - await expect(resizeMessageSent).toEqual(resizeMessageSentToTest) - }) - test("should resolve when receive exported message", async () => - { - expect.assertions(1) - await wsr.init(height, width) - const promise = wsr.clear(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(emptyExportedMessage)) - await expect(promise).resolves.toEqual( - expect.objectContaining({ - exports: { - "application/vnd.myscript.jiix": emptyJIIX - } - }) - ) - }) - test("should reject if receive error message", async () => - { - expect.assertions(3) - await wsr.init(height, width) - const promise = wsr.clear(model) - //¯\_(ツ)_/¯ required to wait for the instantiation of the promise of the recognizer - await delay(100) - mockServer.send(JSON.stringify(errorMessage)) - await expect(promise).rejects.toEqual(new Error(constants.Error.WRONG_CREDENTIALS)) - await expect(spyEmitError).toHaveBeenCalledTimes(1) - await expect(spyEmitError).toHaveBeenCalledWith(new Error(constants.Error.WRONG_CREDENTIALS)) - }) - }) - - describe("Connection lost", () => - { - const serverConfigToCloseTest: TServerConfiguration = { - ...DefaultServerConfiguration, - host: "close-test" - } - let mockServerForCloseTest: Server - let wsr: typeof WSRecognizer - let spyEmitError: jest.SpyInstance - beforeEach(() => - { - mockServerForCloseTest = new Server(`wss://${ serverConfigToCloseTest.host }/api/v4.0/iink/document`, {}) - mockServerForCloseTest.on("connection", (socket) => - { - socket.on("message", (message: string | Blob | ArrayBuffer | ArrayBufferView) => - { - const parsedMessage: TWebSocketEvent = JSON.parse(message as string) - switch (parsedMessage.type) { - case "newContentPackage": - socket.send(JSON.stringify(ackMessage)) - break - case "hmac": - socket.send(JSON.stringify(contentPackageDescriptionMessage)) - break - case "configuration": - socket.send(JSON.stringify(partChangeMessage)) - break - case "newContentPart": - socket.send(JSON.stringify(newPartMessage)) - break - default: - break - } - }) - }) - wsr = new WSRecognizer(serverConfigToCloseTest, DefaultRecognitionConfiguration) - spyEmitError = jest.spyOn(wsr.internalEvent, "emitError") - }) - afterEach(async () => - { - spyEmitError.mockReset() - await wsr.destroy() - }) - const closeMessageOptions = [ - { code: 1001, message: constants.Error.GOING_AWAY }, - { code: 1002, message: constants.Error.PROTOCOL_ERROR }, - { code: 1003, message: constants.Error.UNSUPPORTED_DATA }, - { code: 1006, message: constants.Error.ABNORMAL_CLOSURE }, - { code: 1007, message: constants.Error.INVALID_FRAME_PAULOAD }, - { code: 1008, message: constants.Error.POLICY_VIOLATION }, - { code: 1009, message: constants.Error.MESSAGE_TOO_BIG }, - { code: 1011, message: constants.Error.INTERNAL_ERROR }, - { code: 1012, message: constants.Error.SERVICE_RESTART }, - { code: 1013, message: constants.Error.TRY_AGAIN }, - { code: 1014, message: constants.Error.BAD_GATEWAY }, - { code: 1015, message: constants.Error.TLS_HANDSHAKE }, - { code: 42, message: constants.Error.CANT_ESTABLISH }, - ] - closeMessageOptions.forEach(async (closeEvent) => - { - test(`should emit error if the server closes the connection abnormally code == ${ closeEvent.code }`, async () => - { - expect.assertions(2) - await wsr.init(height, width) - mockServerForCloseTest.server.close({ code: closeEvent.code, reason: closeEvent.message, wasClean: false }) - expect(spyEmitError).toHaveBeenCalledTimes(1) - expect(spyEmitError).toHaveBeenCalledWith(new Error(closeEvent.message)) - }) - }) - }) - - describe("destroy", () => - { - test("should close socket", async () => - { - expect.assertions(2) - const wsr = new WSRecognizer(DefaultServerConfiguration, DefaultRecognitionConfiguration) - await wsr.init(height, width) - // 1 -> OPEN - await expect(mockServer.server.clients()[0].readyState).toEqual(1) - wsr.destroy() - // 2 -> CLOSING - await expect(mockServer.server.clients()[0].readyState).toEqual(2) - }) - }) -}) diff --git a/test/unit/06-undo-redo/00-UndoRedoContext.test.ts b/test/unit/06-undo-redo/00-UndoRedoContext.test.ts deleted file mode 100644 index 045e3d8d7..000000000 --- a/test/unit/06-undo-redo/00-UndoRedoContext.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { undoredo, model } from "../../../src/iink" - -const { UndoRedoContext } = undoredo -const { Model } = model - -describe("UndoRedoContext.ts", () => -{ - const width = 100, height = 100 - test("should instanciate UndoRedoContext", () => - { - const context = new UndoRedoContext(new Model(width, height)) - expect(context).toBeDefined() - }) - - test("should be initialize", () => - { - const model = new Model(width, height) - const context = new UndoRedoContext(model) - - expect(context.stackIndex).toStrictEqual(0) - - expect(context.stack).toHaveLength(1) - expect(context.stack[context.stackIndex]).toEqual(model) - expect(context.stack[context.stackIndex]).not.toBe(model) - - expect(context.canUndo).toStrictEqual(false) - expect(context.canUndo).toStrictEqual(false) - }) -}) diff --git a/test/unit/06-undo-redo/01-UndoRedoManager.test.ts b/test/unit/06-undo-redo/01-UndoRedoManager.test.ts deleted file mode 100644 index c8bdd0077..000000000 --- a/test/unit/06-undo-redo/01-UndoRedoManager.test.ts +++ /dev/null @@ -1,249 +0,0 @@ -import -{ - IModel, - TPointer, - TUndoRedoConfiguration -} from "../../../src/@types" -import { delay } from "../utils/helpers" -import { undoredo, model, configuration, style } from "../../../src/iink" - -const { UndoRedoContext, UndoRedoManager } = undoredo -const { Model } = model -const { DefaultConfiguration } = configuration -const { DefaultPenStyle } = style - -describe("UndoRedoManager.ts", () => -{ - const width = 100, height = 100 - test("should instanciate UndoRedoManager", () => - { - const manager = new UndoRedoManager(DefaultConfiguration["undo-redo"], new Model(width, height)) - expect(manager).toBeDefined() - }) - - test("should initialize UndoRedoContext", () => - { - const model = new Model(width, height) - const manager = new UndoRedoManager(DefaultConfiguration["undo-redo"], model) - const context = new UndoRedoContext(model) - expect(manager.context).toStrictEqual(context) - }) - - describe("addModelToStack", () => - { - const configuration: TUndoRedoConfiguration = { maxStackSize: 5 } - const model: IModel = new Model(27, 5) - const manager = new UndoRedoManager(configuration, model) - - test("should add model to stack", () => - { - const p1: TPointer = { t: 1, p: 0.5, x: 1, y: 1 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: 15, p: 0.5, x: 10, y: 1 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - expect(manager.context.stackIndex).toStrictEqual(1) - - expect(manager.context.stack).toHaveLength(2) - expect(manager.context.stack[manager.context.stackIndex]).toEqual(model) - expect(manager.context.stack[manager.context.stackIndex]).not.toBe(model) - - expect(manager.context.canUndo).toStrictEqual(true) - expect(manager.context.canRedo).toStrictEqual(false) - }) - - test("should splice end of stack if stackIndex no last", () => - { - const NB_STROKE = 4 - for (let i = 0; i < NB_STROKE; i++) { - const p1: TPointer = { t: i * 5, p: 1, x: i * 10, y: 10 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: i * 10, p: 1, x: i * 10, y: 10 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - } - expect(manager.context.stackIndex).toStrictEqual(NB_STROKE) - expect(manager.context.stack).toHaveLength(NB_STROKE + 1) - - manager.context.stackIndex = 0 - - const p1: TPointer = { t: 27, p: 0.5, x: 1989, y: 2022 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: 75, p: 1, x: 200, y: 10 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - - expect(manager.context.stackIndex).toEqual(1) - expect(manager.context.stack).toHaveLength(2) - - expect(manager.context.stack[manager.context.stackIndex]).toEqual(model) - expect(manager.context.stack[manager.context.stackIndex]).not.toBe(model) - }) - - test("should shift the first element of the stack when maxStackSize is exceeded", () => - { - const NB_STROKE = 10 - for (let i = 0; i < NB_STROKE; i++) { - const p1: TPointer = { t: i * 42, p: 0.5, x: i / 2, y: i * 20 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: i * 10, p: 1, x: i * 10, y: 10 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - } - - manager.addModelToStack(model) - expect(manager.context.stackIndex + 1).toStrictEqual(configuration.maxStackSize) - - expect(manager.context.stack).toHaveLength(configuration.maxStackSize) - expect(manager.context.stack[manager.context.stackIndex]).toEqual(model) - expect(manager.context.stack[manager.context.stackIndex]).not.toBe(model) - - expect(manager.context.canUndo).toStrictEqual(true) - expect(manager.context.canRedo).toStrictEqual(false) - }) - }) - - describe("undo", () => - { - const model: IModel = new Model(27, 5) - const manager = new UndoRedoManager(DefaultConfiguration["undo-redo"], model) - test("should get the previous model", () => - { - const p1: TPointer = { t: 1, p: 0.5, x: 1, y: 1 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: 15, p: 0.5, x: 10, y: 1 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - const previousModel = manager.undo() - expect(manager.context.stackIndex).toStrictEqual(0) - - expect(manager.context.stack).toHaveLength(2) - expect(manager.context.stack[manager.context.stackIndex]).toEqual(previousModel) - expect(manager.context.stack[manager.context.stackIndex]).not.toBe(previousModel) - - expect(manager.context.canUndo).toStrictEqual(false) - expect(manager.context.canRedo).toStrictEqual(true) - }) - }) - - describe("redo", () => - { - const model: IModel = new Model(27, 5) - const manager = new UndoRedoManager(DefaultConfiguration["undo-redo"], model) - test("should get the next model", () => - { - const p1: TPointer = { t: 1, p: 0.5, x: 1, y: 1 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: 15, p: 0.5, x: 10, y: 1 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - manager.undo() - const lastModel = manager.redo() - expect(manager.context.stackIndex).toStrictEqual(1) - - expect(manager.context.stack).toHaveLength(2) - expect(manager.context.stack[manager.context.stackIndex]).toEqual(lastModel) - expect(manager.context.stack[manager.context.stackIndex]).not.toBe(lastModel) - - expect(manager.context.canUndo).toStrictEqual(true) - expect(manager.context.canRedo).toStrictEqual(false) - }) - }) - - describe("updateModelInStack", () => - { - test("should update last model in stack", async () => - { - const model: IModel = new Model(27, 5) - const manager = new UndoRedoManager(DefaultConfiguration["undo-redo"], model) - const p1: TPointer = { t: 1, p: 0.5, x: 1, y: 1 } - // wait a few seconds and have a different model.modificationDate - await delay(100) - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: 15, p: 0.5, x: 10, y: 1 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - - model.exports = { "text/plain": "-" } - manager.updateModelInStack(model) - - expect(manager.context.stackIndex).toStrictEqual(1) - - expect(manager.context.stack).toHaveLength(2) - expect(manager.context.stack[manager.context.stackIndex]).toEqual(model) - expect(manager.context.stack[manager.context.stackIndex]).not.toBe(model) - }) - - test("should update previous model in stack", async () => - { - const model: IModel = new Model(27, 5) - const manager = new UndoRedoManager(DefaultConfiguration["undo-redo"], model) - - const p1: TPointer = { t: 1, p: 0.5, x: 1, y: 1 } - // wait a few seconds and have a different model.modificationDate - await delay(100) - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: 15, p: 0.5, x: 10, y: 1 } - model.endCurrentStroke(p2) - - const firstModel = model.getClone() - manager.addModelToStack(model) - - const p3: TPointer = { t: 100, p: 0.5, x: 1, y: 10 } - // wait a few seconds and have a different model.modificationDate - await delay(100) - model.initCurrentStroke(p3, 666, "pen", DefaultPenStyle) - - const p4: TPointer = { t: 150, p: 0.5, x: 1, y: 10 } - model.endCurrentStroke(p4) - manager.addModelToStack(model) - - firstModel.exports = { "text/plain": "-" } - manager.updateModelInStack(firstModel) - - expect(manager.context.stack.at(-2)).toMatchObject(firstModel) - expect(manager.context.stack.at(-2)).not.toBe(firstModel) - }) - }) - - test("should reset context", () => - { - const model: IModel = new Model(27, 5) - const manager = new UndoRedoManager(DefaultConfiguration["undo-redo"], model) - - const p1: TPointer = { t: 1, p: 0.5, x: 1, y: 1 } - model.initCurrentStroke(p1, 666, "pen", DefaultPenStyle) - - const p2: TPointer = { t: 15, p: 0.5, x: 10, y: 1 } - model.endCurrentStroke(p2) - - manager.addModelToStack(model) - const newModel = new Model(width, height) - manager.reset(newModel) - - expect(manager.context.stackIndex).toStrictEqual(0) - - expect(manager.context.stack).toHaveLength(1) - expect(manager.context.stack[manager.context.stackIndex]).toEqual(newModel) - expect(manager.context.stack[manager.context.stackIndex]).not.toBe(newModel) - - expect(manager.context.canUndo).toStrictEqual(false) - expect(manager.context.canRedo).toStrictEqual(false) - }) - -}) diff --git a/test/unit/07-behaviors/00-RestBehaviors.test.ts b/test/unit/07-behaviors/00-RestBehaviors.test.ts deleted file mode 100644 index 9ca1154c5..000000000 --- a/test/unit/07-behaviors/00-RestBehaviors.test.ts +++ /dev/null @@ -1,213 +0,0 @@ - -import { delay } from "../utils/helpers" -import { TBehaviorOptions, TConfiguration, IModel, TPointer } from "../../../src/@types" -import { behaviors, model, configuration, style } from "../../../src/iink" - -describe("RestBehaviors.ts", () => -{ - const { RestBehaviors } = behaviors - const { Model } = model - const { DefaultConfiguration } = configuration - const { DefaultPenStyle } = style - - const height = 100, width = 100 - const DefaultBehaviorsOptions: TBehaviorOptions = { - configuration: DefaultConfiguration - } - - test("should instanciate RestBehaviors", () => - { - const rb = new RestBehaviors(DefaultBehaviorsOptions) - expect(rb).toBeDefined() - }) - - test("should init", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - rb.grabber.attach = jest.fn() - rb.renderer.init = jest.fn() - await rb.init(wrapperHTML) - expect(rb.grabber.attach).toBeCalledTimes(1) - expect(rb.grabber.attach).toBeCalledWith(wrapperHTML) - expect(rb.renderer.init).toBeCalledTimes(1) - expect(rb.renderer.init).toBeCalledWith(wrapperHTML) - }) - - test("should call renderer on drawCurrentStroke", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.renderer.drawPendingStroke = jest.fn() - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 1, x: 100, y: 1 } - rb.model.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - rb.model.endCurrentStroke(p2) - rb.drawCurrentStroke() - expect(rb.renderer.drawPendingStroke).toBeCalledTimes(1) - expect(rb.renderer.drawPendingStroke).toBeCalledWith(rb.model.currentStroke) - }) - - describe("updateModelRendering", () => - { - test("should call renderer.drawModel", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.renderer.drawModel = jest.fn() - rb.recognizer.export = jest.fn(m => Promise.resolve(m)) - rb.updateModelRendering() - expect(rb.renderer.drawModel).toBeCalledTimes(1) - }) - - test("should call recognizer.export", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.renderer.drawModel = jest.fn() - rb.recognizer.export = jest.fn(m => Promise.resolve(m)) - await rb.updateModelRendering() - await delay(DefaultConfiguration.triggers.exportContentDelay) - expect(rb.recognizer.export).toBeCalledTimes(1) - }) - - test("should reject if recognizer.export in error", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.renderer.drawModel = jest.fn() - rb.recognizer.export = jest.fn(() => Promise.reject("pouet")) - expect(rb.updateModelRendering()).rejects.toEqual("pouet") - }) - - test("should not call recognizer.export when exportContent = DEMAND", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const configuration: TConfiguration = JSON.parse(JSON.stringify(DefaultConfiguration)) - configuration.triggers.exportContent = "DEMAND" - const rb = new RestBehaviors({ configuration }) - await rb.init(wrapperHTML) - rb.renderer.drawModel = jest.fn() - rb.recognizer.export = jest.fn(m => Promise.resolve(m)) - await rb.updateModelRendering() - await delay(DefaultConfiguration.triggers.exportContentDelay) - expect(rb.recognizer.export).toBeCalledTimes(0) - }) - }) - - test("should export", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.recognizer.export = jest.fn(m => Promise.resolve(m)) - rb.export() - await delay(DefaultConfiguration.triggers.exportContentDelay) - expect(rb.recognizer.export).toBeCalledTimes(1) - }) - - test("should convert", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.recognizer.convert = jest.fn(m => Promise.resolve(m)) - rb.convert("DIGITAL_EDIT", ["mime-type"]) - await delay(DefaultConfiguration.triggers.exportContentDelay) - expect(rb.recognizer.convert).toBeCalledTimes(1) - }) - - test("should resize", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - rb.renderer.resize = jest.fn() - rb.recognizer.resize = jest.fn(m => Promise.resolve(m)) - await rb.init(wrapperHTML) - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 1, x: 100, y: 1 } - rb.model.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - rb.model.endCurrentStroke(p2) - await rb.resize(1, 2) - expect(rb.renderer.resize).toBeCalledTimes(1) - expect(rb.recognizer.resize).toBeCalledTimes(1) - }) - - test("should not call recognizer on resize if no strokes", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.renderer.resize = jest.fn() - rb.recognizer.resize = jest.fn(m => Promise.resolve(m)) - await rb.resize(1, 2) - expect(rb.renderer.resize).toBeCalledTimes(1) - expect(rb.recognizer.resize).toBeCalledTimes(0) - }) - - test("should undo", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - const model1 = new Model() - rb.recognizer.export = jest.fn(m => Promise.resolve(m)) - rb.renderer.drawModel = jest.fn() - rb.undoRedoManager.undo = jest.fn(() => model1) - await await rb.updateModelRendering() - const undoModel = await rb.undo() - expect(undoModel).toEqual(model1) - }) - - test("should redo", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - const model2: IModel = new Model(width, height) - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 1, x: 100, y: 1 } - model2.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - model2.endCurrentStroke(p2) - rb.recognizer.export = jest.fn(m => Promise.resolve(m)) - rb.renderer.drawModel = jest.fn() - rb.undoRedoManager.redo = jest.fn(() => model2) - const redoModel = await rb.redo() - expect(redoModel.creationTime).toEqual(model2.creationTime) - }) - - test("should clear", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.renderer.drawModel = jest.fn() - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - const p2: TPointer = { t: 10, p: 1, x: 100, y: 1 } - rb.model.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - rb.model.endCurrentStroke(p2) - expect(rb.model.rawStrokes.length).toBeGreaterThan(0) - const clearedModel = await rb.clear() - expect(rb.model.rawStrokes).toHaveLength(0) - expect(clearedModel).toBe(rb.model) - }) - - test("should destroy", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const rb = new RestBehaviors(DefaultBehaviorsOptions) - await rb.init(wrapperHTML) - rb.grabber.detach = jest.fn() - rb.renderer.destroy = jest.fn() - rb.undoRedoManager.reset = jest.fn(m => m) - rb.destroy() - await delay(DefaultConfiguration.triggers.exportContentDelay) - expect(rb.grabber.detach).toBeCalledTimes(1) - expect(rb.renderer.destroy).toBeCalledTimes(1) - }) - -}) diff --git a/test/unit/07-behaviors/01-WSBehaviors.test.ts b/test/unit/07-behaviors/01-WSBehaviors.test.ts deleted file mode 100644 index db9ba9a80..000000000 --- a/test/unit/07-behaviors/01-WSBehaviors.test.ts +++ /dev/null @@ -1,805 +0,0 @@ -import { delay } from "../utils/helpers" -import -{ - TBehaviorOptions, - TConfiguration, - TExport, - TStroke, - TWebSocketSVGPatchEvent, - TPointer, - TPenStyle, - TTheme -} from "../../../src/@types" - -import { behaviors, event, model, configuration, style } from "../../../src/iink" - -describe("WSBehaviors.ts", () => -{ - const { WSBehaviors } = behaviors - const { InternalEvent } = event - const { Model } = model - const { DefaultConfiguration } = configuration - const { DefaultPenStyle } = style - - const height = 100, width = 100 - const DefaultBehaviorsOptions: TBehaviorOptions = { - configuration: DefaultConfiguration - } - - test("should instanciate WSBehaviors", () => - { - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - expect(wsb).toBeDefined() - }) - - test("should have internalEvent property", () => - { - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - expect(wsb.internalEvent).toBe(InternalEvent.getInstance()) - expect(wsb.internalEvent).toEqual(InternalEvent.getInstance()) - }) - - describe("init", () => - { - test("should init grabber, renderer & recognizer & context", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.init(wrapperHTML) - await expect(wsb.context).toMatchObject({ - canRedo: false, - canUndo: false, - empty: true, - stackIndex: 0, - possibleUndoCount: 0 - }) - await expect(wsb.grabber.attach).toBeCalledTimes(1) - await expect(wsb.grabber.attach).toBeCalledWith(wrapperHTML) - await expect(wsb.renderer.init).toBeCalledTimes(1) - await expect(wsb.renderer.init).toBeCalledWith(wrapperHTML) - await expect(wsb.recognizer.init).toBeCalledTimes(1) - }) - - test("should resolve init when recognizer.init is resolve", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - await wsb.init(wrapperHTML) - await expect(wsb.recognizer.init).toBeCalledTimes(1) - }) - - test("should reject init when recognizer.init is reject", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.reject("pouet")) - await expect(wsb.init(wrapperHTML)).rejects.toEqual("pouet") - }) - }) - - describe("drawCurrentStroke", () => - { - test("should call renderer.drawPendingStroke", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.renderer.drawPendingStroke = jest.fn() - await wsb.init(wrapperHTML) - const p1: TPointer = { t: 1, p: 1, x: 1, y: 1 } - wsb.model.initCurrentStroke(p1, 1, "pen", DefaultPenStyle) - wsb.drawCurrentStroke() - await expect(wsb.renderer.drawPendingStroke).toBeCalledTimes(1) - await expect(wsb.renderer.drawPendingStroke).toBeCalledWith(wsb.model.currentStroke) - }) - test("should not call renderer.drawPendingStroke if currentStroke is null", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.renderer.drawPendingStroke = jest.fn() - await wsb.init(wrapperHTML) - wsb.drawCurrentStroke() - await expect(wsb.renderer.drawPendingStroke).toBeCalledTimes(0) - }) - }) - - describe("updateModelRendering", () => - { - test("should call recognizer.addStrokes", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.renderer.clearErasingStrokes = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.addStrokes = jest.fn(() => Promise.resolve({} as TExport)) - await wsb.init(wrapperHTML) - await wsb.updateModelRendering() - await expect(wsb.recognizer.addStrokes).toBeCalledTimes(1) - }) - test("should call renderer.clearErasingStrokes", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.renderer.clearErasingStrokes = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.addStrokes = jest.fn(() => Promise.resolve({} as TExport)) - await wsb.init(wrapperHTML) - await wsb.updateModelRendering() - await expect(wsb.renderer.clearErasingStrokes).toBeCalledTimes(1) - }) - test("should not call recognizer.addStrokes when exportContent = DEMAND", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const configuration: TConfiguration = JSON.parse(JSON.stringify(DefaultConfiguration)) - configuration.triggers.exportContent = "DEMAND" - const wsb = new WSBehaviors({ configuration }) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.renderer.clearPendingStroke = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.addStrokes = jest.fn(() => Promise.resolve({} as TExport)) - await wsb.init(wrapperHTML) - await wsb.updateModelRendering() - await expect(wsb.recognizer.addStrokes).toBeCalledTimes(0) - }) - test("should reject if recognizer.addStrokes rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.renderer.clearErasingStrokes = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.addStrokes = jest.fn(() => Promise.reject("poney")) - await wsb.init(wrapperHTML) - await expect(wsb.updateModelRendering()).rejects.toEqual("poney") - }) - }) - - describe("export", () => - { - test("should call recognizer.export", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.export = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - await wsb.export() - await expect(wsb.recognizer.export).toBeCalledTimes(1) - }) - test("should reject if recognizer.export rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.renderer.clearPendingStroke = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.export = jest.fn(() => Promise.reject("poney")) - await wsb.init(wrapperHTML) - await expect(wsb.export()).rejects.toEqual("poney") - }) - test("should call recognizer.addStrokes when exportContent = DEMAND", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const configuration: TConfiguration = JSON.parse(JSON.stringify(DefaultConfiguration)) - configuration.triggers.exportContent = "DEMAND" - const wsb = new WSBehaviors({ configuration }) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.addStrokes = jest.fn(() => Promise.resolve({} as TExport)) - wsb.recognizer.export = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - await wsb.export() - await expect(wsb.recognizer.addStrokes).toBeCalledTimes(1) - await expect(wsb.recognizer.export).toBeCalledTimes(0) - }) - test("should reject if recognizer.addStrokes rejected when exportContent = DEMAND", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const configuration: TConfiguration = JSON.parse(JSON.stringify(DefaultConfiguration)) - configuration.triggers.exportContent = "DEMAND" - const wsb = new WSBehaviors({ configuration }) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.renderer.clearPendingStroke = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.addStrokes = jest.fn(() => Promise.reject("poney")) - await wsb.init(wrapperHTML) - await expect(wsb.export()).rejects.toEqual("poney") - }) - }) - - describe("convert", () => - { - test("should call recognizer.convert", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.convert = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - await wsb.convert() - await expect(wsb.recognizer.convert).toBeCalledTimes(1) - }) - }) - - describe("import", () => - { - test("should call recognizer.import", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.import = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - const mimeType = "text/plain" - const textImport = "winter is comming" - const blob = new Blob([textImport], { type: mimeType }) - await wsb.import(blob, mimeType) - await expect(wsb.recognizer.import).toBeCalledTimes(1) - }) - test("should return model form recognizer when recognizer emit EXPORTED", async () => - { - const exportExpected: TExport = { "test/plain": "cofveve" } - const wrapperHTML: HTMLElement = document.createElement("div") - const model = new Model(width, height) - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.import = jest.fn(() => - { - model.exports = exportExpected - return Promise.resolve(model) - }) - await wsb.init(wrapperHTML) - const mimeType = "text/plain" - const textImport = "winter is comming" - const blob = new Blob([textImport], { type: mimeType }) - const modelReceive = await wsb.import(blob, mimeType) - await await expect(modelReceive.exports).toBe(exportExpected) - }) - }) - - describe("importPointsEvent", () => - { - test("should call recognizer.importPointsEvents", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn() - wsb.recognizer.importPointEvents = jest.fn() - await wsb.init(wrapperHTML) - const tstrokeToImport: TStroke[] = JSON.parse(`[{ - "pointerType": "PEN", - "pointerId": 1, - "x": [128, 125, 122, 119, 118, 117, 116, 117, 119, 123, 127, 135, 139, 141, 144, 144, 143, 142, 141, 142], - "y": [83, 91, 99, 107, 114, 121, 125, 120, 112, 101, 90, 76, 70, 66, 76, 88, 101, 111, 118, 123], - "t": [1516190046205, 1516190046247, 1516190046264, 1516190046280, 1516190046297, 1516190046314, 1516190046330, 1516190046380, 1516190046397, 1516190046413, 1516190046430, 1516190046447, 1516190046463, 1516190046480, 1516190046547, 1516190046563, 1516190046581, 1516190046597, 1516190046614, 1516190046630], - "p": [0.5, 0.7076987214308235, 0.8060672826037246, 0.8060672826037246, 0.785875329883628, 0.785875329883628, 0.7185264889882718, 0.7461846839143089, 0.8024894359144054, 0.6578786777951477, 0.6578786777951477, 0.5984465727129564, 0.7880849230110567, 0.7292125754002905, 0.6768853685004259, 0.6535898384862245, 0.6389126863152722, 0.6829846120277299, 0.785875329883628, 0.7461846839143089] - },{ - "pointerType": "PEN", - "pointerId": 1, - "x": [117, 122, 128, 139, 146], - "y": [105, 105, 106, 107, 106], - "t": [1516190046870, 1516190046930, 1516190046947, 1516190046963, 1516190046980], - "p": [0.5, 0.7763932022500211, 0.7681880209236327, 0.6676543814462531, 0.785875329883628] - }]`) - await wsb.importPointEvents(tstrokeToImport) - expect(wsb.recognizer.importPointEvents).toBeCalledTimes(1) - expect(wsb.recognizer.importPointEvents).toBeCalledWith(tstrokeToImport) - }) - }) - - describe("resize", () => - { - test("should call renderer.resize", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.renderer.resize = jest.fn() - wsb.recognizer.resize = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - await wsb.resize(1, 2) - await expect(wsb.renderer.resize).toBeCalledTimes(1) - }) - test("should reject if renderer.resize rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.renderer.resize = jest.fn() - wsb.recognizer.resize = jest.fn(() => Promise.reject("pony")) - await wsb.init(wrapperHTML) - await expect(wsb.resize(1, 2)).rejects.toEqual("pony") - }) - test("should call recognizer.resize after resizeTriggerDelay", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.renderer.resize = jest.fn() - wsb.recognizer.resize = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - wsb.resize(1, 2) - await delay(DefaultConfiguration.triggers.resizeTriggerDelay) - await expect(wsb.recognizer.resize).toBeCalledTimes(1) - }) - }) - - describe("undo", () => - { - test("should call recognizer.undo", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.undo = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - wsb.context.canUndo = true - wsb.context.stackIndex = 1 - wsb.context.stack.push(new Model(100, 200)) - await wsb.undo() - await expect(wsb.recognizer.undo).toBeCalledTimes(1) - }) - test("should return previous model", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.undo = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - expect(wsb.model).toEqual(wsb.context.stack[0]) - wsb.context.canUndo = true - wsb.context.stackIndex = 1 - wsb.context.stack.push(new Model(100, 200)) - await expect(wsb.undo()).resolves.toEqual(wsb.context.stack[0]) - }) - test("should throw error if context.canUndo = false", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.undo = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - await expect(wsb.undo()).rejects.toEqual(new Error("Undo not allowed")) - }) - }) - - describe("redo", () => - { - test("should call recognizer.redo", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.redo = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - wsb.context.canRedo = true - wsb.context.stackIndex = 0 - wsb.context.stack.push(new Model(100, 200)) - await wsb.redo() - await expect(wsb.recognizer.redo).toBeCalledTimes(1) - }) - test("should return next model", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.redo = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - wsb.context.canRedo = true - wsb.context.stackIndex = 0 - const nextModel = new Model(100, 200) - wsb.context.stack.push(nextModel) - await expect(wsb.redo()).resolves.toEqual(wsb.context.stack[1]) - }) - test("should reject if recognizer.redo rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.redo = jest.fn(() => Promise.reject("pony")) - await wsb.init(wrapperHTML) - wsb.context.canRedo = true - wsb.context.stackIndex = 0 - wsb.context.stack.push(new Model(100, 200)) - wsb.context.stack.push(new Model(42, 12)) - await expect(wsb.redo()).rejects.toEqual("pony") - }) - test("should throw error if context.canRedo = false", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.redo = jest.fn(m => Promise.resolve(m)) - await wsb.init(wrapperHTML) - await expect(wsb.redo()).rejects.toEqual(new Error("Redo not allowed")) - }) - }) - - describe("clear", () => - { - test("should call recognizer.clear", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.clear = jest.fn() - await wsb.init(wrapperHTML) - await wsb.clear() - await expect(wsb.recognizer.clear).toBeCalledTimes(1) - }) - }) - - describe("destroy", () => - { - test("should call grabber.detach", async () => - { - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.detach = jest.fn() - wsb.renderer.destroy = jest.fn() - wsb.recognizer.close = jest.fn() - wsb.destroy() - await expect(wsb.grabber.detach).toBeCalledTimes(1) - }) - - test("should call renderer.destroy", async () => - { - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.detach = jest.fn() - wsb.renderer.destroy = jest.fn() - wsb.recognizer.close = jest.fn() - wsb.destroy() - await expect(wsb.renderer.destroy).toBeCalledTimes(1) - }) - - test("should call recognizer.destroy", async () => - { - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.detach = jest.fn() - wsb.renderer.destroy = jest.fn() - wsb.recognizer.destroy = jest.fn() - wsb.destroy() - await expect(wsb.recognizer.destroy).toBeCalledTimes(1) - }) - - }) - - describe("Event", () => - { - test("should updatesLayer when recognizer emit SVG_PATCH", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.renderer.updatesLayer = jest.fn() - await wsb.init(wrapperHTML) - const svgPatch: TWebSocketSVGPatchEvent = { - type: "REPLACE_ALL", - layer: "MODEL", - updates: [] - } - wsb.recognizer.internalEvent.emitSVGPatch(svgPatch) - await expect(wsb.renderer.updatesLayer).toBeCalledTimes(1) - await expect(wsb.renderer.updatesLayer).toBeCalledWith(svgPatch.layer, svgPatch.updates) - }) - }) - - describe("Style", () => - { - test("should call styleManager.setPenStyle & recognizer.setPenStyle on init", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const customPenStyle: TPenStyle = { color: "#d1d1d1" } - const customBehaviorsOptions: TBehaviorOptions = JSON.parse(JSON.stringify(DefaultBehaviorsOptions)) - customBehaviorsOptions.penStyle = customPenStyle - const wsb = new WSBehaviors(customBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.styleManager.setPenStyle = jest.fn() - await wsb.init(wrapperHTML) - await expect(wsb.styleManager.setPenStyle).toBeCalledTimes(1) - await expect(wsb.styleManager.setPenStyle).toBeCalledWith(customPenStyle) - await expect(wsb.recognizer.setPenStyle).toBeCalledTimes(1) - await expect(wsb.recognizer.setPenStyle).toBeCalledWith(customPenStyle) - }) - test("should change PenStyle", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.styleManager.setPenStyle = jest.fn() - await wsb.init(wrapperHTML) - const customPenStyle: TPenStyle = { color: "#d1d1d1" } - await wsb.setPenStyle(customPenStyle) - await expect(wsb.styleManager.setPenStyle).toBeCalledTimes(2) - await expect(wsb.styleManager.setPenStyle).toHaveBeenNthCalledWith(2, customPenStyle) - await expect(wsb.recognizer.setPenStyle).toBeCalledTimes(2) - await expect(wsb.recognizer.setPenStyle).toHaveBeenNthCalledWith(2, wsb.styleManager.penStyle) - }) - test("should call styleManager.setTheme & recognizer.setTheme on init", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const customBehaviorsOptions: TBehaviorOptions = JSON.parse(JSON.stringify(DefaultBehaviorsOptions)) - const customTheme: TTheme = { - ink: { - width: 42, - color: "#2E7D32", - "-myscript-pen-width": 2, - "-myscript-pen-fill-style": "purple", - "-myscript-pen-fill-color": "#FFFFFF00" - }, - ".math": { - "font-family": "STIXGeneral" - }, - ".math-solved": { - "font-family": "STIXGeneral", - color: "blue" - }, - ".text": { - "font-family": "Rubik Distressed", - "font-size": 10 - } - } - customBehaviorsOptions.theme = customTheme - const wsb = new WSBehaviors(customBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.styleManager.setTheme = jest.fn() - await wsb.init(wrapperHTML) - await expect(wsb.styleManager.setTheme).toBeCalledTimes(1) - await expect(wsb.styleManager.setTheme).toBeCalledWith(customTheme) - await expect(wsb.recognizer.setTheme).toBeCalledTimes(1) - await expect(wsb.recognizer.setTheme).toBeCalledWith(wsb.styleManager.theme) - }) - test("should change Theme", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.styleManager.setTheme = jest.fn() - await wsb.init(wrapperHTML) - await expect(wsb.recognizer.setTheme).toBeCalledTimes(1) - await expect(wsb.styleManager.setTheme).toBeCalledTimes(1) - const customTheme: TTheme = { - ink: { - width: 42, - color: "#2E7D32", - "-myscript-pen-width": 2, - "-myscript-pen-fill-style": "purple", - "-myscript-pen-fill-color": "#FFFFFF00" - }, - ".math": { - "font-family": "STIXGeneral" - }, - ".math-solved": { - "font-family": "STIXGeneral", - color: "blue" - }, - ".text": { - "font-family": "Rubik Distressed", - "font-size": 10 - } - } - await wsb.setTheme(customTheme) - await expect(wsb.styleManager.setTheme).toBeCalledTimes(2) - await expect(wsb.styleManager.setTheme).toHaveBeenNthCalledWith(2, customTheme) - await expect(wsb.recognizer.setTheme).toBeCalledTimes(2) - await expect(wsb.recognizer.setTheme).toHaveBeenNthCalledWith(2, wsb.styleManager.theme) - }) - test("should change PenStyleClasses", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const wsb = new WSBehaviors(DefaultBehaviorsOptions) - wsb.grabber.attach = jest.fn() - wsb.renderer.init = jest.fn() - wsb.recognizer.send = jest.fn() - wsb.recognizer.init = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyle = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.recognizer.setTheme = jest.fn(() => Promise.resolve()) - wsb.recognizer.setPenStyleClasses = jest.fn(() => Promise.resolve()) - wsb.styleManager.setPenStyleClasses = jest.fn() - await wsb.init(wrapperHTML) - await expect(wsb.recognizer.setPenStyleClasses).toBeCalledTimes(1) - await expect(wsb.styleManager.setPenStyleClasses).toBeCalledTimes(1) - await wsb.setPenStyleClasses("pouet") - await expect(wsb.styleManager.setPenStyleClasses).toBeCalledTimes(2) - await expect(wsb.styleManager.setPenStyleClasses).toHaveBeenNthCalledWith(2, "pouet") - await expect(wsb.recognizer.setPenStyleClasses).toBeCalledTimes(2) - await expect(wsb.recognizer.setPenStyleClasses).toHaveBeenNthCalledWith(2, wsb.styleManager.penStyleClasses) - }) - }) - -}) diff --git a/test/unit/08-smart-guide/00-SmartGuide.test.ts b/test/unit/08-smart-guide/00-SmartGuide.test.ts deleted file mode 100644 index 24d2ef0e2..000000000 --- a/test/unit/08-smart-guide/00-SmartGuide.test.ts +++ /dev/null @@ -1,242 +0,0 @@ -import { delay } from "../utils/helpers" -import { LeftClickEventFake } from "../utils/PointerEventFake" -import { TRenderingConfiguration, TMarginConfiguration } from "../../../src/@types" -import { smartguide, configuration, event } from "../../../src/iink" - -describe("SmartGuide.ts", () => -{ - const { SmartGuide } = smartguide - const { DefaultRenderingConfiguration } = configuration - const { InternalEvent } = event - const margin: TMarginConfiguration = { - bottom: 100, - top: 20, - left: 30, - right: 40 - } - test("should instanciate SmartGuide", () => - { - const sm = new SmartGuide() - expect(sm).toBeDefined() - }) - - test("should have internalEvent property", () => - { - const sm = new SmartGuide() - expect(sm.internalEvent).toBe(InternalEvent.getInstance()) - }) - - describe("Initilize", () => - { - const domElement = document.createElement("div") - const sm = new SmartGuide() - sm.init(domElement, margin, DefaultRenderingConfiguration) - - test("should init wrapper", () => - { - const smartguide = domElement.querySelector(".smartguide") as HTMLDivElement - expect(smartguide).toBeDefined() - expect(smartguide.id).toBe(`smartguide-${ sm.uuid }`) - }) - test("should init prompter", () => - { - const prompter = domElement.querySelector(".prompter-container") as HTMLDivElement - expect(prompter).toBeDefined() - expect(prompter.id).toBe(`prompter-container-${ sm.uuid }`) - - const prompterText = domElement.querySelector(".prompter-text") as HTMLDivElement - expect(prompterText).toBeDefined() - expect(prompterText.id).toBe(`prompter-text-${ sm.uuid }`) - }) - test("should init ellipsis", () => - { - const wrapper = domElement.querySelector(".ellipsis") as HTMLDivElement - expect(wrapper).toBeDefined() - expect(wrapper.id).toBe(`ellipsis-${ sm.uuid }`) - }) - test("should init ellipsis", () => - { - const wrapper = domElement.querySelector(".tag-icon") as HTMLDivElement - expect(wrapper).toBeDefined() - expect(wrapper.id).toBe(`tag-icon-${ sm.uuid }`) - }) - test("should init candidates", () => - { - const wrapper = domElement.querySelector(".candidates") as HTMLDivElement - expect(wrapper).toBeDefined() - expect(wrapper.id).toBe(`candidates-${ sm.uuid }`) - }) - test("should init more-menu", () => - { - const wrapper = domElement.querySelector(".more-menu") as HTMLDivElement - expect(wrapper).toBeDefined() - expect(wrapper.id).toBe(`more-menu-${ sm.uuid }`) - - const copyBtn = domElement.querySelector(`#copy-${ sm.uuid }`) as HTMLDivElement - expect(copyBtn).toBeDefined() - expect(copyBtn.classList).toContain("options-label-button") - - const deleteBtn = domElement.querySelector(`#delete-${ sm.uuid }`) as HTMLDivElement - expect(deleteBtn).toBeDefined() - expect(deleteBtn.classList).toContain("options-label-button") - }) - }) - - describe("Smartguide visibility", () => - { - test("should be displayed on initialization", () => - { - const domElement = document.createElement("div") - const sm = new SmartGuide() - sm.init(domElement, margin, DefaultRenderingConfiguration) - const smartguide = domElement.querySelector(".smartguide") as HTMLDivElement - expect(smartguide.classList).not.toContain("smartguide-out") - expect(smartguide.classList).toContain("smartguide-in") - }) - test("should be hide after fadeOut delay", async () => - { - const domElement = document.createElement("div") - const sm = new SmartGuide() - const renderingConfiguration: TRenderingConfiguration = { - ...DefaultRenderingConfiguration - } - renderingConfiguration.smartGuide.fadeOut.enable = true - renderingConfiguration.smartGuide.fadeOut.duration = 100 - sm.init(domElement, margin, renderingConfiguration) - const smartguide = domElement.querySelector(".smartguide") as HTMLDivElement - expect(smartguide.classList).not.toContain("smartguide-out") - expect(smartguide.classList).toContain("smartguide-in") - - await delay(renderingConfiguration.smartGuide.fadeOut.duration + 10) - expect(smartguide.classList).toContain("smartguide-out") - expect(smartguide.classList).not.toContain("smartguide-in") - }) - }) - - describe("Menu visibility", () => - { - const domElement = document.createElement("div") - const sm = new SmartGuide() - sm.init(domElement, margin, DefaultRenderingConfiguration) - - const pointerDownEvt = new LeftClickEventFake("pointerdown", { - pointerType: "pen", - clientX: 10, - clientY: 10, - pressure: 1 - }) - test("should hidden by default", () => - { - const menu = domElement.querySelector(".more-menu") as HTMLDivElement - expect(menu.classList).toContain("close") - expect(menu.classList).not.toContain("open") - }) - test("should open menu", () => - { - const ellispis = domElement.querySelector(".ellipsis") as HTMLDivElement - ellispis.dispatchEvent(pointerDownEvt) - const menu = domElement.querySelector(".more-menu") as HTMLDivElement - expect(menu.classList).not.toContain("close") - expect(menu.classList).toContain("open") - }) - test("should close menu", () => - { - const ellispis = domElement.querySelector(".ellipsis") as HTMLDivElement - ellispis.dispatchEvent(pointerDownEvt) - const menu = domElement.querySelector(".more-menu") as HTMLDivElement - expect(menu.classList).toContain("close") - expect(menu.classList).not.toContain("open") - }) - }) - - describe("Menu actions", () => - { - const domElement = document.createElement("div") - const sm = new SmartGuide() - sm.internalEvent.emitConvert = jest.fn() - sm.internalEvent.emitClear = jest.fn() - sm.init(domElement, margin, DefaultRenderingConfiguration) - - const pointerDownEvt = new LeftClickEventFake("pointerdown", { - pointerType: "pen", - clientX: 10, - clientY: 10, - pressure: 1 - }) - const ellispis = domElement.querySelector(".ellipsis") as HTMLDivElement - ellispis.dispatchEvent(pointerDownEvt) - test("should emit CONVERT", () => - { - const btn = domElement.querySelector(`#convert-${ sm.uuid }`) as HTMLDivElement - btn.dispatchEvent(pointerDownEvt) - expect(sm.internalEvent.emitConvert).toBeCalledTimes(1) - }) - test.skip("should COPY", () => - { - // TODO - }) - test("should emit CLEAR", () => - { - const btn = domElement.querySelector(`#delete-${ sm.uuid }`) as HTMLDivElement - btn.dispatchEvent(pointerDownEvt) - expect(sm.internalEvent.emitClear).toBeCalledTimes(1) - }) - }) - - describe("Display", () => - { - const domElement = document.createElement("div") - const sm = new SmartGuide() - sm.init(domElement, margin, DefaultRenderingConfiguration) - const jiix = { - "type": "Text", - "label": "hello how", - "words": [ - { - "id": "1", - "label": "hello", - "candidates": ["hello", "helle", "hellor", "hells", "hellon"] - }, - { - "label": " " - }, - { - "id": "2", - "label": "how", - "candidates": ["how", "hou", "hore", "hon", "hor"] - } - ], - "version": "3", - "id": "MainBlock" - } - - test("should display jiix label into prompter-text", () => - { - sm.update(jiix) - const prompterText = domElement.querySelector(".prompter-text") as HTMLDivElement - expect(prompterText).toBeDefined() - expect(prompterText.textContent).toContain(jiix.words[0].label) - expect(prompterText.textContent).toContain(jiix.words[2].label) - expect(prompterText.children.length).toBeGreaterThan(0) - const candidates = domElement.querySelector(".candidates") as HTMLDivElement - expect(candidates.children).toHaveLength(0) - }) - - test.skip("should open candidates", () => - { - // cannot be tested here, you have to simulate an event with a target different from the prompter - const prompterTextElement = domElement.querySelector(".prompter-text") as HTMLDivElement - const pointerDownEvt = new LeftClickEventFake("pointerdown", { - pointerType: "pen", - clientX: 10, - clientY: 10, - pressure: 1, - }) - - prompterTextElement.dispatchEvent(pointerDownEvt) - const candidates = domElement.querySelector(".candidates") as HTMLDivElement - expect(candidates.children).toHaveLength(jiix.words.length) - }) - }) - -}) diff --git a/test/unit/09-event/00-PublicEvent.test.ts b/test/unit/09-event/00-PublicEvent.test.ts deleted file mode 100644 index 6f5ff87a2..000000000 --- a/test/unit/09-event/00-PublicEvent.test.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { - TExport, - TJIIXExport -} from '../../../src/@types' -import { event, constants, model } from "../../../src/iink" - -describe('PublicEvent.ts', () => -{ - const { PublicEvent } = event - const { Model } = model - const publicEvent = PublicEvent.getInstance() - - test('should have singleton', () => - { - const publicEvent1 = PublicEvent.getInstance() - const publicEvent2 = PublicEvent.getInstance() - expect(publicEvent1).toBe(publicEvent2) - expect(publicEvent1).toEqual(publicEvent2) - expect(publicEvent1).toStrictEqual(publicEvent2) - }) - - test('should emit & listen LOADED', () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(constants.EventType.LOADED, testFunction) - publicEvent.emitLoaded() - expect(testFunction).toBeCalledTimes(1) - }) - - test('should emit & listen EXPORTED', () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(constants.EventType.EXPORTED, testFunction) - const exports:TExport = { 'text/plain': 'tatapouet' } - publicEvent.emitExported(exports) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith( - expect.objectContaining({ - detail: exports - }), - ) - }) - - test('should emit & listen CHANGED', () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(constants.EventType.CHANGED, testFunction) - const undoRedoContext = { - canUndo: true, - canRedo: false, - canClear: true, - stackIndex: 10, - empty: false, - possibleUndoCount: 10, - stack: [] - } - publicEvent.emitChanged(undoRedoContext) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith( - expect.objectContaining({ - detail: undoRedoContext - }), - ) - }) - - test('should emit & listen IDLE', () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(constants.EventType.IDLE, testFunction) - publicEvent.emitIdle(true) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith( - expect.objectContaining({ - detail: true - }), - ) - }) - - test('should emit & listen CLEARED', () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(constants.EventType.CLEARED, testFunction) - const model = new Model(100, 50) - publicEvent.emitCleared(model) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith( - expect.objectContaining({ - detail: model - }), - ) - }) - - test('should emit & listen CONVERTED', () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(constants.EventType.CONVERTED, testFunction) - const exports: TExport = { 'text/plain': 'tatapouet' } - publicEvent.emitConverted(exports) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith( - expect.objectContaining({ - detail: exports - }), - ) - }) - - test('should emit & listen IMPORTED', () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(constants.EventType.IMPORTED, testFunction) - const jiix: TJIIXExport = { - "type": "Text", - "label": "hello", - "words": [ - { - "id": "1", - "label": "hello", - "candidates": [ "hello", "helle", "hellor", "hells", "hellon" ] - } - ], - "version": "3", - "id": "MainBlock" - } - const exports: TExport = { - "application/vnd.myscript.jiix": jiix - } - publicEvent.emitImported(exports) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith( - expect.objectContaining({ - detail: exports - }), - ) - }) - -}) diff --git a/test/unit/09-event/01-InternalEvent.test.ts b/test/unit/09-event/01-InternalEvent.test.ts deleted file mode 100644 index 3e7603164..000000000 --- a/test/unit/09-event/01-InternalEvent.test.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { TWebSocketSVGPatchEvent } from "../../../src/@types" -import { event } from "../../../src/iink" - -describe("InternalEvent.ts", () => -{ - const { InternalEvent } = event - const internalEvent = InternalEvent.getInstance() - - test("should have singleton", () => - { - const iEvent1 = InternalEvent.getInstance() - const iEvent2 = InternalEvent.getInstance() - expect(iEvent1).toBe(iEvent2) - expect(iEvent1).toEqual(iEvent2) - expect(iEvent1).toStrictEqual(iEvent2) - }) - - test("should execute callback on emitSVGPatch", () => - { - const testFunction = jest.fn() - internalEvent.addSVGPatchListener(testFunction) - const svgPatch: TWebSocketSVGPatchEvent = { - type: "svgPatch", - layer: "MODEL", - updates: [] - } - internalEvent.emitSVGPatch(svgPatch) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith(svgPatch) - }) - - test("should execute callback on emitNotif", () => - { - const testFunction = jest.fn() - internalEvent.addNotifListener(testFunction) - const notif = { message: "this is the end", timeout: 666 } - internalEvent.emitNotif(notif) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith(notif) - }) - - test("should execute callback on emitError", () => - { - const testFunction = jest.fn() - internalEvent.addErrorListener(testFunction) - const error = new Error("this is un error message") - internalEvent.emitError(error) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith(error) - }) - - test("should execute callback on emitClear", () => - { - const testFunction = jest.fn() - internalEvent.addClearListener(testFunction) - internalEvent.emitClear() - expect(testFunction).toBeCalledTimes(1) - }) - - test("should execute callback on emitConvert", () => - { - const testFunction = jest.fn() - internalEvent.addConvertListener(testFunction) - internalEvent.emitConvert("DIGITAL_EDIT") - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith("DIGITAL_EDIT") - }) - - test("should execute callback on emitImportJIIX", () => - { - const testFunction = jest.fn() - internalEvent.addImportJIIXListener(testFunction) - const jiix = { - "type": "Text", - "label": "hello", - "words": [ - { - "id": "1", - "label": "hello", - "candidates": [ "hello", "helle", "hellor", "hells", "hellon" ] - } - ], - "version": "3", - "id": "MainBlock" - } - internalEvent.emitImportJIIX(jiix) - expect(testFunction).toBeCalledTimes(1) - expect(testFunction).toBeCalledWith(jiix) - }) - - test("should execute callback on emitClearMessage", () => - { - const testFunction = jest.fn() - internalEvent.addClearMessageListener(testFunction) - internalEvent.emitClearMessage() - expect(testFunction).toBeCalledTimes(1) - }) -}) diff --git a/test/unit/99-iink/00-Editor.test.ts b/test/unit/99-iink/00-Editor.test.ts deleted file mode 100644 index af0bd6ab5..000000000 --- a/test/unit/99-iink/00-Editor.test.ts +++ /dev/null @@ -1,701 +0,0 @@ -import { AllOverrideConfiguration } from "../_dataset/configuration.dataset" -import { delay } from "../utils/helpers" -// import { LeftClickEventFake } from "../utils/PointerEventFake" -import -{ - TBehaviorOptions, - TStroke, - TTheme, - TPenStyle, - TJIIXExport, - TConfiguration -} from "../../../src/@types" -import -{ - Editor, - configuration, - style, - model, - grabber, - recognizer, - constants, - event -} from "../../../src/iink" - -describe("Editor.ts", () => -{ - const { DefaultConfiguration } = configuration - const { DefaultPenStyle, DefaultTheme } = style - const { Model} = model - const { PointerEventGrabber } = grabber - const { WSRecognizer } = recognizer - const { PublicEvent, InternalEvent } = event - const publicEvent = PublicEvent.getInstance() - const DefaultBehaviorsOptions: TBehaviorOptions = { configuration: DefaultConfiguration } - - describe("constructor", () => - { - test("should instantiate Editor", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - expect(editor).toBeDefined() - expect(editor.configuration).toBeDefined() - expect(editor.model).toBeDefined() - }) - test("should instantiate Editor with custom configuration", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, { configuration: (AllOverrideConfiguration as TConfiguration) }) - editor.initialize() - expect(editor).toBeDefined() - expect(editor.configuration).toBeDefined() - expect(editor.model).toBeDefined() - }) - test("should define default grabber", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const customGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - expect(editor.grabber).not.toBe(customGrabber) - }) - test("should override grabber", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const customGrabber = new PointerEventGrabber(DefaultConfiguration.grabber) - const customBehaviorsOptions: TBehaviorOptions = { - configuration: DefaultConfiguration, - behaviors: { - grabber: customGrabber - } - } - const editor = new Editor(wrapperHTML, customBehaviorsOptions) - expect(editor.grabber).toBe(customGrabber) - }) - test("should define default recognizer", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const customRecognizer = new WSRecognizer(DefaultConfiguration.server, DefaultConfiguration.recognition) - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - expect(editor.behaviors.recognizer).not.toBe(customRecognizer) - }) - test("should override recognizer", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const customRecognizer = new WSRecognizer(DefaultConfiguration.server, DefaultConfiguration.recognition) - const customBehaviorsOptions: TBehaviorOptions = { - configuration: DefaultConfiguration, - behaviors: { - recognizer: customRecognizer - } - } - const editor = new Editor(wrapperHTML, customBehaviorsOptions) - expect(editor.behaviors.recognizer).toBe(customRecognizer) - }) - test("should throw error if instantiate Editor without configuration", () => - { - expect.assertions(1) - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - try { - //@ts-ignore - new Editor(wrapperHTML, {}) - } - catch (error) { - expect((error as Error).message).toEqual("Configuration required") - } - }) - test("should append loader element", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - new Editor(wrapperHTML, DefaultBehaviorsOptions) - expect(wrapperHTML.querySelector(".loader")).toBeDefined() - }) - test("should append error element", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - new Editor(wrapperHTML, DefaultBehaviorsOptions) - expect(wrapperHTML.querySelector(".error-msg")).toBeDefined() - }) - }) - - describe("initialize", () => - { - test("should display and hide loader", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - const LOAD_TIMEOUT = 200 - editor.behaviors.init = jest.fn(async () => { await delay(LOAD_TIMEOUT); return Promise.resolve() }) - const loaderElement = wrapperHTML.getElementsByClassName("loader") - //@ts-ignore - expect(loaderElement.item(0)?.style.display).toEqual("none") - editor.initialize() - //@ts-ignore - expect(loaderElement.item(0)?.style.display).toEqual("initial") - await delay(LOAD_TIMEOUT) - //@ts-ignore - expect(loaderElement.item(0)?.style.display).toEqual("none") - }) - test("should resolve when behaviors.init is resolved", async () => - { - expect.assertions(1) - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - expect(editor.initializationPromise).toBeDefined() - }) - test("should reject when behaviors.init is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.reject("pouet")) - expect(editor.initialize()).rejects.toEqual("pouet") - }) - test("should show error when behaviors.init is rejected", async () => - { - expect.assertions(3) - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.reject(new Error("pouet"))) - const messageElement = wrapperHTML.getElementsByClassName("message") - try { - //@ts-ignore - expect(messageElement.item(0)?.style.display).toEqual("none") - await editor.initialize() - } catch (error) { - //@ts-ignore - expect(messageElement.item(0)?.style.display).toEqual("initial") - //@ts-ignore - expect(messageElement.item(0)?.innerText).toEqual("pouet") - } - }) - }) - - describe("configuration", () => - { - test("should change behaviors", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - expect(editor.behaviors.name).toEqual("WSBehaviors") - editor.behaviors.destroy = jest.fn(() => Promise.resolve()) - //@ts-ignore - editor.configuration = { ...DefaultBehaviorsOptions, server: { protocol: "REST" } } - expect(editor.behaviors.name).toEqual("RestBehaviors") - }) - }) - - describe("intention", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - test("should init intention = Write", () => - { - expect(editor.intention).toBe(constants.Intention.Write) - }) - test("should set intention = erase", () => - { - editor.intention = constants.Intention.Erase - expect(wrapperHTML.classList).toContain("erasing") - }) - test("should toggle intention", () => - { - editor.intention = constants.Intention.Erase - expect(wrapperHTML.classList).toContain("erasing") - editor.intention = constants.Intention.Write - expect(wrapperHTML.classList).not.toContain("erasing") - }) - }) - - describe("context", () => - { - test("should get context", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - wrapperHTML.style.height = "100px" - wrapperHTML.style.width = "100px" - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - expect(editor.context).toBe(editor.behaviors.context) - }) - }) - - describe('undo', () => - { - test("should resolve when behaviors.undo is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - const modelExpected = new Model(100, 100) - editor.behaviors.undo = jest.fn(() => Promise.resolve(modelExpected)) - await editor.initialize() - await editor.undo() - expect(editor.behaviors.undo).toBeCalledTimes(1) - }) - test("should reject when behaviors.undo is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - editor.behaviors.undo = jest.fn(() => Promise.reject("pouet")) - expect(editor.undo()).rejects.toEqual("pouet") - }) - }) - - describe("redo", () => - { - test("should resolve when behaviors.redo is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - const modelExpected = new Model(100, 100) - editor.behaviors.redo = jest.fn(() => Promise.resolve(modelExpected)) - await editor.initialize() - await editor.redo() - expect(editor.behaviors.redo).toBeCalledTimes(1) - }) - test("should reject when behaviors.redo is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - editor.behaviors.redo = jest.fn(() => Promise.reject("pouet")) - expect(editor.redo()).rejects.toEqual("pouet") - }) - }) - - describe("clear", () => - { - test("should resolve when behaviors.clear is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - const modelExpected = new Model(100, 100) - editor.behaviors.clear = jest.fn(() => Promise.resolve(modelExpected)) - await editor.initialize() - await editor.clear() - expect(editor.behaviors.clear).toBeCalledTimes(1) - }) - test("should reject when behaviors.clear is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - editor.behaviors.clear = jest.fn(() => Promise.reject("pouet")) - expect(editor.clear()).rejects.toEqual("pouet") - }) - test("should emit cleared event", async () => - { - const testFunction = jest.fn() - publicEvent.addEventListener(constants.EventType.CLEARED, testFunction) - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - const modelExpected = new Model(100, 100) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - editor.behaviors.clear = jest.fn(() => Promise.resolve(modelExpected)) - await editor.initialize() - await editor.clear() - expect(testFunction).toBeCalledTimes(1) - }) - }) - - describe("resize", () => - { - test("should resolve when behaviors.resize is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - const modelExpected = new Model(100, 100) - editor.behaviors.resize = jest.fn(() => Promise.resolve(modelExpected)) - await editor.initialize() - await editor.resize() - expect(editor.behaviors.resize).toBeCalledTimes(1) - }) - test("should reject when behaviors.resize is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - editor.behaviors.resize = jest.fn(() => Promise.reject("pouet")) - expect(editor.resize()).rejects.toEqual("pouet") - }) - }) - - describe("export", () => - { - test("should resolve when behaviors.export is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - const modelExpected = new Model(100, 100) - editor.behaviors.export = jest.fn(() => Promise.resolve(modelExpected)) - await editor.initialize() - await editor.export() - expect(editor.behaviors.export).toBeCalledTimes(1) - }) - test("should reject when behaviors.export is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - editor.behaviors.export = jest.fn(() => Promise.reject("pouet")) - expect(editor.export()).rejects.toEqual("pouet") - }) - }) - - describe("convert", () => - { - test("should resolve when behaviors.convert is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - const modelExpected = new Model(100, 100) - editor.behaviors.convert = jest.fn(() => Promise.resolve(modelExpected)) - await editor.initialize() - await editor.convert() - expect(editor.behaviors.convert).toBeCalledTimes(1) - }) - test("should reject when behaviors.convert is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - editor.behaviors.convert = jest.fn(() => Promise.reject("pouet")) - expect(editor.convert()).rejects.toEqual("pouet") - }) - }) - - describe("import", () => - { - test("should resolve import Blob when behaviors.import is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - const model = new Model(100, 50) - editor.behaviors.import = jest.fn(() => Promise.resolve(model)) - editor.events.emitImported = jest.fn() - await editor.import(new Blob(), "text/plain") - expect(editor.events.emitImported).toBeCalledTimes(1) - expect(editor.behaviors.import).toBeCalledTimes(1) - }) - test("should reject import Blob if behaviors.import is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - editor.behaviors.import = jest.fn(() => Promise.reject("pouet")) - editor.events.emitImported = jest.fn() - expect(editor.import(new Blob(), "text/plain")).rejects.toEqual("pouet") - }) - test("should reject import Blob if behaviors.import is not define", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - editor.behaviors.import = undefined - editor.events.emitImported = jest.fn() - expect(editor.import(new Blob(), "text/plain")).rejects.toEqual("Import impossible, behaviors has no import function") - }) - - test("should resolve import Text when behaviors.import is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - const model = new Model(100, 50) - editor.behaviors.import = jest.fn(() => Promise.resolve(model)) - editor.events.emitImported = jest.fn() - await editor.import("hello", "text/plain") - expect(editor.events.emitImported).toBeCalledTimes(1) - expect(editor.behaviors.import).toBeCalledTimes(1) - }) - test("should reject import Text if behaviors.import is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - editor.behaviors.import = jest.fn(() => Promise.reject("pouet")) - editor.events.emitImported = jest.fn() - expect(editor.import("hello", "text/plain")).rejects.toEqual("pouet") - }) - test("should reject import Text if behaviors.import is not define", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - editor.behaviors.import = undefined - editor.events.emitImported = jest.fn() - expect(editor.import("hello", "text/plain")).rejects.toEqual("Import impossible, behaviors has no import function") - }) - - test("should resolve import JIIX when behaviors.import is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - const model = new Model(100, 50) - editor.behaviors.import = jest.fn(() => Promise.resolve(model)) - editor.events.emitImported = jest.fn() - const jiix: TJIIXExport = { - type: "Text", - label: "h", - words: [ - { - label: "h", - candidates: ["h", "k", "hi", "hr", "hn"], - }, - ], - version: "3", - id: "MainBlock", - } - await editor.import(jiix) - expect(editor.events.emitImported).toBeCalledTimes(1) - expect(editor.behaviors.import).toBeCalledTimes(1) - }) - test("should reject import JIIX if behaviors.import is rejected", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - editor.behaviors.import = jest.fn(() => Promise.reject("pouet")) - editor.events.emitImported = jest.fn() - const jiix: TJIIXExport = { - type: "Text", - label: "h", - words: [ - { - label: "h", - candidates: ["h", "k", "hi", "hr", "hn"], - }, - ], - version: "3", - id: "MainBlock", - } - expect(editor.import(jiix)).rejects.toEqual("pouet") - }) - test("should reject import JIIX if behaviors.import is not define", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - editor.behaviors.import = undefined - editor.events.emitImported = jest.fn() - const jiix: TJIIXExport = { - type: "Text", - label: "h", - words: [ - { - label: "h", - candidates: ["h", "k", "hi", "hr", "hn"], - }, - ], - version: "3", - id: "MainBlock", - } - expect(editor.import(jiix)).rejects.toEqual("Import impossible, behaviors has no import function") - }) - - test("should resolve import points Events when behaviors.importPointEvents is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - const model = new Model(100, 50) - const tstrokeToImport: TStroke[] = [ - //@ts-ignore - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ] - } - ] - editor.behaviors.importPointEvents = jest.fn(() => Promise.resolve(model)) - await editor.importPointEvents(tstrokeToImport) - expect(editor.events.emitImported).toBeCalledTimes(1) - expect(editor.behaviors.importPointEvents).toBeCalledTimes(1) - }) - test("should resolve import points Events when behaviors.importPointEvents is resolved", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - const tstrokeToImport: TStroke[] = [ - //@ts-ignore - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ] - } - ] - editor.behaviors.importPointEvents = jest.fn(() => Promise.reject("pouet")) - expect(editor.importPointEvents(tstrokeToImport)).rejects.toEqual("pouet") - }) - test("should reject import Points if behaviors.import is not define", async () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - editor.behaviors.init = jest.fn(() => Promise.resolve()) - await editor.initialize() - const tstrokeToImport: TStroke[] = [ - //@ts-ignore - { - "pointerType": "mouse", - "pointerId": 0, - "pointers": [ - { "x": 604, "y": 226, "t": 1693494025427, "p": 0.1 }, - { "x": 611, "y": 222, "t": 1693494025467, "p": 0.8 }, - { "x": 621, "y": 222, "t": 1693494025484, "p": 0.68 }, - ] - } - ] - editor.behaviors.importPointEvents = undefined - expect(editor.importPointEvents(tstrokeToImport)).rejects.toEqual("Import impossible, behaviors has no importPointEvents function") - }) - }) - - describe("Style", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - let editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - test("should init theme", () => - { - expect(editor.theme).toStrictEqual(DefaultTheme) - }) - test("should set theme", () => - { - editor.behaviors.setTheme = jest.fn() - //@ts-ignore - const customTheme: TTheme = { - ink: { - width: 42, - color: "red", - "-myscript-pen-fill-color": "blue", - "-myscript-pen-fill-style": "style", - "-myscript-pen-width": 5 - } - } - editor.theme = customTheme - expect(editor.behaviors.setTheme).toBeCalledTimes(1) - expect(editor.behaviors.setTheme).toBeCalledWith(customTheme) - }) - test("should set penStyleClasses", () => - { - editor.behaviors.setPenStyleClasses = jest.fn() - const customPenStyleClasses = "customPenStyleClasses" - editor.penStyleClasses = customPenStyleClasses - expect(editor.behaviors.setPenStyleClasses).toBeCalledTimes(1) - expect(editor.behaviors.setPenStyleClasses).toBeCalledWith(customPenStyleClasses) - }) - test("should init penStyle", () => - { - expect(editor.penStyle).toStrictEqual(DefaultPenStyle) - }) - test("should init penStyle", () => - { - editor.behaviors.setPenStyle = jest.fn() - const customPenStyle: TPenStyle = { - width: 42, - color: "red", - "-myscript-pen-fill-color": "blue", - "-myscript-pen-fill-style": "style", - "-myscript-pen-width": 5 - } - editor.penStyle = customPenStyle - expect(editor.behaviors.setPenStyle).toBeCalledTimes(1) - expect(editor.behaviors.setPenStyle).toBeCalledWith(customPenStyle) - }) - }) - - describe("Events", () => - { - const wrapperHTML: HTMLElement = document.createElement("div") - const editor = new Editor(wrapperHTML, DefaultBehaviorsOptions) - // TODO problem with internal event singleton - test.skip("should call clear when internalEvent emit clear", () => - { - editor.clear = jest.fn() - expect(editor.clear).toBeCalledTimes(0) - InternalEvent.getInstance().emitClear() - expect(editor.clear).toBeCalledTimes(1) - }) - // TODO problem with internal event singleton - test.skip("should call convert when internalEvent emit convert", () => - { - editor.convert = jest.fn() - expect(editor.convert).toBeCalledTimes(0) - InternalEvent.getInstance().emitConvert() - expect(editor.convert).toBeCalledTimes(1) - }) - // TODO problem with internal event singleton - test.skip("should emit changed when internalEvent emit changed", () => - { - editor.events.emitChanged = jest.fn() - expect(editor.events.emitChanged).toBeCalledTimes(0) - InternalEvent.getInstance().emitContextChange({ canRedo: true, canUndo: true, empty: false, possibleUndoCount: 10, stack: [], stackIndex: 11 }) - expect(editor.events.emitChanged).toBeCalledTimes(1) - }) - // TODO problem with internal event singleton - test.skip("should emit idle when internalEvent emit idle", () => - { - editor.events.emitIdle = jest.fn() - expect(editor.events.emitIdle).toBeCalledTimes(0) - InternalEvent.getInstance().emitIdle(true) - expect(editor.events.emitIdle).toBeCalledTimes(1) - }) - }) - -}) diff --git a/test/unit/99-iink/01-utils.test.ts b/test/unit/99-iink/01-utils.test.ts deleted file mode 100644 index e4d7f1d26..000000000 --- a/test/unit/99-iink/01-utils.test.ts +++ /dev/null @@ -1,200 +0,0 @@ -import { ConfigurationTextWebsocket } from "../_dataset/configuration.dataset" -import { utils } from "../../../src/iink" - -describe("utils", () => -{ - const { getAvailableLanguageList, getAvailableFontList, version, geometric, crypto } = utils - describe("getAvailableLanguageList", () => - { - global.fetch = jest.fn(() => - Promise.resolve({ - json: () => Promise.resolve({ fr: "fr_FR" }), - }), - ) as jest.Mock - - test("should call fetch with good url", async () => - { - await getAvailableLanguageList(ConfigurationTextWebsocket) - expect(fetch).toBeCalledTimes(1) - expect(fetch).toBeCalledWith(`${ ConfigurationTextWebsocket?.server?.scheme }://${ ConfigurationTextWebsocket?.server?.host }/api/v4.0/iink/availableLanguageList`) - }) - - test("should reject getAvailableLanguageList if no configuration", async () => - { - // @ts-ignore - getAvailableLanguageList() - .catch(e => - { - expect(e).toBe("Failed to get languages: configuration.server.scheme & configuration.server.host are required!") - }) - }) - - test("should reject getAvailableLanguageList if configuration.server is empty", async () => - { - const conf = JSON.parse(JSON.stringify(ConfigurationTextWebsocket)) - delete conf?.server - getAvailableLanguageList(conf) - .catch(e => - { - expect(e).toBe("Failed to get languages: configuration.server.scheme & configuration.server.host are required!") - }) - }) - - test("should reject getAvailableLanguageList if configuration.server.scheme is empty", async () => - { - const conf = JSON.parse(JSON.stringify(ConfigurationTextWebsocket)) - delete conf?.server?.scheme - getAvailableLanguageList(conf) - .catch(e => - { - expect(e).toBe("Failed to get languages: configuration.server.scheme & configuration.server.host are required!") - }) - }) - - test("should reject getAvailableLanguageList if configuration.server.host empty", async () => - { - const conf = JSON.parse(JSON.stringify(ConfigurationTextWebsocket)) - delete conf?.server?.host - getAvailableLanguageList(conf) - .catch(e => - { - expect(e).toBe("Failed to get languages: configuration.server.scheme & configuration.server.host are required!") - }) - }) - }) - - describe("getAvailableFontList", () => - { - global.fetch = jest.fn(() => - Promise.resolve({ - json: () => Promise.resolve({ result: [] }), - }), - ) as jest.Mock - - test("should call fetch with good url", async () => - { - await getAvailableFontList(ConfigurationTextWebsocket) - expect(fetch).toBeCalledTimes(1) - expect(fetch).toBeCalledWith(`${ ConfigurationTextWebsocket?.server?.scheme }://${ ConfigurationTextWebsocket?.server?.host }/api/v4.0/iink/font/google/language/${ ConfigurationTextWebsocket?.recognition?.lang }`) - }) - - test("should reject getAvailableFontList if no configuration", async () => - { - // @ts-ignore - getAvailableFontList() - .catch(e => - { - expect(e).toBe("Failed to get fonts: configuration.server.scheme & configuration.server.host are required!") - }) - }) - - test("should reject getAvailableFontList if configuration.server is empty", async () => - { - const conf = JSON.parse(JSON.stringify(ConfigurationTextWebsocket)) - delete conf?.server - getAvailableFontList(conf) - .catch(e => - { - expect(e).toBe("Failed to get fonts: configuration.server.scheme & configuration.server.host are required!") - }) - }) - - test("should reject getAvailableFontList if configuration.server.scheme is empty", async () => - { - const conf = JSON.parse(JSON.stringify(ConfigurationTextWebsocket)) - delete conf?.server?.scheme - getAvailableFontList(conf) - .catch(e => - { - expect(e).toBe("Failed to get fonts: configuration.server.scheme & configuration.server.host are required!") - }) - }) - - test("should reject getAvailableFontList if configuration.server.host empty", async () => - { - const conf = JSON.parse(JSON.stringify(ConfigurationTextWebsocket)) - delete conf?.server?.host - getAvailableFontList(conf) - .catch(e => - { - expect(e).toBe("Failed to get fonts: configuration.server.scheme & configuration.server.host are required!") - }) - }) - - test("should reject getAvailableFontList if configuration.server.host empty", async () => - { - const conf = JSON.parse(JSON.stringify(ConfigurationTextWebsocket)) - delete conf?.recognition?.lang - getAvailableFontList(conf) - .catch(e => - { - expect(e).toBe("Failed to get fonts: configuration.recognition.lang is required!") - }) - }) - }) - - describe("version", () => - { - const testDatas = [ - { source: "1.0.1", target: "1.0.0", expected: true }, - { source: "1.1.0", target: "1.0.0", expected: true }, - { source: "2.0.0", target: "1.0.0", expected: true }, - { source: "2.0.0", target: "1.9.14", expected: true }, - { source: "2.12.90", target: "2.12.88", expected: true }, - { source: "1.99.99", target: "2.0.0", expected: false }, - { source: "2.0.9", target: "2.0.91", expected: false }, - { source: "2.11.9", target: "2.12.88", expected: false }, - { source: "1.0.0", target: "1.0.0", expected: true }, - ] - - testDatas.forEach(d => - { - test(`shoud get ${ d.source } is ${ d.expected ? "higher" : "lower" } than ${ d.target }`, () => - { - expect(version.isVersionSuperiorOrEqual(d.source, d.target)).toEqual(d.expected) - }) - }) - }) - - describe("geometric", () => - { - describe("computeDistance", () => - { - const testDatas = [ - { - p1: { x: 0, y: 0 }, - p2: { x: 0, y: 3 }, - expected: 3 - }, - { - p1: { x: 0, y: 0 }, - p2: { x: 3, y: 0 }, - expected: 3 - }, - { - p1: { x: 0, y: 0 }, - p2: { x: 1, y: 1 }, - expected: Math.sqrt(2) - }, - ] - testDatas.forEach(d => - { - test(`should computed distance of P1: [${ JSON.stringify(d.p1) }] & P2: [${ JSON.stringify(d.p2) }] to equal ${ d.expected }`, () => - { - expect(geometric.computeDistance(d.p1, d.p2)).toEqual(d.expected) - }) - }) - }) - }) - - describe("crypto", () => - { - test("should computeHmac", () => - { - const computedHmac = crypto.computeHmac("Message", "AppKey", "HMACKey") - expect(computedHmac) - .toBe("b4d62a1900a4010a140e31fc4a07b6445499e6c7488f3214962427b2d539056182d0990f4d042ace794704f03dc6fdc2f73e25dd6ea35d3e0fd537d1dd4c1223") - }) - - }) -}) diff --git a/test/unit/_dataset/configuration.dataset.ts b/test/unit/_dataset/configuration.dataset.ts deleted file mode 100644 index 8dbce36ec..000000000 --- a/test/unit/_dataset/configuration.dataset.ts +++ /dev/null @@ -1,209 +0,0 @@ -import { TConfigurationClient } from "../../../src/@types/configuration" - -export const ConfigurationTextWebsocket: TConfigurationClient = { - server: { - protocol: 'WEBSOCKET', - scheme: 'http', - host: 'cloud.myscript.com', - applicationKey: '80a7f78d-939c-48e0-84a8-7794d6fbf624', - hmacKey: 'df2ba19a-7703-4ab4-9164-00dd33357745' - }, - recognition: { - lang: "en_US", - type: 'TEXT', - text: { - mimeTypes: ['text/plain', 'application/vnd.myscript.jiix'], - margin: { - bottom: 12, - left: 12, - right: 12, - top: 12 - }, - } - } -} - -export const ConfigurationTextRest: TConfigurationClient = { - server: { - protocol: 'REST', - scheme: 'http', - host: 'cloud.myscript.com', - applicationKey: '80a7f78d-939c-48e0-84a8-7794d6fbf624', - hmacKey: 'df2ba19a-7703-4ab4-9164-00dd33357745' - }, - recognition: { - type: 'TEXT', - text: { - mimeTypes: ['text/plain', 'application/vnd.myscript.jiix'], - margin: { - bottom: 12, - left: 12, - right: 12, - top: 12 - }, - } - } -} - -export const ConfigurationDiagramRest: TConfigurationClient = { - server: { - protocol: 'REST', - scheme: 'http', - host: 'cloud.myscript.com', - applicationKey: '80a7f78d-939c-48e0-84a8-7794d6fbf624', - hmacKey: 'df2ba19a-7703-4ab4-9164-00dd33357745' - }, - recognition: { - type: 'DIAGRAM', - diagram: { - mimeTypes: ['application/vnd.myscript.jiix'] - } - } -} - -export const ConfigurationRawContentRest: TConfigurationClient = { - server: { - protocol: 'REST', - scheme: 'http', - host: 'cloud.myscript.com', - applicationKey: '80a7f78d-939c-48e0-84a8-7794d6fbf624', - hmacKey: 'df2ba19a-7703-4ab4-9164-00dd33357745' - }, - recognition: { - type: 'Raw Content', - } -} - -export const AllOverrideConfiguration: TConfigurationClient = { - server: { - protocol: 'REST', - scheme: 'http', - host: 'host', - applicationKey: 'applicationKey', - hmacKey: 'hmacKey', - version: '2.0.4', - useWindowLocation: false, - websocket: { - pingEnabled: false, - pingDelay: 42, - maxPingLostCount: 42, - autoReconnect: false, - maxRetryCount: 42, - fileChunkSize: 42 - } - }, - recognition: { - type: 'DIAGRAM', - alwaysConnected: false, - lang: 'fr_FR', - gesture: { - enable: false - }, - export: { - 'image-resolution': 12, - jiix: { - 'bounding-box': true, - strokes: true, - text: { - chars: true, - words: false - } - }, - }, - renderer: { - debug: { - 'draw-text-boxes': true, - 'draw-image-boxes': true - } - }, - math: { - mimeTypes: ['application/mathml+xml'], // 'application/mathml+xml', 'application/vnd.myscript.jiix', - solver: { - enable: false, - 'fractional-part-digits': 4, - 'decimal-separator': ',', - 'rounding-mode': 'truncate', - 'angle-unit': 'rad' - }, - margin: { - bottom: 12, - left: 12, - right: 12, - top: 12 - }, - eraser: { - 'erase-precisely': true - }, - 'undo-redo': { - mode: 'session' - } - }, - text: { - guides: { - enable: false - }, - mimeTypes: ['application/vnd.myscript.jiix'], - margin: { - top: 21, - left: 21, - right: 21, - bottom: 21 - }, - eraser: { - 'erase-precisely': true - } - }, - diagram: { - mimeTypes: ['application/vnd.openxmlformats-officedocument.presentationml.presentation'], - eraser: { - 'erase-precisely': true - }, - convert: { - "match-text-size": true, - }, - }, - 'raw-content': { - recognition: { - text: false, - shape: true - }, - eraser: { - 'erase-precisely': true - } - } - }, - grabber: { - listenerOptions: { - capture: true, - passive: false - }, - xyFloatPrecision: 27, - timestampFloatPrecision: 27 - }, - rendering: { - minHeight: 42, - minWidth: 42, - smartGuide: { - enable: false, - fadeOut: { - enable: true, - duration: 42 - } - }, - guides: { - enable: false, - gap: 100 - } - }, - triggers: { - exportContent: 'DEMAND', - exportContentDelay: 5, - resizeTriggerDelay: 5 - }, - events: { - processDelay: 0 - }, - 'undo-redo': { - maxStackSize: 10 - } -} diff --git a/test/unit/jest.setup.js b/test/unit/jest.setup.js deleted file mode 100644 index ba3a43285..000000000 --- a/test/unit/jest.setup.js +++ /dev/null @@ -1,4 +0,0 @@ -global.structuredClone = (val) => JSON.parse(JSON.stringify(val)) -console.log = jest.fn() -console.warn = jest.fn() -console.error = jest.fn() diff --git a/test/unit/utils/PointerEventFake.ts b/test/unit/utils/PointerEventFake.ts deleted file mode 100644 index 4aea108af..000000000 --- a/test/unit/utils/PointerEventFake.ts +++ /dev/null @@ -1,84 +0,0 @@ -type EventFakeProps = { - clientX: number - clientY: number - pressure: number - pointerType: string -} - -type CompleteEventFakeProps = EventFakeProps & { - button: number - buttons: number -} - -type TouchListFake = ({clientX: number, clientY: number})[] - -export class PointerEventFake extends Event { - clientX: number - clientY: number - pressure: number - pointerType: string - button: number - buttons: number - pointerId: number - constructor(type: string, props: CompleteEventFakeProps) { - super(type, props as EventInit); - this.clientX = props.clientX - this.clientY = props.clientY - this.pointerType = props.pointerType - this.pressure = props.pressure - this.button = props.button - this.buttons = props.buttons - this.pointerId = Math.floor(Math.random() * 100) - } -} - -export class LeftClickEventFake extends PointerEventFake { - constructor(type: string, props: EventFakeProps) { - super(type, { - ...props, - button: 0, - buttons: 1 - }) - } -} - -export class RightClickEventFake extends PointerEventFake { - constructor(type: string, props: EventFakeProps) { - super(type, { - ...props, - button: 1, - buttons: 1 - }) - } -} - - -export class TouchEventFake extends PointerEventFake { - changedTouches: TouchListFake - constructor(type: string, props: EventFakeProps) { - super(type, { - ...props, - button: 0, - buttons: 1 - }) - this.changedTouches = [{ - clientX: props.clientX, - clientY: props.clientY, - }] - } -} - -export class DoubleTouchEventFake extends PointerEventFake { - changedTouches: TouchListFake - constructor(type: string, props: EventFakeProps) { - super(type, { - ...props, - button: 0, - buttons: 2 - }) - this.changedTouches = [{ - clientX: props.clientX, - clientY: props.clientY, - }] - } -} \ No newline at end of file diff --git a/test/unit/utils/helpers.ts b/test/unit/utils/helpers.ts deleted file mode 100644 index 3097053eb..000000000 --- a/test/unit/utils/helpers.ts +++ /dev/null @@ -1,4 +0,0 @@ - -export const delay = (delayInms: number) => { - return new Promise(resolve => setTimeout(resolve, delayInms)); -} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 86b38b117..000000000 --- a/tsconfig.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "compilerOptions": { - "outDir": "dist", - "target": "ES2015", - "module": "ES2015", - "moduleResolution": "node", - "lib": [ - "DOM", - "ES2015", - "ES2016", - "ES2017" - ], - "declaration": false, - "declarationMap": false, - "removeComments": false, - "preserveConstEnums": true, - "sourceMap": true, - "strict": true, - "strictFunctionTypes": true, - "strictNullChecks": true, - "allowSyntheticDefaultImports": true, - "alwaysStrict": true, - "noImplicitReturns": true, - "noImplicitThis": true, - "noImplicitAny": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "skipLibCheck": true, - "esModuleInterop": true - }, - "types": [ - "./node_modules/@types/**", - "@types/jest", - "jest-websocket-mock", - "jest-playwright-preset", - "expect-playwright", - ], - "include": [ - "." - ], - "exclude": [ - "node_modules", - "dist", - "examples/**", - "plugins" - ] -} diff --git a/typedoc.json b/typedoc.json deleted file mode 100644 index 5bb768e2c..000000000 --- a/typedoc.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "entryPoints": [ - "src/iink.ts" - ], - "includes": "src", - "exclude": [ - "config", - "coverage", - "dist", - "docker", - "docs", - "examples", - "test", - "node_modules" - ], - "plugin": [ - "typedoc-plugin-missing-exports", - "./plugins/typdoc-default-object.ts" - ], - "sort": [ - "alphabetical", - ], - "excludeExternals": true, - "readme": "README.md", - "includeVersion": true, - "disableSources": false, - "githubPages": true, - "cleanOutputDir": true, - "categorizeByGroup": true, - "navigation": { - "includeCategories": false, - "includeGroups": true - }, - "visibilityFilters": { - "protected": false, - "private": false, - "inherited": true, - "external": false, - "@alpha": false, - "@beta": false, - }, - "out": "./docs", - "pretty": true, - "customCss": "./typedoc.css" -} diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 305ade28e..000000000 --- a/yarn.lock +++ /dev/null @@ -1,5749 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" - integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== - dependencies: - "@babel/highlight" "^7.22.5" - -"@babel/compat-data@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255" - integrity sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA== - -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.7.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.5.tgz#d67d9747ecf26ee7ecd3ebae1ee22225fe902a89" - integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg== - 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" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/generator@^7.22.5", "@babel/generator@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" - integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== - dependencies: - "@babel/types" "^7.22.5" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz#fc7319fc54c5e2fa14b2909cf3c5fd3046813e02" - integrity sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw== - dependencies: - "@babel/compat-data" "^7.22.5" - "@babel/helper-validator-option" "^7.22.5" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" - integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== - -"@babel/helper-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" - integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== - dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" - integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-transforms@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" - integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" - "@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-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08" - integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== - -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== - -"@babel/helper-validator-option@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" - integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== - -"@babel/helpers@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.5.tgz#74bb4373eb390d1ceed74a15ef97767e63120820" - integrity sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q== - dependencies: - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/highlight@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" - integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== - dependencies: - "@babel/helper-validator-identifier" "^7.22.5" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" - integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" - integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" - integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/template@^7.22.5", "@babel/template@^7.3.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" - integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== - dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/traverse@^7.22.5", "@babel/traverse@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1" - 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" - "@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" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.3.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" - integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.4.0": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" - integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== - -"@eslint/eslintrc@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" - integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.5.2" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.43.0": - version "8.43.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.43.0.tgz#559ca3d9ddbd6bf907ad524320a0d14b85586af0" - integrity sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg== - -"@hapi/hoek@^9.0.0": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" - integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== - -"@hapi/topo@^5.0.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@humanwhocodes/config-array@^0.11.10": - version "0.11.10" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" - integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== - dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.5.0.tgz#593a6c5c0d3f75689835f1b3b4688c4f8544cb57" - integrity sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - slash "^3.0.0" - -"@jest/core@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.5.0.tgz#76674b96904484e8214614d17261cc491e5f1f03" - integrity sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ== - dependencies: - "@jest/console" "^29.5.0" - "@jest/reporters" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.5.0" - jest-config "^29.5.0" - jest-haste-map "^29.5.0" - jest-message-util "^29.5.0" - jest-regex-util "^29.4.3" - jest-resolve "^29.5.0" - jest-resolve-dependencies "^29.5.0" - jest-runner "^29.5.0" - jest-runtime "^29.5.0" - jest-snapshot "^29.5.0" - jest-util "^29.5.0" - jest-validate "^29.5.0" - jest-watcher "^29.5.0" - micromatch "^4.0.4" - pretty-format "^29.5.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.3.tgz#abed43a6b040a4c24fdcb69eab1f97589b2d663e" - integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== - dependencies: - "@jest/fake-timers" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/node" "*" - jest-mock "^28.1.3" - -"@jest/environment@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" - integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== - dependencies: - "@jest/fake-timers" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-mock "^29.5.0" - -"@jest/expect-utils@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" - integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== - dependencies: - jest-get-type "^29.4.3" - -"@jest/expect@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.5.0.tgz#80952f5316b23c483fbca4363ce822af79c38fba" - integrity sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g== - dependencies: - expect "^29.5.0" - jest-snapshot "^29.5.0" - -"@jest/fake-timers@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.3.tgz#230255b3ad0a3d4978f1d06f70685baea91c640e" - integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw== - dependencies: - "@jest/types" "^28.1.3" - "@sinonjs/fake-timers" "^9.1.2" - "@types/node" "*" - jest-message-util "^28.1.3" - jest-mock "^28.1.3" - jest-util "^28.1.3" - -"@jest/fake-timers@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" - integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== - dependencies: - "@jest/types" "^29.5.0" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.5.0" - jest-mock "^29.5.0" - jest-util "^29.5.0" - -"@jest/globals@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298" - integrity sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/expect" "^29.5.0" - "@jest/types" "^29.5.0" - jest-mock "^29.5.0" - -"@jest/reporters@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.5.0.tgz#985dfd91290cd78ddae4914ba7921bcbabe8ac9b" - integrity sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@jridgewell/trace-mapping" "^0.3.15" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - jest-worker "^29.5.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" - integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== - dependencies: - "@sinclair/typebox" "^0.24.1" - -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== - dependencies: - "@sinclair/typebox" "^0.25.16" - -"@jest/source-map@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.4.3.tgz#ff8d05cbfff875d4a791ab679b4333df47951d20" - integrity sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w== - dependencies: - "@jridgewell/trace-mapping" "^0.3.15" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.5.0.tgz#7c856a6ca84f45cc36926a4e9c6b57f1973f1408" - integrity sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ== - dependencies: - "@jest/console" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz#34d7d82d3081abd523dbddc038a3ddcb9f6d3cc4" - integrity sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ== - dependencies: - "@jest/test-result" "^29.5.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - slash "^3.0.0" - -"@jest/transform@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.5.0.tgz#cf9c872d0965f0cbd32f1458aa44a2b1988b00f9" - integrity sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.5.0" - "@jridgewell/trace-mapping" "^0.3.15" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - jest-regex-util "^29.4.3" - jest-util "^29.5.0" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - -"@jest/types@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" - integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== - dependencies: - "@jest/schemas" "^28.1.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jest/types@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" - integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== - dependencies: - "@jest/schemas" "^29.4.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/source-map@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" - integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.18" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" - integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@rollup/plugin-node-resolve@^13.3.0": - version "13.3.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz#da1c5c5ce8316cef96a2f823d111c1e4e498801c" - integrity sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw== - dependencies: - "@rollup/pluginutils" "^3.1.0" - "@types/resolve" "1.17.1" - deepmerge "^4.2.2" - is-builtin-module "^3.1.0" - is-module "^1.0.0" - resolve "^1.19.0" - -"@rollup/pluginutils@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" - integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== - dependencies: - "@types/estree" "0.0.39" - estree-walker "^1.0.1" - picomatch "^2.2.2" - -"@rollup/pluginutils@^4.1.2": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" - integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== - dependencies: - estree-walker "^2.0.1" - picomatch "^2.2.2" - -"@sideway/address@^4.1.3": - version "4.1.4" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" - integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" - integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== - -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== - -"@sinclair/typebox@^0.24.1": - version "0.24.51" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" - integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== - -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== - -"@sinonjs/commons@^1.7.0": - version "1.8.6" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" - integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/commons@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" - integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== - dependencies: - "@sinonjs/commons" "^3.0.0" - -"@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@tootallnate/once@2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" - integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== - -"@trysound/sax@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" - integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@types/babel__core@^7.1.14": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" - integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.1.tgz#dd6f1d2411ae677dcb2db008c962598be31d6acf" - integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== - dependencies: - "@babel/types" "^7.20.7" - -"@types/estree@*": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" - integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== - -"@types/estree@0.0.39": - version "0.0.39" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" - integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== - -"@types/glob@^7.1.1": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/graceful-fs@^4.1.3": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" - integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^29.2.0": - version "29.5.2" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.2.tgz#86b4afc86e3a8f3005b297ed8a72494f89e6395b" - integrity sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - -"@types/jsdom@^16.2.4": - version "16.2.15" - resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-16.2.15.tgz#6c09990ec43b054e49636cba4d11d54367fc90d6" - integrity sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ== - dependencies: - "@types/node" "*" - "@types/parse5" "^6.0.3" - "@types/tough-cookie" "*" - -"@types/json-schema@^7.0.9": - version "7.0.12" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" - integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== - -"@types/minimatch@*": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" - integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== - -"@types/node@*": - version "20.3.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.1.tgz#e8a83f1aa8b649377bb1fb5d7bac5cb90e784dfe" - integrity sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg== - -"@types/node@^18.11.5": - version "18.16.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.18.tgz#85da09bafb66d4bc14f7c899185336d0c1736390" - integrity sha512-/aNaQZD0+iSBAGnvvN2Cx92HqE5sZCPZtx2TsK+4nvV23fFe09jVDvpArXr2j9DnYlzuU9WuoykDDc6wqvpNcw== - -"@types/parse5@^6.0.3": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" - integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== - -"@types/prettier@^2.1.5": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" - integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== - -"@types/resolve@1.17.1": - version "1.17.1" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" - integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== - dependencies: - "@types/node" "*" - -"@types/semver@^7.3.12": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" - integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== - -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== - -"@types/tough-cookie@*": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" - integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== - -"@types/wait-on@^5.2.0": - version "5.3.1" - resolved "https://registry.yarnpkg.com/@types/wait-on/-/wait-on-5.3.1.tgz#bc5520d1d8b90b9caab1bef23315685ded73320d" - integrity sha512-2FFOKCF/YydrMUaqg+fkk49qf0e5rDgwt6aQsMzFQzbS419h2gNOXyiwp/o2yYy27bi/C1z+HgfncryjGzlvgQ== - dependencies: - "@types/node" "*" - -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^17.0.8": - version "17.0.24" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" - integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== - dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@^5.33.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.0.tgz#2f4bea6a3718bed2ba52905358d0f45cd3620d31" - integrity sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg== - dependencies: - "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.60.0" - "@typescript-eslint/type-utils" "5.60.0" - "@typescript-eslint/utils" "5.60.0" - debug "^4.3.4" - grapheme-splitter "^1.0.4" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/parser@^5.33.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.60.0.tgz#08f4daf5fc6548784513524f4f2f359cebb4068a" - integrity sha512-jBONcBsDJ9UoTWrARkRRCgDz6wUggmH5RpQVlt7BimSwaTkTjwypGzKORXbR4/2Hqjk9hgwlon2rVQAjWNpkyQ== - dependencies: - "@typescript-eslint/scope-manager" "5.60.0" - "@typescript-eslint/types" "5.60.0" - "@typescript-eslint/typescript-estree" "5.60.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz#ae511967b4bd84f1d5e179bb2c82857334941c1c" - integrity sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ== - dependencies: - "@typescript-eslint/types" "5.60.0" - "@typescript-eslint/visitor-keys" "5.60.0" - -"@typescript-eslint/type-utils@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.60.0.tgz#69b09087eb12d7513d5b07747e7d47f5533aa228" - integrity sha512-X7NsRQddORMYRFH7FWo6sA9Y/zbJ8s1x1RIAtnlj6YprbToTiQnM6vxcMu7iYhdunmoC0rUWlca13D5DVHkK2g== - dependencies: - "@typescript-eslint/typescript-estree" "5.60.0" - "@typescript-eslint/utils" "5.60.0" - debug "^4.3.4" - tsutils "^3.21.0" - -"@typescript-eslint/types@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.60.0.tgz#3179962b28b4790de70e2344465ec97582ce2558" - integrity sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA== - -"@typescript-eslint/typescript-estree@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz#4ddf1a81d32a850de66642d9b3ad1e3254fb1600" - integrity sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ== - dependencies: - "@typescript-eslint/types" "5.60.0" - "@typescript-eslint/visitor-keys" "5.60.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.60.0", "@typescript-eslint/utils@^5.10.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.60.0.tgz#4667c5aece82f9d4f24a667602f0f300864b554c" - integrity sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.60.0" - "@typescript-eslint/types" "5.60.0" - "@typescript-eslint/typescript-estree" "5.60.0" - eslint-scope "^5.1.1" - semver "^7.3.7" - -"@typescript-eslint/visitor-keys@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz#b48b29da3f5f31dd1656281727004589d2722a66" - integrity sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw== - dependencies: - "@typescript-eslint/types" "5.60.0" - eslint-visitor-keys "^3.3.0" - -abab@^2.0.5, abab@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.4.1, acorn@^8.5.0, acorn@^8.8.0, acorn@^8.8.2: - version "8.9.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" - integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv@^6.10.0, ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-sequence-parser@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz#4d790f31236ac20366b23b3916b789e1bde39aed" - integrity sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -append-transform@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" - integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== - dependencies: - default-require-extensions "^3.0.0" - -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== - dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -axios@^0.21.1: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - -babel-jest@^29.2.2, babel-jest@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" - integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== - dependencies: - "@jest/transform" "^29.5.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.5.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" - integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-jest@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" - integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== - dependencies: - babel-plugin-jest-hoist "^29.5.0" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browserslist@^4.0.0, browserslist@^4.21.3, browserslist@^4.21.4: - version "4.21.9" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" - integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== - dependencies: - caniuse-lite "^1.0.30001503" - electron-to-chromium "^1.4.431" - node-releases "^2.0.12" - update-browserslist-db "^1.0.11" - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -builtin-modules@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" - integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== - -caching-transform@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" - integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== - dependencies: - hasha "^5.0.0" - make-dir "^3.0.0" - package-hash "^4.0.0" - write-file-atomic "^3.0.0" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001503: - version "1.0.30001507" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001507.tgz#fae53f6286e7564783eadea9b447819410a59534" - integrity sha512-SFpUDoSLCaE5XYL2jfqe9ova/pbQHEmbheDf5r4diNwbAgR3qxM9NQtfsiSscjqoya5K7kFcHPUQ+VsUkIJR4A== - -chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -chokidar@^3.5.0: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== - -cjs-module-lexer@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" - integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@^1.1.4, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colord@^2.9.1: - version "2.9.3" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" - integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== - -commander@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== - -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -common-tags@1.8.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" - integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concat-with-sourcemaps@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e" - integrity sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg== - dependencies: - source-map "^0.6.1" - -convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-fetch@^3.0.4: - version "3.1.6" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.6.tgz#bae05aa31a4da760969756318feeee6e70f15d6c" - integrity sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g== - dependencies: - node-fetch "^2.6.11" - -cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -crypto-js@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.3.0.tgz#846dd1cce2f68aacfa156c8578f926a609b7976b" - integrity sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q== - -css-declaration-sorter@^6.3.1: - version "6.4.0" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz#630618adc21724484b3e9505bce812def44000ad" - integrity sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew== - -css-select@^4.1.3: - version "4.3.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" - integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== - dependencies: - boolbase "^1.0.0" - css-what "^6.0.1" - domhandler "^4.3.1" - domutils "^2.8.0" - nth-check "^2.0.1" - -css-tree@^1.1.2, css-tree@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - -css-what@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssfontparser@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/cssfontparser/-/cssfontparser-1.2.1.tgz#f4022fc8f9700c68029d542084afbaf425a3f3e3" - integrity sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg== - -cssnano-preset-default@^5.2.14: - version "5.2.14" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" - integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== - dependencies: - css-declaration-sorter "^6.3.1" - cssnano-utils "^3.1.0" - postcss-calc "^8.2.3" - postcss-colormin "^5.3.1" - postcss-convert-values "^5.1.3" - postcss-discard-comments "^5.1.2" - postcss-discard-duplicates "^5.1.0" - postcss-discard-empty "^5.1.1" - postcss-discard-overridden "^5.1.0" - postcss-merge-longhand "^5.1.7" - postcss-merge-rules "^5.1.4" - postcss-minify-font-values "^5.1.0" - postcss-minify-gradients "^5.1.1" - postcss-minify-params "^5.1.4" - postcss-minify-selectors "^5.2.1" - postcss-normalize-charset "^5.1.0" - postcss-normalize-display-values "^5.1.0" - postcss-normalize-positions "^5.1.1" - postcss-normalize-repeat-style "^5.1.1" - postcss-normalize-string "^5.1.0" - postcss-normalize-timing-functions "^5.1.0" - postcss-normalize-unicode "^5.1.1" - postcss-normalize-url "^5.1.0" - postcss-normalize-whitespace "^5.1.1" - postcss-ordered-values "^5.1.3" - postcss-reduce-initial "^5.1.2" - postcss-reduce-transforms "^5.1.0" - postcss-svgo "^5.1.0" - postcss-unique-selectors "^5.1.1" - -cssnano-utils@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" - integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== - -cssnano@^5.0.1: - version "5.1.15" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" - integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== - dependencies: - cssnano-preset-default "^5.2.14" - lilconfig "^2.0.3" - yaml "^1.10.2" - -csso@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== - dependencies: - css-tree "^1.1.2" - -cssom@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" - integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -cwd@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/cwd/-/cwd-0.10.0.tgz#172400694057c22a13b0cf16162c7e4b7a7fe567" - integrity sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA== - dependencies: - find-pkg "^0.1.2" - fs-exists-sync "^0.1.0" - -data-urls@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" - integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== - dependencies: - abab "^2.0.6" - whatwg-mimetype "^3.0.0" - whatwg-url "^11.0.0" - -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decimal.js@^10.3.1: - version "10.4.3" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" - integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== - -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== - -deep-is@^0.1.3, deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -default-require-extensions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.1.tgz#bfae00feeaeada68c2ae256c62540f60b80625bd" - integrity sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw== - dependencies: - strip-bom "^4.0.0" - -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -del@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7" - integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA== - dependencies: - globby "^10.0.1" - graceful-fs "^4.2.2" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.1" - p-map "^3.0.0" - rimraf "^3.0.0" - slash "^3.0.0" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" - integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== - -diff-sequences@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" - integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domexception@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" - integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== - dependencies: - webidl-conversions "^7.0.0" - -domhandler@^4.2.0, domhandler@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== - dependencies: - domelementtype "^2.2.0" - -domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -electron-to-chromium@^1.4.431: - version "1.4.439" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.439.tgz#d0748e8128c18f92354d3412dfb2104c3fb90e8f" - integrity sha512-BHpErPSNhb9FB25+OwQP6mCAf3ZXfGbmuvc4LzBNVJwpCcXQJm++LerimocYRG9FRxUVRKZqaB7d0+pImSTPSg== - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.21.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" - integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== - dependencies: - array-buffer-byte-length "^1.0.0" - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.2.0" - 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" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-typed-array "^1.1.10" - is-weakref "^1.0.2" - object-inspect "^1.12.3" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" - typed-array-length "^1.0.4" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.9" - -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== - dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es6-error@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" - integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-plugin-jest@^27.1.3: - version "27.2.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.2.2.tgz#be4ded5f91905d9ec89aa8968d39c71f3b072c0c" - integrity sha512-euzbp06F934Z7UDl5ZUaRPLAc9MKjh0rMPERrHT7UhlCEwgb25kBj37TvMgWeHZVkR5I9CayswrpoaqZU1RImw== - dependencies: - "@typescript-eslint/utils" "^5.10.0" - -eslint-plugin-playwright@^0.15.3: - version "0.15.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-playwright/-/eslint-plugin-playwright-0.15.3.tgz#9fd8753688351bcaf41797eb6a7df8807fd5eb1b" - integrity sha512-LQMW5y0DLK5Fnpya7JR1oAYL2/7Y9wDiYw6VZqlKqcRGSgjbVKNqxraphk7ra1U3Bb5EK444xMgUlQPbMg2M1g== - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" - integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" - integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== - -eslint@^8.22.0: - version "8.43.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.43.0.tgz#3e8c6066a57097adfd9d390b8fc93075f257a094" - integrity sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.4.0" - "@eslint/eslintrc" "^2.0.3" - "@eslint/js" "8.43.0" - "@humanwhocodes/config-array" "^0.11.10" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.0" - eslint-visitor-keys "^3.4.1" - espree "^9.5.2" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.1" - strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" - text-table "^0.2.0" - -espree@^9.5.2: - version "9.5.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" - integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== - dependencies: - acorn "^8.8.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-walker@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" - integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== - -estree-walker@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" - integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== - -estree-walker@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -eventemitter3@^4.0.4: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expand-tilde@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" - integrity sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q== - dependencies: - os-homedir "^1.0.1" - -expect-playwright@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/expect-playwright/-/expect-playwright-0.8.0.tgz#6d4ebe0bdbdd3c1693d880d97153b96a129ae4e8" - integrity sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg== - -expect@^29.0.0, expect@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" - integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== - 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" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.0.3, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-cache-dir@^3.2.0, find-cache-dir@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-file-up@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/find-file-up/-/find-file-up-0.1.3.tgz#cf68091bcf9f300a40da411b37da5cce5a2fbea0" - integrity sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A== - dependencies: - fs-exists-sync "^0.1.0" - resolve-dir "^0.1.0" - -find-pkg@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/find-pkg/-/find-pkg-0.1.2.tgz#1bdc22c06e36365532e2a248046854b9788da557" - integrity sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw== - dependencies: - find-file-up "^0.1.2" - -find-process@^1.4.4: - version "1.4.7" - resolved "https://registry.yarnpkg.com/find-process/-/find-process-1.4.7.tgz#8c76962259216c381ef1099371465b5b439ea121" - integrity sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg== - dependencies: - chalk "^4.0.0" - commander "^5.1.0" - debug "^4.1.1" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - -follow-redirects@^1.14.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -foreground-child@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" - integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^3.0.2" - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fromentries@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" - integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== - -fs-exists-sync@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" - integrity sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg== - -fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functions-have-names@^1.2.2, functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -generic-names@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-4.0.0.tgz#0bd8a2fd23fe8ea16cbd0a279acd69c06933d9a3" - integrity sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A== - dependencies: - loader-utils "^3.2.0" - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.1, get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-proto "^1.0.1" - has-symbols "^1.0.3" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-modules@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" - integrity sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA== - dependencies: - global-prefix "^0.1.4" - is-windows "^0.2.0" - -global-prefix@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" - integrity sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw== - dependencies: - homedir-polyfill "^1.0.0" - ini "^1.3.4" - is-windows "^0.2.0" - which "^1.2.12" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.19.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@^10.0.1: - version "10.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" - integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.0.3" - glob "^7.1.3" - ignore "^5.1.1" - merge2 "^1.2.3" - slash "^3.0.0" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hasha@^5.0.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" - integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== - dependencies: - is-stream "^2.0.0" - type-fest "^0.8.0" - -homedir-polyfill@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -html-encoding-sniffer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" - integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== - dependencies: - whatwg-encoding "^2.0.0" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -http-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" - integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== - dependencies: - "@tootallnate/once" "2" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -icss-replace-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" - integrity sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg== - -icss-utils@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -ignore@^5.1.1, ignore@^5.2.0: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -import-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-3.0.0.tgz#20845547718015126ea9b3676b7592fb8bd4cf92" - integrity sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg== - dependencies: - import-from "^3.0.0" - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" - integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== - dependencies: - resolve-from "^5.0.0" - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@^1.3.4: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== - dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" - side-channel "^1.0.4" - -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-builtin-module@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" - integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== - dependencies: - builtin-modules "^3.3.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.11.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-inside@^3.0.1, is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-reference@^1.1.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" - integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== - dependencies: - "@types/estree" "*" - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== - 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" - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-windows@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" - integrity sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q== - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-hook@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" - integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== - dependencies: - append-transform "^2.0.0" - -istanbul-lib-instrument@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-processinfo@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz#366d454cd0dcb7eb6e0e419378e60072c8626169" - integrity sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg== - dependencies: - archy "^1.0.0" - cross-spawn "^7.0.3" - istanbul-lib-coverage "^3.2.0" - p-map "^3.0.0" - rimraf "^3.0.0" - uuid "^8.3.2" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.0.2, istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jest-canvas-mock@^2.4.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/jest-canvas-mock/-/jest-canvas-mock-2.5.1.tgz#81509af658ef485e9a1bf39c64e06761517bdbcb" - integrity sha512-IVnRiz+v4EYn3ydM/pBo8GW/J+nU/Hg5gHBQQOUQhdRyNfvHnabB8ReqARLO0p+kvQghqr4V0tA92CF3JcUSRg== - dependencies: - cssfontparser "^1.2.1" - moo-color "^1.0.2" - -jest-changed-files@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" - integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== - dependencies: - execa "^5.0.0" - p-limit "^3.1.0" - -jest-circus@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317" - integrity sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/expect" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - is-generator-fn "^2.0.0" - jest-each "^29.5.0" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-runtime "^29.5.0" - jest-snapshot "^29.5.0" - jest-util "^29.5.0" - p-limit "^3.1.0" - pretty-format "^29.5.0" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67" - integrity sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw== - dependencies: - "@jest/core" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/types" "^29.5.0" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^29.5.0" - jest-util "^29.5.0" - jest-validate "^29.5.0" - prompts "^2.0.1" - yargs "^17.3.1" - -jest-config@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da" - integrity sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.5.0" - "@jest/types" "^29.5.0" - babel-jest "^29.5.0" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.5.0" - jest-environment-node "^29.5.0" - jest-get-type "^29.4.3" - jest-regex-util "^29.4.3" - jest-resolve "^29.5.0" - jest-runner "^29.5.0" - jest-util "^29.5.0" - jest-validate "^29.5.0" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.5.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^28.0.2: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" - integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== - dependencies: - chalk "^4.0.0" - diff-sequences "^28.1.1" - jest-get-type "^28.0.2" - pretty-format "^28.1.3" - -jest-diff@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" - integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.4.3" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-docblock@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" - integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== - dependencies: - detect-newline "^3.0.0" - -jest-each@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06" - integrity sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA== - dependencies: - "@jest/types" "^29.5.0" - chalk "^4.0.0" - jest-get-type "^29.4.3" - jest-util "^29.5.0" - pretty-format "^29.5.0" - -jest-environment-jsdom@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-28.1.3.tgz#2d4e5d61b7f1d94c3bddfbb21f0308ee506c09fb" - integrity sha512-HnlGUmZRdxfCByd3GM2F100DgQOajUBzEitjGqIREcb45kGjZvRrKUdlaF6escXBdcXNl0OBh+1ZrfeZT3GnAg== - dependencies: - "@jest/environment" "^28.1.3" - "@jest/fake-timers" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/jsdom" "^16.2.4" - "@types/node" "*" - jest-mock "^28.1.3" - jest-util "^28.1.3" - jsdom "^19.0.0" - -jest-environment-node@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967" - integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/fake-timers" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-mock "^29.5.0" - jest-util "^29.5.0" - -jest-fetch-mock@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz#31749c456ae27b8919d69824f1c2bd85fe0a1f3b" - integrity sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw== - dependencies: - cross-fetch "^3.0.4" - promise-polyfill "^8.1.3" - -jest-get-type@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" - integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== - -jest-get-type@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" - integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== - -jest-haste-map@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de" - integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA== - dependencies: - "@jest/types" "^29.5.0" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.4.3" - jest-util "^29.5.0" - jest-worker "^29.5.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz#cf4bdea9615c72bac4a3a7ba7e7930f9c0610c8c" - integrity sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow== - dependencies: - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-matcher-utils@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" - integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== - dependencies: - chalk "^4.0.0" - jest-diff "^29.5.0" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-message-util@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" - integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^28.1.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^28.1.3" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-message-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" - integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.5.0" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.5.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.3.tgz#d4e9b1fc838bea595c77ab73672ebf513ab249da" - integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA== - dependencies: - "@jest/types" "^28.1.3" - "@types/node" "*" - -jest-mock@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" - integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-util "^29.5.0" - -jest-playwright-preset@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/jest-playwright-preset/-/jest-playwright-preset-3.0.1.tgz#91c5c2bf4c87ba879d8d9a7ef914ff4904b05c3d" - integrity sha512-tHqv+JUmheNMZpmH7XyT5CAMHr3ExTUIY9baMPzcJiLYPvCaPTwig9YvuGGnXV2n+Epmch0Ld4429g6py0nq0w== - dependencies: - expect-playwright "^0.8.0" - jest-process-manager "^0.3.1" - nyc "^15.1.0" - playwright-core ">=1.2.0" - rimraf "^3.0.2" - uuid "^8.3.2" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-process-manager@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/jest-process-manager/-/jest-process-manager-0.3.1.tgz#e748da83ea66ac5073087feb1150ba1270332b2e" - integrity sha512-x9W54UgZ7IkzUHgXtnI1x4GKOVjxtwW0CA/7yGbTHtT/YhENO0Lic2yfVyC/gekn7OIEMcQmy0L1r9WLQABfqw== - dependencies: - "@types/wait-on" "^5.2.0" - chalk "^4.1.0" - cwd "^0.10.0" - exit "^0.1.2" - find-process "^1.4.4" - prompts "^2.4.1" - signal-exit "^3.0.3" - spawnd "^5.0.0" - tree-kill "^1.2.2" - wait-on "^5.3.0" - -jest-regex-util@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" - integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== - -jest-resolve-dependencies@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz#f0ea29955996f49788bf70996052aa98e7befee4" - integrity sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg== - dependencies: - jest-regex-util "^29.4.3" - jest-snapshot "^29.5.0" - -jest-resolve@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc" - integrity sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.5.0" - jest-validate "^29.5.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - -jest-runner@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8" - integrity sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ== - dependencies: - "@jest/console" "^29.5.0" - "@jest/environment" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.4.3" - jest-environment-node "^29.5.0" - jest-haste-map "^29.5.0" - jest-leak-detector "^29.5.0" - jest-message-util "^29.5.0" - jest-resolve "^29.5.0" - jest-runtime "^29.5.0" - jest-util "^29.5.0" - jest-watcher "^29.5.0" - jest-worker "^29.5.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420" - integrity sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/fake-timers" "^29.5.0" - "@jest/globals" "^29.5.0" - "@jest/source-map" "^29.4.3" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - jest-message-util "^29.5.0" - jest-mock "^29.5.0" - jest-regex-util "^29.4.3" - jest-resolve "^29.5.0" - jest-snapshot "^29.5.0" - jest-util "^29.5.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce" - integrity sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/babel__traverse" "^7.0.6" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.5.0" - graceful-fs "^4.2.9" - jest-diff "^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" - natural-compare "^1.4.0" - pretty-format "^29.5.0" - semver "^7.3.5" - -jest-transform-css@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/jest-transform-css/-/jest-transform-css-6.0.1.tgz#95c579c98945734439c1f243b9843d5f477a9c60" - integrity sha512-i78Pi2MW6vcdsUFSRx1kPbjbEIO0pBWwh1Y+PcDrLwTv/6e5p7fzsV/gxFW/SYMHS8DUvMdRVTwVCkA/y+t0iQ== - dependencies: - common-tags "1.8.2" - cross-spawn "7.0.3" - postcss-load-config "4.0.1" - postcss-modules "4.3.1" - style-inject "0.3.0" - -jest-util@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" - integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== - dependencies: - "@jest/types" "^28.1.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-util@^29.0.0, jest-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" - integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" - integrity sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ== - dependencies: - "@jest/types" "^29.5.0" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.4.3" - leven "^3.1.0" - pretty-format "^29.5.0" - -jest-watcher@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363" - integrity sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA== - dependencies: - "@jest/test-result" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.5.0" - string-length "^4.0.1" - -jest-websocket-mock@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jest-websocket-mock/-/jest-websocket-mock-2.4.0.tgz#95ab1f89f809e57d2714427736ab7b1094fb1c3c" - integrity sha512-AOwyuRw6fgROXHxMOiTDl1/T4dh3fV4jDquha5N0csS/PNp742HeTZWPAuKppVRSQ8s3fUGgJHoyZT9JDO0hMA== - dependencies: - jest-diff "^28.0.2" - mock-socket "^9.1.0" - -jest-worker@^26.2.1: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" - integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^7.0.0" - -jest-worker@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" - integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== - dependencies: - "@types/node" "*" - jest-util "^29.5.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^29.0.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.5.0.tgz#f75157622f5ce7ad53028f2f8888ab53e1f1f24e" - integrity sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ== - dependencies: - "@jest/core" "^29.5.0" - "@jest/types" "^29.5.0" - import-local "^3.0.2" - jest-cli "^29.5.0" - -joi@^17.3.0: - version "17.9.2" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.9.2.tgz#8b2e4724188369f55451aebd1d0b1d9482470690" - integrity sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw== - dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.3" - "@sideway/formula" "^3.0.1" - "@sideway/pinpoint" "^2.0.0" - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsdom@^19.0.0: - version "19.0.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-19.0.0.tgz#93e67c149fe26816d38a849ea30ac93677e16b6a" - integrity sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A== - dependencies: - abab "^2.0.5" - acorn "^8.5.0" - acorn-globals "^6.0.0" - cssom "^0.5.0" - cssstyle "^2.3.0" - data-urls "^3.0.1" - decimal.js "^10.3.1" - domexception "^4.0.0" - escodegen "^2.0.0" - form-data "^4.0.0" - html-encoding-sniffer "^3.0.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^3.0.0" - webidl-conversions "^7.0.0" - whatwg-encoding "^2.0.0" - whatwg-mimetype "^3.0.0" - whatwg-url "^10.0.0" - ws "^8.2.3" - xml-name-validator "^4.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-css@^1.5.6: - version "1.5.6" - resolved "https://registry.yarnpkg.com/json-css/-/json-css-1.5.6.tgz#eb964f834a2e4eaa1bc2f698ff5db007a26c7c00" - integrity sha512-B/0T0OxZH9tSb93tXV6VOYtXqrPz/Vgz2QrCT/4NXen8HGElYkYr9V+8IrSVTMj/ftxa8cG1kcu7f3iAMlaFlQ== - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@2.2.2, json5@^2.2.2, json5@^2.2.3: - version "2.2.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.2.tgz#64471c5bdcc564c18f7c1d4df2e2297f2457c5ab" - integrity sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ== - -jsonc-parser@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" - integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lilconfig@^2.0.3, lilconfig@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -livereload-js@^3.3.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-3.4.1.tgz#ba90fbc708ed1b9a024bb89c4ee12c96ea03d66f" - integrity sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g== - -livereload@^0.9.1: - version "0.9.3" - resolved "https://registry.yarnpkg.com/livereload/-/livereload-0.9.3.tgz#a714816375ed52471408bede8b49b2ee6a0c55b1" - integrity sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw== - dependencies: - chokidar "^3.5.0" - livereload-js "^3.3.1" - opts ">= 1.2.0" - ws "^7.4.3" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -loader-utils@3.2.1, loader-utils@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" - integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - -lodash.flattendeep@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" - integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== - -lodash.memoize@4.x, lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lunr@^2.3.9: - version "2.3.9" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" - integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== - -magic-string@^0.25.2: - version "0.25.9" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" - integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== - dependencies: - sourcemap-codec "^1.4.8" - -magic-string@^0.26.6: - version "0.26.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.7.tgz#caf7daf61b34e9982f8228c4527474dac8981d6f" - integrity sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow== - dependencies: - sourcemap-codec "^1.4.8" - -make-dir@^3.0.0, make-dir@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@1.x, make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -marked@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" - integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== - -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== - -memorystream@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@>=2.4.6: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" - integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.5: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mock-socket@^9.1.0: - version "9.2.1" - resolved "https://registry.yarnpkg.com/mock-socket/-/mock-socket-9.2.1.tgz#cc9c0810aa4d0afe02d721dcb2b7e657c00e2282" - integrity sha512-aw9F9T9G2zpGipLLhSNh6ZpgUyUl4frcVmRN08uE1NWPWg43Wx6+sGPDbQ7E5iFZZDJW5b5bypMeAEHqTbIFag== - -moo-color@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/moo-color/-/moo-color-1.0.3.tgz#d56435f8359c8284d83ac58016df7427febece74" - integrity sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ== - dependencies: - color-name "^1.1.4" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -nanoid@^3.3.6: - version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== - -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-fetch@^2.6.11: - version "2.6.11" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" - integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== - dependencies: - whatwg-url "^5.0.0" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-preload@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" - integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== - dependencies: - process-on-spawn "^1.0.0" - -node-releases@^2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" - integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== - -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -npm-run-all@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" - integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== - dependencies: - ansi-styles "^3.2.1" - chalk "^2.4.1" - cross-spawn "^6.0.5" - memorystream "^0.3.1" - minimatch "^3.0.4" - pidtree "^0.3.0" - read-pkg "^3.0.0" - shell-quote "^1.6.1" - string.prototype.padend "^3.0.0" - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -nwsapi@^2.2.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.5.tgz#a52744c61b3889dd44b0a158687add39b8d935e2" - integrity sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ== - -nyc@^15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" - integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== - dependencies: - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - caching-transform "^4.0.0" - convert-source-map "^1.7.0" - decamelize "^1.2.0" - find-cache-dir "^3.2.0" - find-up "^4.1.0" - foreground-child "^2.0.0" - get-package-type "^0.1.0" - glob "^7.1.6" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-hook "^3.0.0" - istanbul-lib-instrument "^4.0.0" - istanbul-lib-processinfo "^2.0.2" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - make-dir "^3.0.0" - node-preload "^0.2.1" - p-map "^3.0.0" - process-on-spawn "^1.0.0" - resolve-from "^5.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - spawn-wrap "^2.0.0" - test-exclude "^6.0.0" - yargs "^15.0.2" - -object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -opener@1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" - integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - 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" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - 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" - -"opts@>= 1.2.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/opts/-/opts-2.0.2.tgz#a17e189fbbfee171da559edd8a42423bc5993ce1" - integrity sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg== - -os-homedir@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2, p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - -p-queue@^6.6.2: - version "6.6.2" - resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" - integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== - dependencies: - eventemitter3 "^4.0.4" - p-timeout "^3.2.0" - -p-timeout@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" - integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== - dependencies: - p-finally "^1.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-hash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" - integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== - dependencies: - graceful-fs "^4.1.15" - hasha "^5.0.0" - lodash.flattendeep "^4.4.0" - release-zalgo "^1.0.0" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== - -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pidtree@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" - integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== - -pify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" - integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== - -pirates@^4.0.4: - version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -pkg-dir@^4.1.0, pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -playwright-core@1.36.1: - version "1.36.1" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.36.1.tgz#f5f275d70548768ca892583519c89b237a381c77" - integrity sha512-7+tmPuMcEW4xeCL9cp9KxmYpQYHKkyjwoXRnoeTowaeNat8PoBMk/HwCYhqkH2fRkshfKEOiVus/IhID2Pg8kg== - -playwright-core@>=1.2.0: - version "1.35.1" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.35.1.tgz#52c1e6ffaa6a8c29de1a5bdf8cce0ce290ffb81d" - integrity sha512-pNXb6CQ7OqmGDRspEjlxE49w+4YtR6a3X6mT1hZXeJHWmsEz7SunmvZeiG/+y1yyMZdHnnn73WKYdtV1er0Xyg== - -playwright@^1.36.1: - version "1.36.1" - resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.36.1.tgz#bd01541048b4ea54bcf1989e61e0129f34d2df71" - integrity sha512-2ZqHpD0U0COKR8bqR3W5IkyIAAM0mT9FgGJB9xWCI1qAUkqLxJskA1ueeQOTH2Qfz3+oxdwwf2EzdOX+RkZmmQ== - dependencies: - playwright-core "1.36.1" - -postcss-calc@^8.2.3: - version "8.2.4" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" - integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== - dependencies: - postcss-selector-parser "^6.0.9" - postcss-value-parser "^4.2.0" - -postcss-colormin@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" - integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - colord "^2.9.1" - postcss-value-parser "^4.2.0" - -postcss-convert-values@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" - integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-discard-comments@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" - integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== - -postcss-discard-duplicates@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" - integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== - -postcss-discard-empty@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" - integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== - -postcss-discard-overridden@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" - integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== - -postcss-load-config@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.1.tgz#152383f481c2758274404e4962743191d73875bd" - integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== - dependencies: - lilconfig "^2.0.5" - yaml "^2.1.1" - -postcss-load-config@^3.0.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" - integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== - dependencies: - lilconfig "^2.0.5" - yaml "^1.10.2" - -postcss-merge-longhand@^5.1.7: - version "5.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" - integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== - dependencies: - postcss-value-parser "^4.2.0" - stylehacks "^5.1.1" - -postcss-merge-rules@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" - integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - cssnano-utils "^3.1.0" - postcss-selector-parser "^6.0.5" - -postcss-minify-font-values@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" - integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-minify-gradients@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" - integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== - dependencies: - colord "^2.9.1" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-params@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" - integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== - dependencies: - browserslist "^4.21.4" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-selectors@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" - integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" - integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-modules@4.3.1, postcss-modules@^4.0.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/postcss-modules/-/postcss-modules-4.3.1.tgz#517c06c09eab07d133ae0effca2c510abba18048" - integrity sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q== - dependencies: - generic-names "^4.0.0" - icss-replace-symbols "^1.1.0" - lodash.camelcase "^4.3.0" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - string-hash "^1.1.1" - -postcss-normalize-charset@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" - integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== - -postcss-normalize-display-values@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" - integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-positions@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" - integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-repeat-style@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" - integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-string@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" - integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-timing-functions@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" - integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-unicode@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" - integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-normalize-url@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" - integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== - dependencies: - normalize-url "^6.0.1" - postcss-value-parser "^4.2.0" - -postcss-normalize-whitespace@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" - integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-ordered-values@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" - integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== - dependencies: - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-reduce-initial@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" - integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - -postcss-reduce-transforms@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" - integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.0.13" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" - integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-svgo@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" - integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== - dependencies: - postcss-value-parser "^4.2.0" - svgo "^2.7.0" - -postcss-unique-selectors@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" - integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^8.4.16: - version "8.4.24" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df" - integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - -pretty-format@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" - integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== - dependencies: - "@jest/schemas" "^28.1.3" - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -pretty-format@^29.0.0, pretty-format@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" - integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== - dependencies: - "@jest/schemas" "^29.4.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -process-on-spawn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" - integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== - dependencies: - fromentries "^1.2.0" - -promise-polyfill@^8.1.3: - version "8.3.0" - resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.3.0.tgz#9284810268138d103807b11f4e23d5e945a4db63" - integrity sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg== - -promise.series@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/promise.series/-/promise.series-0.2.0.tgz#2cc7ebe959fc3a6619c04ab4dbdc9e452d864bbd" - integrity sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ== - -prompts@^2.0.1, prompts@^2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -pure-rand@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" - integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -regexp.prototype.flags@^1.4.3: - version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - functions-have-names "^1.2.3" - -release-zalgo@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" - integrity sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA== - dependencies: - es6-error "^4.0.1" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-dir@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" - integrity sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA== - dependencies: - expand-tilde "^1.2.2" - global-modules "^0.2.3" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve.exports@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" - integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== - -resolve@^1.10.0, resolve@^1.11.0, resolve@^1.19.0, resolve@^1.20.0: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rollup-plugin-commonjs@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz#417af3b54503878e084d127adf4d1caf8beb86fb" - integrity sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q== - dependencies: - estree-walker "^0.6.1" - is-reference "^1.1.2" - magic-string "^0.25.2" - resolve "^1.11.0" - rollup-pluginutils "^2.8.1" - -rollup-plugin-delete@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-delete/-/rollup-plugin-delete-2.0.0.tgz#262acf80660d48c3b167fb0baabd0c3ab985c153" - integrity sha512-/VpLMtDy+8wwRlDANuYmDa9ss/knGsAgrDhM+tEwB1npHwNu4DYNmDfUL55csse/GHs9Q+SMT/rw9uiaZ3pnzA== - dependencies: - del "^5.1.0" - -rollup-plugin-dts@^4.2.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/rollup-plugin-dts/-/rollup-plugin-dts-4.2.3.tgz#04c3615df1ffab4228aa9d540697eaca61e01f47" - integrity sha512-jlcpItqM2efqfIiKzDB/IKOS9E9fDvbkJSGw5GtK/PqPGS9eC3R3JKyw2VvpTktZA+TNgJRMu1NTv244aTUzzQ== - dependencies: - magic-string "^0.26.6" - optionalDependencies: - "@babel/code-frame" "^7.18.6" - -rollup-plugin-livereload@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/rollup-plugin-livereload/-/rollup-plugin-livereload-2.0.5.tgz#4747fa292a2cceb0c972c573d71b3d66b4252b37" - integrity sha512-vqQZ/UQowTW7VoiKEM5ouNW90wE5/GZLfdWuR0ELxyKOJUIaj+uismPZZaICU4DnWPVjnpCDDxEqwU7pcKY/PA== - dependencies: - livereload "^0.9.1" - -rollup-plugin-postcss@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-postcss/-/rollup-plugin-postcss-4.0.2.tgz#15e9462f39475059b368ce0e49c800fa4b1f7050" - integrity sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w== - dependencies: - chalk "^4.1.0" - concat-with-sourcemaps "^1.1.0" - cssnano "^5.0.1" - import-cwd "^3.0.0" - p-queue "^6.6.2" - pify "^5.0.0" - postcss-load-config "^3.0.0" - postcss-modules "^4.0.0" - promise.series "^0.2.0" - resolve "^1.19.0" - rollup-pluginutils "^2.8.2" - safe-identifier "^0.4.2" - style-inject "^0.3.0" - -rollup-plugin-serve@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-serve/-/rollup-plugin-serve-2.0.2.tgz#f49958b0725c9bd2fef976d23025a361e20bdee2" - integrity sha512-ALqyTbPhlf7FZ5RzlbDvMYvbKuCHWginJkTo6dMsbgji/a78IbsXox+pC83HENdkTRz8OXrTj+aShp3+3ratpg== - dependencies: - mime ">=2.4.6" - opener "1" - -rollup-plugin-terser@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" - integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== - dependencies: - "@babel/code-frame" "^7.10.4" - jest-worker "^26.2.1" - serialize-javascript "^4.0.0" - terser "^5.0.0" - -rollup-plugin-typescript2@^0.32.1: - version "0.32.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.32.1.tgz#470ded8e1965efac02043cc0ef4a7fa36bed83b9" - integrity sha512-RanO8bp1WbeMv0bVlgcbsFNCn+Y3rX7wF97SQLDxf0fMLsg0B/QFF005t4AsGUcDgF3aKJHoqt4JF2xVaABeKw== - dependencies: - "@rollup/pluginutils" "^4.1.2" - find-cache-dir "^3.3.2" - fs-extra "^10.0.0" - resolve "^1.20.0" - tslib "^2.4.0" - -rollup-pluginutils@^2.8.1, rollup-pluginutils@^2.8.2: - version "2.8.2" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" - integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== - dependencies: - estree-walker "^0.6.1" - -rollup@^2.76.0: - version "2.79.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" - integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== - optionalDependencies: - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^6.6.3: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -safe-buffer@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-identifier@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/safe-identifier/-/safe-identifier-0.4.2.tgz#cf6bfca31c2897c588092d1750d30ef501d59fcb" - integrity sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w== - -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" - -"safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - -"semver@2 || 3 || 4 || 5", semver@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@7.x, semver@^7.3.5, semver@^7.3.7: - version "7.5.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" - integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== - dependencies: - lru-cache "^6.0.0" - -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -serialize-javascript@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" - integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== - dependencies: - randombytes "^2.1.0" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.6.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== - -shiki@^0.14.1: - version "0.14.2" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.2.tgz#d51440800b701392b31ce2336036058e338247a1" - integrity sha512-ltSZlSLOuSY0M0Y75KA+ieRaZ0Trf5Wl3gutE7jzLuIcWxLp5i/uEnLoQWNvgKXQ5OMpGkJnVMRLAuzjc0LJ2A== - dependencies: - ansi-sequence-parser "^1.1.0" - jsonc-parser "^3.2.0" - vscode-oniguruma "^1.7.0" - vscode-textmate "^8.0.0" - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -sourcemap-codec@^1.4.8: - version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - -spawn-wrap@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" - integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== - dependencies: - foreground-child "^2.0.0" - is-windows "^1.0.2" - make-dir "^3.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - which "^2.0.1" - -spawnd@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/spawnd/-/spawnd-5.0.0.tgz#ea72200bdc468998e84e1c3e7b914ce85fc1c32c" - integrity sha512-28+AJr82moMVWolQvlAIv3JcYDkjkFTEmfDc503wxrF5l2rQ3dFz6DpbXp3kD4zmgGGldfM4xM4v1sFj/ZaIOA== - dependencies: - exit "^0.1.2" - signal-exit "^3.0.3" - tree-kill "^1.2.2" - wait-port "^0.2.9" - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.13" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" - integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -string-hash@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" - integrity sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A== - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.padend@^3.0.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz#2c43bb3a89eb54b6750de5942c123d6c98dd65b6" - integrity sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -style-inject@0.3.0, style-inject@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/style-inject/-/style-inject-0.3.0.tgz#d21c477affec91811cc82355832a700d22bf8dd3" - integrity sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw== - -stylehacks@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" - integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== - dependencies: - browserslist "^4.21.4" - postcss-selector-parser "^6.0.4" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svgo@^2.7.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" - integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== - dependencies: - "@trysound/sax" "0.2.0" - commander "^7.2.0" - css-select "^4.1.3" - css-tree "^1.1.3" - csso "^4.2.0" - picocolors "^1.0.0" - stable "^0.1.8" - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -terser@^5.0.0: - version "5.18.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.18.1.tgz#6d8642508ae9fb7b48768e48f16d675c89a78460" - integrity sha512-j1n0Ao919h/Ai5r43VAnfV/7azUYW43GPxK7qSATzrsERfW7+y2QW9Cp9ufnRF5CQUWbnLSo7UJokSWCqg4tsQ== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" - commander "^2.20.0" - source-map-support "~0.5.20" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tough-cookie@^4.0.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" - integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" - integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== - dependencies: - punycode "^2.1.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -ts-jest@^29.0.3: - version "29.1.0" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.0.tgz#4a9db4104a49b76d2b368ea775b6c9535c603891" - integrity sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA== - dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" - jest-util "^29.0.0" - json5 "^2.2.3" - lodash.memoize "4.x" - make-error "1.x" - semver "7.x" - yargs-parser "^21.0.1" - -ts-node@^10.9.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tslib@^1.8.1, tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.4.0: - version "2.5.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" - integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.8.0: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - is-typed-array "^1.1.9" - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typedoc-plugin-missing-exports@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-2.1.0.tgz#f283a407eb7b3a43dafc598f44bbfc2d36dc1704" - integrity sha512-+1DhqZCEu7Vu5APnrqpPwl31D+hXpt1fV0Le9ycCRL1eLVdatdl6KVt4SEVwPxnEpKwgOn2dNX6I9+0F1aO2aA== - -typedoc@^0.25.2: - version "0.25.2" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.25.2.tgz#39f525c28b6eb61da54dda4ec6b1500df620bed8" - integrity sha512-286F7BeATBiWe/qC4PCOCKlSTwfnsLbC/4cZ68oGBbvAqb9vV33quEOXx7q176OXotD+JdEerdQ1OZGJ818lnA== - dependencies: - lunr "^2.3.9" - marked "^4.3.0" - minimatch "^9.0.3" - shiki "^0.14.1" - -typescript@^4.7.4: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -update-browserslist-db@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -util-deprecate@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -v8-to-istanbul@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" - integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vscode-oniguruma@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" - integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== - -vscode-textmate@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d" - integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923" - integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg== - dependencies: - xml-name-validator "^4.0.0" - -wait-on@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-5.3.0.tgz#584e17d4b3fe7b46ac2b9f8e5e102c005c2776c7" - integrity sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg== - dependencies: - axios "^0.21.1" - joi "^17.3.0" - lodash "^4.17.21" - minimist "^1.2.5" - rxjs "^6.6.3" - -wait-port@^0.2.9: - version "0.2.14" - resolved "https://registry.yarnpkg.com/wait-port/-/wait-port-0.2.14.tgz#6df40629be2c95aa4073ceb895abef7d872b28c6" - integrity sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ== - dependencies: - chalk "^2.4.2" - commander "^3.0.2" - debug "^4.1.1" - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webidl-conversions@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" - integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== - -whatwg-encoding@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" - integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== - dependencies: - iconv-lite "0.6.3" - -whatwg-mimetype@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" - integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== - -whatwg-url@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-10.0.0.tgz#37264f720b575b4a311bd4094ed8c760caaa05da" - integrity sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w== - dependencies: - tr46 "^3.0.0" - webidl-conversions "^7.0.0" - -whatwg-url@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" - integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== - dependencies: - tr46 "^3.0.0" - webidl-conversions "^7.0.0" - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-module@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" - integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== - -which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== - 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" - is-typed-array "^1.1.10" - -which@^1.2.12, which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -ws@^7.4.3: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -ws@^8.2.3: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== - -xml-name-validator@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" - integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yaml@^2.1.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" - integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== - -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^21.0.1, yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^15.0.2: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - -yargs@^17.3.1: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==

+