From cd39afb6ff78c50d80d8a3a389a073081124f03f Mon Sep 17 00:00:00 2001 From: Bat-Zion Rotman Date: Mon, 25 Nov 2024 17:01:36 +0200 Subject: [PATCH] chore(orchestrator): deprecate orchestrator --- .changeset/slow-eagles-refuse.md | 2 + plugins/orchestrator-backend/.eslintignore | 3 - plugins/orchestrator-backend/.eslintrc.js | 11 - plugins/orchestrator-backend/.gitignore | 1 - .../orchestrator-backend/.lintstagedrc.json | 4 - plugins/orchestrator-backend/.prettierignore | 13 - plugins/orchestrator-backend/.prettierrc.js | 20 - plugins/orchestrator-backend/CHANGELOG.md | 732 -- plugins/orchestrator-backend/README.md | 6 +- .../mockComposedGreetingWorfklow.ts | 129 - .../__fixtures__/mockGreetingWorkflowData.ts | 114 - .../mockSpringBootWorkflowData.ts | 580 - .../app-config.janus-idp.yaml | 3 - .../orchestrator-backend/catalog-info.yaml | 25 - plugins/orchestrator-backend/dev/index.ts | 9 - plugins/orchestrator-backend/package.json | 109 - .../src/OrchestratorPlugin.ts | 60 - .../src/helpers/errorBuilder.ts | 34 - .../src/helpers/filterBuilder.ts | 269 - .../src/helpers/filterBuilders.test.ts | 553 - .../src/helpers/queryBuilder.test.ts | 82 - .../src/helpers/queryBuilder.ts | 52 - plugins/orchestrator-backend/src/index.ts | 1 - plugins/orchestrator-backend/src/plugin.ts | 44 - .../src/routerWrapper/index.ts | 59 - .../src/service/DataIndexService.test.ts | 786 -- .../src/service/DataIndexService.ts | 550 - .../src/service/DataInputSchemaService.ts | 11 - .../src/service/DevModeService.ts | 205 - .../src/service/GitService.ts | 93 - .../src/service/GitWrapper/git.ts | 354 - .../src/service/GitWrapper/index.ts | 4 - .../src/service/Helper.test.ts | 49 - .../src/service/Helper.ts | 76 - .../src/service/OrchestratorService.test.ts | 656 - .../src/service/OrchestratorService.ts | 214 - .../src/service/ScaffolderService.ts | 118 - .../src/service/SonataFlowService.test.ts | 355 - .../src/service/SonataFlowService.ts | 253 - .../src/service/WorkflowCacheService.ts | 112 - .../mockProcessDefinitionArgumentsData.ts | 105 - .../mockProcessInstanceArgumentsData.ts | 354 - .../service/api/mapping/V2Mappings.test.ts | 159 - .../src/service/api/mapping/V2Mappings.ts | 194 - .../__fixtures__/assessedProcessInstance.json | 143 - .../src/service/api/test-utils.ts | 143 - .../src/service/api/v2.test.ts | 561 - .../src/service/api/v2.ts | 262 - .../src/service/constants.ts | 4 - .../src/types/pagination.test.ts | 59 - .../src/types/pagination.ts | 75 - .../generated/envelope/combined.bundle.js | 1 - .../generated/envelope/diagram.bundle.js | 1 - .../7B8391DDA1E35A2797E163B741F050D7.cache.js | 80 - .../E0FAC72ADB096551A5346E4435AA4F35.cache.js | 80 - .../daterangepicker.css | 365 - .../css/bootstrap-select.min.css | 279 - .../clear.cache.gif | Bin 43 -> 0 bytes .../compilation-mappings.txt | 7 - .../css/animate-3.5.2.min.cache.css | 2967 ----- .../css/bootstrap-3.4.1.min.cache.css | 6971 ----------- .../bootstrap-datepicker3-1.6.4.min.cache.css | 471 - ...otstrap-datetimepicker-2.4.4.min.cache.css | 367 - .../css/bootstrap-notify-custom.min.cache.css | 9 - .../css/bootstrap-slider-9.2.0.min.cache.css | 264 - .../css/bootstrap-theme-3.4.1.min.cache.css | 614 - .../css/card-1.0.1.cache.css | 89 - .../css/font-awesome-4.7.0.min.cache.css | 2335 ---- .../css/patternfly-additions.min.css | 6662 ---------- .../css/patternfly.min.css | 10014 ---------------- .../css/typeahead-0.10.5.min.cache.css | 69 - .../fonts/FontAwesome.otf | Bin 134808 -> 0 bytes .../fonts/OpenSans-Bold-webfont.ttf | Bin 38452 -> 0 bytes .../fonts/OpenSans-BoldItalic-webfont.ttf | Bin 39076 -> 0 bytes .../fonts/OpenSans-ExtraBold-webfont.ttf | Bin 42024 -> 0 bytes .../OpenSans-ExtraBoldItalic-webfont.ttf | Bin 43420 -> 0 bytes .../fonts/OpenSans-Italic-webfont.ttf | Bin 38412 -> 0 bytes .../fonts/OpenSans-Light-webfont.ttf | Bin 37336 -> 0 bytes .../fonts/OpenSans-LightItalic-webfont.ttf | Bin 39956 -> 0 bytes .../fonts/OpenSans-Regular-webfont.ttf | Bin 38232 -> 0 bytes .../fonts/OpenSans-Semibold-webfont.ttf | Bin 39476 -> 0 bytes .../fonts/OpenSans-SemiboldItalic-webfont.ttf | Bin 40252 -> 0 bytes .../fonts/PatternFlyIcons-webfont.ttf | Bin 20676 -> 0 bytes .../fonts/fontawesome-webfont.eot | Bin 165742 -> 0 bytes .../fonts/fontawesome-webfont.svg | 2671 ----- .../fonts/fontawesome-webfont.ttf | Bin 152796 -> 0 bytes .../fonts/fontawesome-webfont.woff | Bin 98024 -> 0 bytes .../fonts/fontawesome-webfont.woff2 | Bin 77160 -> 0 bytes .../fonts/glyphicons-halflings-regular.eot | Bin 20127 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 288 - .../fonts/glyphicons-halflings-regular.ttf | Bin 45404 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23424 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 18028 -> 0 bytes .../jquery-ui/jquery-ui.min.css | 879 -- .../js/bootstrap-3.4.1.min.cache.js | 1498 --- .../js/gwtbootstrap3.js | 91 - .../js/jquery-1.12.4.min.cache.js | 5007 -------- ...ommon.stunner.sw.KogitoSWEditor.devmode.js | 1 - ...ommon.stunner.sw.KogitoSWEditor.nocache.js | 27 - .../uberfire-patternfly.css | 342 - .../generated/envelope/editor.worker.js | 1 - .../static/generated/envelope/json.worker.js | 1 - .../generated/envelope/monaco-editor.chunk.js | 1 - ...ess-workflow-combined-editor-envelope.html | 10 - ...less-workflow-diagram-editor-envelope.html | 10 - ...verless-workflow-text-editor-envelope.html | 10 - .../static/generated/envelope/text.bundle.js | 22 - .../generated/envelope/yaml.worker.worker.js | 22 - plugins/orchestrator-backend/tsconfig.json | 9 - plugins/orchestrator-backend/turbo.json | 8 - plugins/orchestrator-common/.eslintignore | 2 - plugins/orchestrator-common/.eslintrc.js | 3 - plugins/orchestrator-common/.gitignore | 1 - .../orchestrator-common/.lintstagedrc.json | 4 - plugins/orchestrator-common/.prettierignore | 13 - plugins/orchestrator-common/.prettierrc.js | 20 - plugins/orchestrator-common/CHANGELOG.md | 222 - plugins/orchestrator-common/README.md | 6 +- plugins/orchestrator-common/catalog-info.yaml | 25 - plugins/orchestrator-common/config.d.ts | 66 - plugins/orchestrator-common/openapitools.json | 7 - plugins/orchestrator-common/package.json | 80 - .../orchestrator-common/scripts/openapi.sh | 82 - .../orchestrator-common/src/QueryParams.ts | 5 - plugins/orchestrator-common/src/constants.ts | 10 - .../src/generated/client/.gitignore | 4 - .../src/generated/client/.npmignore | 1 - .../client/.openapi-generator-ignore | 23 - .../generated/client/.openapi-generator/FILES | 9 - .../client/.openapi-generator/VERSION | 1 - .../src/generated/client/base.ts | 86 - .../src/generated/client/common.ts | 150 - .../src/generated/client/configuration.ts | 110 - .../src/generated/client/git_push.sh | 57 - .../src/generated/client/index.ts | 18 - .../docs/html/.openapi-generator-ignore | 23 - .../docs/html/.openapi-generator/FILES | 2 - .../docs/html/.openapi-generator/VERSION | 1 - .../docs/markdown/.openapi-generator-ignore | 23 - .../docs/markdown/.openapi-generator/FILES | 34 - .../docs/markdown/.openapi-generator/VERSION | 1 - .../Models/AssessedProcessInstanceDTO.md | 10 - .../docs/markdown/Models/ErrorResponse.md | 10 - .../Models/ExecuteWorkflowRequestDTO.md | 9 - .../Models/ExecuteWorkflowResponseDTO.md | 9 - .../docs/markdown/Models/FieldFilter.md | 11 - .../docs/markdown/Models/FieldFilter_value.md | 8 - .../generated/docs/markdown/Models/Filter.md | 12 - .../markdown/Models/GetInstancesRequest.md | 10 - .../Models/GetOverviewsRequestParams.md | 10 - .../markdown/Models/InputSchemaResponseDTO.md | 10 - .../docs/markdown/Models/LogicalFilter.md | 10 - .../docs/markdown/Models/NodeInstanceDTO.md | 16 - .../docs/markdown/Models/PaginationInfoDTO.md | 13 - .../markdown/Models/ProcessInstanceDTO.md | 23 - .../Models/ProcessInstanceErrorDTO.md | 11 - .../Models/ProcessInstanceListResultDTO.md | 10 - .../Models/ProcessInstanceStatusDTO.md | 8 - .../docs/markdown/Models/SearchRequest.md | 10 - .../markdown/Models/WorkflowCategoryDTO.md | 8 - .../docs/markdown/Models/WorkflowDTO.md | 14 - .../docs/markdown/Models/WorkflowDataDTO.md | 9 - .../docs/markdown/Models/WorkflowFormatDTO.md | 8 - .../markdown/Models/WorkflowListResultDTO.md | 10 - .../markdown/Models/WorkflowOverviewDTO.md | 17 - .../Models/WorkflowOverviewListResultDTO.md | 10 - .../markdown/Models/WorkflowProgressDTO.md | 18 - .../docs/markdown/Models/WorkflowResultDTO.md | 12 - .../WorkflowResultDTO_nextWorkflows_inner.md | 10 - .../Models/WorkflowResultDTO_outputs_inner.md | 11 - .../WorkflowResultDTO_outputs_inner_value.md | 8 - .../markdown/Models/WorkflowRunStatusDTO.md | 10 - .../src/generated/docs/markdown/README.md | 62 - plugins/orchestrator-common/src/index.ts | 9 - plugins/orchestrator-common/src/models.ts | 119 - .../orchestrator-common/src/permissions.ts | 40 - plugins/orchestrator-common/src/types.ts | 127 - .../src/utils/StringUtils.ts | 8 - .../orchestrator-common/src/workflow.test.ts | 13 - plugins/orchestrator-common/src/workflow.ts | 106 - plugins/orchestrator-common/tsconfig.json | 9 - plugins/orchestrator-common/turbo.json | 8 - plugins/orchestrator-form-api/.eslintignore | 2 - plugins/orchestrator-form-api/.eslintrc.js | 1 - .../orchestrator-form-api/.lintstagedrc.json | 4 - plugins/orchestrator-form-api/.prettierignore | 12 - plugins/orchestrator-form-api/.prettierrc.js | 20 - .../orchestrator-form-api/.versionhistory.md | 1 - plugins/orchestrator-form-api/CHANGELOG.md | 33 - plugins/orchestrator-form-api/README.md | 6 +- plugins/orchestrator-form-api/package.json | 50 - plugins/orchestrator-form-api/src/api.ts | 50 - plugins/orchestrator-form-api/src/index.ts | 4 - plugins/orchestrator-form-api/tsconfig.json | 9 - plugins/orchestrator-form-api/turbo.json | 8 - plugins/orchestrator-form-react/.eslintignore | 2 - plugins/orchestrator-form-react/.eslintrc.js | 1 - .../.lintstagedrc.json | 4 - .../orchestrator-form-react/.prettierignore | 12 - .../orchestrator-form-react/.prettierrc.js | 20 - .../.versionhistory.md | 1 - plugins/orchestrator-form-react/CHANGELOG.md | 131 - plugins/orchestrator-form-react/README.md | 6 +- plugins/orchestrator-form-react/package.json | 63 - .../src/DefaultFormApi.tsx | 18 - .../src/components/OrchestratorForm.tsx | 134 - .../components/OrchestratorFormStepper.tsx | 109 - .../components/OrchestratorFormWrapper.tsx | 156 - .../src/components/ReviewStep.tsx | 60 - .../src/components/StepperObjectField.tsx | 69 - .../src/components/SubmitButton.tsx | 40 - .../src/components/index.ts | 2 - .../src/components/useStyles.ts | 0 plugins/orchestrator-form-react/src/index.ts | 11 - .../src/utils/StepperContext.tsx | 46 - .../src/utils/generateReviewTableData.test.ts | 154 - .../src/utils/generateReviewTableData.ts | 61 - .../src/utils/generateUiSchema.test.ts | 516 - .../src/utils/generateUiSchema.ts | 223 - .../src/utils/useValidator.ts | 87 - plugins/orchestrator-form-react/tsconfig.json | 9 - plugins/orchestrator-form-react/turbo.json | 8 - .../.eslintignore | 2 - .../.eslintrc.js | 1 - .../.lintstagedrc.json | 4 - .../.prettierignore | 12 - .../.prettierrc.js | 20 - .../README.md | 33 +- .../catalog-info.yaml | 25 - .../package.json | 86 - .../scripts/build.sh | 7 - .../scripts/postbuild.js | 114 - .../src/index.ejs | 25 - .../src/init/SwfEditorEnvelopeCombined.ts | 29 - .../src/init/SwfEditorEnvelopeDiagram.ts | 31 - .../src/init/SwfEditorEnvelopeText.ts | 27 - .../tsconfig.json | 11 - .../webpack.config.js | 166 - plugins/orchestrator/.eslintignore | 2 - plugins/orchestrator/.eslintrc.js | 1 - plugins/orchestrator/.lintstagedrc.json | 4 - plugins/orchestrator/.prettierignore | 12 - plugins/orchestrator/.prettierrc.js | 20 - plugins/orchestrator/CHANGELOG.md | 812 -- plugins/orchestrator/README.md | 262 +- .../orchestrator/app-config.janus-idp.yaml | 14 - plugins/orchestrator/catalog-info.yaml | 51 - plugins/orchestrator/dev/index.tsx | 17 - plugins/orchestrator/docs/Permissions.md | 47 - plugins/orchestrator/docs/executePageNext.png | Bin 138885 -> 0 bytes plugins/orchestrator/docs/executePageRun.png | Bin 135197 -> 0 bytes plugins/orchestrator/docs/extensibleForm.md | 136 - .../orchestrator/docs/orchestratorIcon.png | Bin 136688 -> 0 bytes plugins/orchestrator/docs/quickstart.md | 35 - plugins/orchestrator/docs/rbac-policy.csv | 11 - .../orchestrator/docs/workflowCompleted.png | Bin 248260 -> 0 bytes plugins/orchestrator/docs/workflowsPage.png | Bin 114122 -> 0 bytes plugins/orchestrator/package.json | 114 - plugins/orchestrator/src/api/api.ts | 52 - plugins/orchestrator/src/api/index.ts | 3 - .../src/components/BaseOrchestratorPage.tsx | 32 - .../ExecuteWorkflowPage/JsonTextAreaForm.tsx | 68 - .../src/components/InfoDialog.stories.tsx | 96 - .../src/components/InfoDialog.tsx | 62 - .../src/components/OrchestratorIcon.tsx | 13 - .../src/components/OrchestratorPage.tsx | 26 - .../orchestrator/src/components/Paragraph.tsx | 18 - .../orchestrator/src/components/Router.tsx | 32 - .../orchestrator/src/components/Selector.tsx | 69 - .../WorkflowDefinitionDetailsCard.tsx | 105 - .../WorkflowDefinitionViewerPage.tsx | 105 - .../WorkflowDefinitionViewerPage/index.ts | 1 - .../components/WorkflowDescriptionModal.tsx | 122 - .../src/components/WorkflowDialog.tsx | 75 - .../WorkflowEditor/WorkflowEditor.tsx | 304 - .../channel/WorkflowEditorLanguageService.ts | 72 - ...flowEditorLanguageServiceChannelApiImpl.ts | 35 - .../src/components/WorkflowEditor/index.ts | 2 - .../src/components/WorkflowInstancePage.tsx | 259 - .../WorkflowInstancePageContent.tsx | 161 - .../WorkflowInstanceStatusIndicator.tsx | 43 - .../src/components/WorkflowProgress.tsx | 37 - .../src/components/WorkflowProgressNode.tsx | 97 - .../components/WorkflowProgressNodeModel.ts | 53 - .../src/components/WorkflowResult.tsx | 299 - .../src/components/WorkflowRunDetail.ts | 16 - .../src/components/WorkflowRunDetails.tsx | 110 - .../src/components/WorkflowRunsTabContent.tsx | 143 - .../components/WorkflowVariablesViewer.tsx | 29 - .../src/components/WorkflowsTabContent.tsx | 45 - .../src/components/WorkflowsTable.tsx | 147 - .../components/ui/OverrideBackstageTable.tsx | 34 - plugins/orchestrator/src/constants.ts | 5 - .../src/dataFormatters/DataFormatter.ts | 5 - .../WorkflowOverviewFormatter.test.ts | 58 - .../WorkflowOverviewFormatter.ts | 49 - .../orchestrator/src/hooks/usePolling.test.ts | 182 - plugins/orchestrator/src/hooks/usePolling.ts | 68 - .../hooks/useWorkflowInstanceStatusColors.ts | 34 - plugins/orchestrator/src/index.ts | 8 - plugins/orchestrator/src/plugin.ts | 34 - plugins/orchestrator/src/routes.ts | 29 - plugins/orchestrator/src/utils/ErrorUtils.ts | 11 - .../src/utils/NodeInstanceUtils.test.ts | 210 - .../src/utils/NodeInstanceUtils.ts | 41 - plugins/orchestrator/src/utils/TypeGuards.ts | 9 - .../orchestrator/src/utils/UrlUtils.test.ts | 32 - plugins/orchestrator/src/utils/UrlUtils.ts | 18 - plugins/orchestrator/tsconfig.json | 9 - plugins/orchestrator/turbo.json | 8 - yarn.lock | 2742 +---- 311 files changed, 117 insertions(+), 63762 deletions(-) create mode 100644 .changeset/slow-eagles-refuse.md delete mode 100644 plugins/orchestrator-backend/.eslintignore delete mode 100644 plugins/orchestrator-backend/.eslintrc.js delete mode 100644 plugins/orchestrator-backend/.gitignore delete mode 100644 plugins/orchestrator-backend/.lintstagedrc.json delete mode 100644 plugins/orchestrator-backend/.prettierignore delete mode 100644 plugins/orchestrator-backend/.prettierrc.js delete mode 100644 plugins/orchestrator-backend/CHANGELOG.md delete mode 100644 plugins/orchestrator-backend/__fixtures__/mockComposedGreetingWorfklow.ts delete mode 100644 plugins/orchestrator-backend/__fixtures__/mockGreetingWorkflowData.ts delete mode 100644 plugins/orchestrator-backend/__fixtures__/mockSpringBootWorkflowData.ts delete mode 100644 plugins/orchestrator-backend/app-config.janus-idp.yaml delete mode 100644 plugins/orchestrator-backend/catalog-info.yaml delete mode 100644 plugins/orchestrator-backend/dev/index.ts delete mode 100644 plugins/orchestrator-backend/package.json delete mode 100644 plugins/orchestrator-backend/src/OrchestratorPlugin.ts delete mode 100644 plugins/orchestrator-backend/src/helpers/errorBuilder.ts delete mode 100644 plugins/orchestrator-backend/src/helpers/filterBuilder.ts delete mode 100644 plugins/orchestrator-backend/src/helpers/filterBuilders.test.ts delete mode 100644 plugins/orchestrator-backend/src/helpers/queryBuilder.test.ts delete mode 100644 plugins/orchestrator-backend/src/helpers/queryBuilder.ts delete mode 100644 plugins/orchestrator-backend/src/index.ts delete mode 100644 plugins/orchestrator-backend/src/plugin.ts delete mode 100644 plugins/orchestrator-backend/src/routerWrapper/index.ts delete mode 100644 plugins/orchestrator-backend/src/service/DataIndexService.test.ts delete mode 100644 plugins/orchestrator-backend/src/service/DataIndexService.ts delete mode 100644 plugins/orchestrator-backend/src/service/DataInputSchemaService.ts delete mode 100644 plugins/orchestrator-backend/src/service/DevModeService.ts delete mode 100644 plugins/orchestrator-backend/src/service/GitService.ts delete mode 100644 plugins/orchestrator-backend/src/service/GitWrapper/git.ts delete mode 100644 plugins/orchestrator-backend/src/service/GitWrapper/index.ts delete mode 100644 plugins/orchestrator-backend/src/service/Helper.test.ts delete mode 100644 plugins/orchestrator-backend/src/service/Helper.ts delete mode 100644 plugins/orchestrator-backend/src/service/OrchestratorService.test.ts delete mode 100644 plugins/orchestrator-backend/src/service/OrchestratorService.ts delete mode 100644 plugins/orchestrator-backend/src/service/ScaffolderService.ts delete mode 100644 plugins/orchestrator-backend/src/service/SonataFlowService.test.ts delete mode 100644 plugins/orchestrator-backend/src/service/SonataFlowService.ts delete mode 100644 plugins/orchestrator-backend/src/service/WorkflowCacheService.ts delete mode 100644 plugins/orchestrator-backend/src/service/__fixtures__/mockProcessDefinitionArgumentsData.ts delete mode 100644 plugins/orchestrator-backend/src/service/__fixtures__/mockProcessInstanceArgumentsData.ts delete mode 100644 plugins/orchestrator-backend/src/service/api/mapping/V2Mappings.test.ts delete mode 100644 plugins/orchestrator-backend/src/service/api/mapping/V2Mappings.ts delete mode 100644 plugins/orchestrator-backend/src/service/api/mapping/__fixtures__/assessedProcessInstance.json delete mode 100644 plugins/orchestrator-backend/src/service/api/test-utils.ts delete mode 100644 plugins/orchestrator-backend/src/service/api/v2.test.ts delete mode 100644 plugins/orchestrator-backend/src/service/api/v2.ts delete mode 100644 plugins/orchestrator-backend/src/service/constants.ts delete mode 100644 plugins/orchestrator-backend/src/types/pagination.test.ts delete mode 100644 plugins/orchestrator-backend/src/types/pagination.ts delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/combined.bundle.js delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram.bundle.js delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/7B8391DDA1E35A2797E163B741F050D7.cache.js delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/E0FAC72ADB096551A5346E4435AA4F35.cache.js delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/bootstrap-daterangepicker/daterangepicker.css delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/bootstrap-select/css/bootstrap-select.min.css delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/clear.cache.gif delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/compilation-mappings.txt delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/css/animate-3.5.2.min.cache.css delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/css/bootstrap-3.4.1.min.cache.css delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/css/bootstrap-datepicker3-1.6.4.min.cache.css delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/css/bootstrap-datetimepicker-2.4.4.min.cache.css delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/css/bootstrap-notify-custom.min.cache.css delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/css/bootstrap-slider-9.2.0.min.cache.css delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/css/bootstrap-theme-3.4.1.min.cache.css delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/css/card-1.0.1.cache.css delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/css/font-awesome-4.7.0.min.cache.css delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/css/patternfly-additions.min.css delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/css/patternfly.min.css delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/css/typeahead-0.10.5.min.cache.css delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/fonts/FontAwesome.otf delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/fonts/OpenSans-Bold-webfont.ttf delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/fonts/OpenSans-BoldItalic-webfont.ttf delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/fonts/OpenSans-ExtraBold-webfont.ttf delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/fonts/OpenSans-ExtraBoldItalic-webfont.ttf delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/fonts/OpenSans-Italic-webfont.ttf delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/fonts/OpenSans-Light-webfont.ttf delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/fonts/OpenSans-LightItalic-webfont.ttf delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/fonts/OpenSans-Regular-webfont.ttf delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/fonts/OpenSans-Semibold-webfont.ttf delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/fonts/OpenSans-SemiboldItalic-webfont.ttf delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/fonts/PatternFlyIcons-webfont.ttf delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/fonts/fontawesome-webfont.eot delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/fonts/fontawesome-webfont.svg delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/fonts/fontawesome-webfont.ttf delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/fonts/fontawesome-webfont.woff delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/fonts/fontawesome-webfont.woff2 delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/fonts/glyphicons-halflings-regular.eot delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/fonts/glyphicons-halflings-regular.svg delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/fonts/glyphicons-halflings-regular.ttf delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/fonts/glyphicons-halflings-regular.woff delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/fonts/glyphicons-halflings-regular.woff2 delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/jquery-ui/jquery-ui.min.css delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/js/bootstrap-3.4.1.min.cache.js delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/js/gwtbootstrap3.js delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/js/jquery-1.12.4.min.cache.js delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/org.kie.workbench.common.stunner.sw.KogitoSWEditor.devmode.js delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/org.kie.workbench.common.stunner.sw.KogitoSWEditor.nocache.js delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/diagram/org.kie.workbench.common.stunner.sw.KogitoSWEditor/uberfire-patternfly.css delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/editor.worker.js delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/json.worker.js delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/monaco-editor.chunk.js delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/serverless-workflow-combined-editor-envelope.html delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/serverless-workflow-diagram-editor-envelope.html delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/serverless-workflow-text-editor-envelope.html delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/text.bundle.js delete mode 100644 plugins/orchestrator-backend/static/generated/envelope/yaml.worker.worker.js delete mode 100644 plugins/orchestrator-backend/tsconfig.json delete mode 100644 plugins/orchestrator-backend/turbo.json delete mode 100644 plugins/orchestrator-common/.eslintignore delete mode 100644 plugins/orchestrator-common/.eslintrc.js delete mode 100644 plugins/orchestrator-common/.gitignore delete mode 100644 plugins/orchestrator-common/.lintstagedrc.json delete mode 100644 plugins/orchestrator-common/.prettierignore delete mode 100644 plugins/orchestrator-common/.prettierrc.js delete mode 100644 plugins/orchestrator-common/CHANGELOG.md delete mode 100644 plugins/orchestrator-common/catalog-info.yaml delete mode 100644 plugins/orchestrator-common/config.d.ts delete mode 100644 plugins/orchestrator-common/openapitools.json delete mode 100644 plugins/orchestrator-common/package.json delete mode 100755 plugins/orchestrator-common/scripts/openapi.sh delete mode 100644 plugins/orchestrator-common/src/QueryParams.ts delete mode 100644 plugins/orchestrator-common/src/constants.ts delete mode 100644 plugins/orchestrator-common/src/generated/client/.gitignore delete mode 100644 plugins/orchestrator-common/src/generated/client/.npmignore delete mode 100644 plugins/orchestrator-common/src/generated/client/.openapi-generator-ignore delete mode 100644 plugins/orchestrator-common/src/generated/client/.openapi-generator/FILES delete mode 100644 plugins/orchestrator-common/src/generated/client/.openapi-generator/VERSION delete mode 100644 plugins/orchestrator-common/src/generated/client/base.ts delete mode 100644 plugins/orchestrator-common/src/generated/client/common.ts delete mode 100644 plugins/orchestrator-common/src/generated/client/configuration.ts delete mode 100644 plugins/orchestrator-common/src/generated/client/git_push.sh delete mode 100644 plugins/orchestrator-common/src/generated/client/index.ts delete mode 100644 plugins/orchestrator-common/src/generated/docs/html/.openapi-generator-ignore delete mode 100644 plugins/orchestrator-common/src/generated/docs/html/.openapi-generator/FILES delete mode 100644 plugins/orchestrator-common/src/generated/docs/html/.openapi-generator/VERSION delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/.openapi-generator-ignore delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/.openapi-generator/FILES delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/.openapi-generator/VERSION delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/AssessedProcessInstanceDTO.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/ErrorResponse.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/ExecuteWorkflowRequestDTO.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/ExecuteWorkflowResponseDTO.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/FieldFilter.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/FieldFilter_value.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/Filter.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/GetInstancesRequest.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/GetOverviewsRequestParams.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/InputSchemaResponseDTO.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/LogicalFilter.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/NodeInstanceDTO.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/PaginationInfoDTO.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/ProcessInstanceDTO.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/ProcessInstanceErrorDTO.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/ProcessInstanceListResultDTO.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/ProcessInstanceStatusDTO.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/SearchRequest.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/WorkflowCategoryDTO.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/WorkflowDTO.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/WorkflowDataDTO.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/WorkflowFormatDTO.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/WorkflowListResultDTO.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/WorkflowOverviewDTO.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/WorkflowOverviewListResultDTO.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/WorkflowProgressDTO.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/WorkflowResultDTO.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/WorkflowResultDTO_nextWorkflows_inner.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/WorkflowResultDTO_outputs_inner.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/WorkflowResultDTO_outputs_inner_value.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/Models/WorkflowRunStatusDTO.md delete mode 100644 plugins/orchestrator-common/src/generated/docs/markdown/README.md delete mode 100644 plugins/orchestrator-common/src/index.ts delete mode 100644 plugins/orchestrator-common/src/models.ts delete mode 100644 plugins/orchestrator-common/src/permissions.ts delete mode 100644 plugins/orchestrator-common/src/types.ts delete mode 100644 plugins/orchestrator-common/src/utils/StringUtils.ts delete mode 100644 plugins/orchestrator-common/src/workflow.test.ts delete mode 100644 plugins/orchestrator-common/src/workflow.ts delete mode 100644 plugins/orchestrator-common/tsconfig.json delete mode 100644 plugins/orchestrator-common/turbo.json delete mode 100644 plugins/orchestrator-form-api/.eslintignore delete mode 100644 plugins/orchestrator-form-api/.eslintrc.js delete mode 100644 plugins/orchestrator-form-api/.lintstagedrc.json delete mode 100644 plugins/orchestrator-form-api/.prettierignore delete mode 100644 plugins/orchestrator-form-api/.prettierrc.js delete mode 100644 plugins/orchestrator-form-api/.versionhistory.md delete mode 100644 plugins/orchestrator-form-api/CHANGELOG.md delete mode 100644 plugins/orchestrator-form-api/package.json delete mode 100644 plugins/orchestrator-form-api/src/api.ts delete mode 100644 plugins/orchestrator-form-api/src/index.ts delete mode 100644 plugins/orchestrator-form-api/tsconfig.json delete mode 100644 plugins/orchestrator-form-api/turbo.json delete mode 100644 plugins/orchestrator-form-react/.eslintignore delete mode 100644 plugins/orchestrator-form-react/.eslintrc.js delete mode 100644 plugins/orchestrator-form-react/.lintstagedrc.json delete mode 100644 plugins/orchestrator-form-react/.prettierignore delete mode 100644 plugins/orchestrator-form-react/.prettierrc.js delete mode 100644 plugins/orchestrator-form-react/.versionhistory.md delete mode 100644 plugins/orchestrator-form-react/CHANGELOG.md delete mode 100644 plugins/orchestrator-form-react/package.json delete mode 100644 plugins/orchestrator-form-react/src/DefaultFormApi.tsx delete mode 100644 plugins/orchestrator-form-react/src/components/OrchestratorForm.tsx delete mode 100644 plugins/orchestrator-form-react/src/components/OrchestratorFormStepper.tsx delete mode 100644 plugins/orchestrator-form-react/src/components/OrchestratorFormWrapper.tsx delete mode 100644 plugins/orchestrator-form-react/src/components/ReviewStep.tsx delete mode 100644 plugins/orchestrator-form-react/src/components/StepperObjectField.tsx delete mode 100644 plugins/orchestrator-form-react/src/components/SubmitButton.tsx delete mode 100644 plugins/orchestrator-form-react/src/components/index.ts delete mode 100644 plugins/orchestrator-form-react/src/components/useStyles.ts delete mode 100644 plugins/orchestrator-form-react/src/index.ts delete mode 100644 plugins/orchestrator-form-react/src/utils/StepperContext.tsx delete mode 100644 plugins/orchestrator-form-react/src/utils/generateReviewTableData.test.ts delete mode 100644 plugins/orchestrator-form-react/src/utils/generateReviewTableData.ts delete mode 100644 plugins/orchestrator-form-react/src/utils/generateUiSchema.test.ts delete mode 100644 plugins/orchestrator-form-react/src/utils/generateUiSchema.ts delete mode 100644 plugins/orchestrator-form-react/src/utils/useValidator.ts delete mode 100644 plugins/orchestrator-form-react/tsconfig.json delete mode 100644 plugins/orchestrator-form-react/turbo.json delete mode 100644 plugins/orchestrator-swf-editor-envelope/.eslintignore delete mode 100644 plugins/orchestrator-swf-editor-envelope/.eslintrc.js delete mode 100644 plugins/orchestrator-swf-editor-envelope/.lintstagedrc.json delete mode 100644 plugins/orchestrator-swf-editor-envelope/.prettierignore delete mode 100644 plugins/orchestrator-swf-editor-envelope/.prettierrc.js delete mode 100644 plugins/orchestrator-swf-editor-envelope/catalog-info.yaml delete mode 100644 plugins/orchestrator-swf-editor-envelope/package.json delete mode 100755 plugins/orchestrator-swf-editor-envelope/scripts/build.sh delete mode 100755 plugins/orchestrator-swf-editor-envelope/scripts/postbuild.js delete mode 100644 plugins/orchestrator-swf-editor-envelope/src/index.ejs delete mode 100644 plugins/orchestrator-swf-editor-envelope/src/init/SwfEditorEnvelopeCombined.ts delete mode 100644 plugins/orchestrator-swf-editor-envelope/src/init/SwfEditorEnvelopeDiagram.ts delete mode 100644 plugins/orchestrator-swf-editor-envelope/src/init/SwfEditorEnvelopeText.ts delete mode 100644 plugins/orchestrator-swf-editor-envelope/tsconfig.json delete mode 100644 plugins/orchestrator-swf-editor-envelope/webpack.config.js delete mode 100644 plugins/orchestrator/.eslintignore delete mode 100644 plugins/orchestrator/.eslintrc.js delete mode 100644 plugins/orchestrator/.lintstagedrc.json delete mode 100644 plugins/orchestrator/.prettierignore delete mode 100644 plugins/orchestrator/.prettierrc.js delete mode 100644 plugins/orchestrator/CHANGELOG.md delete mode 100644 plugins/orchestrator/app-config.janus-idp.yaml delete mode 100644 plugins/orchestrator/catalog-info.yaml delete mode 100644 plugins/orchestrator/dev/index.tsx delete mode 100644 plugins/orchestrator/docs/Permissions.md delete mode 100644 plugins/orchestrator/docs/executePageNext.png delete mode 100644 plugins/orchestrator/docs/executePageRun.png delete mode 100644 plugins/orchestrator/docs/extensibleForm.md delete mode 100644 plugins/orchestrator/docs/orchestratorIcon.png delete mode 100644 plugins/orchestrator/docs/quickstart.md delete mode 100644 plugins/orchestrator/docs/rbac-policy.csv delete mode 100644 plugins/orchestrator/docs/workflowCompleted.png delete mode 100644 plugins/orchestrator/docs/workflowsPage.png delete mode 100644 plugins/orchestrator/package.json delete mode 100644 plugins/orchestrator/src/api/api.ts delete mode 100644 plugins/orchestrator/src/api/index.ts delete mode 100644 plugins/orchestrator/src/components/BaseOrchestratorPage.tsx delete mode 100644 plugins/orchestrator/src/components/ExecuteWorkflowPage/JsonTextAreaForm.tsx delete mode 100644 plugins/orchestrator/src/components/InfoDialog.stories.tsx delete mode 100644 plugins/orchestrator/src/components/InfoDialog.tsx delete mode 100644 plugins/orchestrator/src/components/OrchestratorIcon.tsx delete mode 100644 plugins/orchestrator/src/components/OrchestratorPage.tsx delete mode 100644 plugins/orchestrator/src/components/Paragraph.tsx delete mode 100644 plugins/orchestrator/src/components/Router.tsx delete mode 100644 plugins/orchestrator/src/components/Selector.tsx delete mode 100644 plugins/orchestrator/src/components/WorkflowDefinitionViewerPage/WorkflowDefinitionDetailsCard.tsx delete mode 100644 plugins/orchestrator/src/components/WorkflowDefinitionViewerPage/WorkflowDefinitionViewerPage.tsx delete mode 100644 plugins/orchestrator/src/components/WorkflowDefinitionViewerPage/index.ts delete mode 100644 plugins/orchestrator/src/components/WorkflowDescriptionModal.tsx delete mode 100644 plugins/orchestrator/src/components/WorkflowDialog.tsx delete mode 100644 plugins/orchestrator/src/components/WorkflowEditor/WorkflowEditor.tsx delete mode 100644 plugins/orchestrator/src/components/WorkflowEditor/channel/WorkflowEditorLanguageService.ts delete mode 100644 plugins/orchestrator/src/components/WorkflowEditor/channel/WorkflowEditorLanguageServiceChannelApiImpl.ts delete mode 100644 plugins/orchestrator/src/components/WorkflowEditor/index.ts delete mode 100644 plugins/orchestrator/src/components/WorkflowInstancePage.tsx delete mode 100644 plugins/orchestrator/src/components/WorkflowInstancePageContent.tsx delete mode 100644 plugins/orchestrator/src/components/WorkflowInstanceStatusIndicator.tsx delete mode 100644 plugins/orchestrator/src/components/WorkflowProgress.tsx delete mode 100644 plugins/orchestrator/src/components/WorkflowProgressNode.tsx delete mode 100644 plugins/orchestrator/src/components/WorkflowProgressNodeModel.ts delete mode 100644 plugins/orchestrator/src/components/WorkflowResult.tsx delete mode 100644 plugins/orchestrator/src/components/WorkflowRunDetail.ts delete mode 100644 plugins/orchestrator/src/components/WorkflowRunDetails.tsx delete mode 100644 plugins/orchestrator/src/components/WorkflowRunsTabContent.tsx delete mode 100644 plugins/orchestrator/src/components/WorkflowVariablesViewer.tsx delete mode 100644 plugins/orchestrator/src/components/WorkflowsTabContent.tsx delete mode 100644 plugins/orchestrator/src/components/WorkflowsTable.tsx delete mode 100644 plugins/orchestrator/src/components/ui/OverrideBackstageTable.tsx delete mode 100644 plugins/orchestrator/src/constants.ts delete mode 100644 plugins/orchestrator/src/dataFormatters/DataFormatter.ts delete mode 100644 plugins/orchestrator/src/dataFormatters/WorkflowOverviewFormatter.test.ts delete mode 100644 plugins/orchestrator/src/dataFormatters/WorkflowOverviewFormatter.ts delete mode 100644 plugins/orchestrator/src/hooks/usePolling.test.ts delete mode 100644 plugins/orchestrator/src/hooks/usePolling.ts delete mode 100644 plugins/orchestrator/src/hooks/useWorkflowInstanceStatusColors.ts delete mode 100644 plugins/orchestrator/src/index.ts delete mode 100644 plugins/orchestrator/src/plugin.ts delete mode 100644 plugins/orchestrator/src/routes.ts delete mode 100644 plugins/orchestrator/src/utils/ErrorUtils.ts delete mode 100644 plugins/orchestrator/src/utils/NodeInstanceUtils.test.ts delete mode 100644 plugins/orchestrator/src/utils/NodeInstanceUtils.ts delete mode 100644 plugins/orchestrator/src/utils/TypeGuards.ts delete mode 100644 plugins/orchestrator/src/utils/UrlUtils.test.ts delete mode 100644 plugins/orchestrator/src/utils/UrlUtils.ts delete mode 100644 plugins/orchestrator/tsconfig.json delete mode 100644 plugins/orchestrator/turbo.json diff --git a/.changeset/slow-eagles-refuse.md b/.changeset/slow-eagles-refuse.md new file mode 100644 index 0000000000..a845151cc8 --- /dev/null +++ b/.changeset/slow-eagles-refuse.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/plugins/orchestrator-backend/.eslintignore b/plugins/orchestrator-backend/.eslintignore deleted file mode 100644 index 92a242d727..0000000000 --- a/plugins/orchestrator-backend/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -dist-dynamic -dist-scalprum -static diff --git a/plugins/orchestrator-backend/.eslintrc.js b/plugins/orchestrator-backend/.eslintrc.js deleted file mode 100644 index bdff83a034..0000000000 --- a/plugins/orchestrator-backend/.eslintrc.js +++ /dev/null @@ -1,11 +0,0 @@ -const backstageEslintConfig = require('@backstage/cli/config/eslint-factory')( - __dirname, -); - -module.exports = { - ...backstageEslintConfig, - ignorePatterns: [ - ...backstageEslintConfig.ignorePatterns, - 'static/generated/**', - ], -}; diff --git a/plugins/orchestrator-backend/.gitignore b/plugins/orchestrator-backend/.gitignore deleted file mode 100644 index 7b4d4ba2e6..0000000000 --- a/plugins/orchestrator-backend/.gitignore +++ /dev/null @@ -1 +0,0 @@ -static diff --git a/plugins/orchestrator-backend/.lintstagedrc.json b/plugins/orchestrator-backend/.lintstagedrc.json deleted file mode 100644 index 14b2263def..0000000000 --- a/plugins/orchestrator-backend/.lintstagedrc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "*": "prettier --ignore-unknown --write", - "*.{js,jsx,ts,tsx,mjs,cjs}": "backstage-cli package lint --fix" -} diff --git a/plugins/orchestrator-backend/.prettierignore b/plugins/orchestrator-backend/.prettierignore deleted file mode 100644 index 45c54605f6..0000000000 --- a/plugins/orchestrator-backend/.prettierignore +++ /dev/null @@ -1,13 +0,0 @@ -dist -dist-types -coverage -.vscode -CHANGELOG.md -generated -templates -*.hbs -renovate.json -dist-dynamic -dist-scalprum -playwright-report -static diff --git a/plugins/orchestrator-backend/.prettierrc.js b/plugins/orchestrator-backend/.prettierrc.js deleted file mode 100644 index 84cbac65b5..0000000000 --- a/plugins/orchestrator-backend/.prettierrc.js +++ /dev/null @@ -1,20 +0,0 @@ -// @ts-check - -/** @type {import("@ianvs/prettier-plugin-sort-imports").PrettierConfig} */ -module.exports = { - ...require('@spotify/prettier-config'), - plugins: ['@ianvs/prettier-plugin-sort-imports'], - importOrder: [ - '^react(.*)$', - '', - '^@backstage/(.*)$', - '', - '', - '', - '^@janus-idp/(.*)$', - '', - '', - '', - '^[.]', - ], -}; diff --git a/plugins/orchestrator-backend/CHANGELOG.md b/plugins/orchestrator-backend/CHANGELOG.md deleted file mode 100644 index ecfe95db93..0000000000 --- a/plugins/orchestrator-backend/CHANGELOG.md +++ /dev/null @@ -1,732 +0,0 @@ -### Dependencies - -## 4.1.0 - -### Minor Changes - -- 25f1787: Add enum filters to orchestrator plugin -- 603a162: make error handling consistent in backend and UI - -### Patch Changes - -- Updated dependencies [25f1787] - - @janus-idp/backstage-plugin-orchestrator-common@1.24.0 - -## 4.0.1 - -### Patch Changes - -- 0e6bfd3: feat: update Backstage to the latest version - - Update to Backstage 1.32.5 - -- Updated dependencies [0e6bfd3] - - @janus-idp/backstage-plugin-orchestrator-common@1.23.1 - - @janus-idp/backstage-plugin-audit-log-node@1.7.1 - - @janus-idp/backstage-plugin-rbac-common@1.12.1 - -## 4.0.0 - -### Minor Changes - -- 8244f28: chore(deps): update to backstage 1.32 - -### Patch Changes - -- Updated dependencies [8244f28] - - @janus-idp/backstage-plugin-orchestrator-common@1.23.0 - - @janus-idp/backstage-plugin-audit-log-node@1.7.0 - - @janus-idp/backstage-plugin-rbac-common@1.12.0 - -## 3.0.1 - -### Patch Changes - -- 7342e9b: chore: remove @janus-idp/cli dep and relink local packages - - This update removes `@janus-idp/cli` from all plugins, as it’s no longer necessary. Additionally, packages are now correctly linked with a specified version. - -## 3.0.0 - -### Minor Changes - -- d9551ae: feat(deps): update to backstage 1.31 - -### Patch Changes - -- d9551ae: Change local package references to a `*` -- d9551ae: pin the @janus-idp/cli package -- d9551ae: upgrade to yarn v3 -- d9551ae: Change the export-dynamic script to no longer use any flags and remove the tracking of the dist-dynamic folder -- Updated dependencies [d9551ae] -- Updated dependencies [d9551ae] -- Updated dependencies [d9551ae] - - @janus-idp/backstage-plugin-orchestrator-common@1.22.0 - - @janus-idp/backstage-plugin-rbac-common@1.11.0 - - @janus-idp/backstage-plugin-audit-log-node@1.6.0 - -* **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.21.0 - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.20.0 -- **@janus-idp/cli:** upgraded to 1.15.2 - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.19.0 - -### Dependencies - -- **@janus-idp/backstage-plugin-audit-log-node:** upgraded to 1.5.1 - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.15.1 - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.18.2 - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.18.1 - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.15.0 - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.18.0 - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.17.3 - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.14.0 -- **@janus-idp/backstage-plugin-audit-log-node:** upgraded to 1.5.0 -- **@janus-idp/backstage-plugin-rbac-common:** upgraded to 1.10.0 - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.13.2 - -### Dependencies - -- **@janus-idp/backstage-plugin-audit-log-node:** upgraded to 1.4.1 - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.17.2 - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.17.1 - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.17.0 - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.16.0 - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.15.2 - -### Dependencies - -- **@janus-idp/backstage-plugin-rbac-common:** upgraded to 1.9.0 - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.15.1 - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.15.0 - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.13.1 - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.14.0 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.17.3](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.17.2...@janus-idp/backstage-plugin-orchestrator-backend@1.17.3) (2024-08-06) - -### Dependencies - -- **@janus-idp/backstage-plugin-rbac-common:** upgraded to 1.8.2 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.17.2](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.17.1...@janus-idp/backstage-plugin-orchestrator-backend@1.17.2) (2024-08-05) - -### Dependencies - -- **@janus-idp/backstage-plugin-rbac-common:** upgraded to 1.8.1 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.17.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.17.0...@janus-idp/backstage-plugin-orchestrator-backend@1.17.1) (2024-08-02) - -### Bug Fixes - -- **orchestrator:** remove default pagination on v2 endpoints ([#1983](https://github.com/janus-idp/backstage-plugins/issues/1983)) ([5e30274](https://github.com/janus-idp/backstage-plugins/commit/5e302748a25cbad127122407e5258576054eac3d)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.13.1 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.17.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.16.1...@janus-idp/backstage-plugin-orchestrator-backend@1.17.0) (2024-07-26) - -### Features - -- **deps:** update to backstage 1.29 ([#1900](https://github.com/janus-idp/backstage-plugins/issues/1900)) ([f53677f](https://github.com/janus-idp/backstage-plugins/commit/f53677fb02d6df43a9de98c43a9f101a6db76802)) -- **orchestrator:** use v2 endpoints to retrieve instances ([#1956](https://github.com/janus-idp/backstage-plugins/issues/1956)) ([537502b](https://github.com/janus-idp/backstage-plugins/commit/537502b9d2ac13f2fb3f79188422d2c6e97f41fb)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.13.0 -- **@janus-idp/backstage-plugin-rbac-common:** upgraded to 1.8.0 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.16.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.16.0...@janus-idp/backstage-plugin-orchestrator-backend@1.16.1) (2024-07-24) - -### Bug Fixes - -- **deps:** rollback unreleased plugins ([#1951](https://github.com/janus-idp/backstage-plugins/issues/1951)) ([8b77969](https://github.com/janus-idp/backstage-plugins/commit/8b779694f02f8125587296305276b84cdfeeaebe)) - -### Dependencies - -- **@janus-idp/backstage-plugin-rbac-common:** upgraded to 1.7.2 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.16.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.15.0...@janus-idp/backstage-plugin-orchestrator-backend@1.16.0) (2024-07-24) - -### Features - -- **deps:** update to backstage 1.28 ([#1891](https://github.com/janus-idp/backstage-plugins/issues/1891)) ([1ba1108](https://github.com/janus-idp/backstage-plugins/commit/1ba11088e0de60e90d138944267b83600dc446e5)) -- **orchestrator:** use v2 endpoints to retrieve workflow overviews ([#1892](https://github.com/janus-idp/backstage-plugins/issues/1892)) ([cca1e53](https://github.com/janus-idp/backstage-plugins/commit/cca1e53bc6b3019b1c544f2f62bed8723ebf6130)) - -### Bug Fixes - -- **orchestrator:** resolve broken dynamic plugin publish ([#1906](https://github.com/janus-idp/backstage-plugins/issues/1906)) ([5f99043](https://github.com/janus-idp/backstage-plugins/commit/5f990438ebebf8b23c0c8706852753ad0812c55a)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.12.0 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.15.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.14.0...@janus-idp/backstage-plugin-orchestrator-backend@1.15.0) (2024-07-12) - -### Features - -- **orchestrator:** fix version ([#1886](https://github.com/janus-idp/backstage-plugins/issues/1886)) ([65c5917](https://github.com/janus-idp/backstage-plugins/commit/65c5917b8fc066a869d1a8e76d5e7b6cb4c8327c)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.11.0 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.14.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.13.1...@janus-idp/backstage-plugin-orchestrator-backend@1.14.0) (2024-07-11) - -### Features - -- **orchestrator:** change openapi client generator ([#1864](https://github.com/janus-idp/backstage-plugins/issues/1864)) ([d6a4f4c](https://github.com/janus-idp/backstage-plugins/commit/d6a4f4ccfedfd55356305131029fd3d8ca0ab9c5)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.11.0 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.13.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.13.0...@janus-idp/backstage-plugin-orchestrator-backend@1.13.1) (2024-07-01) - -### Bug Fixes - -- **rbac:** update rbac common to fix compilation ([#1858](https://github.com/janus-idp/backstage-plugins/issues/1858)) ([48f142b](https://github.com/janus-idp/backstage-plugins/commit/48f142b447f0d1677ba3f16b2a3c8972b22d0588)) - -## @janus-idp/backstage-plugin-orchestrator-backend [1.13.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.12.0...@janus-idp/backstage-plugin-orchestrator-backend@1.13.0) (2024-06-28) - -### Features - -- **orchestrator:** fix build failure from [#1833](https://github.com/janus-idp/backstage-plugins/issues/1833) ([#1850](https://github.com/janus-idp/backstage-plugins/issues/1850)) ([c0c73e6](https://github.com/janus-idp/backstage-plugins/commit/c0c73e638f66c03dae565614b8186938b38d7032)) -- **orchestrator:** remove unneeded orchestrator jira integration and endpoint ([#1833](https://github.com/janus-idp/backstage-plugins/issues/1833)) ([d2a76fd](https://github.com/janus-idp/backstage-plugins/commit/d2a76fd3db028f9774c821759bee5f38b7131c94)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.10.0 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.12.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.11.0...@janus-idp/backstage-plugin-orchestrator-backend@1.12.0) (2024-06-26) - -### Features - -- **orchestrator:** disable buttons based on permissions ([#1818](https://github.com/janus-idp/backstage-plugins/issues/1818)) ([36504b0](https://github.com/janus-idp/backstage-plugins/commit/36504b05d96dbbf0b2395dc6e5c155c21fa73bcd)) - -## @janus-idp/backstage-plugin-orchestrator-backend [1.11.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.10.1...@janus-idp/backstage-plugin-orchestrator-backend@1.11.0) (2024-06-25) - -### Features - -- **orchestrator:** add auditLog and reorganize endpoints declaration ([#1820](https://github.com/janus-idp/backstage-plugins/issues/1820)) ([00d9216](https://github.com/janus-idp/backstage-plugins/commit/00d9216ba76c13fac86933a8605102d6e1768929)) - -## @janus-idp/backstage-plugin-orchestrator-backend [1.10.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.10.0...@janus-idp/backstage-plugin-orchestrator-backend@1.10.1) (2024-06-19) - -### Bug Fixes - -- **orchestrator:** change log level of cache messages to be debug ([#1824](https://github.com/janus-idp/backstage-plugins/issues/1824)) ([4224612](https://github.com/janus-idp/backstage-plugins/commit/422461224e31b419cd8394e2432af71ed10a986e)) - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.11.1 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.10.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.9.8...@janus-idp/backstage-plugin-orchestrator-backend@1.10.0) (2024-06-13) - -### Features - -- **deps:** update to backstage 1.27 ([#1683](https://github.com/janus-idp/backstage-plugins/issues/1683)) ([a14869c](https://github.com/janus-idp/backstage-plugins/commit/a14869c3f4177049cb8d6552b36c3ffd17e7997d)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.9.0 -- **@janus-idp/cli:** upgraded to 1.11.0 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.9.8](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.9.7...@janus-idp/backstage-plugin-orchestrator-backend@1.9.8) (2024-06-13) - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.10.1 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.9.7](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.9.6...@janus-idp/backstage-plugin-orchestrator-backend@1.9.7) (2024-06-11) - -### Bug Fixes - -- **orchestrator:** fix error handling in case data index failed to start ([#1804](https://github.com/janus-idp/backstage-plugins/issues/1804)) ([27affb7](https://github.com/janus-idp/backstage-plugins/commit/27affb7815e02127721fd854f7903dca3525dede)) - -## @janus-idp/backstage-plugin-orchestrator-backend [1.9.6](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.9.5...@janus-idp/backstage-plugin-orchestrator-backend@1.9.6) (2024-06-05) - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.10.0 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.9.5](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.9.4...@janus-idp/backstage-plugin-orchestrator-backend@1.9.5) (2024-06-04) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.8.1 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.9.4](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.9.3...@janus-idp/backstage-plugin-orchestrator-backend@1.9.4) (2024-06-03) - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.9.0 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.9.3](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.9.2...@janus-idp/backstage-plugin-orchestrator-backend@1.9.3) (2024-05-29) - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.8.10 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.9.2](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.9.1...@janus-idp/backstage-plugin-orchestrator-backend@1.9.2) (2024-05-29) - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.8.9 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.9.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.9.0...@janus-idp/backstage-plugin-orchestrator-backend@1.9.1) (2024-05-28) - -### Bug Fixes - -- **orchestrator:** fixed broken workflow viewer ([#1717](https://github.com/janus-idp/backstage-plugins/issues/1717)) ([19cc79b](https://github.com/janus-idp/backstage-plugins/commit/19cc79bb9c1422556ddb9f85a2ac323186808321)) - -## @janus-idp/backstage-plugin-orchestrator-backend [1.9.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.8.7...@janus-idp/backstage-plugin-orchestrator-backend@1.9.0) (2024-05-22) - -### Features - -- **orchestrator:** add permissions to orchestrator plugin ([#1599](https://github.com/janus-idp/backstage-plugins/issues/1599)) ([d0a4531](https://github.com/janus-idp/backstage-plugins/commit/d0a453181e177eb1da7b1e231253b76a2d9356a8)) - -### Bug Fixes - -- **orchestrator:** fix the common package reference version ([#1704](https://github.com/janus-idp/backstage-plugins/issues/1704)) ([942b2a3](https://github.com/janus-idp/backstage-plugins/commit/942b2a3b6eb29c0fe88f9c98dea581309d02fded)) - -## @janus-idp/backstage-plugin-orchestrator-backend [1.8.7](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.8.6...@janus-idp/backstage-plugin-orchestrator-backend@1.8.7) (2024-05-21) - -## @janus-idp/backstage-plugin-orchestrator-backend [1.8.6](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.8.5...@janus-idp/backstage-plugin-orchestrator-backend@1.8.6) (2024-05-20) - -### Bug Fixes - -- **orchestrator:** fixes many security-related issues ([#1681](https://github.com/janus-idp/backstage-plugins/issues/1681)) ([3e801c8](https://github.com/janus-idp/backstage-plugins/commit/3e801c84015f925bdecd226a161ef81a5fc69432)) - -## @janus-idp/backstage-plugin-orchestrator-backend [1.8.5](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.8.4...@janus-idp/backstage-plugin-orchestrator-backend@1.8.5) (2024-05-16) - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.8.7 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.8.4](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.8.3...@janus-idp/backstage-plugin-orchestrator-backend@1.8.4) (2024-05-15) - -### Documentation - -- **orchestrator:** removes instructions related to the editor ([#1664](https://github.com/janus-idp/backstage-plugins/issues/1664)) ([10a75b2](https://github.com/janus-idp/backstage-plugins/commit/10a75b2706c72751bd774d6fae4332bbc527dc2b)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.7.2 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.8.3](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.8.2...@janus-idp/backstage-plugin-orchestrator-backend@1.8.3) (2024-05-15) - -### Bug Fixes - -- **orchestrator:** export the `OrchestratorPlugin` accordingly ([#1644](https://github.com/janus-idp/backstage-plugins/issues/1644)) ([4a9d1f8](https://github.com/janus-idp/backstage-plugins/commit/4a9d1f821a30437e73631fac98b1aabc65473fba)) - -## @janus-idp/backstage-plugin-orchestrator-backend [1.8.2](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.8.1...@janus-idp/backstage-plugin-orchestrator-backend@1.8.2) (2024-05-09) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.7.1 -- **@janus-idp/cli:** upgraded to 1.8.6 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.8.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.8.0...@janus-idp/backstage-plugin-orchestrator-backend@1.8.1) (2024-05-09) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.7.0 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.8.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.7.4...@janus-idp/backstage-plugin-orchestrator-backend@1.8.0) (2024-05-06) - -### Features - -- **orchestrator:** make the internal sonata podman compatible ([#1612](https://github.com/janus-idp/backstage-plugins/issues/1612)) ([e4e528e](https://github.com/janus-idp/backstage-plugins/commit/e4e528e2c10536d029ffec11953f3a1d0309b0c5)) - -## @janus-idp/backstage-plugin-orchestrator-backend [1.7.4](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.7.3...@janus-idp/backstage-plugin-orchestrator-backend@1.7.4) (2024-05-02) - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.8.5 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.7.3](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.7.2...@janus-idp/backstage-plugin-orchestrator-backend@1.7.3) (2024-05-02) - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.8.4 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.7.2](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.7.1...@janus-idp/backstage-plugin-orchestrator-backend@1.7.2) (2024-04-30) - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.8.3 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.7.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.7.0...@janus-idp/backstage-plugin-orchestrator-backend@1.7.1) (2024-04-30) - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.8.2 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.7.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.6.8...@janus-idp/backstage-plugin-orchestrator-backend@1.7.0) (2024-04-25) - -### Features - -- **orchestrator:** add endpoint to retrigger workflow in error state ([#1343](https://github.com/janus-idp/backstage-plugins/issues/1343)) ([328d23a](https://github.com/janus-idp/backstage-plugins/commit/328d23a7992da125becc8d7775a4ebd68165f243)) - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.8.1 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.6.8](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.6.7...@janus-idp/backstage-plugin-orchestrator-backend@1.6.8) (2024-04-18) - -### Bug Fixes - -- **orchestrator:** allows serving the editor envelope in disconnected environments ([#1450](https://github.com/janus-idp/backstage-plugins/issues/1450)) ([1e778d8](https://github.com/janus-idp/backstage-plugins/commit/1e778d88336dfec79d48ece4fd8d2a035133b70e)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.6.4 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.6.7](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.6.6...@janus-idp/backstage-plugin-orchestrator-backend@1.6.7) (2024-04-15) - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.8.0 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.6.6](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.6.5...@janus-idp/backstage-plugin-orchestrator-backend@1.6.6) (2024-04-09) - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.7.10 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.6.5](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.6.4...@janus-idp/backstage-plugin-orchestrator-backend@1.6.5) (2024-04-09) - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.7.9 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.6.4](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.6.3...@janus-idp/backstage-plugin-orchestrator-backend@1.6.4) (2024-04-05) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.6.3 -- **@janus-idp/cli:** upgraded to 1.7.8 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.6.3](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.6.2...@janus-idp/backstage-plugin-orchestrator-backend@1.6.3) (2024-04-04) - -### Bug Fixes - -- **orchestrator:** add lastRunId to overview endpoints ([#1449](https://github.com/janus-idp/backstage-plugins/issues/1449)) ([cce56f7](https://github.com/janus-idp/backstage-plugins/commit/cce56f7de3acc41ecd30b1b9962d7817be69de7d)) -- **orchestrator:** only inputs inherited from the assessment workflow should be disabled ([#1436](https://github.com/janus-idp/backstage-plugins/issues/1436)) ([32d9bdf](https://github.com/janus-idp/backstage-plugins/commit/32d9bdfc38c07c4e60f0ce7670fc3813ad0d92c3)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.6.2 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.6.2](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.6.1...@janus-idp/backstage-plugin-orchestrator-backend@1.6.2) (2024-04-02) - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.7.7 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.6.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.6.0...@janus-idp/backstage-plugin-orchestrator-backend@1.6.1) (2024-03-29) - -### Bug Fixes - -- **orchestrator:** fixes v2/instances endpoint ([#1414](https://github.com/janus-idp/backstage-plugins/issues/1414)) ([88b49df](https://github.com/janus-idp/backstage-plugins/commit/88b49df35cf10e231ba69c239e873cb10e7cc25b)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.6.1 -- **@janus-idp/cli:** upgraded to 1.7.6 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.6.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.5.3...@janus-idp/backstage-plugin-orchestrator-backend@1.6.0) (2024-03-14) - -### Features - -- **orchestrator:** verify availability and cache workflow definition IDs ([#1309](https://github.com/janus-idp/backstage-plugins/issues/1309)) ([4d322f1](https://github.com/janus-idp/backstage-plugins/commit/4d322f1fc5b6f8b1afedf40cfe1b24b2edae2ac1)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.6.0 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.5.3](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.5.2...@janus-idp/backstage-plugin-orchestrator-backend@1.5.3) (2024-03-12) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.5.1 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.5.2](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.5.1...@janus-idp/backstage-plugin-orchestrator-backend@1.5.2) (2024-03-11) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.5.0 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.5.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.5.0...@janus-idp/backstage-plugin-orchestrator-backend@1.5.1) (2024-03-11) - -### Other changes - -- **orchestrator:** add unit tests for v2 endpoints ([#1300](https://github.com/janus-idp/backstage-plugins/issues/1300)) ([9a13138](https://github.com/janus-idp/backstage-plugins/commit/9a13138c61d3cc7331f739da80f020bb68dd61e5)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.4.1 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.5.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.4.12...@janus-idp/backstage-plugin-orchestrator-backend@1.5.0) (2024-03-07) - -### Features - -- **orchestrator:** support pagination for /instances and /overview ([#1313](https://github.com/janus-idp/backstage-plugins/issues/1313)) ([79d5988](https://github.com/janus-idp/backstage-plugins/commit/79d598816f16c8346b6868bff4cc30d695cad518)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.4.0 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.4.12](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.4.11...@janus-idp/backstage-plugin-orchestrator-backend@1.4.12) (2024-03-04) - -### Bug Fixes - -- **orchestrator:** increase the number of attempts to fetch the instance after execution ([#1301](https://github.com/janus-idp/backstage-plugins/issues/1301)) ([77dcce3](https://github.com/janus-idp/backstage-plugins/commit/77dcce3adceaf12b583bda5e74be69a5cc273ba1)) - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.7.5 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.4.11](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.4.10...@janus-idp/backstage-plugin-orchestrator-backend@1.4.11) (2024-03-03) - -### Bug Fixes - -- **orchestrator:** stop fetching workflow URI ([#1297](https://github.com/janus-idp/backstage-plugins/issues/1297)) ([2456a28](https://github.com/janus-idp/backstage-plugins/commit/2456a287dbff955a0916b9600e89a39511cd537a)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.3.7 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.4.10](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.4.9...@janus-idp/backstage-plugin-orchestrator-backend@1.4.10) (2024-02-29) - -### Bug Fixes - -- **orchestrator:** refactor 500 response to use ErrorResponse object ([#1290](https://github.com/janus-idp/backstage-plugins/issues/1290)) ([2580f3d](https://github.com/janus-idp/backstage-plugins/commit/2580f3d38cecf78334964666eb7c127c21b00924)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.3.6 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.4.9](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.4.8...@janus-idp/backstage-plugin-orchestrator-backend@1.4.9) (2024-02-28) - -### Bug Fixes - -- **orchestrator:** clean up the plugin code ([#1292](https://github.com/janus-idp/backstage-plugins/issues/1292)) ([ad27fb8](https://github.com/janus-idp/backstage-plugins/commit/ad27fb8e98913a6b80feb38ff58a7864e1953a7e)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.3.5 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.4.8](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.4.7...@janus-idp/backstage-plugin-orchestrator-backend@1.4.8) (2024-02-28) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.3.4 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.4.7](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.4.6...@janus-idp/backstage-plugin-orchestrator-backend@1.4.7) (2024-02-28) - -### Bug Fixes - -- **orchestrator:** handle nullable start/state properties of process instance ([#1277](https://github.com/janus-idp/backstage-plugins/issues/1277)) ([d8a43a5](https://github.com/janus-idp/backstage-plugins/commit/d8a43a5a164f83fc90d037ae3d7a355f5de543e0)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.3.3 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.4.6](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.4.5...@janus-idp/backstage-plugin-orchestrator-backend@1.4.6) (2024-02-27) - -### Bug Fixes - -- **orchestrator:** workflowId parameter wrongly parsed in getWorkflowOverviewById (v2) ([#1283](https://github.com/janus-idp/backstage-plugins/issues/1283)) ([2cd70d0](https://github.com/janus-idp/backstage-plugins/commit/2cd70d048d707a3b117c5273a1d8bc9fdc03fff7)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.3.2 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.4.5](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.4.4...@janus-idp/backstage-plugin-orchestrator-backend@1.4.5) (2024-02-27) - -### Bug Fixes - -- **orchestrator:** warn "unknown format X ignored in schema at path Y" ([#1270](https://github.com/janus-idp/backstage-plugins/issues/1270)) ([de3c734](https://github.com/janus-idp/backstage-plugins/commit/de3c734299189b753d924c87aa9b5c9b5f94683c)), closes [/github.com/janus-idp/backstage-plugins/blob/903c7f37a1cf138ac96ef3f631f951866c2014fa/plugins/notifications-backend/src/service/router.ts#L45-L52](https://github.com/janus-idp//github.com/janus-idp/backstage-plugins/blob/903c7f37a1cf138ac96ef3f631f951866c2014fa/plugins/notifications-backend/src/service/router.ts/issues/L45-L52) - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.7.4 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.4.4](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.4.3...@janus-idp/backstage-plugin-orchestrator-backend@1.4.4) (2024-02-26) - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.7.3 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.4.3](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.4.2...@janus-idp/backstage-plugin-orchestrator-backend@1.4.3) (2024-02-23) - -### Bug Fixes - -- **orchestrator:** handle api endpoint failure ([#1254](https://github.com/janus-idp/backstage-plugins/issues/1254)) ([503de1b](https://github.com/janus-idp/backstage-plugins/commit/503de1b028e134cafb5a04045068768f30519409)) - -## @janus-idp/backstage-plugin-orchestrator-backend [1.4.2](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.4.1...@janus-idp/backstage-plugin-orchestrator-backend@1.4.2) (2024-02-22) - -### Bug Fixes - -- **orchestrator:** improvements to backend services ([#1252](https://github.com/janus-idp/backstage-plugins/issues/1252)) ([af8e072](https://github.com/janus-idp/backstage-plugins/commit/af8e072f35bc033f5111207c87711c9c0f9ff386)) - -## @janus-idp/backstage-plugin-orchestrator-backend [1.4.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.4.0...@janus-idp/backstage-plugin-orchestrator-backend@1.4.1) (2024-02-21) - -### Bug Fixes - -- **orchestrator:** implementation of getWorkflowById (v2) ([#1233](https://github.com/janus-idp/backstage-plugins/issues/1233)) ([f9f9008](https://github.com/janus-idp/backstage-plugins/commit/f9f9008d29f244c2ae6d688d3e2dc9b65b705e5b)) -- **orchestrator:** minor improvements and fixes ([#1242](https://github.com/janus-idp/backstage-plugins/issues/1242)) ([c9ec4cb](https://github.com/janus-idp/backstage-plugins/commit/c9ec4cbe1847268e8068edc69c7937c5e133c315)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.3.1 -- **@janus-idp/cli:** upgraded to 1.7.2 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.4.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.3.1...@janus-idp/backstage-plugin-orchestrator-backend@1.4.0) (2024-02-20) - -### Features - -- **orchestrator:** add OpenAPI v2 implementations ([#1182](https://github.com/janus-idp/backstage-plugins/issues/1182)) ([43ac2f3](https://github.com/janus-idp/backstage-plugins/commit/43ac2f3f492b5c977142a3cfd9868d5e193ceb02)) - -### Bug Fixes - -- **orchestrator:** decommission the ProcessInstance.lastUpdate field ([#1230](https://github.com/janus-idp/backstage-plugins/issues/1230)) ([9724e27](https://github.com/janus-idp/backstage-plugins/commit/9724e27eaa84fe73d7724f28c86409681b7f79f8)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.3.0 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.3.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.3.0...@janus-idp/backstage-plugin-orchestrator-backend@1.3.1) (2024-02-16) - -### Bug Fixes - -- **orchestrator:** resolve mismatch between execution data and composed schema ([#1217](https://github.com/janus-idp/backstage-plugins/issues/1217)) ([af85114](https://github.com/janus-idp/backstage-plugins/commit/af851148935e1ed083709cac145520d7551de737)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.2.1 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.3.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.2.2...@janus-idp/backstage-plugin-orchestrator-backend@1.3.0) (2024-02-16) - -### Features - -- **orchestrator:** add OpenAPI support ([#1123](https://github.com/janus-idp/backstage-plugins/issues/1123)) ([bd88e23](https://github.com/janus-idp/backstage-plugins/commit/bd88e2304c93761ce6754985074f004a5a3c8c4b)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.2.0 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.2.2](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.2.1...@janus-idp/backstage-plugin-orchestrator-backend@1.2.2) (2024-02-13) - -### Bug Fixes - -- **orchestrator:** filter out `null` values from action input ([#1199](https://github.com/janus-idp/backstage-plugins/issues/1199)) ([55c3927](https://github.com/janus-idp/backstage-plugins/commit/55c3927fb5211e1ec78719fd38740eb29e481962)) - -## @janus-idp/backstage-plugin-orchestrator-backend [1.2.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.2.0...@janus-idp/backstage-plugin-orchestrator-backend@1.2.1) (2024-02-05) - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.7.1 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.2.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.1.0...@janus-idp/backstage-plugin-orchestrator-backend@1.2.0) (2024-02-02) - -### Features - -- **orchestrator:** add the ability to rerun workflows in a new instance ([#1141](https://github.com/janus-idp/backstage-plugins/issues/1141)) ([fe326df](https://github.com/janus-idp/backstage-plugins/commit/fe326df569caa5a9e7b7ec809c1c371a2a936010)) - -### Bug Fixes - -- add missing alpha dynamic plugin entry points ([#1161](https://github.com/janus-idp/backstage-plugins/issues/1161)) ([36e9d91](https://github.com/janus-idp/backstage-plugins/commit/36e9d910b8f534fd9db2f8210c9aa7a24560f01d)) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.1.0 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.1.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.0.2...@janus-idp/backstage-plugin-orchestrator-backend@1.1.0) (2024-01-30) - -### Features - -- add new backend system support for existing backend plugins that have not been migrated over yet ([#1132](https://github.com/janus-idp/backstage-plugins/issues/1132)) ([06e16fd](https://github.com/janus-idp/backstage-plugins/commit/06e16fdcf64257dd08297cb727445d9a8a23c522)) - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.7.0 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.0.2](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.0.1...@janus-idp/backstage-plugin-orchestrator-backend@1.0.2) (2024-01-25) - -### Dependencies - -- **@janus-idp/cli:** upgraded to 1.6.0 - -## @janus-idp/backstage-plugin-orchestrator-backend [1.0.1](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-orchestrator-backend@1.0.0...@janus-idp/backstage-plugin-orchestrator-backend@1.0.1) (2024-01-18) - -### Bug Fixes - -- **orchestrator:** regenerate `orchestrator-backend/dist-dynamic/package.json` ([#1083](https://github.com/janus-idp/backstage-plugins/issues/1083)) ([8a8051c](https://github.com/janus-idp/backstage-plugins/commit/8a8051c5eded7bdd3e05d1532e8354709aaccb8b)) - -## @janus-idp/backstage-plugin-orchestrator-backend 1.0.0 (2024-01-17) - -### Features - -- **orchestrator:** add orchestrator plugin ([#783](https://github.com/janus-idp/backstage-plugins/issues/783)) ([cf5fe74](https://github.com/janus-idp/backstage-plugins/commit/cf5fe74db6992d9f51f5073bbcf20c8c346357a1)), closes [#28](https://github.com/janus-idp/backstage-plugins/issues/28) [#38](https://github.com/janus-idp/backstage-plugins/issues/38) [#35](https://github.com/janus-idp/backstage-plugins/issues/35) [#21](https://github.com/janus-idp/backstage-plugins/issues/21) - -### Dependencies - -- **@janus-idp/backstage-plugin-orchestrator-common:** upgraded to 1.0.0 diff --git a/plugins/orchestrator-backend/README.md b/plugins/orchestrator-backend/README.md index cf4bfb3439..f28844c45e 100644 --- a/plugins/orchestrator-backend/README.md +++ b/plugins/orchestrator-backend/README.md @@ -1,5 +1,3 @@ -# Orchestrator Backend Plugin for Backstage +# Deprecated -Welcome to the backend package for the Orchestrator plugin! - -For more information about the Orchestrator plugin, see the [Orchestrator Plugin documentation](https://github.com/janus-idp/backstage-plugins/tree/main/plugins/orchestrator) on GitHub. +This package has been moved to the [red-hat-developer/rhdh-plugins](https://github.com/redhat-developer/rhdh-plugins) repository. Migrate to using `@red-hat-developer-hub/backstage-plugin-orchestrator-backend` instead. diff --git a/plugins/orchestrator-backend/__fixtures__/mockComposedGreetingWorfklow.ts b/plugins/orchestrator-backend/__fixtures__/mockComposedGreetingWorfklow.ts deleted file mode 100644 index dd97d3aa40..0000000000 --- a/plugins/orchestrator-backend/__fixtures__/mockComposedGreetingWorfklow.ts +++ /dev/null @@ -1,129 +0,0 @@ -import type { JsonObject } from '@backstage/types'; - -import { JSONSchema7 } from 'json-schema'; - -import { WorkflowDefinition } from '@janus-idp/backstage-plugin-orchestrator-common'; - -const schema = { - $id: 'classpath:/schemas/yamlgreet__main-schema.json', - title: 'Data Input Schema', - $schema: 'http://json-schema.org/draft-07/schema#', - type: 'object', - properties: { - language: { - type: 'object', - properties: { - language: { - title: 'Language', - description: 'Language to greet', - type: 'string', - enum: ['English', 'Spanish'], - default: 'English', - }, - }, - title: 'Language', - }, - name: { - type: 'object', - properties: { - name: { - title: 'Name', - description: 'Name of the person', - type: 'string', - default: 'John Doe', - }, - }, - }, - }, - required: ['name'], -} as JSONSchema7; - -const workflowDefinition = { - id: 'yamlgreet', - version: '1.0', - specVersion: '0.8', - name: 'Greeting workflow', - description: 'YAML based greeting workflow', - dataInputSchema: 'schemas/yamlgreet__main-schema.json', - start: 'ChooseOnLanguage', - functions: [ - { - name: 'greetFunction', - type: 'custom', - operation: 'sysout', - }, - ], - states: [ - { - name: 'ChooseOnLanguage', - type: 'switch', - dataConditions: [ - { - condition: '${ .language.language == "English" }', - transition: 'GreetInEnglish', - }, - { - condition: '${ .language.language == "Spanish" }', - transition: 'GreetInSpanish', - }, - ], - defaultCondition: { - transition: 'GreetInEnglish', - }, - }, - { - name: 'GreetInEnglish', - type: 'inject', - data: { - greeting: 'Hello from YAML Workflow, ', - }, - transition: 'GreetPerson', - }, - { - name: 'GreetInSpanish', - type: 'inject', - data: { - greeting: 'Saludos desde YAML Workflow, ', - }, - transition: 'GreetPerson', - }, - { - name: 'GreetPerson', - type: 'operation', - actions: [ - { - name: 'greetAction', - functionRef: { - refName: 'greetFunction', - arguments: { - message: '.greeting+.name.name', - }, - }, - }, - ], - end: { - terminate: true, - }, - }, - ], -} as WorkflowDefinition; - -const variables = { - workflowdata: { - name: { - name: 'John Doe', - }, - language: { - language: 'Spanish', - }, - greeting: 'hello', - }, -}; - -const mockData: { - schema: JSONSchema7; - workflowDefinition: WorkflowDefinition; - variables: JsonObject; -} = { schema, workflowDefinition, variables }; - -export default mockData; diff --git a/plugins/orchestrator-backend/__fixtures__/mockGreetingWorkflowData.ts b/plugins/orchestrator-backend/__fixtures__/mockGreetingWorkflowData.ts deleted file mode 100644 index 3d6c04d1ad..0000000000 --- a/plugins/orchestrator-backend/__fixtures__/mockGreetingWorkflowData.ts +++ /dev/null @@ -1,114 +0,0 @@ -import type { JsonObject } from '@backstage/types'; - -import { JSONSchema7 } from 'json-schema'; - -import { WorkflowDefinition } from '@janus-idp/backstage-plugin-orchestrator-common'; - -const schema = { - $id: 'classpath:/schemas/yamlgreet__main-schema.json', - title: 'Data Input Schema', - $schema: 'http://json-schema.org/draft-07/schema#', - type: 'object', - properties: { - language: { - title: 'Language', - description: 'Language to greet', - type: 'string', - enum: ['English', 'Spanish'], - default: 'English', - }, - name: { - title: 'Name', - description: 'Name of the person', - type: 'string', - default: 'John Doe', - }, - }, - required: ['name'], -} as JSONSchema7; - -const workflowDefinition = { - id: 'yamlgreet', - version: '1.0', - specVersion: '0.8', - name: 'Greeting workflow', - description: 'YAML based greeting workflow', - dataInputSchema: 'schemas/yamlgreet__main-schema.json', - start: 'ChooseOnLanguage', - functions: [ - { - name: 'greetFunction', - type: 'custom', - operation: 'sysout', - }, - ], - states: [ - { - name: 'ChooseOnLanguage', - type: 'switch', - dataConditions: [ - { - condition: '${ .language == "English" }', - transition: 'GreetInEnglish', - }, - { - condition: '${ .language == "Spanish" }', - transition: 'GreetInSpanish', - }, - ], - defaultCondition: { - transition: 'GreetInEnglish', - }, - }, - { - name: 'GreetInEnglish', - type: 'inject', - data: { - greeting: 'Hello from YAML Workflow, ', - }, - transition: 'GreetPerson', - }, - { - name: 'GreetInSpanish', - type: 'inject', - data: { - greeting: 'Saludos desde YAML Workflow, ', - }, - transition: 'GreetPerson', - }, - { - name: 'GreetPerson', - type: 'operation', - actions: [ - { - name: 'greetAction', - functionRef: { - refName: 'greetFunction', - arguments: { - message: '.greeting+.name', - }, - }, - }, - ], - end: { - terminate: true, - }, - }, - ], -} as WorkflowDefinition; - -const variables = { - workflowdata: { - name: 'John Doe', - greeting: 'Saludos desde YAML Workflow, ', - language: 'Spanish', - }, -}; - -const mockData: { - schema: JSONSchema7; - workflowDefinition: WorkflowDefinition; - variables: JsonObject; -} = { schema, workflowDefinition, variables }; - -export default mockData; diff --git a/plugins/orchestrator-backend/__fixtures__/mockSpringBootWorkflowData.ts b/plugins/orchestrator-backend/__fixtures__/mockSpringBootWorkflowData.ts deleted file mode 100644 index 0e80c8fdf8..0000000000 --- a/plugins/orchestrator-backend/__fixtures__/mockSpringBootWorkflowData.ts +++ /dev/null @@ -1,580 +0,0 @@ -import { JSONSchema7 } from 'json-schema'; - -import { WorkflowDefinition } from '@janus-idp/backstage-plugin-orchestrator-common'; - -const schema = { - $id: 'classpath:/schemas/spring-boot-backend__main-schema.json', - title: 'Data input schema', - $schema: 'http://json-schema.org/draft-07/schema#', - type: 'object', - properties: { - newComponent: { - $ref: '#/$defs/Provide information about the new component_0', - type: 'object', - }, - javaMetadata: { - $ref: '#/$defs/Provide information about the Java metadata_1', - type: 'object', - }, - ciMethod: { - $ref: '#/$defs/Provide information about the CI method_2', - type: 'object', - }, - }, - $defs: { - 'Provide information about the CI method_2': { - $id: 'classpath:/schemas/spring-boot-backend__ref-schema__CI_Method.json', - title: 'Provide information about the CI method', - $schema: 'http://json-schema.org/draft-07/schema#', - type: 'object', - properties: { - ci: { - title: 'CI Method', - type: 'string', - default: 'github', - oneOf: [ - { - const: 'github', - title: 'GitHub Action', - }, - { - const: 'tekton', - title: 'Tekton', - }, - ], - }, - }, - allOf: [ - { - if: { - properties: { - ci: { - const: 'github', - }, - }, - }, - }, - { - if: { - properties: { - ci: { - const: 'tekton', - }, - }, - }, - then: { - properties: { - imageRepository: { - title: 'Image Registry', - description: 'The registry to use', - type: 'string', - default: 'quay.io', - oneOf: [ - { - const: 'quay.io', - title: 'Quay', - }, - { - const: 'image-registry.openshift-image-registry.svc:5000', - title: 'Internal OpenShift Registry', - }, - ], - }, - imageUrl: { - title: 'Image URL', - description: - 'The Quay.io or OpenShift Image URL //', - type: 'string', - }, - namespace: { - title: 'Namespace', - description: 'The namespace for deploying resources', - type: 'string', - }, - }, - required: ['namespace', 'imageUrl', 'imageRepository'], - }, - }, - ], - }, - 'Provide information about the Java metadata_1': { - $id: 'classpath:/schemas/spring-boot-backend__ref-schema__Java_Metadata.json', - title: 'Provide information about the Java metadata', - $schema: 'http://json-schema.org/draft-07/schema#', - type: 'object', - properties: { - groupId: { - title: 'Group ID', - description: 'Maven Group ID eg (io.janus)', - type: 'string', - default: 'io.janus', - }, - artifactId: { - title: 'Artifact ID', - description: 'Maven Artifact ID', - type: 'string', - default: 'spring-boot-app', - }, - javaPackageName: { - title: 'Java Package Namespace', - description: - 'Name for the Java Package (ensure to use the / character as this is used for folder structure) should match Group ID and Artifact ID', - type: 'string', - default: 'io/janus/spring-boot-app', - }, - version: { - title: 'Version', - description: 'Maven Artifact Version', - type: 'string', - default: '1.0.0-SNAPSHOT', - }, - }, - required: ['groupId', 'artifactId', 'javaPackageName', 'version'], - }, - 'Provide information about the new component_0': { - $id: 'classpath:/schemas/spring-boot-backend__ref-schema__New_Component.json', - title: 'Provide information about the new component', - $schema: 'http://json-schema.org/draft-07/schema#', - type: 'object', - properties: { - orgName: { - title: 'Organization Name', - description: 'Organization name', - type: 'string', - }, - repoName: { - title: 'Repository Name', - description: 'Repository name', - type: 'string', - }, - description: { - title: 'Description', - description: 'Help others understand what this component is for', - type: 'string', - }, - owner: { - title: 'Owner', - description: 'An entity from the catalog', - type: 'string', - }, - system: { - title: 'System', - description: 'An entity from the catalog', - type: 'string', - }, - port: { - title: 'Port', - description: 'Override the port exposed for the application', - type: 'number', - default: 8080, - }, - }, - required: ['orgName', 'repoName', 'owner', 'system', 'port'], - }, - }, -} as JSONSchema7; - -const workflowDefinition = { - id: 'spring-boot-backend', - version: '1.0', - specVersion: '0.8', - name: 'Spring Boot Backend application', - description: - 'Create a starter Spring Boot backend application with a CI pipeline', - dataInputSchema: 'schemas/spring-boot-backend__main-schema.json', - functions: [ - { - name: 'runActionFetchTemplate', - operation: 'specs/actions-openapi.json#fetch:template', - }, - { - name: 'runActionPublishGithub', - operation: 'specs/actions-openapi.json#publish:github', - }, - { - name: 'runActionCatalogRegister', - operation: 'specs/actions-openapi.json#catalog:register', - }, - { - name: 'fs:delete', - operation: 'specs/actions-openapi.json#fs:delete', - }, - { - name: 'sysout', - type: 'custom', - operation: 'sysout', - }, - ], - errors: [ - { - name: 'Error on Action', - code: 'java.lang.RuntimeException', - }, - ], - start: 'Generating the Source Code Component', - states: [ - { - name: 'Generating the Source Code Component', - type: 'operation', - actionMode: 'sequential', - actions: [ - { - name: 'Fetch Template Action - Source Code', - functionRef: { - refName: 'runActionFetchTemplate', - arguments: { - url: 'https://github.com/janus-idp/software-templates/tree/main/templates/github/spring-boot-backend/skeleton', - values: { - orgName: '.newComponent.orgName', - repoName: '.newComponent.repoName', - owner: '.newComponent.owner', - system: '.newComponent.system', - applicationType: 'api', - description: '.newComponent.description', - namespace: '.ciMethod.namespace', - port: '.newComponent.port', - ci: '.ciMethod.ci', - sourceControl: 'github.com', - groupId: '.javaMetadata.groupId', - artifactId: '.javaMetadata.artifactId', - javaPackageName: '.javaMetadata.javaPackageName', - version: '.javaMetadata.version', - }, - }, - }, - actionDataFilter: { - toStateData: '.actionFetchTemplateSourceCodeResult', - }, - }, - ], - onErrors: [ - { - errorRef: 'Error on Action', - transition: 'Handle Error', - }, - ], - compensatedBy: 'Clear File System - Source Code', - transition: 'Generating the CI Component', - }, - { - name: 'Generating the CI Component', - type: 'switch', - dataConditions: [ - { - condition: '${ .ciMethod.ci == "github" }', - transition: 'Generating the CI Component - GitHub', - }, - { - condition: '${ .ciMethod.ci == "tekton" }', - transition: 'Generating the CI Component - Tekton', - }, - ], - defaultCondition: { - transition: 'Generating the CI Component - GitHub', - }, - }, - { - name: 'Generating the CI Component - GitHub', - type: 'operation', - actionMode: 'sequential', - actions: [ - { - name: 'Run Template Fetch Action - CI - GitHub', - functionRef: { - refName: 'runActionFetchTemplate', - arguments: { - url: 'https://github.com/janus-idp/software-templates/tree/main/skeletons/github-actions', - copyWithoutTemplating: ['".github/workflows/"'], - values: { - orgName: '.newComponent.orgName', - repoName: '.newComponent.repoName', - owner: '.newComponent.owner', - system: '.newComponent.system', - applicationType: 'api', - description: '.newComponent.description', - namespace: '.ciMethod.namespace', - port: '.newComponent.port', - ci: '.ciMethod.ci', - sourceControl: 'github.com', - groupId: '.javaMetadata.groupId', - artifactId: '.javaMetadata.artifactId', - javaPackageName: '.javaMetadata.javaPackageName', - version: '.javaMetadata.version', - }, - }, - }, - actionDataFilter: { - toStateData: '.actionTemplateFetchCIResult', - }, - }, - ], - onErrors: [ - { - errorRef: 'Error on Action', - transition: 'Handle Error', - }, - ], - compensatedBy: 'Clear File System - CI', - transition: 'Generating the Catalog Info Component', - }, - { - name: 'Generating the CI Component - Tekton', - type: 'operation', - actionMode: 'sequential', - actions: [ - { - name: 'Run Template Fetch Action - CI - Tekton', - functionRef: { - refName: 'runActionFetchTemplate', - arguments: { - url: 'https://github.com/janus-idp/software-templates/tree/main/skeletons/tekton', - copyWithoutTemplating: ['".github/workflows/"'], - values: { - orgName: '.newComponent.orgName', - repoName: '.newComponent.repoName', - owner: '.newComponent.owner', - system: '.newComponent.system', - applicationType: 'api', - description: '.newComponent.description', - namespace: '.ciMethod.namespace', - imageUrl: '.imageUrl', - imageRepository: '.imageRepository', - imageBuilder: 's2i-go', - port: '.newComponent.port', - ci: '.ciMethod.ci', - sourceControl: 'github.com', - groupId: '.javaMetadata.groupId', - artifactId: '.javaMetadata.artifactId', - javaPackageName: '.javaMetadata.javaPackageName', - version: '.javaMetadata.version', - }, - }, - }, - actionDataFilter: { - toStateData: '.actionTemplateFetchCIResult', - }, - }, - ], - onErrors: [ - { - errorRef: 'Error on Action', - transition: 'Handle Error', - }, - ], - compensatedBy: 'Clear File System - CI', - transition: 'Generating the Catalog Info Component', - }, - { - name: 'Generating the Catalog Info Component', - type: 'operation', - actions: [ - { - name: 'Fetch Template Action - Catalog Info', - functionRef: { - refName: 'runActionFetchTemplate', - arguments: { - url: 'https://github.com/janus-idp/software-templates/tree/main/skeletons/catalog-info', - values: { - orgName: '.newComponent.orgName', - repoName: '.newComponent.repoName', - owner: '.newComponent.owner', - system: '.newComponent.system', - applicationType: 'api', - description: '.newComponent.description', - namespace: '.ciMethod.namespace', - imageUrl: '.ciMethod.imageUrl', - imageRepository: '.ciMethod.imageRepository', - imageBuilder: 's2i-go', - port: '.newComponent.port', - ci: '.ciMethod.ci', - sourceControl: 'github.com', - groupId: '.javaMetadata.groupId', - artifactId: '.javaMetadata.artifactId', - javaPackageName: '.javaMetadata.javaPackageName', - version: '.javaMetadata.version', - }, - }, - }, - actionDataFilter: { - toStateData: '.actionFetchTemplateCatalogInfoResult', - }, - }, - ], - onErrors: [ - { - errorRef: 'Error on Action', - transition: 'Handle Error', - }, - ], - compensatedBy: 'Clear File System - Catalog', - transition: 'Publishing to the Source Code Repository', - }, - { - name: 'Publishing to the Source Code Repository', - type: 'operation', - actionMode: 'sequential', - actions: [ - { - name: 'Publish Github', - functionRef: { - refName: 'runActionPublishGithub', - arguments: { - allowedHosts: ['"github.com"'], - description: 'Workflow Action', - repoUrl: - '"github.com?owner=" + .newComponent.orgName + "&repo=" + .newComponent.repoName', - defaultBranch: 'main', - gitCommitMessage: 'Initial commit', - allowAutoMerge: true, - allowRebaseMerge: true, - }, - }, - actionDataFilter: { - toStateData: '.actionPublishResult', - }, - }, - ], - onErrors: [ - { - errorRef: 'Error on Action', - transition: 'Handle Error', - }, - ], - compensatedBy: 'Remove Source Code Repository', - transition: 'Registering the Catalog Info Component', - }, - { - name: 'Registering the Catalog Info Component', - type: 'operation', - actionMode: 'sequential', - actions: [ - { - name: 'Catalog Register Action', - functionRef: { - refName: 'runActionCatalogRegister', - arguments: { - repoContentsUrl: '.actionPublishResult.repoContentsUrl', - catalogInfoPath: '"/catalog-info.yaml"', - }, - }, - actionDataFilter: { - toStateData: '.actionCatalogRegisterResult', - }, - }, - ], - onErrors: [ - { - errorRef: 'Error on Action', - transition: 'Handle Error', - }, - ], - compensatedBy: 'Remove Catalog Info Component', - end: true, - }, - { - name: 'Handle Error', - type: 'operation', - actions: [ - { - name: 'Error Action', - functionRef: { - refName: 'sysout', - arguments: { - message: 'Error on workflow, triggering compensations', - }, - }, - }, - ], - end: { - compensate: true, - }, - }, - { - name: 'Clear File System - Source Code', - type: 'operation', - usedForCompensation: true, - actions: [ - { - name: 'Clear FS Action', - functionRef: { - refName: 'fs:delete', - arguments: { - files: ['./'], - }, - }, - }, - ], - }, - { - name: 'Clear File System - CI', - type: 'operation', - usedForCompensation: true, - actions: [ - { - name: 'Clear FS Action', - functionRef: { - refName: 'fs:delete', - arguments: { - files: ['./'], - }, - }, - }, - ], - }, - { - name: 'Clear File System - Catalog', - type: 'operation', - usedForCompensation: true, - actions: [ - { - name: 'Clear FS Action', - functionRef: { - refName: 'fs:delete', - arguments: { - files: ['./'], - }, - }, - }, - ], - }, - { - name: 'Remove Source Code Repository', - type: 'operation', - usedForCompensation: true, - actions: [ - { - name: 'Remove Source Code Repository', - functionRef: { - refName: 'sysout', - arguments: { - message: 'Remove Source Code Repository', - }, - }, - }, - ], - }, - { - name: 'Remove Catalog Info Component', - type: 'operation', - usedForCompensation: true, - actions: [ - { - name: 'Remove Catalog Info Component', - functionRef: { - refName: 'sysout', - arguments: { - message: 'Remove Catalog Info Component', - }, - }, - }, - ], - }, - ], -} as WorkflowDefinition; - -const mockData: { - schema: JSONSchema7; - workflowDefinition: WorkflowDefinition; -} = { schema, workflowDefinition }; - -export default mockData; diff --git a/plugins/orchestrator-backend/app-config.janus-idp.yaml b/plugins/orchestrator-backend/app-config.janus-idp.yaml deleted file mode 100644 index a3a8b8bea8..0000000000 --- a/plugins/orchestrator-backend/app-config.janus-idp.yaml +++ /dev/null @@ -1,3 +0,0 @@ -orchestrator: - dataIndexService: - url: http://sonataflow-platform-data-index-service.sonataflow-infra diff --git a/plugins/orchestrator-backend/catalog-info.yaml b/plugins/orchestrator-backend/catalog-info.yaml deleted file mode 100644 index 5f6eecbcd6..0000000000 --- a/plugins/orchestrator-backend/catalog-info.yaml +++ /dev/null @@ -1,25 +0,0 @@ -# https://backstage.io/docs/features/software-catalog/descriptor-format#kind-component -apiVersion: backstage.io/v1alpha1 -kind: Component -metadata: - name: janus-idp-orchestrator-backend - title: '@janus-idp/backstage-plugin-orchestrator-backend' - description: Orchestrator Backend Plugin for Backstage - annotations: - backstage.io/source-location: url:https://github.com/janus-idp/backstage-plugins/tree/main/plugins/orchestrator-backend - backstage.io/view-url: https://github.com/janus-idp/backstage-plugins/blob/main/plugins/orchestrator-backend/catalog-info.yaml - backstage.io/edit-url: https://github.com/janus-idp/backstage-plugins/edit/main/plugins/orchestrator-backend/catalog-info.yaml - github.com/project-slug: janus-idp/backstage-plugins - github.com/team-slug: janus-idp/orchestrator-codeowners - sonarqube.org/project-key: janus-idp_backstage-plugins - links: - - url: https://github.com/janus-idp/backstage-plugins/tree/main/plugins/orchestrator-backend - title: GitHub Source - icon: source - type: source -spec: - type: backstage-backend-plugin - lifecycle: production - owner: orchestrator-team - system: rhdh - subcomponentOf: janus-idp-orchestrator diff --git a/plugins/orchestrator-backend/dev/index.ts b/plugins/orchestrator-backend/dev/index.ts deleted file mode 100644 index 0f85011bee..0000000000 --- a/plugins/orchestrator-backend/dev/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { createBackend } from '@backstage/backend-defaults'; - -import { orchestratorPlugin } from '../src/plugin'; - -const backend = createBackend(); - -backend.add(orchestratorPlugin); - -backend.start(); diff --git a/plugins/orchestrator-backend/package.json b/plugins/orchestrator-backend/package.json deleted file mode 100644 index fe290afb1d..0000000000 --- a/plugins/orchestrator-backend/package.json +++ /dev/null @@ -1,109 +0,0 @@ -{ - "name": "@janus-idp/backstage-plugin-orchestrator-backend", - "version": "4.1.0", - "license": "Apache-2.0", - "main": "src/index.ts", - "types": "src/index.ts", - "publishConfig": { - "access": "public" - }, - "backstage": { - "role": "backend-plugin", - "supported-versions": "1.32.5", - "pluginId": "orchestrator", - "pluginPackages": [ - "@janus-idp/backstage-plugin-orchestrator", - "@janus-idp/backstage-plugin-orchestrator-backend", - "@janus-idp/backstage-plugin-orchestrator-common" - ] - }, - "exports": { - ".": "./src/index.ts", - "./package.json": "./package.json" - }, - "typesVersions": { - "*": { - "package.json": [ - "package.json" - ] - } - }, - "homepage": "https://red.ht/rhdh", - "repository": { - "type": "git", - "url": "https://github.com/janus-idp/backstage-plugins", - "directory": "plugins/orchestrator-backend" - }, - "bugs": "https://github.com/janus-idp/backstage-plugins/issues", - "keywords": [ - "support:tech-preview", - "lifecycle:active", - "backstage", - "plugin", - "orchestrator", - "workflows" - ], - "files": [ - "app-config.janus-idp.yaml", - "dist", - "dist-dynamic/*.*", - "dist-dynamic/dist/**", - "static" - ], - "scripts": { - "start": "backstage-cli package start", - "build": "backstage-cli package build", - "tsc": "tsc", - "prettier:check": "prettier --ignore-unknown --check .", - "prettier:fix": "prettier --ignore-unknown --write .", - "lint:check": "backstage-cli package lint", - "lint:fix": "backstage-cli package lint --fix", - "test": "backstage-cli package test --passWithNoTests --coverage", - "clean": "backstage-cli package clean", - "prepack": "backstage-cli package prepack", - "postpack": "backstage-cli package postpack" - }, - "dependencies": { - "@backstage/backend-common": "^0.25.0", - "@backstage/backend-defaults": "^0.5.2", - "@backstage/backend-plugin-api": "^1.0.1", - "@backstage/backend-tasks": "^0.6.1", - "@backstage/catalog-client": "^1.7.1", - "@backstage/errors": "^1.2.4", - "@backstage/integration": "^1.15.1", - "@backstage/plugin-catalog-node": "^1.13.1", - "@backstage/plugin-permission-common": "^0.8.1", - "@backstage/plugin-permission-node": "^0.8.4", - "@backstage/plugin-scaffolder-backend": "^1.26.2", - "@backstage/plugin-scaffolder-node": "^0.5.0", - "@janus-idp/backstage-plugin-orchestrator-common": "^1.24.0", - "@urql/core": "^4.1.4", - "ajv-formats": "^2.1.1", - "cloudevents": "^8.0.0", - "express": "^4.18.2", - "express-promise-router": "^4.1.1", - "fs-extra": "^10.1.0", - "isomorphic-git": "^1.23.0", - "json-schema": "^0.4.0", - "moment": "^2.29.4", - "openapi-backend": "^5.10.5", - "yn": "^5.0.0" - }, - "devDependencies": { - "@backstage/backend-test-utils": "1.0.2", - "@backstage/cli": "0.28.2", - "@types/express": "4.17.21", - "@types/fs-extra": "11.0.4", - "@types/json-schema": "7.0.15", - "prettier": "3.3.3" - }, - "peerDependencies": { - "@janus-idp/backstage-plugin-audit-log-node": "^1.7.1", - "@janus-idp/backstage-plugin-rbac-common": "^1.12.1" - }, - "maintainers": [ - "@janus-idp/maintainers-plugins", - "@janus-idp/orchestrator-codeowners" - ], - "author": "The Backstage Community" -} diff --git a/plugins/orchestrator-backend/src/OrchestratorPlugin.ts b/plugins/orchestrator-backend/src/OrchestratorPlugin.ts deleted file mode 100644 index 1e5927c562..0000000000 --- a/plugins/orchestrator-backend/src/OrchestratorPlugin.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { - coreServices, - createBackendPlugin, -} from '@backstage/backend-plugin-api'; -import { catalogServiceRef } from '@backstage/plugin-catalog-node/alpha'; - -import { createRouter } from './routerWrapper'; - -export const orchestratorPlugin = createBackendPlugin({ - pluginId: 'orchestrator', - register(env) { - env.registerInit({ - deps: { - logger: coreServices.logger, - config: coreServices.rootConfig, - discovery: coreServices.discovery, - httpRouter: coreServices.httpRouter, - urlReader: coreServices.urlReader, - scheduler: coreServices.scheduler, - permissions: coreServices.permissions, - httpAuth: coreServices.httpAuth, - auth: coreServices.auth, - catalogApi: catalogServiceRef, - }, - async init({ - logger, - config, - discovery, - httpRouter, - catalogApi, - urlReader, - scheduler, - permissions, - httpAuth, - auth, - }) { - const router = await createRouter({ - config: config, - logger, - discovery: discovery, - catalogApi: catalogApi, - urlReader: urlReader, - scheduler: scheduler, - permissions: permissions, - httpAuth: httpAuth, - auth: auth, - }); - httpRouter.use(router); - httpRouter.addAuthPolicy({ - path: '/static/generated/envelope', - allow: 'unauthenticated', - }); - httpRouter.addAuthPolicy({ - path: '/health', - allow: 'unauthenticated', - }); - }, - }); - }, -}); diff --git a/plugins/orchestrator-backend/src/helpers/errorBuilder.ts b/plugins/orchestrator-backend/src/helpers/errorBuilder.ts deleted file mode 100644 index 32b5070917..0000000000 --- a/plugins/orchestrator-backend/src/helpers/errorBuilder.ts +++ /dev/null @@ -1,34 +0,0 @@ -export const NO_DATA_INDEX_URL = 'NO_DATA_INDEX_URL'; -export const NO_BACKEND_EXEC_CTX = 'NO_BACKEND_EXEC_CTX'; -export const NO_CLIENT_PROVIDED = 'NO_CLIENT_PROVIDED'; -export const NO_LOGGER = 'NO_LOGGER'; -export const SWF_BACKEND_NOT_INITED = 'SWF_BACKEND_NOT_INITED'; - -export class ErrorBuilder { - public static NewBackendError(name: string, message: string): Error { - const e = new Error(message); - e.name = name; - return e; - } - - public static GET_NO_DATA_INDEX_URL_ERR(): Error { - return this.NewBackendError( - NO_DATA_INDEX_URL, - 'No data index url specified or found', - ); - } - - public static GET_NO_CLIENT_PROVIDED_ERR(): Error { - return this.NewBackendError( - NO_CLIENT_PROVIDED, - 'No or null graphql client', - ); - } - - public static GET_SWF_BACKEND_NOT_INITED(): Error { - return this.NewBackendError( - SWF_BACKEND_NOT_INITED, - 'The SonataFlow backend is not initialized, call initialize() method before trying to get the workflows.', - ); - } -} diff --git a/plugins/orchestrator-backend/src/helpers/filterBuilder.ts b/plugins/orchestrator-backend/src/helpers/filterBuilder.ts deleted file mode 100644 index 5f63e82b90..0000000000 --- a/plugins/orchestrator-backend/src/helpers/filterBuilder.ts +++ /dev/null @@ -1,269 +0,0 @@ -import { - FieldFilter, - FieldFilterOperatorEnum, - Filter, - IntrospectionField, - LogicalFilter, - ProcessInstanceStatusDTO, - TypeName, -} from '@janus-idp/backstage-plugin-orchestrator-common'; - -import { getProcessInstanceStateFromStatusDTOString } from '../service/api/mapping/V2Mappings'; - -type ProcessType = 'ProcessDefinition' | 'ProcessInstance'; - -function isLogicalFilter(filter: Filter): filter is LogicalFilter { - return (filter as LogicalFilter).filters !== undefined; -} - -function handleLogicalFilter( - introspection: IntrospectionField[], - type: ProcessType, - filter: LogicalFilter, -): string { - if (!filter.operator) return ''; - - const subClauses = filter.filters.map(f => - buildFilterCondition(introspection, type, f), - ); - - return `${filter.operator.toLowerCase()}: {${subClauses.join(', ')}}`; -} - -function handleBetweenOperator(filter: FieldFilter): string { - if (!Array.isArray(filter.value) || filter.value.length !== 2) { - throw new Error('Between operator requires an array of two elements'); - } - return `${filter.field}: {${getGraphQLOperator(FieldFilterOperatorEnum.Between)}: {from: "${filter.value[0]}", to: "${filter.value[1]}"}}`; -} - -function handleIsNullOperator(filter: FieldFilter): string { - return `${filter.field}: {${getGraphQLOperator(FieldFilterOperatorEnum.IsNull)}: ${convertToBoolean(filter.value)}}`; -} - -function isEnumFilter( - fieldName: string, - type: 'ProcessDefinition' | 'ProcessInstance', -): boolean { - if (type === 'ProcessInstance') { - if (fieldName === 'state') { - return true; - } - } - return false; -} - -function convertEnumValue( - fieldName: string, - fieldValue: string, - type: 'ProcessDefinition' | 'ProcessInstance', -): string { - if (type === 'ProcessInstance') { - if (fieldName === 'state') { - const state = (ProcessInstanceStatusDTO as any)[ - fieldValue as keyof typeof ProcessInstanceStatusDTO - ]; - - if (!state) { - throw new Error( - `status ${fieldValue} is not a valid value of ProcessInstanceStatusDTO`, - ); - } - return getProcessInstanceStateFromStatusDTOString(state).valueOf(); - } - } - throw new Error( - `Unsupported enum ${fieldName}: can't convert value ${fieldValue}`, - ); -} - -function isValidEnumOperator(operator: FieldFilterOperatorEnum): boolean { - return ( - operator === FieldFilterOperatorEnum.In || - operator === FieldFilterOperatorEnum.Eq - ); -} - -function handleBinaryOperator( - binaryFilter: FieldFilter, - fieldDef: IntrospectionField, - type: 'ProcessDefinition' | 'ProcessInstance', -): string { - if (isEnumFilter(binaryFilter.field, type)) { - if (!isValidEnumOperator(binaryFilter.operator)) { - throw new Error( - `Invalid operator ${binaryFilter.operator} for enum field ${binaryFilter.field} filter`, - ); - } - binaryFilter.value = convertEnumValue( - binaryFilter.field, - binaryFilter.value, - type, - ); - } - const formattedValue = Array.isArray(binaryFilter.value) - ? `[${binaryFilter.value.map(v => formatValue(binaryFilter.field, v, fieldDef, type)).join(', ')}]` - : formatValue(binaryFilter.field, binaryFilter.value, fieldDef, type); - return `${binaryFilter.field}: {${getGraphQLOperator(binaryFilter.operator)}: ${formattedValue}}`; -} - -export function buildFilterCondition( - introspection: IntrospectionField[], - type: ProcessType, - filters?: Filter, -): string { - if (!filters) { - return ''; - } - - if (isLogicalFilter(filters)) { - return handleLogicalFilter(introspection, type, filters); - } - - if (!isOperatorSupported(filters.operator)) { - throw new Error(`Unsopported operator ${filters.operator}`); - } - - const fieldDef = introspection.find(f => f.name === filters.field); - if (!fieldDef) { - throw new Error(`Can't find field "${filters.field}" definition`); - } - - if (!isOperatorAllowedForField(filters.operator, fieldDef)) { - throw new Error(`Unsupported field type ${fieldDef.type.name}`); - } - - switch (filters.operator) { - case FieldFilterOperatorEnum.IsNull: - return handleIsNullOperator(filters); - case FieldFilterOperatorEnum.Between: - return handleBetweenOperator(filters); - case FieldFilterOperatorEnum.Eq: - case FieldFilterOperatorEnum.Like: - case FieldFilterOperatorEnum.In: - case FieldFilterOperatorEnum.Gt: - case FieldFilterOperatorEnum.Gte: - case FieldFilterOperatorEnum.Lt: - case FieldFilterOperatorEnum.Lte: - return handleBinaryOperator(filters, fieldDef, type); - - default: - throw new Error(`Can't build filter condition`); - } -} - -function isOperatorSupported(operator: FieldFilterOperatorEnum): boolean { - return ( - operator === FieldFilterOperatorEnum.Eq || - operator === FieldFilterOperatorEnum.Like || - operator === FieldFilterOperatorEnum.In || - operator === FieldFilterOperatorEnum.IsNull || - operator === FieldFilterOperatorEnum.Gt || - operator === FieldFilterOperatorEnum.Gte || - operator === FieldFilterOperatorEnum.Lt || - operator === FieldFilterOperatorEnum.Lte || - operator === FieldFilterOperatorEnum.Between - ); -} - -function isFieldFilterSupported(fieldDef: IntrospectionField): boolean { - return fieldDef?.type.name === TypeName.String; -} - -function isOperatorAllowedForField( - operator: FieldFilterOperatorEnum, - fieldDef: IntrospectionField, -): boolean { - const allowedOperators: Record = { - [TypeName.String]: [ - FieldFilterOperatorEnum.In, - FieldFilterOperatorEnum.Like, - FieldFilterOperatorEnum.IsNull, - FieldFilterOperatorEnum.Eq, - ], - [TypeName.Id]: [ - FieldFilterOperatorEnum.In, - FieldFilterOperatorEnum.IsNull, - FieldFilterOperatorEnum.Eq, - ], - [TypeName.Date]: [ - FieldFilterOperatorEnum.IsNull, - FieldFilterOperatorEnum.Eq, - FieldFilterOperatorEnum.Gt, - FieldFilterOperatorEnum.Gte, - FieldFilterOperatorEnum.Lt, - FieldFilterOperatorEnum.Lte, - FieldFilterOperatorEnum.Between, - ], - [TypeName.StringArray]: [], - }; - const allowedForType = allowedOperators[fieldDef.type.name]; - return allowedForType ? allowedForType.includes(operator) : false; -} - -function convertToBoolean(value: any): boolean { - if (typeof value === 'boolean') { - return value; - } - if (typeof value === 'string') { - return value.toLowerCase() === 'true'; - } - if (typeof value === 'number') { - return value === 1; - } - return false; // Default to false for unsupported types -} - -function formatValue( - fieldName: string, - fieldValue: any, - fieldDef: IntrospectionField, - type: ProcessType, -): string { - if (!isFieldFilterSupported) { - throw new Error(`Unsupported field type ${fieldDef.type.name}`); - } - - if (isEnumFilter(fieldName, type)) { - return `${fieldValue}`; - } - if ( - fieldDef.type.name === TypeName.String || - fieldDef.type.name === TypeName.Id || - fieldDef.type.name === TypeName.Date - ) { - return `"${fieldValue}"`; - } - throw new Error( - `Failed to format value for ${fieldName} ${fieldValue} with type ${fieldDef.type.name}`, - ); -} - -function getGraphQLOperator(operator: FieldFilterOperatorEnum): string { - switch (operator) { - case 'EQ': - return 'equal'; - case 'LIKE': - return 'like'; - case 'IN': - return 'in'; - case 'IS_NULL': - return 'isNull'; - case 'GT': - return 'greaterThan'; - case 'GTE': - return 'greaterThanEqual'; - case 'LT': - return 'lessThan'; - case 'LTE': - return 'lessThanEqual'; - // case 'CONTAINS': - // return "contains" - // case 'CONTAINS_ALL': - // case 'CONTAINS_ANY': - case 'BETWEEN': - return 'between'; - default: - throw new Error(`Operation "${operator}" not supported`); - } -} diff --git a/plugins/orchestrator-backend/src/helpers/filterBuilders.test.ts b/plugins/orchestrator-backend/src/helpers/filterBuilders.test.ts deleted file mode 100644 index f642ea5008..0000000000 --- a/plugins/orchestrator-backend/src/helpers/filterBuilders.test.ts +++ /dev/null @@ -1,553 +0,0 @@ -import { - FieldFilterOperatorEnum, - Filter, - IntrospectionField, - ProcessInstanceState, - ProcessInstanceStatusDTO, - TypeKind, - TypeName, -} from '@janus-idp/backstage-plugin-orchestrator-common'; - -import { buildFilterCondition } from './filterBuilder'; - -describe('column filters', () => { - const createIntrospectionField = ( - name: string, - type: TypeName, - ): IntrospectionField => ({ - name, - type: { - name: type, - kind: TypeKind.InputObject, - ofType: null, - }, - }); - - const createFieldFilter = ( - field: string, - operator: FieldFilterOperatorEnum, - value: any, - ): Filter => ({ - field, - operator, - value, - }); - - type FilterTestCase = { - name: string; - introspectionFields: IntrospectionField[]; - filter: Filter | undefined; - expectedResult: string; - }; - describe('empty filter testcases', () => { - const emptyFilterTestCases: FilterTestCase[] = [ - { - name: 'returns empty string when filters are null or undefined', - introspectionFields: [], - filter: undefined, - expectedResult: '', - }, - ]; - emptyFilterTestCases.forEach( - ({ name, introspectionFields, filter, expectedResult }) => { - it(`${name}`, () => { - const result = buildFilterCondition( - introspectionFields, - 'ProcessInstance', - filter, - ); - expect(result).toBe(expectedResult); - }); - }, - ); - }); - describe('stringArgument testcases', () => { - const stringTestCases: FilterTestCase[] = [ - { - name: 'returns correct filter for single string field with equal operator', - introspectionFields: [ - createIntrospectionField('name', TypeName.String), - ], - filter: createFieldFilter( - 'name', - FieldFilterOperatorEnum.Eq, - 'Hello World Workflow', - ), - expectedResult: 'name: {equal: "Hello World Workflow"}', - }, - { - name: 'returns correct filter for single string field with like operator', - introspectionFields: [ - createIntrospectionField('name', TypeName.String), - ], - filter: createFieldFilter( - 'name', - FieldFilterOperatorEnum.Like, - 'Hello%', - ), - expectedResult: 'name: {like: "Hello%"}', - }, - { - name: 'returns correct filter for string field with isNull operator (true)', - introspectionFields: [ - createIntrospectionField('name', TypeName.String), - ], - filter: createFieldFilter('name', FieldFilterOperatorEnum.IsNull, true), - expectedResult: 'name: {isNull: true}', - }, - { - name: 'returns correct filter for string field with isNull operator (false)', - introspectionFields: [ - createIntrospectionField('name', TypeName.String), - ], - filter: createFieldFilter( - 'name', - FieldFilterOperatorEnum.IsNull, - false, - ), - expectedResult: 'name: {isNull: false}', - }, - { - name: 'returns correct filter for string field with isNull operator ("true" as string)', - introspectionFields: [ - createIntrospectionField('name', TypeName.String), - ], - filter: createFieldFilter( - 'name', - FieldFilterOperatorEnum.IsNull, - 'True', - ), - expectedResult: 'name: {isNull: true}', - }, - { - name: 'returns correct filter for string field with isNull operator ("false" as string)', - introspectionFields: [ - createIntrospectionField('name', TypeName.String), - ], - filter: createFieldFilter( - 'name', - FieldFilterOperatorEnum.IsNull, - 'FALSE', - ), - expectedResult: 'name: {isNull: false}', - }, - { - name: 'returns correct filter for string field with in operator (single value)', - introspectionFields: [ - createIntrospectionField('name', TypeName.String), - ], - filter: createFieldFilter('name', FieldFilterOperatorEnum.In, [ - 'Test String', - ]), - expectedResult: 'name: {in: ["Test String"]}', - }, - { - name: 'returns correct filter for string field with in operator (multiple values)', - introspectionFields: [ - createIntrospectionField('name', TypeName.String), - ], - filter: createFieldFilter('name', FieldFilterOperatorEnum.In, [ - 'Test String 1', - 'Test String 2', - 'Test String 3', - ]), - expectedResult: - 'name: {in: ["Test String 1", "Test String 2", "Test String 3"]}', - }, - { - name: 'returns correct OR filter for two string fields with equal operator', - introspectionFields: [ - createIntrospectionField('name', TypeName.String), - createIntrospectionField('processName', TypeName.String), - ], - filter: { - operator: 'OR', - filters: [ - createFieldFilter( - 'name', - FieldFilterOperatorEnum.Eq, - 'Hello World Workflow', - ), - createFieldFilter( - 'processName', - FieldFilterOperatorEnum.Eq, - 'Greeting workflow', - ), - ], - }, - expectedResult: - 'or: {name: {equal: "Hello World Workflow"}, processName: {equal: "Greeting workflow"}}', - }, - { - name: 'returns correct filter for string field with like and isNull operators', - introspectionFields: [ - createIntrospectionField('description', TypeName.String), - ], - filter: { - operator: 'OR', - filters: [ - createFieldFilter( - 'description', - FieldFilterOperatorEnum.Like, - '%Test%', - ), - createFieldFilter( - 'description', - FieldFilterOperatorEnum.IsNull, - true, - ), - ], - }, - expectedResult: - 'or: {description: {like: "%Test%"}, description: {isNull: true}}', - }, - { - name: 'returns correct filter for string field with in, like, equal, and isNull operators', - introspectionFields: [ - createIntrospectionField('name', TypeName.String), - ], - filter: { - operator: 'OR', - filters: [ - createFieldFilter('name', FieldFilterOperatorEnum.In, [ - 'Test String 1', - 'Test String 2', - ]), - createFieldFilter('name', FieldFilterOperatorEnum.Like, '%Test%'), - createFieldFilter( - 'name', - FieldFilterOperatorEnum.Eq, - 'Exact Match', - ), - createFieldFilter('name', FieldFilterOperatorEnum.IsNull, false), - ], - }, - expectedResult: - 'or: {name: {in: ["Test String 1", "Test String 2"]}, name: {like: "%Test%"}, name: {equal: "Exact Match"}, name: {isNull: false}}', - }, - { - name: 'returns correct filter for string field with in, like, equal, and isNull operators', - introspectionFields: [ - createIntrospectionField('name', TypeName.String), - ], - filter: { - operator: 'AND', - filters: [ - createFieldFilter('name', FieldFilterOperatorEnum.In, [ - 'Test String 1', - 'Test String 2', - ]), - createFieldFilter('name', FieldFilterOperatorEnum.Like, '%Test%'), - createFieldFilter( - 'name', - FieldFilterOperatorEnum.Eq, - 'Exact Match', - ), - createFieldFilter('name', FieldFilterOperatorEnum.IsNull, false), - ], - }, - expectedResult: - 'and: {name: {in: ["Test String 1", "Test String 2"]}, name: {like: "%Test%"}, name: {equal: "Exact Match"}, name: {isNull: false}}', - }, - ]; - stringTestCases.forEach( - ({ name, introspectionFields, filter, expectedResult }) => { - it(`${name}`, () => { - const result = buildFilterCondition( - introspectionFields, - 'ProcessInstance', - filter, - ); - expect(result).toBe(expectedResult); - }); - }, - ); - }); - describe('idArgument testcases', () => { - const idTestCases: FilterTestCase[] = [ - { - name: 'returns correct filter for single id field with equal operator', - introspectionFields: [createIntrospectionField('id', TypeName.Id)], - filter: createFieldFilter('id', FieldFilterOperatorEnum.Eq, 'idA'), - expectedResult: 'id: {equal: "idA"}', - }, - { - name: 'returns correct filter for single id field with isNull operator (false as boolean)', - introspectionFields: [createIntrospectionField('id', TypeName.Id)], - filter: createFieldFilter('id', FieldFilterOperatorEnum.IsNull, false), - expectedResult: 'id: {isNull: false}', - }, - { - name: 'returns correct filter for single id field with isNull operator (false as string)', - introspectionFields: [createIntrospectionField('id', TypeName.Id)], - filter: createFieldFilter( - 'id', - FieldFilterOperatorEnum.IsNull, - 'false', - ), - expectedResult: 'id: {isNull: false}', - }, - { - name: 'returns correct filter for single id field with IN operator', - introspectionFields: [createIntrospectionField('id', TypeName.Id)], - filter: createFieldFilter('id', FieldFilterOperatorEnum.In, [ - 'idA', - 'idB', - 'idC', - ]), - expectedResult: 'id: {in: ["idA", "idB", "idC"]}', - }, - { - name: 'returns correct OR filter for multiple id fields with equal, isNull, and IN operators', - introspectionFields: [ - createIntrospectionField('processId', TypeName.Id), - createIntrospectionField('id', TypeName.Id), - ], - filter: { - operator: 'OR', - filters: [ - createFieldFilter('id', FieldFilterOperatorEnum.Eq, 'idA'), - createFieldFilter( - 'processId', - FieldFilterOperatorEnum.IsNull, - 'True', - ), - createFieldFilter('id', 'IN', ['idA', 'idB', 'idC']), - ], - }, - expectedResult: - 'or: {id: {equal: "idA"}, processId: {isNull: true}, id: {in: ["idA", "idB", "idC"]}}', - }, - { - name: 'returns correct AND filter for multiple id fields with equal, isNull, and IN operators', - introspectionFields: [ - createIntrospectionField('processId', TypeName.Id), - createIntrospectionField('id', TypeName.Id), - ], - filter: { - operator: 'AND', - filters: [ - createFieldFilter('id', FieldFilterOperatorEnum.Eq, 'idA'), - createFieldFilter( - 'processId', - FieldFilterOperatorEnum.IsNull, - 'True', - ), - createFieldFilter('id', 'IN', ['idA', 'idB', 'idC']), - ], - }, - expectedResult: - 'and: {id: {equal: "idA"}, processId: {isNull: true}, id: {in: ["idA", "idB", "idC"]}}', - }, - ]; - - idTestCases.forEach( - ({ name, introspectionFields, filter, expectedResult }) => { - it(`${name}`, () => { - const result = buildFilterCondition( - introspectionFields, - 'ProcessInstance', - filter, - ); - expect(result).toBe(expectedResult); - }); - }, - ); - }); - describe('dateArgument testcases', () => { - const testDate1 = '2024-10-10T09:54:40.759Z'; - const testDate2 = '2025-10-10T09:54:40.759Z'; - - const idTestCases: FilterTestCase[] = [ - { - name: 'returns correct filter for single date field with equal operator', - introspectionFields: [createIntrospectionField('start', TypeName.Date)], - filter: createFieldFilter( - 'start', - FieldFilterOperatorEnum.Eq, - testDate1, - ), - expectedResult: `start: {equal: "${testDate1}"}`, - }, - { - name: 'returns correct filter for single date field with isNull operator (false as boolean)', - introspectionFields: [createIntrospectionField('start', TypeName.Date)], - filter: createFieldFilter( - 'start', - FieldFilterOperatorEnum.IsNull, - false, - ), - expectedResult: 'start: {isNull: false}', - }, - { - name: 'returns correct filter for single date field with isNull operator (false as string)', - introspectionFields: [createIntrospectionField('start', TypeName.Date)], - filter: createFieldFilter( - 'start', - FieldFilterOperatorEnum.IsNull, - 'false', - ), - expectedResult: 'start: {isNull: false}', - }, - { - name: 'returns correct filter for single date field with GT operator', - introspectionFields: [createIntrospectionField('start', TypeName.Date)], - filter: createFieldFilter( - 'start', - FieldFilterOperatorEnum.Gt, - testDate1, - ), - expectedResult: `start: {greaterThan: "${testDate1}"}`, - }, - { - name: 'returns correct filter for single date field with GTE operator', - introspectionFields: [createIntrospectionField('start', TypeName.Date)], - filter: createFieldFilter( - 'start', - FieldFilterOperatorEnum.Gte, - testDate1, - ), - expectedResult: `start: {greaterThanEqual: "${testDate1}"}`, - }, - { - name: 'returns correct filter for single date field with LT operator', - introspectionFields: [createIntrospectionField('start', TypeName.Date)], - filter: createFieldFilter( - 'start', - FieldFilterOperatorEnum.Lt, - testDate1, - ), - expectedResult: `start: {lessThan: "${testDate1}"}`, - }, - { - name: 'returns correct filter for single date field with LTE operator', - introspectionFields: [createIntrospectionField('start', TypeName.Date)], - filter: createFieldFilter( - 'start', - FieldFilterOperatorEnum.Lte, - testDate1, - ), - expectedResult: `start: {lessThanEqual: "${testDate1}"}`, - }, - { - name: 'returns correct filter for single date field with BETWEEN operator', - introspectionFields: [createIntrospectionField('start', TypeName.Date)], - filter: createFieldFilter('start', FieldFilterOperatorEnum.Between, [ - testDate1, - testDate2, - ]), - expectedResult: `start: {between: {from: "${testDate1}", to: "${testDate2}"}}`, - }, - { - name: 'returns correct OR filter for multiple id fields with equal, isNull, and GT operators', - introspectionFields: [ - createIntrospectionField('start', TypeName.Date), - createIntrospectionField('end', TypeName.Date), - ], - filter: { - operator: 'OR', - filters: [ - createFieldFilter('start', FieldFilterOperatorEnum.Eq, testDate1), - createFieldFilter('end', FieldFilterOperatorEnum.IsNull, 'False'), - createFieldFilter('end', FieldFilterOperatorEnum.Gt, testDate1), - ], - }, - expectedResult: `or: {start: {equal: "${testDate1}"}, end: {isNull: false}, end: {greaterThan: "${testDate1}"}}`, - }, - { - name: 'returns correct OR filter for multiple id fields with equal, isNull, and GTE operators', - introspectionFields: [ - createIntrospectionField('start', TypeName.Date), - createIntrospectionField('end', TypeName.Date), - ], - filter: { - operator: 'OR', - filters: [ - createFieldFilter('start', FieldFilterOperatorEnum.Eq, testDate1), - createFieldFilter('end', FieldFilterOperatorEnum.IsNull, 'False'), - createFieldFilter('end', FieldFilterOperatorEnum.Gte, testDate1), - ], - }, - expectedResult: `or: {start: {equal: "${testDate1}"}, end: {isNull: false}, end: {greaterThanEqual: "${testDate1}"}}`, - }, - { - name: 'returns correct AND filter for multiple id fields with equal, isNull, and LTE operators', - introspectionFields: [ - createIntrospectionField('start', TypeName.Date), - createIntrospectionField('end', TypeName.Date), - ], - filter: { - operator: 'AND', - filters: [ - createFieldFilter('start', FieldFilterOperatorEnum.Eq, testDate1), - createFieldFilter('end', FieldFilterOperatorEnum.IsNull, 'False'), - createFieldFilter('end', FieldFilterOperatorEnum.Lte, testDate1), - ], - }, - expectedResult: `and: {start: {equal: "${testDate1}"}, end: {isNull: false}, end: {lessThanEqual: "${testDate1}"}}`, - }, - { - name: 'returns correct AND filter for multiple id fields with equal, isNull, LTE, and between operators', - introspectionFields: [ - createIntrospectionField('start', TypeName.Date), - createIntrospectionField('end', TypeName.Date), - ], - filter: { - operator: 'AND', - filters: [ - createFieldFilter('start', FieldFilterOperatorEnum.Eq, testDate1), - createFieldFilter('end', FieldFilterOperatorEnum.IsNull, 'False'), - createFieldFilter('end', FieldFilterOperatorEnum.Lte, testDate1), - createFieldFilter('start', FieldFilterOperatorEnum.Between, [ - testDate1, - testDate2, - ]), - ], - }, - expectedResult: `and: {start: {equal: "${testDate1}"}, end: {isNull: false}, end: {lessThanEqual: "${testDate1}"}, start: {between: {from: "${testDate1}", to: "${testDate2}"}}}`, - }, - ]; - - idTestCases.forEach( - ({ name, introspectionFields, filter, expectedResult }) => { - it(`${name}`, () => { - const result = buildFilterCondition( - introspectionFields, - 'ProcessInstance', - filter, - ); - expect(result).toBe(expectedResult); - }); - }, - ); - }); - describe('enumArgument testcases', () => { - const idTestCases: FilterTestCase[] = [ - { - name: 'returns correct filter for state enum field with equal operator', - introspectionFields: [ - createIntrospectionField('state', TypeName.String), - ], - filter: createFieldFilter( - 'state', - FieldFilterOperatorEnum.Eq, - ProcessInstanceStatusDTO.Completed, - ), - expectedResult: `state: {equal: ${ProcessInstanceState.Completed}}`, - }, - ]; - - idTestCases.forEach( - ({ name, introspectionFields, filter, expectedResult }) => { - it(`${name}`, () => { - const result = buildFilterCondition( - introspectionFields, - 'ProcessInstance', - filter, - ); - expect(result).toBe(expectedResult); - }); - }, - ); - }); -}); diff --git a/plugins/orchestrator-backend/src/helpers/queryBuilder.test.ts b/plugins/orchestrator-backend/src/helpers/queryBuilder.test.ts deleted file mode 100644 index ac1f41c600..0000000000 --- a/plugins/orchestrator-backend/src/helpers/queryBuilder.test.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { Pagination } from '../types/pagination'; -import { buildGraphQlQuery } from './queryBuilder'; - -describe('buildGraphQlQuery', () => { - const defaultTestParams = { - queryBody: 'id status', - type: 'ProcessInstances' as - | 'ProcessDefinitions' - | 'ProcessInstances' - | 'Jobs', - pagination: { - offset: 0, - limit: 10, - order: 'asc', - sortField: 'name', - } as Pagination | undefined, - whereClause: 'version: "1.0"', - }; - - const getPaginationString = (pagination: Pagination | undefined) => { - const paginationOrder = pagination?.order - ? pagination.order.toUpperCase() - : 'ASC'; - if (pagination) { - return `orderBy: {${pagination.sortField}: ${paginationOrder}}, pagination: {limit: ${pagination.limit}, offset: ${pagination.offset}})`; - } - return undefined; - }; - - type TestCase = { - name: string; - params: typeof defaultTestParams; - expectedResult: string; - }; - - const testCases: TestCase[] = [ - { - name: 'should build a basic query without where clause and pagination', - params: { - type: defaultTestParams.type, - queryBody: defaultTestParams.queryBody, - whereClause: '', - pagination: {}, - }, - expectedResult: `{${defaultTestParams.type} {${defaultTestParams.queryBody} } }`, - }, - { - name: 'should build a query with a where clause', - params: { - type: defaultTestParams.type, - queryBody: defaultTestParams.queryBody, - whereClause: defaultTestParams.whereClause, - pagination: {}, - }, - expectedResult: `{${defaultTestParams.type} (where: {${defaultTestParams.whereClause}}) {${defaultTestParams.queryBody} } }`, - }, - { - name: 'should build a query with pagination', - params: { - type: defaultTestParams.type, - queryBody: defaultTestParams.queryBody, - whereClause: '', - pagination: defaultTestParams.pagination, - }, - expectedResult: `{${defaultTestParams.type} (${getPaginationString(defaultTestParams.pagination)} {${defaultTestParams.queryBody} } }`, - }, - { - name: 'should build a query with both where clause and pagination', - params: { - ...defaultTestParams, - }, - expectedResult: `{${defaultTestParams.type} (where: {${defaultTestParams.whereClause}}, ${getPaginationString(defaultTestParams.pagination)} {${defaultTestParams.queryBody} } }`, - }, - ]; - - testCases.forEach(({ name, params, expectedResult }) => { - it(`${name}`, () => { - const result = buildGraphQlQuery(params); - expect(result).toBe(expectedResult); - }); - }); -}); diff --git a/plugins/orchestrator-backend/src/helpers/queryBuilder.ts b/plugins/orchestrator-backend/src/helpers/queryBuilder.ts deleted file mode 100644 index 01c28ef285..0000000000 --- a/plugins/orchestrator-backend/src/helpers/queryBuilder.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Pagination } from '../types/pagination'; - -export function buildGraphQlQuery(args: { - type: 'ProcessDefinitions' | 'ProcessInstances' | 'Jobs'; - queryBody: string; - whereClause?: string; - pagination?: Pagination; -}): string { - let query = `{${args.type}`; - - const whereClause = buildWhereClause(args.whereClause); - const paginationClause = buildPaginationClause(args.pagination); - - if (whereClause || paginationClause) { - query += ' ('; - query += [whereClause, paginationClause].filter(Boolean).join(', '); - query += ') '; - } - - query += ` {${args.queryBody} } }`; - - return query.replace(/\s+/g, ' ').trim(); -} - -function buildWhereClause(whereClause?: string): string { - return whereClause ? `where: {${whereClause}}` : ''; -} - -function buildPaginationClause(pagination?: Pagination): string { - if (!pagination) return ''; - - const parts = []; - - if (pagination.sortField !== undefined) { - parts.push( - `orderBy: {${pagination.sortField}: ${pagination.order !== undefined ? pagination.order?.toUpperCase() : 'ASC'}}`, - ); - } - - const paginationParts = []; - if (pagination.limit !== undefined) { - paginationParts.push(`limit: ${pagination.limit}`); - } - if (pagination.offset !== undefined) { - paginationParts.push(`offset: ${pagination.offset}`); - } - if (paginationParts.length) { - parts.push(`pagination: {${paginationParts.join(', ')}}`); - } - - return parts.join(', '); -} diff --git a/plugins/orchestrator-backend/src/index.ts b/plugins/orchestrator-backend/src/index.ts deleted file mode 100644 index b8e1645d7b..0000000000 --- a/plugins/orchestrator-backend/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { orchestratorPlugin as default } from './plugin'; diff --git a/plugins/orchestrator-backend/src/plugin.ts b/plugins/orchestrator-backend/src/plugin.ts deleted file mode 100644 index f9ddc32452..0000000000 --- a/plugins/orchestrator-backend/src/plugin.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { - coreServices, - createBackendPlugin, -} from '@backstage/backend-plugin-api'; -import { catalogServiceRef } from '@backstage/plugin-catalog-node/alpha'; - -import { createRouter } from './routerWrapper'; - -export const orchestratorPlugin = createBackendPlugin({ - pluginId: 'orchestrator', - register(env) { - env.registerInit({ - deps: { - logger: coreServices.logger, - config: coreServices.rootConfig, - discovery: coreServices.discovery, - catalogApi: catalogServiceRef, - urlReader: coreServices.urlReader, - permissions: coreServices.permissions, - scheduler: coreServices.scheduler, - auth: coreServices.auth, - httpAuth: coreServices.httpAuth, - http: coreServices.httpRouter, - }, - async init(props) { - const { http } = props; - const router = await createRouter(props); - http.use(router); - http.addAuthPolicy({ - path: '/health', - allow: 'unauthenticated', - }); - http.addAuthPolicy({ - path: '/static', - allow: 'unauthenticated', - }); - http.addAuthPolicy({ - path: '/docs', - allow: 'unauthenticated', - }); - }, - }); - }, -}); diff --git a/plugins/orchestrator-backend/src/routerWrapper/index.ts b/plugins/orchestrator-backend/src/routerWrapper/index.ts deleted file mode 100644 index 601619d4fe..0000000000 --- a/plugins/orchestrator-backend/src/routerWrapper/index.ts +++ /dev/null @@ -1,59 +0,0 @@ -import type { - AuthService, - DiscoveryService, - HttpAuthService, - LoggerService, - PermissionsService, - SchedulerService, - UrlReaderService, -} from '@backstage/backend-plugin-api'; -import type { CatalogApi } from '@backstage/catalog-client'; -import type { Config } from '@backstage/config'; - -import express from 'express'; - -import { DevModeService } from '../service/DevModeService'; -import { createBackendRouter } from '../service/router'; - -export interface RouterOptions { - config: Config; - logger: LoggerService; - discovery: DiscoveryService; - catalogApi: CatalogApi; - urlReader: UrlReaderService; - scheduler: SchedulerService; - permissions: PermissionsService; - httpAuth: HttpAuthService; - auth: AuthService; -} - -export async function createRouter( - args: RouterOptions, -): Promise { - const autoStartDevMode = - args.config.getOptionalBoolean( - 'orchestrator.sonataFlowService.autoStart', - ) ?? false; - - if (autoStartDevMode) { - const devModeService = new DevModeService(args.config, args.logger); - - const isSonataFlowUp = await devModeService.launchDevMode(); - - if (!isSonataFlowUp) { - args.logger.error('SonataFlow is not up. Check your configuration.'); - } - } - - return await createBackendRouter({ - config: args.config, - logger: args.logger, - discovery: args.discovery, - catalogApi: args.catalogApi, - urlReader: args.urlReader, - scheduler: args.scheduler, - permissions: args.permissions, - httpAuth: args.httpAuth, - auth: args.auth, - }); -} diff --git a/plugins/orchestrator-backend/src/service/DataIndexService.test.ts b/plugins/orchestrator-backend/src/service/DataIndexService.test.ts deleted file mode 100644 index efe86eed30..0000000000 --- a/plugins/orchestrator-backend/src/service/DataIndexService.test.ts +++ /dev/null @@ -1,786 +0,0 @@ -import { LoggerService } from '@backstage/backend-plugin-api'; - -import { Client, OperationResult } from '@urql/core'; - -import { - FieldFilter, - FieldFilterOperatorEnum, - LogicalFilter, - NodeInstance, - ProcessInstance, - TypeKind, - TypeName, - WorkflowInfo, -} from '@janus-idp/backstage-plugin-orchestrator-common'; - -import * as buildGrahQLFilterUtils from '../helpers/filterBuilder'; -import * as buildGrahQLQueryUtils from '../helpers/queryBuilder'; -import { Pagination } from '../types/pagination'; -import { - mockProcessDefinitionArguments, - mockProcessDefinitionIntrospection, -} from './__fixtures__/mockProcessDefinitionArgumentsData'; -import { - mockProcessInstanceArguments, - mockProcessInstanceIntrospection, -} from './__fixtures__/mockProcessInstanceArgumentsData'; -import { DataIndexService } from './DataIndexService'; - -jest.mock('../helpers/queryBuilder', () => { - return { - __esModule: true, - ...jest.requireActual('../helpers/queryBuilder'), - }; -}); - -jest.mock('../helpers/filterBuilder', () => { - return { - __esModule: true, - ...jest.requireActual('../helpers/filterBuilder'), - }; -}); - -jest.mock('@urql/core', () => { - return { - Client: jest.fn().mockImplementation(() => ({ - query: jest.fn(), - })), - }; -}); - -const mockOperationResult = (data: T, error?: any): OperationResult => ({ - data, - error, - operation: {} as any, - extensions: {}, - hasNext: false, - stale: false, -}); - -const mockWfInfos: WorkflowInfo[] = [ - { - id: '9fa2a881-c932-468d-83a9-687b9f1e62a7', - nodes: [createNodeObject('A'), createNodeObject('B')], - }, -]; - -const createQueryArgs = ( - type: 'ProcessDefinitions' | 'ProcessInstances' | 'Jobs', - queryBody: string, - whereClause?: string, - pagination?: Pagination, -) => ({ - type, - queryBody, - whereClause, - pagination, -}); - -describe('initInputArgs', () => { - type MockableClient = Pick; - const createMockClient = (): jest.Mocked => ({ - query: jest.fn(), - }); - - let loggerMock: LoggerService; - let dataIndexService: DataIndexService; - let mockClient: jest.Mocked; - - beforeEach(() => { - jest.resetAllMocks(); - jest.clearAllMocks(); - // Create a new mock client for each test - mockClient = createMockClient(); - (Client as jest.MockedClass).mockImplementation( - () => mockClient as unknown as Client, - ); - - loggerMock = { - info: jest.fn(), - debug: jest.fn(), - error: jest.fn(), - warn: jest.fn(), - child: jest.fn(), - }; - mockClient.query.mockResolvedValueOnce( - mockOperationResult(mockProcessDefinitionArguments), - ); - dataIndexService = new DataIndexService('fakeUrl', loggerMock); - }); - - it('ProcessDefinition', async () => { - const processDefinitionArguments = - await dataIndexService.initInputProcessDefinitionArgs(); - - expect(mockClient.query).toHaveBeenCalledTimes(1); - expect(mockClient.query).toHaveBeenCalledWith( - dataIndexService.graphQLArgumentQuery('ProcessDefinition'), - {}, - ); - - expect(processDefinitionArguments).toBeDefined(); - expect( - processDefinitionArguments.every( - val => !['and', 'or', 'not'].includes(val.name), - ), - ).toBe(true); - expect(processDefinitionArguments).toHaveLength(3); - expect( - processDefinitionArguments.some( - obj => - obj.name === 'id' && - obj.type.kind === TypeKind.InputObject && - obj.type.name === TypeName.String, - ), - ).toBe(true); - expect( - processDefinitionArguments.some( - obj => - obj.name === 'name' && - obj.type.kind === TypeKind.InputObject && - obj.type.name === TypeName.String, - ), - ).toBe(true); - expect( - processDefinitionArguments.some( - obj => - obj.name === 'version' && - obj.type.kind === TypeKind.InputObject && - obj.type.name === TypeName.String, - ), - ).toBe(true); - }); -}); - -describe('fetchWorkflowInfos', () => { - let loggerMock: LoggerService; - let buildFilterConditionSpy: any; - let buildGraphQlQuerySpy: jest.SpyInstance; - let dataIndexService: DataIndexService; - let mockClient: jest.Mocked; - - const definitionIds = ['id1', 'id2']; - const queryBody = 'id, name, version, type, endpoint, serviceUrl, source'; - const pagination = { limit: 10, offset: 0, order: 'ASC', sortField: 'name' }; - - const filterString = - 'or: {name: {equal: "Hello World Workflow"}, id: {equal: "yamlgreet"}}'; - - const helloWorldFilter = { - field: 'name', - operator: FieldFilterOperatorEnum.Eq, - value: 'Hello World Workflow', - }; - const greetingFilter = { - field: 'id', - operator: FieldFilterOperatorEnum.Eq, - value: 'yamlgreet', - }; - - const logicalFilter: LogicalFilter = { - operator: 'OR', - filters: [helloWorldFilter, greetingFilter], - }; - - beforeEach(() => { - jest.clearAllMocks(); - - mockClient = { - query: jest.fn(), - } as any; - - (Client as jest.Mock).mockImplementation(() => mockClient); - - loggerMock = { - info: jest.fn(), - debug: jest.fn(), - error: jest.fn(), - warn: jest.fn(), - child: jest.fn(), - }; - - dataIndexService = new DataIndexService('fakeUrl', loggerMock); - - // Set up spies on the graphql utility functions - buildGraphQlQuerySpy = jest.spyOn( - buildGrahQLQueryUtils, - 'buildGraphQlQuery', - ); - buildFilterConditionSpy = jest.spyOn( - buildGrahQLFilterUtils, - 'buildFilterCondition', - ); - }); - it('should fetch workflow infos with no parameters', async () => { - // Given - const mockQueryResult = { - ProcessDefinitions: mockWfInfos, - }; - mockClient.query.mockResolvedValueOnce( - mockOperationResult(mockQueryResult), - ); - - const expectedQueryArgs = createQueryArgs('ProcessDefinitions', queryBody); - // When - const result = await dataIndexService.fetchWorkflowInfos({}); - // Then - expect(result).toBeDefined(); - expect(result).toBe(mockQueryResult.ProcessDefinitions); - expect(buildFilterConditionSpy).not.toHaveBeenCalled(); - expect(buildGraphQlQuerySpy).toHaveBeenCalledTimes(1); - expect(buildGraphQlQuerySpy).toHaveBeenCalledWith({ - type: 'ProcessDefinitions', - queryBody, - }); - expect(mockClient.query).toHaveBeenCalled(); - expect(mockClient.query).toHaveBeenCalledWith( - buildGrahQLQueryUtils.buildGraphQlQuery(expectedQueryArgs), - {}, - ); - }); - - it('should fetch workflow infos with definitionIds', async () => { - // Given - const whereClause = `id: {in: ${JSON.stringify(definitionIds)}}`; - const mockQueryResult = { - ProcessDefinitions: mockWfInfos, - }; - mockClient.query.mockResolvedValueOnce( - mockOperationResult(mockQueryResult), - ); - - const expectedQueryArgs = createQueryArgs( - 'ProcessDefinitions', - queryBody, - whereClause, - ); - // When - const result = await dataIndexService.fetchWorkflowInfos({ - definitionIds, - }); - - // Then - expect(result).toBeDefined(); - expect(result).toBe(mockQueryResult.ProcessDefinitions); - expect(buildGraphQlQuerySpy).toHaveBeenCalledTimes(1); - expect(buildGraphQlQuerySpy).toHaveBeenCalledWith({ - type: 'ProcessDefinitions', - queryBody, - whereClause, - }); - expect(buildFilterConditionSpy).not.toHaveBeenCalled(); - expect(mockClient.query).toHaveBeenCalled(); - expect(mockClient.query).toHaveBeenCalledWith( - buildGrahQLQueryUtils.buildGraphQlQuery(expectedQueryArgs), - {}, - ); - }); - - it('should fetch workflow infos with definitionIds and pagination', async () => { - // Given - const mockQueryResult = { - ProcessDefinitions: mockWfInfos, - }; - mockClient.query.mockResolvedValueOnce( - mockOperationResult(mockQueryResult), - ); - - const expectedQueryArgs = createQueryArgs( - 'ProcessDefinitions', - queryBody, - `id: {in: ${JSON.stringify(definitionIds)}}`, - pagination, - ); - // When - const result = await dataIndexService.fetchWorkflowInfos({ - definitionIds, - pagination, - }); - - // Then - expect(result).toBeDefined(); - expect(result).toBe(mockQueryResult.ProcessDefinitions); - expect(buildGraphQlQuerySpy).toHaveBeenCalledTimes(1); - expect(buildGraphQlQuerySpy).toHaveBeenCalledWith({ - type: 'ProcessDefinitions', - queryBody, - whereClause: `id: {in: ${JSON.stringify(definitionIds)}}`, - pagination, - }); - expect(mockClient.query).toHaveBeenCalledTimes(1); - expect(mockClient.query).toHaveBeenCalledWith( - buildGrahQLQueryUtils.buildGraphQlQuery(expectedQueryArgs), - {}, - ); - expect(buildFilterConditionSpy).not.toHaveBeenCalled(); - }); - - it('should fetch workflow infos with only filter', async () => { - // Given - const mockQueryResult = { - ProcessDefinitions: mockWfInfos, - }; - mockClient.query - .mockResolvedValueOnce( - mockOperationResult(mockProcessDefinitionArguments), - ) - .mockResolvedValueOnce(mockOperationResult(mockQueryResult)); - - const expectedQueryArgs = createQueryArgs( - 'ProcessDefinitions', - queryBody, - filterString, - ); - - // When - const result = await dataIndexService.fetchWorkflowInfos({ - filter: logicalFilter, - }); - - // Then - expect(result).toBeDefined(); - expect(result).toBe(mockQueryResult.ProcessDefinitions); - - expect(buildGraphQlQuerySpy).toHaveBeenCalledTimes(1); - expect(buildGraphQlQuerySpy).toHaveBeenCalledWith({ - type: 'ProcessDefinitions', - queryBody, - whereClause: filterString, - }); - expect(buildFilterConditionSpy).toHaveBeenCalledTimes(1); - expect(buildFilterConditionSpy).toHaveBeenCalledWith( - mockProcessDefinitionIntrospection, - 'ProcessDefinition', - logicalFilter, - ); - expect(mockClient.query).toHaveBeenCalledTimes(2); - expect(mockClient.query).toHaveBeenCalledWith( - buildGrahQLQueryUtils.buildGraphQlQuery(expectedQueryArgs), - {}, - ); - }); - - it('should fetch workflow infos with definitionIds and filter', async () => { - // Given - const whereClause = `and: [{id: {in: ${JSON.stringify(definitionIds)}}}, {${filterString}}]`; - // Given - const mockQueryResult = { - ProcessDefinitions: mockWfInfos, - }; - mockClient.query - .mockResolvedValueOnce( - mockOperationResult(mockProcessDefinitionArguments), - ) - .mockResolvedValueOnce(mockOperationResult(mockQueryResult)); - - const expectedQueryArgs = createQueryArgs( - 'ProcessDefinitions', - queryBody, - whereClause, - ); - - // When - const result = await dataIndexService.fetchWorkflowInfos({ - definitionIds, - filter: logicalFilter, - }); - - // Then - - expect(buildGraphQlQuerySpy).toHaveBeenCalledTimes(1); - expect(buildGraphQlQuerySpy).toHaveBeenCalledWith({ - type: 'ProcessDefinitions', - queryBody: 'id, name, version, type, endpoint, serviceUrl, source', - whereClause, - }); - expect(buildFilterConditionSpy).toHaveBeenCalledTimes(1); - expect(buildFilterConditionSpy).toHaveBeenCalledWith( - mockProcessDefinitionIntrospection, - 'ProcessDefinition', - logicalFilter, - ); - expect(mockClient.query).toHaveBeenCalledTimes(2); - expect(mockClient.query).toHaveBeenCalledWith( - buildGrahQLQueryUtils.buildGraphQlQuery(expectedQueryArgs), - {}, - ); - expect(result).toBeDefined(); - expect(result).toBe(mockQueryResult.ProcessDefinitions); - }); - - it('should fetch workflow infos with definitionIds, pagination, and filter', async () => { - // Given - const whereClause = `and: [{id: {in: ${JSON.stringify(definitionIds)}}}, {${filterString}}]`; - // Given - const mockQueryResult = { - ProcessDefinitions: mockWfInfos, - }; - mockClient.query - .mockResolvedValueOnce( - mockOperationResult(mockProcessDefinitionArguments), - ) - .mockResolvedValueOnce(mockOperationResult(mockQueryResult)); - - const expectedQueryArgs = createQueryArgs( - 'ProcessDefinitions', - queryBody, - whereClause, - pagination, - ); - // When - const result = await dataIndexService.fetchWorkflowInfos({ - definitionIds, - pagination, - filter: logicalFilter, - }); - - // Then - - expect(mockClient.query).toHaveBeenCalledTimes(2); - expect(mockClient.query).toHaveBeenCalledWith( - buildGrahQLQueryUtils.buildGraphQlQuery(expectedQueryArgs), - {}, - ); - expect(buildGraphQlQuerySpy).toHaveBeenCalledTimes(2); - expect(buildGraphQlQuerySpy).toHaveBeenCalledWith({ - type: 'ProcessDefinitions', - queryBody, - whereClause, - pagination, - }); - expect(buildFilterConditionSpy).toHaveBeenCalledTimes(1); - expect(buildFilterConditionSpy).toHaveBeenCalledWith( - mockProcessDefinitionIntrospection, - 'ProcessDefinition', - logicalFilter, - ); - expect(result).toBeDefined(); - expect(result).toBe(mockQueryResult.ProcessDefinitions); - }); -}); -describe('fetchInstances', () => { - let loggerMock: LoggerService; - let buildFilterConditionSpy: any; - let buildGraphQlQuerySpy: any; - let mockClient: jest.Mocked; - - let dataIndexService: DataIndexService; - - const definitionIds = ['id', 'name']; - const pagination = { limit: 10, offset: 0, order: 'ASC', sortField: 'name' }; - - const processIdNotNullCondition = 'processId: {isNull: false}'; - const processIdDefinitions = `processId: {in: ${JSON.stringify(definitionIds)}`; - const queryBody = - 'id, processName, processId, businessKey, state, start, end, nodes { id }, variables, parentProcessInstance {id, processName, businessKey}'; - - const mockProcessInstances: ProcessInstance[] = [ - { - id: 'id', - processId: 'processId1', - endpoint: 'endpoint1', - nodes: [createNodeObject('A'), createNodeObject('B')], - }, - { - id: 'name', - processId: 'processId2', - endpoint: 'endpoint2', - nodes: [createNodeObject('C'), createNodeObject('D')], - }, - ]; - - const filterString = - 'or: {processId: {equal: "processId1"}, processName: {like: "processName%"}}'; - - const procName1Filter: FieldFilter = { - field: 'processName', - operator: FieldFilterOperatorEnum.Like, - value: 'processName%', - }; - const procId1Filter: FieldFilter = { - field: 'processId', - operator: FieldFilterOperatorEnum.Eq, - value: 'processId1', - }; - - const logicalFilter: LogicalFilter = { - operator: 'OR', - filters: [procId1Filter, procName1Filter], - }; - const mockQueryResult = { ProcessInstances: mockProcessInstances }; - - beforeEach(() => { - mockClient = { - query: jest.fn(), - } as any; - - (Client as jest.Mock).mockImplementation(() => mockClient); - - const wfInfo: WorkflowInfo = { - id: 'wfinfo1', - source: 'workflow info source', - }; - - loggerMock = { - info: jest.fn(), - debug: jest.fn(), - error: jest.fn(), - warn: jest.fn(), - child: jest.fn(), - }; - dataIndexService = new DataIndexService('fakeUrl', loggerMock); - // Create a spy for method1 - jest.spyOn(dataIndexService, 'fetchWorkflowInfo').mockResolvedValue(wfInfo); - // Set up spies on the graphql utility functions - buildGraphQlQuerySpy = jest.spyOn( - buildGrahQLQueryUtils, - 'buildGraphQlQuery', - ); - buildFilterConditionSpy = jest.spyOn( - buildGrahQLFilterUtils, - 'buildFilterCondition', - ); - - // Clear mocks before each test - jest.clearAllMocks(); - }); - it('should fetch instances with no parameters', async () => { - // Given - const whereClause = processIdNotNullCondition; - mockClient.query.mockResolvedValueOnce( - mockOperationResult(mockQueryResult), - ); - - const expectedQueryArgs = createQueryArgs( - 'ProcessInstances', - queryBody, - whereClause, - ); - - // When - const result = await dataIndexService.fetchInstances({}); - - // Then - expect(result).toBeDefined(); - expect(result).toStrictEqual(mockQueryResult.ProcessInstances); - - expect(buildGraphQlQuerySpy).toHaveBeenCalledTimes(1); - expect(buildGraphQlQuerySpy).toHaveBeenCalledWith({ - type: 'ProcessInstances', - queryBody, - whereClause, - }); - expect(buildFilterConditionSpy).not.toHaveBeenCalled(); - expect(mockClient.query).toHaveBeenCalled(); - expect(mockClient.query).toHaveBeenCalledWith( - buildGrahQLQueryUtils.buildGraphQlQuery(expectedQueryArgs), - {}, - ); - }); - - it('should fetch instances with definitionIds', async () => { - // Given - const whereClause = `and: [{${processIdNotNullCondition}}, {${processIdDefinitions}}}]`; - - mockClient.query.mockResolvedValueOnce( - mockOperationResult(mockQueryResult), - ); - - const expectedQueryArgs = createQueryArgs( - 'ProcessInstances', - queryBody, - whereClause, - ); - // When - const result = await dataIndexService.fetchInstances({ - definitionIds, - }); - - // Then - expect(buildGraphQlQuerySpy).toHaveBeenCalledTimes(1); - expect(buildGraphQlQuerySpy).toHaveBeenCalledWith({ - type: 'ProcessInstances', - queryBody, - whereClause, - pagination: undefined, - }); - expect(buildFilterConditionSpy).not.toHaveBeenCalled(); - expect(mockClient.query).toHaveBeenCalled(); - expect(mockClient.query).toHaveBeenCalledWith( - buildGrahQLQueryUtils.buildGraphQlQuery(expectedQueryArgs), - {}, - ); - expect(result).toBeDefined(); - expect(result).toStrictEqual(mockQueryResult.ProcessInstances); - }); - - it('should fetch instances with definitionIds and pagination', async () => { - // Given - const whereClause = `and: [{${processIdNotNullCondition}}, {${processIdDefinitions}}}]`; - mockClient.query.mockResolvedValueOnce( - mockOperationResult(mockQueryResult), - ); - - const expectedQueryArgs = createQueryArgs( - 'ProcessInstances', - queryBody, - whereClause, - pagination, - ); - // When - const result = await dataIndexService.fetchInstances({ - definitionIds, - - pagination, - }); - - // Then - expect(result).toBeDefined(); - expect(result).toStrictEqual(mockQueryResult.ProcessInstances); - - expect(buildGraphQlQuerySpy).toHaveBeenCalledTimes(1); - expect(buildGraphQlQuerySpy).toHaveBeenCalledWith({ - type: 'ProcessInstances', - queryBody, - whereClause, - pagination, - }); - expect(buildFilterConditionSpy).not.toHaveBeenCalled(); - expect(mockClient.query).toHaveBeenCalledTimes(1); - expect(mockClient.query).toHaveBeenCalledWith( - buildGrahQLQueryUtils.buildGraphQlQuery(expectedQueryArgs), - {}, - ); - }); - - it('should fetch instances with only filter', async () => { - // Given - const whereClause = `and: [{${processIdNotNullCondition}}, {${filterString}}]`; - mockClient.query - .mockResolvedValueOnce(mockOperationResult(mockProcessInstanceArguments)) - .mockResolvedValueOnce(mockOperationResult(mockQueryResult)); - - const expectedQueryArgs = createQueryArgs( - 'ProcessInstances', - queryBody, - whereClause, - ); - // When - const result = await dataIndexService.fetchInstances({ - filter: logicalFilter, - }); - - // Then - expect(result).toBeDefined(); - expect(result).toStrictEqual(mockQueryResult.ProcessInstances); - expect(buildGraphQlQuerySpy).toHaveBeenCalledTimes(1); - expect(buildGraphQlQuerySpy).toHaveBeenCalledWith({ - type: 'ProcessInstances', - queryBody, - whereClause, - }); - expect(buildFilterConditionSpy).toHaveBeenCalledTimes(1); - expect(buildFilterConditionSpy).toHaveBeenCalledWith( - mockProcessInstanceIntrospection, - 'ProcessInstance', - logicalFilter, - ); - expect(mockClient.query).toHaveBeenCalledTimes(2); - expect(mockClient.query).toHaveBeenCalledWith( - buildGrahQLQueryUtils.buildGraphQlQuery(expectedQueryArgs), - {}, - ); - }); - - it('should fetch instances with definitionIds and filter', async () => { - // Given - const whereClause = `and: [{${processIdNotNullCondition}}, {${processIdDefinitions}}}, {${filterString}}]`; - mockClient.query - .mockResolvedValueOnce(mockOperationResult(mockProcessInstanceArguments)) - .mockResolvedValueOnce(mockOperationResult(mockQueryResult)); - const expectedQueryArgs = createQueryArgs( - 'ProcessInstances', - queryBody, - whereClause, - ); - // When - const result = await dataIndexService.fetchInstances({ - definitionIds, - filter: logicalFilter, - }); - - // Then - expect(buildGraphQlQuerySpy).toHaveBeenCalledTimes(1); - expect(buildGraphQlQuerySpy).toHaveBeenCalledWith({ - type: 'ProcessInstances', - queryBody, - whereClause, - }); - expect(buildFilterConditionSpy).toHaveBeenCalledTimes(1); - expect(buildFilterConditionSpy).toHaveBeenCalledWith( - mockProcessInstanceIntrospection, - 'ProcessInstance', - logicalFilter, - ); - expect(mockClient.query).toHaveBeenCalledTimes(2); - expect(mockClient.query).toHaveBeenCalledWith( - buildGrahQLQueryUtils.buildGraphQlQuery(expectedQueryArgs), - {}, - ); - expect(result).toBeDefined(); - expect(result).toStrictEqual(mockQueryResult.ProcessInstances); - }); - - it('should fetch instances with definitionIds, pagination, and filter', async () => { - // Given - const whereClause = `and: [{${processIdNotNullCondition}}, {${processIdDefinitions}}}, {${filterString}}]`; - mockClient.query - .mockResolvedValueOnce(mockOperationResult(mockProcessInstanceArguments)) - .mockResolvedValueOnce(mockOperationResult(mockQueryResult)); - const expectedQueryArgs = createQueryArgs( - 'ProcessInstances', - queryBody, - whereClause, - pagination, - ); - // When - const result = await dataIndexService.fetchInstances({ - definitionIds, - pagination, - filter: logicalFilter, - }); - - // Then - expect(buildGraphQlQuerySpy).toHaveBeenCalledTimes(1); - expect(buildGraphQlQuerySpy).toHaveBeenCalledWith({ - type: 'ProcessInstances', - queryBody, - whereClause, - pagination, - }); - expect(buildFilterConditionSpy).toHaveBeenCalledTimes(1); - expect(buildFilterConditionSpy).toHaveBeenCalledWith( - mockProcessInstanceIntrospection, - 'ProcessInstance', - logicalFilter, - ); - expect(mockClient.query).toHaveBeenCalledTimes(2); - expect(mockClient.query).toHaveBeenCalledWith( - buildGrahQLQueryUtils.buildGraphQlQuery(expectedQueryArgs), - {}, - ); - expect(result).toBeDefined(); - expect(result).toStrictEqual(mockQueryResult.ProcessInstances); - }); -}); - -function createNodeObject(suffix: string): NodeInstance { - return { - id: `node${suffix}`, - name: `node${suffix}`, - enter: new Date('2024-08-01T14:30:00').toISOString(), - type: 'NodeType', - definitionId: `definitionId${suffix}`, - nodeId: `nodeId${suffix}`, - }; -} diff --git a/plugins/orchestrator-backend/src/service/DataIndexService.ts b/plugins/orchestrator-backend/src/service/DataIndexService.ts deleted file mode 100644 index 207a99c5e6..0000000000 --- a/plugins/orchestrator-backend/src/service/DataIndexService.ts +++ /dev/null @@ -1,550 +0,0 @@ -import { LoggerService } from '@backstage/backend-plugin-api'; - -import { Client, fetchExchange, gql } from '@urql/core'; - -import { - Filter, - fromWorkflowSource, - getWorkflowCategory, - IntrospectionField, - parseWorkflowVariables, - ProcessInstance, - WorkflowDefinition, - WorkflowInfo, -} from '@janus-idp/backstage-plugin-orchestrator-common'; - -import { ErrorBuilder } from '../helpers/errorBuilder'; -import { buildFilterCondition } from '../helpers/filterBuilder'; -import { buildGraphQlQuery } from '../helpers/queryBuilder'; -import { Pagination } from '../types/pagination'; -import { FETCH_PROCESS_INSTANCES_SORT_FIELD } from './constants'; - -export class DataIndexService { - private readonly client: Client; - public processDefinitionArguments: IntrospectionField[] = []; - public processInstanceArguments: IntrospectionField[] = []; - - public constructor( - private readonly dataIndexUrl: string, - private readonly logger: LoggerService, - ) { - if (!dataIndexUrl.length) { - throw ErrorBuilder.GET_NO_DATA_INDEX_URL_ERR(); - } - - this.client = this.getNewGraphQLClient(); - } - - private getNewGraphQLClient(): Client { - const diURL = `${this.dataIndexUrl}/graphql`; - return new Client({ - url: diURL, - exchanges: [fetchExchange], - }); - } - - public async initInputProcessDefinitionArgs(): Promise { - if (this.processDefinitionArguments.length === 0) { - this.processDefinitionArguments = - await this.inspectInputArgument('ProcessDefinition'); - } - return this.processDefinitionArguments; // For testing purposes - } - - public graphQLArgumentQuery(type: string): string { - return `query ${type}Argument { - __type(name: "${type}Argument") { - kind - name - inputFields { - name - type { - kind - name - ofType { - kind - name - ofType { - kind - name - ofType { - kind - name - } - } - } - } - } - } - }`; - } - - public async inspectInputArgument( - type: string, - ): Promise { - const result = await this.client.query(this.graphQLArgumentQuery(type), {}); - - this.logger.debug(`Introspection query result: ${JSON.stringify(result)}`); - - if (result?.error) { - this.logger.error(`Error executing introspection query ${result.error}`); - throw result.error; - } - - const pairs: IntrospectionField[] = []; - if (result?.data?.__type?.inputFields) { - for (const field of result.data.__type.inputFields) { - if ( - field.name !== 'and' && - field.name !== 'or' && - field.name !== 'not' - ) { - pairs.push({ - name: field.name, - type: { - name: field.type.name, - kind: field.type.kind, - ofType: field.type.ofType, - }, - }); - } - } - } - return pairs; - } - - public async abortWorkflowInstance(instanceId: string): Promise { - this.logger.info(`Aborting workflow instance ${instanceId}`); - const ProcessInstanceAbortMutationDocument = gql` - mutation ProcessInstanceAbortMutation($id: String) { - ProcessInstanceAbort(id: $id) - } - `; - - const result = await this.client.mutation( - ProcessInstanceAbortMutationDocument, - { id: instanceId }, - ); - - this.logger.debug( - `Abort workflow instance result: ${JSON.stringify(result)}`, - ); - - if (result.error) { - throw new Error( - `Error aborting workflow instance ${instanceId}: ${result.error}`, - ); - } - this.logger.debug(`Successfully aborted workflow instance ${instanceId}`); - } - - public async fetchWorkflowInfo( - definitionId: string, - ): Promise { - const graphQlQuery = `{ ProcessDefinitions ( where: {id: {equal: "${definitionId}" } } ) { id, name, version, type, endpoint, serviceUrl, source } }`; - - const result = await this.client.query(graphQlQuery, {}); - - this.logger.debug( - `Get workflow definition result: ${JSON.stringify(result)}`, - ); - - if (result.error) { - this.logger.error(`Error fetching workflow definition ${result.error}`); - throw result.error; - } - - const processDefinitions = result.data.ProcessDefinitions as WorkflowInfo[]; - - if (processDefinitions.length === 0) { - this.logger.info(`No workflow definition found for ${definitionId}`); - return undefined; - } - - return processDefinitions[0]; - } - - public async fetchWorkflowServiceUrls(): Promise> { - const graphQlQuery = `{ ProcessDefinitions { id, serviceUrl } }`; - - const result = await this.client.query(graphQlQuery, {}); - - this.logger.debug( - `Get workflow service urls result: ${JSON.stringify(result)}`, - ); - - if (result.error) { - this.logger.error(`Error fetching workflow service urls ${result.error}`); - throw result.error; - } - - const processDefinitions = result.data.ProcessDefinitions as WorkflowInfo[]; - return processDefinitions - .filter(definition => definition.serviceUrl) - .map(definition => ({ [definition.id]: definition.serviceUrl! })) - .reduce((acc, curr) => ({ ...acc, ...curr }), {}); - } - - public async fetchWorkflowInfos(args: { - definitionIds?: string[]; - pagination?: Pagination; - filter?: Filter; - }): Promise { - this.logger.info(`fetchWorkflowInfos() called: ${this.dataIndexUrl}`); - const { definitionIds, pagination, filter } = args; - - const definitionIdsCondition = - definitionIds !== undefined && definitionIds.length > 0 - ? `id: {in: ${JSON.stringify(definitionIds)}}` - : undefined; - - const filterCondition = filter - ? buildFilterCondition( - await this.initInputProcessDefinitionArgs(), - 'ProcessDefinition', - filter, - ) - : undefined; - - let whereClause: string | undefined; - if (definitionIds && filter) { - whereClause = `and: [{${definitionIdsCondition}}, {${filterCondition}}]`; - } else if (definitionIdsCondition || filterCondition) { - whereClause = definitionIdsCondition ?? filterCondition; - } else { - whereClause = undefined; - } - - const graphQlQuery = buildGraphQlQuery({ - type: 'ProcessDefinitions', - queryBody: 'id, name, version, type, endpoint, serviceUrl, source', - whereClause, - pagination, - }); - this.logger.debug(`GraphQL query: ${graphQlQuery}`); - const result = await this.client.query(graphQlQuery, {}); - this.logger.debug( - `Get workflow definitions result: ${JSON.stringify(result)}`, - ); - - if (result.error) { - this.logger.error( - `Error fetching data index swf results ${result.error}`, - ); - throw result.error; - } - - return result.data.ProcessDefinitions; - } - - public async fetchInstances(args: { - definitionIds?: string[]; - pagination?: Pagination; - filter?: Filter; - }): Promise { - const { pagination, definitionIds, filter } = args; - if (pagination) pagination.sortField ??= FETCH_PROCESS_INSTANCES_SORT_FIELD; - - const processIdNotNullCondition = 'processId: {isNull: false}'; - const definitionIdsCondition = definitionIds - ? `processId: {in: ${JSON.stringify(definitionIds)}}` - : undefined; - const type = 'ProcessInstance'; - const filterCondition = filter - ? buildFilterCondition( - await this.inspectInputArgument(type), - type, - filter, - ) - : ''; - - let whereClause = ''; - const conditions = []; - - if (processIdNotNullCondition) { - conditions.push(`{${processIdNotNullCondition}}`); - } - - if (definitionIdsCondition) { - conditions.push(`{${definitionIdsCondition}}`); - } - - if (filter) { - conditions.push(`{${filterCondition}}`); - } - - if (conditions.length === 0) { - whereClause = processIdNotNullCondition; - } else if (conditions.length === 1) { - whereClause = conditions[0].slice(1, -1); // Remove the outer braces - } else if (conditions.length > 1) { - whereClause = `and: [${conditions.join(', ')}]`; - } - - const graphQlQuery = buildGraphQlQuery({ - type: 'ProcessInstances', - queryBody: - 'id, processName, processId, businessKey, state, start, end, nodes { id }, variables, parentProcessInstance {id, processName, businessKey}', - whereClause, - pagination, - }); - - this.logger.debug(`GraphQL query: ${graphQlQuery}`); - - const result = await this.client.query(graphQlQuery, {}); - - this.logger.debug( - `Fetch process instances result: ${JSON.stringify(result)}`, - ); - - const processInstancesSrc = result.data - .ProcessInstances as ProcessInstance[]; - - const processInstances = await Promise.all( - processInstancesSrc.map(async instance => { - return await this.getWorkflowDefinitionFromInstance(instance); - }), - ); - return processInstances; - } - - public async fetchInstancesTotalCount( - definitionIds?: string[], - filter?: Filter, - ): Promise { - const definitionIdsCondition = definitionIds - ? `processId: {in: ${JSON.stringify(definitionIds)}}` - : undefined; - this.initInputProcessDefinitionArgs(); - const filterCondition = filter - ? buildFilterCondition( - await this.inspectInputArgument('ProcessInstance'), - 'ProcessInstance', - filter, - ) - : ''; - - let whereClause: string | undefined; - if (definitionIds && filter) { - whereClause = `and: [{${definitionIdsCondition}}, {${filterCondition}}]`; - } else if (definitionIdsCondition || filterCondition) { - whereClause = definitionIdsCondition ?? filterCondition; - } - - const graphQlQuery = buildGraphQlQuery({ - type: 'ProcessInstances', - queryBody: 'id', - whereClause, - }); - this.logger.debug(`GraphQL query: ${graphQlQuery}`); - - const result = await this.client.query(graphQlQuery, {}); - - if (result.error) { - this.logger.error( - `Error when fetching instances total count: ${result.error}`, - ); - throw result.error; - } - - const idArr = result.data.ProcessInstances as ProcessInstance[]; - - return idArr.length; - } - - private async getWorkflowDefinitionFromInstance(instance: ProcessInstance) { - const workflowInfo = await this.fetchWorkflowInfo(instance.processId); - if (!workflowInfo?.source) { - throw new Error( - `Workflow defintion is required to fetch instance ${instance.id}`, - ); - } - const workflowDefinitionSrc: WorkflowDefinition = fromWorkflowSource( - workflowInfo.source, - ); - if (workflowInfo) { - instance.category = getWorkflowCategory(workflowDefinitionSrc); - instance.description = workflowInfo.description; - } - return instance; - } - - public async fetchWorkflowSource( - definitionId: string, - ): Promise { - const graphQlQuery = `{ ProcessDefinitions ( where: {id: {equal: "${definitionId}" } } ) { id, source } }`; - - const result = await this.client.query(graphQlQuery, {}); - - this.logger.debug( - `Fetch workflow source result: ${JSON.stringify(result)}`, - ); - - if (result.error) { - this.logger.error(`Error when fetching workflow source: ${result.error}`); - return undefined; - } - - const processDefinitions = result.data.ProcessDefinitions as WorkflowInfo[]; - - if (processDefinitions.length === 0) { - this.logger.info(`No workflow source found for ${definitionId}`); - return undefined; - } - - return processDefinitions[0].source; - } - - public async fetchInstancesByDefinitionId(args: { - definitionId: string; - limit: number; - offset: number; - }): Promise { - const graphQlQuery = `{ ProcessInstances(where: {processId: {equal: "${args.definitionId}" } }, pagination: {limit: ${args.limit}, offset: ${args.offset}}) { id, processName, state, start, end } }`; - - const result = await this.client.query(graphQlQuery, {}); - - this.logger.debug( - `Fetch workflow instances result: ${JSON.stringify(result)}`, - ); - - if (result.error) { - this.logger.error( - `Error when fetching workflow instances: ${result.error}`, - ); - throw result.error; - } - - return result.data.ProcessInstances; - } - - public async fetchInstanceVariables( - instanceId: string, - ): Promise { - const graphQlQuery = `{ ProcessInstances (where: { id: {equal: "${instanceId}" } } ) { variables } }`; - - const result = await this.client.query(graphQlQuery, {}); - - this.logger.debug( - `Fetch process instance variables result: ${JSON.stringify(result)}`, - ); - - if (result.error) { - this.logger.error( - `Error when fetching process instance variables: ${result.error}`, - ); - throw result.error; - } - - const processInstances = result.data.ProcessInstances as ProcessInstance[]; - - if (processInstances.length === 0) { - return undefined; - } - - return parseWorkflowVariables(processInstances[0].variables as object); - } - - public async fetchDefinitionIdByInstanceId( - instanceId: string, - ): Promise { - const graphQlQuery = `{ ProcessInstances (where: { id: {equal: "${instanceId}" } } ) { processId } }`; - - const result = await this.client.query(graphQlQuery, {}); - - this.logger.debug( - `Fetch process id from instance result: ${JSON.stringify(result)}`, - ); - - if (result.error) { - this.logger.error( - `Error when fetching process id from instance: ${result.error}`, - ); - throw result.error; - } - - const processInstances = result.data.ProcessInstances as ProcessInstance[]; - - if (processInstances.length === 0) { - return undefined; - } - - return processInstances[0].processId; - } - - public async fetchInstance( - instanceId: string, - ): Promise { - const FindProcessInstanceQuery = gql` - query FindProcessInstanceQuery($instanceId: String!) { - ProcessInstances(where: { id: { equal: $instanceId } }) { - id - processName - processId - serviceUrl - businessKey - state - start - end - nodes { - id - nodeId - definitionId - type - name - enter - exit - } - variables - parentProcessInstance { - id - processName - businessKey - } - error { - nodeDefinitionId - message - } - } - } - `; - - const result = await this.client.query(FindProcessInstanceQuery, { - instanceId, - }); - - this.logger.debug( - `Fetch process instance result: ${JSON.stringify(result)}`, - ); - - if (result.error) { - this.logger.error( - `Error when fetching process instances: ${result.error}`, - ); - throw result.error; - } - - const processInstances = result.data.ProcessInstances as ProcessInstance[]; - - if (processInstances.length === 0) { - return undefined; - } - - const instance = processInstances[0]; - - const workflowInfo = await this.fetchWorkflowInfo(instance.processId); - if (!workflowInfo?.source) { - throw new Error( - `Workflow defintion is required to fetch instance ${instance.id}`, - ); - } - const workflowDefinitionSrc: WorkflowDefinition = fromWorkflowSource( - workflowInfo.source, - ); - if (workflowInfo) { - instance.category = getWorkflowCategory(workflowDefinitionSrc); - instance.description = workflowDefinitionSrc.description; - } - return instance; - } -} diff --git a/plugins/orchestrator-backend/src/service/DataInputSchemaService.ts b/plugins/orchestrator-backend/src/service/DataInputSchemaService.ts deleted file mode 100644 index f6ef192b62..0000000000 --- a/plugins/orchestrator-backend/src/service/DataInputSchemaService.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { JsonObject } from '@backstage/types'; - -import { WORKFLOW_DATA_KEY } from './constants'; - -export class DataInputSchemaService { - public extractWorkflowData(variables?: object): JsonObject | undefined { - return variables && WORKFLOW_DATA_KEY in variables - ? (variables[WORKFLOW_DATA_KEY] as JsonObject) - : undefined; - } -} diff --git a/plugins/orchestrator-backend/src/service/DevModeService.ts b/plugins/orchestrator-backend/src/service/DevModeService.ts deleted file mode 100644 index c1f8bb2af6..0000000000 --- a/plugins/orchestrator-backend/src/service/DevModeService.ts +++ /dev/null @@ -1,205 +0,0 @@ -import type { LoggerService } from '@backstage/backend-plugin-api'; -import type { Config } from '@backstage/config'; - -import fs from 'fs-extra'; - -import { - DEFAULT_SONATAFLOW_BASE_URL, - DEFAULT_SONATAFLOW_CONTAINER_IMAGE, - DEFAULT_SONATAFLOW_PERSISTENCE_PATH, - DEFAULT_WORKFLOWS_PATH, -} from '@janus-idp/backstage-plugin-orchestrator-common'; - -import { spawn } from 'child_process'; -import { join, resolve } from 'path'; - -import { GitService } from './GitService'; -import { executeWithRetry } from './Helper'; - -const SONATA_FLOW_RESOURCES_PATH = - '/home/kogito/serverless-workflow-project/src/main/resources'; - -interface LauncherCommand { - command: string; - args: string[]; -} - -interface DevModeConnectionConfig { - host: string; - port?: number; - containerImage: string; - resourcesPath: string; - persistencePath: string; - repoUrl?: string; -} - -export class DevModeService { - private readonly connection: DevModeConnectionConfig; - private readonly gitService; - - constructor( - config: Config, - private readonly logger: LoggerService, - ) { - this.connection = this.extractConnectionConfig(config); - this.gitService = new GitService(logger, config); - } - - public get devModeUrl(): string { - if (!this.connection.port) { - return this.connection.host; - } - return `${this.connection.host}:${this.connection.port}`; - } - - public async launchDevMode(): Promise { - await this.loadDevWorkflows(); - - const isAlreadyUp = await this.isSonataFlowUp(false, this.devModeUrl); - if (isAlreadyUp) { - return true; - } - - this.launchSonataFlow(); - - return await this.isSonataFlowUp(true, this.devModeUrl); - } - - private async isSonataFlowUp( - withRetry: boolean, - endpoint: string, - ): Promise { - const healthUrl = `${endpoint}/q/health`; - this.logger.info(`Checking SonataFlow health at: ${healthUrl}`); - - try { - const response = await executeWithRetry( - () => fetch(healthUrl), - withRetry ? 15 : 1, - ); - if (response.ok) { - this.logger.info('SonataFlow is up and running'); - return true; - } - } catch (e) { - this.logger.error(`Error when checking SonataFlow health: ${e}`); - } - return false; - } - - private launchSonataFlow(): void { - const launcherCmd = this.createLauncherCommand(); - - this.logger.info( - `Auto starting SonataFlow through: ${ - launcherCmd.command - } ${launcherCmd.args.join(' ')}`, - ); - - const process = spawn(launcherCmd.command, launcherCmd.args, { - shell: false, - }); - - process.on('close', code => { - this.logger.info(`SonataFlow process exited with code ${code}`); - }); - - process.on('exit', code => { - this.logger.info(`SonataFlow process exited with code ${code}`); - }); - - process.on('error', error => { - this.logger.error(`SonataFlow process error: ${error}`); - }); - } - - private createLauncherCommand(): LauncherCommand { - const resourcesAbsPath = resolve( - join(this.connection.resourcesPath, DEFAULT_WORKFLOWS_PATH), - ); - - const launcherArgs = [ - 'run', - '--name', - 'backstage-internal-sonataflow', - '--add-host', - 'host.docker.internal:host-gateway', - ]; - - launcherArgs.push('-e', `QUARKUS_HTTP_PORT=${this.connection.port}`); - - launcherArgs.push('-p', `${this.connection.port}:${this.connection.port}`); - launcherArgs.push('-e', `KOGITO_SERVICE_URL=${this.devModeUrl}`); - launcherArgs.push( - '-v', - `${resourcesAbsPath}:${SONATA_FLOW_RESOURCES_PATH}:Z`, - ); - launcherArgs.push('-e', 'KOGITO.CODEGEN.PROCESS.FAILONERROR=false'); - launcherArgs.push( - '-e', - `QUARKUS_EMBEDDED_POSTGRESQL_DATA_DIR=${this.connection.persistencePath}`, - ); - - launcherArgs.push(this.connection.containerImage); - - return { - command: 'docker', - args: launcherArgs, - }; - } - - private extractConnectionConfig(config: Config): DevModeConnectionConfig { - const host = - config.getOptionalString('orchestrator.sonataFlowService.baseUrl') ?? - DEFAULT_SONATAFLOW_BASE_URL; - const port = config.getOptionalNumber( - 'orchestrator.sonataFlowService.port', - ); - - const resourcesPath = - config.getOptionalString( - 'orchestrator.sonataFlowService.workflowsSource.localPath', - ) ?? ''; - - const containerImage = - config.getOptionalString('orchestrator.sonataFlowService.container') ?? - DEFAULT_SONATAFLOW_CONTAINER_IMAGE; - - const persistencePath = - config.getOptionalString( - 'orchestrator.sonataFlowService.persistence.path', - ) ?? DEFAULT_SONATAFLOW_PERSISTENCE_PATH; - - const repoUrl = - config.getOptionalString( - 'orchestrator.sonataFlowService.workflowsSource.gitRepositoryUrl', - ) ?? ''; - - return { - host, - port, - containerImage, - resourcesPath, - persistencePath, - repoUrl, - }; - } - - public async loadDevWorkflows() { - if (!this.connection.repoUrl) { - this.logger.info( - 'No Git repository configured. Skipping dev workflows loading.', - ); - return; - } - - this.logger.info(`Loading dev workflows from ${this.connection.repoUrl}`); - const localPath = this.connection.resourcesPath; - if (await fs.pathExists(localPath)) { - this.logger.info(`Path ${localPath} already exists. Skipping clone.`); - return; - } - - await this.gitService.clone(this.connection.repoUrl, localPath); - } -} diff --git a/plugins/orchestrator-backend/src/service/GitService.ts b/plugins/orchestrator-backend/src/service/GitService.ts deleted file mode 100644 index a99011768e..0000000000 --- a/plugins/orchestrator-backend/src/service/GitService.ts +++ /dev/null @@ -1,93 +0,0 @@ -import type { LoggerService } from '@backstage/backend-plugin-api'; -import type { Config } from '@backstage/config'; -import { ScmIntegrations } from '@backstage/integration'; - -import { Git } from './GitWrapper'; - -export class GitService { - private readonly git: Git; - - private readonly logger: LoggerService; - private authenticated: boolean; - - private readonly author = { - name: 'backstage-orchestrator', - email: 'orchestrator@backstage.io', - }; - - private readonly committer = { - name: 'backstage-orchestrator', - email: 'orchestrator@backstage.io', - }; - - constructor(logger: LoggerService, config: Config) { - this.logger = logger; - const githubIntegration = ScmIntegrations.fromConfig(config) - .github.list() - .pop(); - this.git = Git.fromAuth({ - username: 'x-access-token', - password: githubIntegration?.config.token, - }); - this.authenticated = !!githubIntegration?.config.token; - } - - async clone(repoURL: string, localPath: string): Promise { - this.logger.info(`cloning repo ${repoURL} into ${localPath}`); - return this.git - .clone({ - url: repoURL, - dir: localPath, - depth: 1, - }) - .then(() => this.git.checkout({ dir: localPath, ref: 'main' })); - } - - async push(dir: string, message: string): Promise { - if (!this.authenticated) { - this.logger.warn( - 'Git integration is required to be configured for push, with the token or credentials', - ); - return; - } - const branch = 'main'; - const force = true; - const remote = 'origin'; - const filepath = '.'; - this.git - .fetch({ remote, dir }) - .then(() => this.git.checkout({ dir, ref: branch })) - .then(() => this.git.add({ dir, filepath })) - .then(() => - this.git.commit({ - dir, - message, - author: this.author, - committer: this.committer, - }), - ) - .then(() => this.git.push({ dir, remote, remoteRef: branch, force })) - .finally(() => this.logger.info('push completed')) - .catch(ex => this.logger.error(ex)); - } - - async pull(localPath: string): Promise { - const remoteBranch = 'origin/main'; - const localBranch = 'main'; - const remote = 'origin'; - this.git - .fetch({ remote, dir: localPath }) - .then(() => this.git.checkout({ dir: localPath, ref: localBranch })) - .then(() => - this.git.merge({ - dir: localPath, - ours: localBranch, - theirs: remoteBranch, - author: this.author, - committer: this.committer, - }), - ) - .finally(() => this.logger.info('merge completed')) - .catch(ex => this.logger.error(ex)); - } -} diff --git a/plugins/orchestrator-backend/src/service/GitWrapper/git.ts b/plugins/orchestrator-backend/src/service/GitWrapper/git.ts deleted file mode 100644 index e3f4fcc7f1..0000000000 --- a/plugins/orchestrator-backend/src/service/GitWrapper/git.ts +++ /dev/null @@ -1,354 +0,0 @@ -/* Copyright 2020 The Backstage Authors - * - * 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. - */ - -import { LoggerService } from '@backstage/backend-plugin-api'; - -import fs from 'fs-extra'; -import git, { - AuthCallback, - MergeResult, - ProgressCallback, - ReadCommitResult, -} from 'isomorphic-git'; -import http from 'isomorphic-git/http/node'; - -function isAuthCallbackOptions( - options: StaticAuthOptions | AuthCallbackOptions, -): options is AuthCallbackOptions { - return 'onAuth' in options; -} - -/** - * Configure static credential for authentication - * @public - */ -export type StaticAuthOptions = { - username?: string; - password?: string; - token?: string; - logger?: LoggerService; -}; - -/** - * Configure an authentication callback that can provide credentials on demand - * @public - */ -export type AuthCallbackOptions = { - onAuth: AuthCallback; - logger?: LoggerService; -}; - -/* -provider username password -Azure 'notempty' token -Bitbucket Cloud 'x-token-auth' token -Bitbucket Server username password or token -GitHub 'x-access-token' token -GitLab 'oauth2' token -From : https://isomorphic-git.org/docs/en/onAuth with fix for GitHub -Or token provided as `token` for Bearer auth header -instead of Basic Auth (e.g., Bitbucket Server). -*/ - -/** - * A convenience wrapper around the `isomorphic-git` library. - * @public - */ - -export class Git { - private readonly headers: { - [x: string]: string; - }; - - private constructor( - private readonly config: { - onAuth: AuthCallback; - token?: string; - logger?: LoggerService; - }, - ) { - this.onAuth = config.onAuth; - - this.headers = { - 'user-agent': 'git/@isomorphic-git', - ...(config.token ? { Authorization: `Bearer ${config.token}` } : {}), - }; - } - - async add(options: { dir: string; filepath: string }): Promise { - const { dir, filepath } = options; - this.config.logger?.info(`Adding file {dir=${dir},filepath=${filepath}}`); - - return git.add({ fs, dir, filepath }); - } - - async addRemote(options: { - dir: string; - remote: string; - url: string; - force?: boolean; - }): Promise { - const { dir, url, remote, force } = options; - this.config.logger?.info( - `Creating new remote {dir=${dir},remote=${remote},url=${url}}`, - ); - return git.addRemote({ fs, dir, remote, url, force }); - } - - async deleteRemote(options: { dir: string; remote: string }): Promise { - const { dir, remote } = options; - this.config.logger?.info(`Deleting remote {dir=${dir},remote=${remote}}`); - return git.deleteRemote({ fs, dir, remote }); - } - - async checkout(options: { dir: string; ref: string }): Promise { - const { dir, ref } = options; - this.config.logger?.info(`Checking out branch {dir=${dir},ref=${ref}}`); - - return git.checkout({ fs, dir, ref }); - } - - async branch(options: { dir: string; ref: string }): Promise { - const { dir, ref } = options; - this.config.logger?.info(`Creating branch {dir=${dir},ref=${ref}`); - - return git.branch({ fs, dir, ref }); - } - - async commit(options: { - dir: string; - message: string; - author: { name: string; email: string }; - committer: { name: string; email: string }; - }): Promise { - const { dir, message, author, committer } = options; - this.config.logger?.info( - `Committing file to repo {dir=${dir},message=${message}}`, - ); - return git.commit({ fs, dir, message, author, committer }); - } - - /** https://isomorphic-git.org/docs/en/clone */ - async clone(options: { - url: string; - dir: string; - ref?: string; - depth?: number; - noCheckout?: boolean; - }): Promise { - const { url, dir, ref, depth, noCheckout } = options; - this.config.logger?.info(`Cloning repo {dir=${dir},url=${url}}`); - - try { - return await git.clone({ - fs, - http, - url, - dir, - ref, - singleBranch: true, - depth: depth ?? 1, - noCheckout, - onProgress: this.onProgressHandler(), - headers: this.headers, - onAuth: this.onAuth, - }); - } catch (ex: any) { - this.config.logger?.error(`Failed to clone repo {dir=${dir},url=${url}}`); - if (ex.data) { - throw new Error(`${ex.message} {data=${JSON.stringify(ex.data)}}`); - } - throw ex; - } - } - - /** https://isomorphic-git.org/docs/en/currentBranch */ - async currentBranch(options: { - dir: string; - fullName?: boolean; - }): Promise { - const { dir, fullName = false } = options; - return git.currentBranch({ fs, dir, fullname: fullName }) as Promise< - string | undefined - >; - } - - /** https://isomorphic-git.org/docs/en/fetch */ - async fetch(options: { - dir: string; - remote?: string; - tags?: boolean; - }): Promise { - const { dir, remote = 'origin', tags = false } = options; - this.config.logger?.info( - `Fetching remote=${remote} for repository {dir=${dir}}`, - ); - - try { - await git.fetch({ - fs, - http, - dir, - remote, - tags, - onProgress: this.onProgressHandler(), - headers: this.headers, - onAuth: this.onAuth, - }); - } catch (ex: any) { - this.config.logger?.error( - `Failed to fetch repo {dir=${dir},remote=${remote}}`, - ); - if (ex.data) { - throw new Error(`${ex.message} {data=${JSON.stringify(ex.data)}}`); - } - throw ex; - } - } - - async init(options: { dir: string; defaultBranch?: string }): Promise { - const { dir, defaultBranch = 'master' } = options; - this.config.logger?.info(`Init git repository {dir=${dir}}`); - - return git.init({ - fs, - dir, - defaultBranch, - }); - } - - /** https://isomorphic-git.org/docs/en/merge */ - async merge(options: { - dir: string; - theirs: string; - ours?: string; - author: { name: string; email: string }; - committer: { name: string; email: string }; - }): Promise { - const { dir, theirs, ours, author, committer } = options; - this.config.logger?.info( - `Merging branch '${theirs}' into '${ours}' for repository {dir=${dir}}`, - ); - - // If ours is undefined, current branch is used. - return git.merge({ - fs, - dir, - ours, - theirs, - author, - committer, - }); - } - - async push(options: { - dir: string; - remote: string; - remoteRef?: string; - force?: boolean; - }) { - const { dir, remote, remoteRef, force } = options; - this.config.logger?.info( - `Pushing directory to remote {dir=${dir},remote=${remote}}`, - ); - try { - return await git.push({ - fs, - dir, - http, - onProgress: this.onProgressHandler(), - remoteRef, - force, - headers: this.headers, - remote, - onAuth: this.onAuth, - }); - } catch (ex: any) { - this.config.logger?.error( - `Failed to push to repo {dir=${dir}, remote=${remote}}`, - ); - if (ex.data) { - throw new Error(`${ex.message} {data=${JSON.stringify(ex.data)}}`); - } - throw ex; - } - } - - /** https://isomorphic-git.org/docs/en/readCommit */ - async readCommit(options: { - dir: string; - sha: string; - }): Promise { - const { dir, sha } = options; - return git.readCommit({ fs, dir, oid: sha }); - } - - /** https://isomorphic-git.org/docs/en/remove */ - async remove(options: { dir: string; filepath: string }): Promise { - const { dir, filepath } = options; - this.config.logger?.info( - `Removing file from git index {dir=${dir},filepath=${filepath}}`, - ); - return git.remove({ fs, dir, filepath }); - } - - /** https://isomorphic-git.org/docs/en/resolveRef */ - async resolveRef(options: { dir: string; ref: string }): Promise { - const { dir, ref } = options; - return git.resolveRef({ fs, dir, ref }); - } - - /** https://isomorphic-git.org/docs/en/log */ - async log(options: { - dir: string; - ref?: string; - }): Promise { - const { dir, ref } = options; - return git.log({ - fs, - dir, - ref: ref ?? 'HEAD', - }); - } - - private readonly onAuth: AuthCallback; - - private readonly onProgressHandler = (): ProgressCallback => { - let currentPhase = ''; - - return event => { - if (currentPhase !== event.phase) { - currentPhase = event.phase; - this.config.logger?.info(event.phase); - } - const total = event.total - ? `${Math.round((event.loaded / event.total) * 100)}%` - : event.loaded; - this.config.logger?.debug(`status={${event.phase},total={${total}}}`); - }; - }; - - static readonly fromAuth = ( - options: StaticAuthOptions | AuthCallbackOptions, - ) => { - if (isAuthCallbackOptions(options)) { - const { onAuth, logger } = options; - return new Git({ onAuth, logger }); - } - - const { username, password, token, logger } = options; - return new Git({ onAuth: () => ({ username, password }), token, logger }); - }; -} diff --git a/plugins/orchestrator-backend/src/service/GitWrapper/index.ts b/plugins/orchestrator-backend/src/service/GitWrapper/index.ts deleted file mode 100644 index f6d2e5bac5..0000000000 --- a/plugins/orchestrator-backend/src/service/GitWrapper/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -// Plan for the future: Eventually remove that wrapper in favour of direct use of the isomorphic-git package. - -// Based on https://github.com/backstage/backstage/pull/24605/files -export * from './git'; diff --git a/plugins/orchestrator-backend/src/service/Helper.test.ts b/plugins/orchestrator-backend/src/service/Helper.test.ts deleted file mode 100644 index caebd566e9..0000000000 --- a/plugins/orchestrator-backend/src/service/Helper.test.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { retryAsyncFunction } from './Helper'; - -describe('retryAsyncFunction', () => { - const successfulResponse = 'Success'; - it('should be successful in the first attempt', async () => { - const asyncFnSuccess = jest.fn().mockResolvedValueOnce(successfulResponse); - - const result = await retryAsyncFunction({ - asyncFn: asyncFnSuccess, - maxAttempts: 3, - delayMs: 100, - }); - - expect(result).toBe(successfulResponse); - expect(asyncFnSuccess).toHaveBeenCalledTimes(1); - }); - - it('should throw an error after maximum attempts', async () => { - const asyncFnFailure = jest.fn().mockResolvedValue(undefined); - - await expect( - retryAsyncFunction({ - asyncFn: asyncFnFailure, - maxAttempts: 5, - delayMs: 100, - }), - ).rejects.toThrow(); - - expect(asyncFnFailure).toHaveBeenCalledTimes(5); - }); - - it('should retry until successful after getting some undefined responses', async () => { - const asyncFns = jest - .fn() - .mockResolvedValueOnce(undefined) - .mockResolvedValueOnce(undefined) - .mockResolvedValueOnce(undefined) - .mockResolvedValueOnce(successfulResponse); - - const result = await retryAsyncFunction({ - asyncFn: asyncFns, - maxAttempts: 5, - delayMs: 100, - }); - - expect(result).toBe(successfulResponse); - expect(asyncFns).toHaveBeenCalledTimes(4); - }); -}); diff --git a/plugins/orchestrator-backend/src/service/Helper.ts b/plugins/orchestrator-backend/src/service/Helper.ts deleted file mode 100644 index 471a3dadd7..0000000000 --- a/plugins/orchestrator-backend/src/service/Helper.ts +++ /dev/null @@ -1,76 +0,0 @@ -import type { LoggerService } from '@backstage/backend-plugin-api'; -import type { Config } from '@backstage/config'; - -import fs from 'fs-extra'; - -import os from 'os'; - -export async function retryAsyncFunction(args: { - asyncFn: () => Promise; - maxAttempts: number; - delayMs: number; -}): Promise { - let result: T | undefined; - for (let i = 0; i < args.maxAttempts; i++) { - result = await args.asyncFn(); - if (result !== undefined) { - return result; - } - await new Promise(resolve => setTimeout(resolve, args.delayMs)); - } - throw new Error('Exceeded maximum number of retries for async function'); -} - -export async function getWorkingDirectory( - config: Config, - logger: LoggerService, -): Promise { - if (!config.has('backend.workingDirectory')) { - return os.tmpdir(); - } - - const workingDirectory = config.getString('backend.workingDirectory'); - try { - // Check if working directory exists and is writable - await fs.access(workingDirectory, fs.constants.F_OK | fs.constants.W_OK); - logger.info(`using working directory: ${workingDirectory}`); - } catch (err: any) { - logger.error( - `working directory ${workingDirectory} ${ - err.code === 'ENOENT' ? 'does not exist' : 'is not writable' - }`, - ); - throw err; - } - return workingDirectory; -} - -export async function executeWithRetry( - action: () => Promise, - maxErrors = 15, -): Promise { - let response: Response; - let errorCount = 0; - // execute with retry - const backoff = 5000; - while (errorCount < maxErrors) { - try { - response = await action(); - if (response.status >= 400) { - errorCount++; - // backoff - await delay(backoff); - } else { - return response; - } - } catch (e) { - errorCount++; - await delay(backoff); - } - } - throw new Error('Unable to execute query.'); -} - -export function delay(time: number) { - return new Promise(r => setTimeout(r, time)); -} diff --git a/plugins/orchestrator-backend/src/service/OrchestratorService.test.ts b/plugins/orchestrator-backend/src/service/OrchestratorService.test.ts deleted file mode 100644 index 30659c339e..0000000000 --- a/plugins/orchestrator-backend/src/service/OrchestratorService.test.ts +++ /dev/null @@ -1,656 +0,0 @@ -import { - ProcessInstance, - WorkflowDefinition, - WorkflowExecutionResponse, - WorkflowInfo, - WorkflowOverview, -} from '@janus-idp/backstage-plugin-orchestrator-common'; - -import { DataIndexService } from './DataIndexService'; -import { OrchestratorService } from './OrchestratorService'; -import { SonataFlowService } from './SonataFlowService'; -import { WorkflowCacheService } from './WorkflowCacheService'; - -// Mocked data helpers -const createInstanceIdMock = (x: number): string => `instance${x}`; -const createDefinitionIdMock = (x: number): string => `definition${x}`; -const createWorkflowInfoMock = (x: number): WorkflowInfo => { - return { - id: createDefinitionIdMock(x), - }; -}; -const createWorkflowOverviewMock = (x: number): WorkflowOverview => { - return { - workflowId: createDefinitionIdMock(x), - format: 'yaml', - }; -}; -const createWorkflowOverviewsMock = (size: number): WorkflowOverview[] => - Array.from({ length: size }, (_, i) => createWorkflowOverviewMock(i + 1)); -const createInstanceMock = (x: number): ProcessInstance => { - return { - id: createInstanceIdMock(x), - processId: createDefinitionIdMock(x), - endpoint: `endpoint${x}`, - nodes: [], - }; -}; -const createInstancesMock = (size: number): ProcessInstance[] => { - const result: ProcessInstance[] = []; - for (let i = 1; i <= size; i++) { - result.push(createInstanceMock(i)); - } - return result; -}; - -// Mocked data -const instanceId = createInstanceIdMock(1); -const definitionId = createDefinitionIdMock(1); -const workflowInfo = createWorkflowInfoMock(1); -const workflowOverview = createWorkflowOverviewMock(1); -const workflowOverviews = createWorkflowOverviewsMock(3); -const instance = createInstanceMock(1); -const instances = createInstancesMock(3); -const serviceUrl = 'http://localhost'; -const inputData = { foo: 'bar' }; - -// Mocked dependencies -const sonataFlowServiceMock = {} as SonataFlowService; -const workflowCacheServiceMock = {} as WorkflowCacheService; -const dataIndexServiceMock = {} as DataIndexService; - -// Target -const orchestratorService = new OrchestratorService( - sonataFlowServiceMock, - dataIndexServiceMock, - workflowCacheServiceMock, -); - -describe('OrchestratorService', () => { - describe('abortWorkflowInstance', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('should execute the operation when the workflow is available', async () => { - dataIndexServiceMock.fetchDefinitionIdByInstanceId = jest - .fn() - .mockResolvedValue(definitionId); - workflowCacheServiceMock.isAvailable = jest.fn().mockReturnValue(true); - dataIndexServiceMock.abortWorkflowInstance = jest.fn( - (_instanceId: string) => Promise.resolve(), - ); - - await orchestratorService.abortWorkflowInstance({ - instanceId, - cacheHandler: 'skip', - }); - - expect( - dataIndexServiceMock.fetchDefinitionIdByInstanceId, - ).toHaveBeenCalled(); - expect(dataIndexServiceMock.abortWorkflowInstance).toHaveBeenCalled(); - }); - - it('should skip and not execute the operation when the workflow is not available', async () => { - dataIndexServiceMock.fetchDefinitionIdByInstanceId = jest - .fn() - .mockResolvedValue(definitionId); - workflowCacheServiceMock.isAvailable = jest.fn().mockReturnValue(false); - - await orchestratorService.abortWorkflowInstance({ - instanceId, - cacheHandler: 'skip', - }); - - expect( - dataIndexServiceMock.fetchDefinitionIdByInstanceId, - ).toHaveBeenCalled(); - expect(dataIndexServiceMock.abortWorkflowInstance).not.toHaveBeenCalled(); - }); - - it('should throw an error and not execute the operation when the workflow is not available', async () => { - dataIndexServiceMock.fetchDefinitionIdByInstanceId = jest - .fn() - .mockResolvedValue(definitionId); - workflowCacheServiceMock.isAvailable = jest - .fn() - .mockImplementation(() => { - throw new Error(); - }); - - const promise = orchestratorService.abortWorkflowInstance({ - instanceId, - cacheHandler: 'throw', - }); - - await expect(promise).rejects.toThrow(); - - expect( - dataIndexServiceMock.fetchDefinitionIdByInstanceId, - ).toHaveBeenCalled(); - expect(workflowCacheServiceMock.isAvailable).toHaveBeenCalled(); - expect(dataIndexServiceMock.abortWorkflowInstance).not.toHaveBeenCalled(); - }); - }); - - describe('fetchInstances', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('should throw error when data index returns error', async () => { - const errMsg = 'Failed to load instances'; - dataIndexServiceMock.fetchInstances = jest.fn().mockImplementation(() => { - throw new Error(errMsg); - }); - - const promise = orchestratorService.fetchInstances({}); - await expect(promise).rejects.toThrow(errMsg); - }); - - it('should execute the operation', async () => { - dataIndexServiceMock.fetchInstances = jest - .fn() - .mockResolvedValue(instances); - - const result = await orchestratorService.fetchInstances({}); - - expect(result).toHaveLength(instances.length); - expect(dataIndexServiceMock.fetchInstances).toHaveBeenCalled(); - }); - }); - - describe('fetchInstancesTotalCount', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('should throw error when data index returns error', async () => { - const errMsg = 'Failed to get instances total count'; - dataIndexServiceMock.fetchInstancesTotalCount = jest - .fn() - .mockImplementation(() => { - throw new Error(errMsg); - }); - const promise = orchestratorService.fetchInstancesTotalCount(); - await expect(promise).rejects.toThrow(errMsg); - }); - - it('should execute the operation', async () => { - dataIndexServiceMock.fetchInstancesTotalCount = jest - .fn() - .mockResolvedValue(instances.length); - - const result = await orchestratorService.fetchInstancesTotalCount(); - - expect(result).toBe(instances.length); - expect(dataIndexServiceMock.fetchInstancesTotalCount).toHaveBeenCalled(); - }); - }); - - describe('fetchWorkflowOverviews', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('should throw error when data index returns error', async () => { - const errMsg = 'Failed to get workflows overview'; - sonataFlowServiceMock.fetchWorkflowOverviews = jest - .fn() - .mockImplementation(() => { - throw new Error(errMsg); - }); - - const promise = orchestratorService.fetchWorkflowOverviews({}); - await expect(promise).rejects.toThrow(); - }); - - it('should execute the operation', async () => { - sonataFlowServiceMock.fetchWorkflowOverviews = jest - .fn() - .mockResolvedValue(workflowOverviews); - - const result = await orchestratorService.fetchWorkflowOverviews({}); - - expect(result).toHaveLength(workflowOverviews.length); - expect(sonataFlowServiceMock.fetchWorkflowOverviews).toHaveBeenCalled(); - }); - }); - - describe('fetchWorkflowInfo', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('should execute the operation when the workflow is available', async () => { - workflowCacheServiceMock.isAvailable = jest.fn().mockReturnValue(true); - dataIndexServiceMock.fetchWorkflowInfo = jest - .fn() - .mockResolvedValue(workflowInfo); - - const result = await orchestratorService.fetchWorkflowInfo({ - definitionId, - cacheHandler: 'skip', - }); - - expect(result).toBeDefined(); - }); - - it('should skip and not execute the operation when the workflow is not available', async () => { - workflowCacheServiceMock.isAvailable = jest.fn().mockReturnValue(false); - - const result = await orchestratorService.fetchWorkflowInfo({ - definitionId, - cacheHandler: 'skip', - }); - - expect(result).toBeUndefined(); - expect(dataIndexServiceMock.fetchWorkflowInfo).not.toHaveBeenCalled(); - }); - - it('should throw an error and not execute the operation when the workflow is not available', async () => { - workflowCacheServiceMock.isAvailable = jest - .fn() - .mockImplementation(() => { - throw new Error(); - }); - - const promise = orchestratorService.fetchWorkflowInfo({ - definitionId, - cacheHandler: 'throw', - }); - - await expect(promise).rejects.toThrow(); - - expect(dataIndexServiceMock.fetchWorkflowInfo).not.toHaveBeenCalled(); - }); - }); - - describe('fetchWorkflowSource', () => { - const workflowSource = 'workflow source'; - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('should execute the operation when the workflow is available', async () => { - workflowCacheServiceMock.isAvailable = jest.fn().mockReturnValue(true); - dataIndexServiceMock.fetchWorkflowSource = jest - .fn() - .mockResolvedValue(workflowSource); - - const result = await orchestratorService.fetchWorkflowSource({ - definitionId, - cacheHandler: 'skip', - }); - - expect(result).toBeDefined(); - }); - - it('should skip and not execute the operation when the workflow is not available', async () => { - workflowCacheServiceMock.isAvailable = jest.fn().mockReturnValue(false); - - const result = await orchestratorService.fetchWorkflowSource({ - definitionId, - cacheHandler: 'skip', - }); - - expect(result).toBeUndefined(); - expect(dataIndexServiceMock.fetchWorkflowSource).not.toHaveBeenCalled(); - }); - - it('should throw an error and not execute the operation when the workflow is not available', async () => { - workflowCacheServiceMock.isAvailable = jest - .fn() - .mockImplementation(() => { - throw new Error(); - }); - - const promise = orchestratorService.fetchWorkflowSource({ - definitionId, - cacheHandler: 'throw', - }); - - await expect(promise).rejects.toThrow(); - - expect(dataIndexServiceMock.fetchWorkflowSource).not.toHaveBeenCalled(); - }); - }); - - describe('fetchInstanceVariables', () => { - const variables: object = { foo: 'bar' }; - - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('should execute the operation when the workflow is available', async () => { - workflowCacheServiceMock.isAvailable = jest.fn().mockReturnValue(true); - dataIndexServiceMock.fetchDefinitionIdByInstanceId = jest - .fn() - .mockResolvedValue(definitionId); - dataIndexServiceMock.fetchInstanceVariables = jest - .fn() - .mockResolvedValue(variables); - - const result = await orchestratorService.fetchInstanceVariables({ - instanceId, - cacheHandler: 'skip', - }); - - expect(result).toBeDefined(); - }); - - it('should skip and not execute the operation when the workflow is not available', async () => { - workflowCacheServiceMock.isAvailable = jest.fn().mockReturnValue(false); - dataIndexServiceMock.fetchDefinitionIdByInstanceId = jest - .fn() - .mockResolvedValue(definitionId); - - const result = await orchestratorService.fetchInstanceVariables({ - instanceId, - cacheHandler: 'skip', - }); - - expect(result).toBeUndefined(); - expect( - dataIndexServiceMock.fetchInstanceVariables, - ).not.toHaveBeenCalled(); - }); - - it('should throw an error and not execute the operation when the workflow is not available', async () => { - workflowCacheServiceMock.isAvailable = jest - .fn() - .mockImplementation(() => { - throw new Error(); - }); - dataIndexServiceMock.fetchDefinitionIdByInstanceId = jest - .fn() - .mockResolvedValue(definitionId); - - const promise = orchestratorService.fetchInstanceVariables({ - instanceId, - cacheHandler: 'throw', - }); - - await expect(promise).rejects.toThrow(); - - expect( - dataIndexServiceMock.fetchInstanceVariables, - ).not.toHaveBeenCalled(); - }); - }); - - describe('fetchInstance', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('should execute the operation when the workflow is available', async () => { - workflowCacheServiceMock.isAvailable = jest.fn().mockReturnValue(true); - dataIndexServiceMock.fetchInstance = jest - .fn() - .mockResolvedValue(instance); - - const result = await orchestratorService.fetchInstance({ - instanceId, - cacheHandler: 'skip', - }); - - expect(result).toBeDefined(); - }); - - it('should skip and not execute the operation when the workflow is not available', async () => { - workflowCacheServiceMock.isAvailable = jest.fn().mockReturnValue(false); - - const result = await orchestratorService.fetchInstance({ - instanceId, - cacheHandler: 'skip', - }); - - expect(result).toBeUndefined(); - }); - - it('should throw an error and not execute the operation when the workflow is not available', async () => { - workflowCacheServiceMock.isAvailable = jest - .fn() - .mockImplementation(() => { - throw new Error(); - }); - - const promise = orchestratorService.fetchInstance({ - instanceId, - cacheHandler: 'throw', - }); - - await expect(promise).rejects.toThrow(); - }); - }); - - describe('fetchWorkflowInfoOnService', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('should execute the operation when the workflow is available', async () => { - workflowCacheServiceMock.isAvailable = jest.fn().mockReturnValue(true); - sonataFlowServiceMock.fetchWorkflowInfoOnService = jest - .fn() - .mockResolvedValue(workflowInfo); - - const result = await orchestratorService.fetchWorkflowInfoOnService({ - definitionId, - serviceUrl, - cacheHandler: 'skip', - }); - - expect(result).toBeDefined(); - }); - - it('should skip and not execute the operation when the workflow is not available', async () => { - workflowCacheServiceMock.isAvailable = jest.fn().mockReturnValue(false); - - const result = await orchestratorService.fetchWorkflowInfoOnService({ - definitionId, - serviceUrl, - cacheHandler: 'skip', - }); - - expect(result).toBeUndefined(); - expect( - sonataFlowServiceMock.fetchWorkflowInfoOnService, - ).not.toHaveBeenCalled(); - }); - - it('should throw an error and not execute the operation when the workflow is not available', async () => { - workflowCacheServiceMock.isAvailable = jest - .fn() - .mockImplementation(() => { - throw new Error(); - }); - - const promise = orchestratorService.fetchWorkflowInfoOnService({ - definitionId, - serviceUrl, - cacheHandler: 'throw', - }); - - await expect(promise).rejects.toThrow(); - - expect( - sonataFlowServiceMock.fetchWorkflowInfoOnService, - ).not.toHaveBeenCalled(); - }); - }); - - describe('fetchWorkflowDefinition', () => { - const definition: WorkflowDefinition = { - id: 'test_workflowId', - specVersion: '0.8', - states: [{}], - }; - - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('should execute the operation when the workflow is available', async () => { - workflowCacheServiceMock.isAvailable = jest.fn().mockReturnValue(true); - sonataFlowServiceMock.fetchWorkflowDefinition = jest - .fn() - .mockResolvedValue(definition); - - const result = await orchestratorService.fetchWorkflowDefinition({ - definitionId, - cacheHandler: 'skip', - }); - - expect(result).toBeDefined(); - }); - - it('should skip and not execute the operation when the workflow is not available', async () => { - workflowCacheServiceMock.isAvailable = jest.fn().mockReturnValue(false); - - const result = await orchestratorService.fetchWorkflowDefinition({ - definitionId, - cacheHandler: 'skip', - }); - - expect(result).toBeUndefined(); - expect( - sonataFlowServiceMock.fetchWorkflowDefinition, - ).not.toHaveBeenCalled(); - }); - - it('should throw an error and not execute the operation when the workflow is not available', async () => { - workflowCacheServiceMock.isAvailable = jest - .fn() - .mockImplementation(() => { - throw new Error(); - }); - - const promise = orchestratorService.fetchWorkflowDefinition({ - definitionId, - cacheHandler: 'throw', - }); - - await expect(promise).rejects.toThrow(); - - expect( - sonataFlowServiceMock.fetchWorkflowDefinition, - ).not.toHaveBeenCalled(); - }); - }); - - describe('fetchWorkflowOverview', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('should execute the operation when the workflow is available', async () => { - workflowCacheServiceMock.isAvailable = jest.fn().mockReturnValue(true); - sonataFlowServiceMock.fetchWorkflowOverview = jest - .fn() - .mockResolvedValue(workflowOverview); - - const result = await orchestratorService.fetchWorkflowOverview({ - definitionId, - cacheHandler: 'skip', - }); - - expect(result).toBeDefined(); - }); - - it('should skip and not execute the operation when the workflow is not available', async () => { - workflowCacheServiceMock.isAvailable = jest.fn().mockReturnValue(false); - - const result = await orchestratorService.fetchWorkflowOverview({ - definitionId, - cacheHandler: 'skip', - }); - - expect(result).toBeUndefined(); - expect( - sonataFlowServiceMock.fetchWorkflowOverview, - ).not.toHaveBeenCalled(); - }); - - it('should throw an error and not execute the operation when the workflow is not available', async () => { - workflowCacheServiceMock.isAvailable = jest - .fn() - .mockImplementation(() => { - throw new Error(); - }); - - const promise = orchestratorService.fetchWorkflowOverview({ - definitionId, - cacheHandler: 'throw', - }); - - await expect(promise).rejects.toThrow(); - - expect( - sonataFlowServiceMock.fetchWorkflowOverview, - ).not.toHaveBeenCalled(); - }); - }); - - describe('executeWorkflow', () => { - const executeResponse: WorkflowExecutionResponse = { - id: createInstanceIdMock(1), - }; - - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('should execute the operation when the workflow is available', async () => { - workflowCacheServiceMock.isAvailable = jest.fn().mockReturnValue(true); - sonataFlowServiceMock.executeWorkflow = jest - .fn() - .mockResolvedValue(executeResponse); - - const result = await orchestratorService.executeWorkflow({ - definitionId, - serviceUrl, - inputData, - cacheHandler: 'skip', - }); - - expect(result).toBeDefined(); - }); - - it('should skip and not execute the operation when the workflow is not available', async () => { - workflowCacheServiceMock.isAvailable = jest.fn().mockReturnValue(false); - - const result = await orchestratorService.executeWorkflow({ - definitionId, - serviceUrl, - inputData, - cacheHandler: 'skip', - }); - - expect(result).toBeUndefined(); - expect(sonataFlowServiceMock.executeWorkflow).not.toHaveBeenCalled(); - }); - - it('should throw an error and not execute the operation when the workflow is not available', async () => { - workflowCacheServiceMock.isAvailable = jest - .fn() - .mockImplementation(() => { - throw new Error(); - }); - - const promise = orchestratorService.executeWorkflow({ - definitionId, - serviceUrl, - inputData, - cacheHandler: 'throw', - }); - - await expect(promise).rejects.toThrow(); - - expect(sonataFlowServiceMock.executeWorkflow).not.toHaveBeenCalled(); - }); - }); -}); diff --git a/plugins/orchestrator-backend/src/service/OrchestratorService.ts b/plugins/orchestrator-backend/src/service/OrchestratorService.ts deleted file mode 100644 index 377038aee1..0000000000 --- a/plugins/orchestrator-backend/src/service/OrchestratorService.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { - Filter, - ProcessInstance, - ProcessInstanceVariables, - WorkflowDefinition, - WorkflowExecutionResponse, - WorkflowInfo, - WorkflowOverview, -} from '@janus-idp/backstage-plugin-orchestrator-common'; - -import { Pagination } from '../types/pagination'; -import { DataIndexService } from './DataIndexService'; -import { SonataFlowService } from './SonataFlowService'; -import { CacheHandler, WorkflowCacheService } from './WorkflowCacheService'; - -export class OrchestratorService { - constructor( - private readonly sonataFlowService: SonataFlowService, - private readonly dataIndexService: DataIndexService, - private readonly workflowCacheService: WorkflowCacheService, - ) {} - - // Data Index Service Wrapper - - public async abortWorkflowInstance(args: { - instanceId: string; - cacheHandler?: CacheHandler; - }): Promise { - const { instanceId, cacheHandler } = args; - const definitionId = - await this.dataIndexService.fetchDefinitionIdByInstanceId(instanceId); - const isWorkflowAvailable = this.workflowCacheService.isAvailable( - definitionId, - cacheHandler, - ); - return isWorkflowAvailable - ? await this.dataIndexService.abortWorkflowInstance(instanceId) - : undefined; - } - - public async fetchWorkflowInfo(args: { - definitionId: string; - cacheHandler?: CacheHandler; - }): Promise { - const { definitionId, cacheHandler } = args; - const isWorkflowAvailable = this.workflowCacheService.isAvailable( - definitionId, - cacheHandler, - ); - return isWorkflowAvailable - ? await this.dataIndexService.fetchWorkflowInfo(definitionId) - : undefined; - } - - public async fetchInstances(args: { - pagination?: Pagination; - filter?: Filter; - workflowId?: string; - }): Promise { - const definitionIds = args.workflowId - ? [args.workflowId] - : this.workflowCacheService.definitionIds; - return await this.dataIndexService.fetchInstances({ - definitionIds: definitionIds, - pagination: args.pagination, - filter: args.filter, - }); - } - - public async fetchInstancesTotalCount( - workflowId?: string, - filter?: Filter, - ): Promise { - const definitionIds = workflowId - ? [workflowId] - : this.workflowCacheService.definitionIds; - return await this.dataIndexService.fetchInstancesTotalCount( - definitionIds, - filter, - ); - } - - public async fetchWorkflowSource(args: { - definitionId: string; - cacheHandler?: CacheHandler; - }): Promise { - const { definitionId, cacheHandler } = args; - const isWorkflowAvailable = this.workflowCacheService.isAvailable( - definitionId, - cacheHandler, - ); - return isWorkflowAvailable - ? await this.dataIndexService.fetchWorkflowSource(definitionId) - : undefined; - } - - public async fetchInstanceVariables(args: { - instanceId: string; - cacheHandler?: CacheHandler; - }): Promise { - const { instanceId, cacheHandler } = args; - const definitionId = - await this.dataIndexService.fetchDefinitionIdByInstanceId(instanceId); - const isWorkflowAvailable = this.workflowCacheService.isAvailable( - definitionId, - cacheHandler, - ); - return isWorkflowAvailable - ? await this.dataIndexService.fetchInstanceVariables(instanceId) - : undefined; - } - - public async fetchInstance(args: { - instanceId: string; - cacheHandler?: CacheHandler; - }): Promise { - const { instanceId, cacheHandler } = args; - const instance = await this.dataIndexService.fetchInstance(instanceId); - const isWorkflowAvailable = this.workflowCacheService.isAvailable( - instance?.processId, - cacheHandler, - ); - return isWorkflowAvailable ? instance : undefined; - } - - // SonataFlow Service Wrapper - - public async fetchWorkflowInfoOnService(args: { - definitionId: string; - serviceUrl: string; - cacheHandler?: CacheHandler; - }): Promise { - const { definitionId, cacheHandler } = args; - const isWorkflowAvailable = this.workflowCacheService.isAvailable( - definitionId, - cacheHandler, - ); - return isWorkflowAvailable - ? await this.sonataFlowService.fetchWorkflowInfoOnService(args) - : undefined; - } - - public async fetchWorkflowDefinition(args: { - definitionId: string; - cacheHandler?: CacheHandler; - }): Promise { - const { definitionId, cacheHandler } = args; - const isWorkflowAvailable = this.workflowCacheService.isAvailable( - definitionId, - cacheHandler, - ); - return isWorkflowAvailable - ? await this.sonataFlowService.fetchWorkflowDefinition(definitionId) - : undefined; - } - - public async fetchWorkflowOverviews(args: { - pagination?: Pagination; - filter?: Filter; - }): Promise { - return await this.sonataFlowService.fetchWorkflowOverviews({ - definitionIds: this.workflowCacheService.definitionIds, - pagination: args.pagination, - filter: args.filter, - }); - } - - public async executeWorkflow(args: { - definitionId: string; - serviceUrl: string; - inputData: ProcessInstanceVariables; - businessKey?: string; - cacheHandler?: CacheHandler; - }): Promise { - const { definitionId, cacheHandler } = args; - const isWorkflowAvailable = this.workflowCacheService.isAvailable( - definitionId, - cacheHandler, - ); - return isWorkflowAvailable - ? await this.sonataFlowService.executeWorkflow(args) - : undefined; - } - - public async retriggerWorkflow(args: { - definitionId: string; - instanceId: string; - serviceUrl: string; - cacheHandler?: CacheHandler; - }): Promise { - const { definitionId, cacheHandler } = args; - const isWorkflowAvailable = this.workflowCacheService.isAvailable( - definitionId, - cacheHandler, - ); - return isWorkflowAvailable - ? await this.sonataFlowService.retriggerInstance(args) - : undefined; - } - - public async fetchWorkflowOverview(args: { - definitionId: string; - cacheHandler?: CacheHandler; - }): Promise { - const { definitionId, cacheHandler } = args; - const isWorkflowAvailable = this.workflowCacheService.isAvailable( - definitionId, - cacheHandler, - ); - return isWorkflowAvailable - ? await this.sonataFlowService.fetchWorkflowOverview(definitionId) - : undefined; - } -} diff --git a/plugins/orchestrator-backend/src/service/ScaffolderService.ts b/plugins/orchestrator-backend/src/service/ScaffolderService.ts deleted file mode 100644 index aee81946ce..0000000000 --- a/plugins/orchestrator-backend/src/service/ScaffolderService.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { loggerToWinstonLogger } from '@backstage/backend-common'; -import type { - LoggerService, - UrlReaderService, -} from '@backstage/backend-plugin-api'; -import type { CatalogApi } from '@backstage/catalog-client'; -import type { Config } from '@backstage/config'; -import { ScmIntegrations } from '@backstage/integration'; -import { - createBuiltinActions, - TemplateActionRegistry, -} from '@backstage/plugin-scaffolder-backend'; -import { - ActionContext, - TemplateAction, -} from '@backstage/plugin-scaffolder-node'; -import type { JsonObject, JsonValue } from '@backstage/types'; - -import fs from 'fs-extra'; - -import { randomUUID } from 'crypto'; -import path from 'path'; -import { PassThrough } from 'stream'; - -import { getWorkingDirectory } from './Helper'; - -export interface ActionExecutionContext { - actionId: string; - instanceId: string | undefined; - input: JsonObject; -} - -export class ScaffolderService { - private actionRegistry: TemplateActionRegistry; - private streamLogger = new PassThrough(); - - constructor( - private readonly logger: LoggerService, - private readonly config: Config, - private readonly catalogApi: CatalogApi, - private readonly urlReader: UrlReaderService, - ) { - this.actionRegistry = new TemplateActionRegistry(); - } - - public loadActions(): void { - const actions = [ - ...createBuiltinActions({ - integrations: ScmIntegrations.fromConfig(this.config), - catalogClient: this.catalogApi, - reader: this.urlReader, - config: this.config, - }), - ]; - actions.forEach(a => this.actionRegistry.register(a)); - } - - public getAction(id: string): TemplateAction { - return this.actionRegistry.get(id); - } - - public async executeAction( - actionExecutionContext: ActionExecutionContext, - ): Promise { - if (this.actionRegistry.list().length === 0) { - this.loadActions(); - } - - const action: TemplateAction = this.getAction( - actionExecutionContext.actionId, - ); - const stepOutput: { [outputName: string]: JsonValue } = {}; - - let workspacePath: string; - try { - const workingDirectory = await getWorkingDirectory( - this.config, - this.logger, - ); - workspacePath = path.join( - workingDirectory, - actionExecutionContext.instanceId ?? randomUUID(), - ); - } catch (err: unknown) { - this.logger.error( - `Error getting working directory to execute action ${actionExecutionContext.actionId}`, - err as Error, - ); - throw err; - } - const actionContext: ActionContext = { - input: actionExecutionContext.input, - workspacePath: workspacePath, - // TODO: Move this to LoggerService after scaffolder-node moves to LoggerService - // https://github.com/backstage/backstage/issues/26933 - logger: loggerToWinstonLogger(this.logger), - logStream: this.streamLogger, - createTemporaryDirectory: async () => - await fs.mkdtemp(`${workspacePath}_step-${0}-`), - output(name: string, value: JsonValue) { - stepOutput[name] = value; - }, - getInitiatorCredentials: async () => { - return { - $$type: '@backstage/BackstageCredentials', - principal: 'mock-principal', - }; - }, - checkpoint: async (key, fn) => { - this.logger.info(`Orchestrator ScaffolderService checkpoint ${key}`); - return fn(); - }, - }; - await action.handler(actionContext); - - return stepOutput; - } -} diff --git a/plugins/orchestrator-backend/src/service/SonataFlowService.test.ts b/plugins/orchestrator-backend/src/service/SonataFlowService.test.ts deleted file mode 100644 index 4342cb54aa..0000000000 --- a/plugins/orchestrator-backend/src/service/SonataFlowService.test.ts +++ /dev/null @@ -1,355 +0,0 @@ -import { LoggerService } from '@backstage/backend-plugin-api'; - -import { WorkflowExecutionResponse } from '@janus-idp/backstage-plugin-orchestrator-common'; - -import { DataIndexService } from './DataIndexService'; -import { SonataFlowService } from './SonataFlowService'; - -describe('SonataFlowService', () => { - let loggerMock: jest.Mocked; - let sonataFlowService: SonataFlowService; - - beforeAll(() => { - loggerMock = { - info: jest.fn(), - debug: jest.fn(), - error: jest.fn(), - warn: jest.fn(), - child: jest.fn(), - }; - sonataFlowService = new SonataFlowService( - {} as DataIndexService, - loggerMock, - ); - }); - - beforeEach(() => { - jest.clearAllMocks(); - }); - - afterEach(() => { - jest.resetAllMocks(); - }); - - describe('fetchWorkflowInfoOnService', () => { - const serviceUrl = 'http://example.com'; - const definitionId = 'workflow-123'; - const urlToFetch = 'http://example.com/management/processes/workflow-123'; - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('should return workflow info when the fetch response is ok', async () => { - // Given - const mockResponse: Partial = { - ok: true, - json: jest.fn().mockResolvedValue({ id: 'workflow-123' }), - }; - global.fetch = jest.fn().mockResolvedValue(mockResponse as any); - - // When - const result = await sonataFlowService.fetchWorkflowInfoOnService({ - definitionId, - serviceUrl, - }); - - // Then - expect(fetch).toHaveBeenCalledWith(urlToFetch); - expect(result).toEqual({ id: definitionId }); - expect(loggerMock.debug).toHaveBeenCalledWith( - `Fetch workflow info result: {"id":"${definitionId}"}`, - ); - }); - - it('should propagate thrown error when the fetch response is not ok', async () => { - // Given - const mockResponse: Partial = { - ok: false, - status: 500, - statusText: 'Not Found', - json: jest.fn().mockResolvedValue({ - details: 'Error details', - stack: 'Error stack trace', - }), - }; - global.fetch = jest.fn().mockResolvedValue(mockResponse as any); - - // When - let result; - try { - await sonataFlowService.fetchWorkflowInfoOnService({ - definitionId, - serviceUrl, - }); - } catch (error) { - result = error; - } - - expect(result).toBeDefined(); - }); - - it('should propagate thrown error when fetch throws an error', async () => { - // Given - global.fetch = jest.fn().mockRejectedValue(new Error('Network Error')); - - // When - let result; - try { - await sonataFlowService.fetchWorkflowInfoOnService({ - definitionId, - serviceUrl, - }); - } catch (error) { - result = error; - } - - expect(result).toBeDefined(); - }); - }); - describe('executeWorkflow', () => { - const serviceUrl = 'http://example.com/workflows'; - const definitionId = 'workflow-123'; - const urlToFetch = `${serviceUrl}/${definitionId}`; - const inputData = { var1: 'value1' }; - - const expectedFetchRequestInit = (): RequestInit => { - return { - method: 'POST', - body: JSON.stringify(inputData), - headers: { 'content-type': 'application/json' }, - }; - }; - - const setupTest = (responseConfig: { - ok: boolean; - status?: number; - statusText?: string; - json: any; - }): Partial => { - const mockResponse: Partial = { - ok: responseConfig.ok, - status: responseConfig.status || (responseConfig.ok ? 200 : 500), - statusText: responseConfig.statusText, - json: jest.fn().mockResolvedValue(responseConfig.json), - }; - global.fetch = jest.fn().mockResolvedValue(mockResponse as any); - return mockResponse; - }; - - const runErrorTest = async (): Promise< - WorkflowExecutionResponse | undefined - > => { - return await sonataFlowService.executeWorkflow({ - definitionId, - serviceUrl, - inputData, - }); - }; - - beforeEach(() => { - jest.clearAllMocks(); - }); - it('should return workflow execution response when the request is successful', async () => { - // Given - setupTest({ ok: true, json: { id: definitionId, status: 'completed' } }); - - // When - const result = await sonataFlowService.executeWorkflow({ - definitionId, - serviceUrl, - inputData: { var1: 'value1' }, - }); - - // Then - expect(fetch).toHaveBeenCalledWith( - urlToFetch, - expectedFetchRequestInit(), - ); - expect(result).toEqual({ id: definitionId, status: 'completed' }); - expect(loggerMock.debug).toHaveBeenCalledWith( - 'Execute workflow successful. Response: {"id":"workflow-123","status":"completed"}', - ); - // Verify that all other logger methods were not called - expect(loggerMock.debug).toHaveBeenCalledTimes(1); - expect(loggerMock.info).not.toHaveBeenCalled(); - expect(loggerMock.error).not.toHaveBeenCalled(); - expect(loggerMock.warn).not.toHaveBeenCalled(); - expect(loggerMock.child).not.toHaveBeenCalled(); - }); - - it('should include businessKey in the URL if provided', async () => { - // Given - const businessKey = 'key-123'; - setupTest({ ok: true, json: { id: definitionId, status: 'completed' } }); - - // When - const result = await sonataFlowService.executeWorkflow({ - definitionId, - serviceUrl, - inputData, - businessKey, - }); - - // Then - expect(fetch).toHaveBeenCalledWith( - `${serviceUrl}/${definitionId}?businessKey=${businessKey}`, - expectedFetchRequestInit(), - ); - expect(result).toEqual({ id: definitionId, status: 'completed' }); - }); - it('should propagate thrown error when the fetch response is not ok without extra info', async () => { - // When - setupTest({ - ok: false, - status: 500, - statusText: 'Internal Server Error', - json: { details: undefined, stack: undefined }, - }); - - let result; - try { - await runErrorTest(); - } catch (error) { - result = error; - } - - expect(result).toBeDefined(); - }); - it('should propagate thrown exception when the fetch response is not ok with extra info', async () => { - // When - setupTest({ - ok: false, - json: { details: 'Error details test', stack: 'Error stacktrace test' }, - }); - - let result; - try { - await runErrorTest(); - } catch (error) { - result = error; - } - - expect(result).toBeDefined(); - }); - it('should propagate thrown error when fetch throws an error', async () => { - // Given - global.fetch = jest.fn().mockRejectedValue(new Error('Network Error')); - - // When - let result; - try { - await sonataFlowService.executeWorkflow({ - definitionId, - serviceUrl, - inputData: inputData, - }); - } catch (error) { - result = error; - } - - expect(result).toBeDefined(); - }); - }); - - describe('createPrefixFetchErrorMessage', () => { - // Constants - const TEST_URL = 'http://example.com'; - const STATUS_TEXT_BAD_REQUEST = 'Bad Request'; - const STATUS_TEXT_NOT_FOUND = 'Not Found'; - const STATUS_TEXT_INTERNAL_SERVER_ERROR = 'Internal Server Error'; - const DETAILS = 'Some error details'; - const STACK_TRACE = 'Error stack trace'; - - it('should return the correct message with all fields provided', async () => { - // Given - const mockResponseJson = { details: DETAILS, stack: STACK_TRACE }; - const mockResponse = new Response(JSON.stringify(mockResponseJson), { - status: 400, - statusText: STATUS_TEXT_BAD_REQUEST, - }); - - // When - const result = await sonataFlowService.createPrefixFetchErrorMessage( - TEST_URL, - mockResponse, - 'POST', - ); - - // Then - const expectedMessage = `Request POST ${TEST_URL} failed with: StatusCode: 400 StatusText: ${STATUS_TEXT_BAD_REQUEST}, Details: ${DETAILS}, Stack: ${STACK_TRACE}`; - expect(result).toBe(expectedMessage); - }); - - it('should return the correct message without details and stack', async () => { - // Given - const mockResponseJson = {}; - const mockResponse = new Response(JSON.stringify(mockResponseJson), { - status: 404, - statusText: STATUS_TEXT_NOT_FOUND, - }); - - // When - const result = await sonataFlowService.createPrefixFetchErrorMessage( - TEST_URL, - mockResponse, - ); - - // Then - const expectedMessage = `Request GET ${TEST_URL} failed with: StatusCode: 404 StatusText: ${STATUS_TEXT_NOT_FOUND}`; - expect(result).toBe(expectedMessage); - }); - - it('should return the correct message with only status code', async () => { - // Given - const mockResponseJson = {}; - const mockResponse = new Response(JSON.stringify(mockResponseJson), { - status: 500, - }); - - // When - const result = await sonataFlowService.createPrefixFetchErrorMessage( - TEST_URL, - mockResponse, - ); - - // Then - const expectedMessage = `Request GET ${TEST_URL} failed with: StatusCode: 500 Unexpected error`; - expect(result).toBe(expectedMessage); - }); - - it('should return the unexpected error message if no other fields are present', async () => { - // Given - const mockResponseJson = {}; - const mockResponse = new Response(JSON.stringify(mockResponseJson)); - - // When - const result = await sonataFlowService.createPrefixFetchErrorMessage( - TEST_URL, - mockResponse, - ); - - // Then - const expectedMessage = `Request GET ${TEST_URL} failed with: StatusCode: 200 Unexpected error`; - expect(result).toBe(expectedMessage); - }); - - it('should handle response with undefined JSON gracefully', async () => { - // Given - const mockResponse = new Response(undefined, { - status: 500, - statusText: STATUS_TEXT_INTERNAL_SERVER_ERROR, - }); - jest.spyOn(mockResponse, 'json').mockResolvedValue(undefined); - - // When - const result = await sonataFlowService.createPrefixFetchErrorMessage( - TEST_URL, - mockResponse, - ); - - // Then - const expectedMessage = `Request GET ${TEST_URL} failed with: StatusCode: 500 StatusText: ${STATUS_TEXT_INTERNAL_SERVER_ERROR}`; - expect(result).toBe(expectedMessage); - }); - }); -}); diff --git a/plugins/orchestrator-backend/src/service/SonataFlowService.ts b/plugins/orchestrator-backend/src/service/SonataFlowService.ts deleted file mode 100644 index 6ca728ae37..0000000000 --- a/plugins/orchestrator-backend/src/service/SonataFlowService.ts +++ /dev/null @@ -1,253 +0,0 @@ -import { LoggerService } from '@backstage/backend-plugin-api'; - -import { - extractWorkflowFormat, - Filter, - fromWorkflowSource, - getWorkflowCategory, - ProcessInstance, - ProcessInstanceStateValues, - ProcessInstanceVariables, - WorkflowDefinition, - WorkflowExecutionResponse, - WorkflowInfo, - WorkflowOverview, -} from '@janus-idp/backstage-plugin-orchestrator-common'; - -import { Pagination } from '../types/pagination'; -import { DataIndexService } from './DataIndexService'; - -export class SonataFlowService { - constructor( - private readonly dataIndexService: DataIndexService, - private readonly logger: LoggerService, - ) {} - - public async fetchWorkflowInfoOnService(args: { - definitionId: string; - serviceUrl: string; - }): Promise { - const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}`; - const response = await fetch(urlToFetch); - - if (response.ok) { - const json = await response.json(); - this.logger.debug(`Fetch workflow info result: ${JSON.stringify(json)}`); - return json; - } - throw new Error( - await this.createPrefixFetchErrorMessage(urlToFetch, response), - ); - } - - public async fetchWorkflowDefinition( - definitionId: string, - ): Promise { - const source = - await this.dataIndexService.fetchWorkflowSource(definitionId); - if (source) { - return fromWorkflowSource(source); - } - return undefined; - } - - public async fetchWorkflowOverviews(args: { - definitionIds?: string[]; - pagination?: Pagination; - filter?: Filter; - }): Promise { - const { definitionIds, pagination, filter } = args; - const workflowInfos = await this.dataIndexService.fetchWorkflowInfos({ - definitionIds, - pagination, - filter, - }); - if (!workflowInfos?.length) { - return []; - } - const items = await Promise.all( - workflowInfos - .filter(info => info.source) - .map(info => this.fetchWorkflowOverviewBySource(info.source!)), - ); - return items.filter((item): item is WorkflowOverview => !!item); - } - - public async executeWorkflow(args: { - definitionId: string; - serviceUrl: string; - inputData: ProcessInstanceVariables; - businessKey?: string; - }): Promise { - const urlToFetch = args.businessKey - ? `${args.serviceUrl}/${args.definitionId}?businessKey=${args.businessKey}` - : `${args.serviceUrl}/${args.definitionId}`; - - const response = await fetch(urlToFetch, { - method: 'POST', - body: JSON.stringify(args.inputData), - headers: { 'content-type': 'application/json' }, - }); - - const json = await response.json(); - if (json.id) { - this.logger.debug( - `Execute workflow successful. Response: ${JSON.stringify(json)}`, - ); - return json; - } else if (!response.ok) { - const errorMessage = await this.createPrefixFetchErrorMessage( - urlToFetch, - response, - 'POST', - ); - this.logger.error( - `Execute workflow failed. Response: ${JSON.stringify(json)}`, - ); - throw new Error(errorMessage); - } else { - this.logger.error( - `Execute workflow did not return a workflow instance ID. Response: ${JSON.stringify(json)}`, - ); - throw new Error('Execute workflow did not return a workflow instance ID'); - } - } - - public async retriggerInstance(args: { - definitionId: string; - instanceId: string; - serviceUrl: string; - }): Promise { - const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}/instances/${args.instanceId}/retrigger`; - - const response = await fetch(urlToFetch, { - method: 'POST', - }); - - if (!response.ok) { - throw new Error( - `${await this.createPrefixFetchErrorMessage(urlToFetch, response, 'POST')}`, - ); - } - - return true; - } - - public async fetchWorkflowOverview( - definitionId: string, - ): Promise { - const source = - await this.dataIndexService.fetchWorkflowSource(definitionId); - if (!source) { - this.logger.debug(`Workflow source not found: ${definitionId}`); - return undefined; - } - return await this.fetchWorkflowOverviewBySource(source); - } - - private async fetchWorkflowOverviewBySource( - source: string, - ): Promise { - let processInstances: ProcessInstance[] = []; - const limit = 10; - let offset: number = 0; - - let lastTriggered: Date = new Date(0); - let lastRunStatus: ProcessInstanceStateValues | undefined; - let lastRunId: string | undefined; - let counter = 0; - let totalDuration = 0; - const definition = fromWorkflowSource(source); - - do { - processInstances = - await this.dataIndexService.fetchInstancesByDefinitionId({ - definitionId: definition.id, - limit, - offset, - }); - - for (const pInstance of processInstances) { - if (!pInstance.start) { - continue; - } - if (new Date(pInstance.start) > lastTriggered) { - lastRunId = pInstance.id; - lastTriggered = new Date(pInstance.start); - lastRunStatus = pInstance.state; - } - if (pInstance.end) { - const start: Date = new Date(pInstance.start); - const end: Date = new Date(pInstance.end); - totalDuration += end.valueOf() - start.valueOf(); - counter++; - } - } - offset += limit; - } while (processInstances.length > 0); - - return { - workflowId: definition.id, - name: definition.name, - format: extractWorkflowFormat(source), - lastRunId, - lastTriggeredMs: lastTriggered.getTime(), - lastRunStatus, - category: getWorkflowCategory(definition), - avgDurationMs: counter ? totalDuration / counter : undefined, - description: definition.description, - }; - } - - public async pingWorkflowService(args: { - definitionId: string; - serviceUrl: string; - }): Promise { - const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}`; - const response = await fetch(urlToFetch); - return response.ok; - } - - public async updateInstanceInputData(args: { - definitionId: string; - serviceUrl: string; - instanceId: string; - inputData: ProcessInstanceVariables; - }): Promise { - const { definitionId, serviceUrl, instanceId, inputData } = args; - const urlToFetch = `${serviceUrl}/${definitionId}/${instanceId}`; - const response = await fetch(urlToFetch, { - method: 'PATCH', - body: JSON.stringify(inputData), - headers: { 'content-type': 'application/json' }, - }); - return response.ok; - } - - public async createPrefixFetchErrorMessage( - urlToFetch: string, - response: Response, - httpMethod = 'GET', - ): Promise { - const res = await response.json(); - const errorInfo = []; - let errorMsg = `Request ${httpMethod} ${urlToFetch} failed with: StatusCode: ${response.status}`; - - if (response.statusText) { - errorInfo.push(`StatusText: ${response.statusText}`); - } - if (res?.details) { - errorInfo.push(`Details: ${res?.details}`); - } - if (res?.stack) { - errorInfo.push(`Stack: ${res?.stack}`); - } - if (errorInfo.length > 0) { - errorMsg += ` ${errorInfo.join(', ')}`; - } else { - errorMsg += ' Unexpected error'; - } - - return errorMsg; - } -} diff --git a/plugins/orchestrator-backend/src/service/WorkflowCacheService.ts b/plugins/orchestrator-backend/src/service/WorkflowCacheService.ts deleted file mode 100644 index 272b740e5c..0000000000 --- a/plugins/orchestrator-backend/src/service/WorkflowCacheService.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { LoggerService } from '@backstage/backend-plugin-api'; -import { PluginTaskScheduler } from '@backstage/backend-tasks'; - -import { DataIndexService } from './DataIndexService'; -import { SonataFlowService } from './SonataFlowService'; - -export type CacheHandler = 'skip' | 'throw'; - -export class WorkflowCacheService { - private readonly TASK_ID = 'task__Orchestrator__WorkflowCacheService'; - private readonly DEFAULT_FREQUENCY_IN_SECONDS = 5; - private readonly DEFAULT_TIMEOUT_IN_MINUTES = 10; - private readonly definitionIdCache = new Set(); - - constructor( - private readonly logger: LoggerService, - private readonly dataIndexService: DataIndexService, - private readonly sonataFlowService: SonataFlowService, - ) {} - - public get definitionIds(): string[] { - return Array.from(this.definitionIdCache); - } - - public isEmpty(): boolean { - return this.definitionIdCache.size === 0; - } - - public isAvailable( - definitionId?: string, - cacheHandler: CacheHandler = 'skip', - ): boolean { - if (!definitionId) { - return false; - } - const isAvailable = this.definitionIdCache.has(definitionId); - if (!isAvailable && cacheHandler === 'throw') { - throw new Error( - `Workflow service "${definitionId}" not available at the moment`, - ); - } - return isAvailable; - } - - public schedule(args: { - scheduler: PluginTaskScheduler; - frequencyInSeconds?: number; - timeoutInMinutes?: number; - }): void { - const { - scheduler, - frequencyInSeconds = this.DEFAULT_FREQUENCY_IN_SECONDS, - timeoutInMinutes = this.DEFAULT_TIMEOUT_IN_MINUTES, - } = args; - - scheduler.scheduleTask({ - id: this.TASK_ID, - frequency: { seconds: frequencyInSeconds }, - timeout: { minutes: timeoutInMinutes }, - fn: async () => { - await this.runTask(); - }, - }); - } - - private async runTask() { - try { - const idUrlMap = await this.dataIndexService.fetchWorkflowServiceUrls(); - this.definitionIdCache.forEach(definitionId => { - if (!idUrlMap[definitionId]) { - this.definitionIdCache.delete(definitionId); - } - }); - await Promise.all( - Object.entries(idUrlMap).map(async ([definitionId, serviceUrl]) => { - let isServiceUp = false; - try { - isServiceUp = await this.sonataFlowService.pingWorkflowService({ - definitionId, - serviceUrl, - }); - } catch (err) { - this.logger.error( - `Ping workflow ${definitionId} service threw error: ${err}`, - ); - } - if (isServiceUp) { - this.definitionIdCache.add(definitionId); - } else { - this.logger.error( - `Failed to ping service for workflow ${definitionId} at ${serviceUrl}`, - ); - if (this.definitionIdCache.has(definitionId)) { - this.definitionIdCache.delete(definitionId); - } - } - }), - ); - - const workflowDefinitionIds = this.isEmpty() - ? 'empty cache' - : Array.from(this.definitionIdCache).join(', '); - - this.logger.debug( - `${this.TASK_ID} updated the workflow definition ID cache to: ${workflowDefinitionIds}`, - ); - } catch (error) { - this.logger.error(`Error running ${this.TASK_ID}: ${error}`); - return; - } - } -} diff --git a/plugins/orchestrator-backend/src/service/__fixtures__/mockProcessDefinitionArgumentsData.ts b/plugins/orchestrator-backend/src/service/__fixtures__/mockProcessDefinitionArgumentsData.ts deleted file mode 100644 index 2cd635a93c..0000000000 --- a/plugins/orchestrator-backend/src/service/__fixtures__/mockProcessDefinitionArgumentsData.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { - IntrospectionField, - TypeKind, - TypeName, -} from '@janus-idp/backstage-plugin-orchestrator-common'; - -export const mockProcessDefinitionArguments = { - __type: { - kind: 'INPUT_OBJECT', - name: 'ProcessDefinitionArgument', - inputFields: [ - { - name: 'and', - type: { - kind: 'LIST', - name: null, - ofType: { - kind: 'NON_NULL', - name: null, - ofType: { - kind: 'INPUT_OBJECT', - name: 'ProcessDefinitionArgument', - ofType: null, - }, - }, - }, - }, - { - name: 'or', - type: { - kind: 'LIST', - name: null, - ofType: { - kind: 'NON_NULL', - name: null, - ofType: { - kind: 'INPUT_OBJECT', - name: 'ProcessDefinitionArgument', - ofType: null, - }, - }, - }, - }, - { - name: 'not', - type: { - kind: 'INPUT_OBJECT', - name: 'ProcessDefinitionArgument', - ofType: null, - }, - }, - { - name: 'id', - type: { - kind: 'INPUT_OBJECT', - name: 'StringArgument', - ofType: null, - }, - }, - { - name: 'name', - type: { - kind: 'INPUT_OBJECT', - name: 'StringArgument', - ofType: null, - }, - }, - { - name: 'version', - type: { - kind: 'INPUT_OBJECT', - name: 'StringArgument', - ofType: null, - }, - }, - ], - }, -}; - -export const mockProcessDefinitionIntrospection: IntrospectionField[] = [ - { - name: 'id', - type: { - kind: TypeKind.InputObject, - name: TypeName.String, - ofType: null, - }, - }, - { - name: 'name', - type: { - kind: TypeKind.InputObject, - name: TypeName.String, - ofType: null, - }, - }, - { - name: 'version', - type: { - kind: TypeKind.InputObject, - name: TypeName.String, - ofType: null, - }, - }, -]; diff --git a/plugins/orchestrator-backend/src/service/__fixtures__/mockProcessInstanceArgumentsData.ts b/plugins/orchestrator-backend/src/service/__fixtures__/mockProcessInstanceArgumentsData.ts deleted file mode 100644 index 3750cebf72..0000000000 --- a/plugins/orchestrator-backend/src/service/__fixtures__/mockProcessInstanceArgumentsData.ts +++ /dev/null @@ -1,354 +0,0 @@ -import { - IntrospectionField, - TypeKind, - TypeName, -} from '@janus-idp/backstage-plugin-orchestrator-common'; - -export const mockProcessInstanceArguments = { - __type: { - kind: 'INPUT_OBJECT', - name: 'ProcessInstanceArgument', - inputFields: [ - { - name: 'and', - type: { - kind: 'LIST', - name: null, - ofType: { - kind: 'NON_NULL', - name: null, - ofType: { - kind: 'INPUT_OBJECT', - name: 'ProcessInstanceArgument', - ofType: null, - }, - }, - }, - }, - { - name: 'or', - type: { - kind: 'LIST', - name: null, - ofType: { - kind: 'NON_NULL', - name: null, - ofType: { - kind: 'INPUT_OBJECT', - name: 'ProcessInstanceArgument', - ofType: null, - }, - }, - }, - }, - { - name: 'not', - type: { - kind: 'INPUT_OBJECT', - name: 'ProcessInstanceArgument', - ofType: null, - }, - }, - { - name: 'id', - type: { - kind: 'INPUT_OBJECT', - name: 'IdArgument', - ofType: null, - }, - }, - { - name: 'processId', - type: { - kind: 'INPUT_OBJECT', - name: 'StringArgument', - ofType: null, - }, - }, - { - name: 'processName', - type: { - kind: 'INPUT_OBJECT', - name: 'StringArgument', - ofType: null, - }, - }, - { - name: 'parentProcessInstanceId', - type: { - kind: 'INPUT_OBJECT', - name: 'IdArgument', - ofType: null, - }, - }, - { - name: 'rootProcessInstanceId', - type: { - kind: 'INPUT_OBJECT', - name: 'IdArgument', - ofType: null, - }, - }, - { - name: 'rootProcessId', - type: { - kind: 'INPUT_OBJECT', - name: 'StringArgument', - ofType: null, - }, - }, - // { - // name: 'state', - // type: { - // kind: 'INPUT_OBJECT', - // name: 'ProcessInstanceStateArgument', - // ofType: null, - // }, - // }, - // { - // name: 'error', - // type: { - // kind: 'INPUT_OBJECT', - // name: 'ProcessInstanceErrorArgument', - // ofType: null, - // }, - // }, - // { - // name: 'nodes', - // type: { - // kind: 'INPUT_OBJECT', - // name: 'NodeInstanceArgument', - // ofType: null, - // }, - // }, - // { - // name: 'milestones', - // type: { - // kind: 'INPUT_OBJECT', - // name: 'MilestoneArgument', - // ofType: null, - // }, - // }, - { - name: 'endpoint', - type: { - kind: 'INPUT_OBJECT', - name: 'StringArgument', - ofType: null, - }, - }, - // { - // name: 'roles', - // type: { - // kind: 'INPUT_OBJECT', - // name: 'StringArrayArgument', - // ofType: null, - // }, - // }, - { - name: 'start', - type: { - kind: 'INPUT_OBJECT', - name: 'DateArgument', - ofType: null, - }, - }, - { - name: 'end', - type: { - kind: 'INPUT_OBJECT', - name: 'DateArgument', - ofType: null, - }, - }, - // { - // name: 'addons', - // type: { - // kind: 'INPUT_OBJECT', - // name: 'StringArrayArgument', - // ofType: null, - // }, - // }, - { - name: 'lastUpdate', - type: { - kind: 'INPUT_OBJECT', - name: 'DateArgument', - ofType: null, - }, - }, - { - name: 'businessKey', - type: { - kind: 'INPUT_OBJECT', - name: 'StringArgument', - ofType: null, - }, - }, - { - name: 'createdBy', - type: { - kind: 'INPUT_OBJECT', - name: 'StringArgument', - ofType: null, - }, - }, - { - name: 'updatedBy', - type: { - kind: 'INPUT_OBJECT', - name: 'StringArgument', - ofType: null, - }, - }, - ], - }, -}; - -export const mockProcessInstanceIntrospection: IntrospectionField[] = [ - { - name: 'id', - type: { - kind: TypeKind.InputObject, - name: TypeName.Id, - ofType: null, - }, - }, - { - name: 'processId', - type: { - kind: TypeKind.InputObject, - name: TypeName.String, - ofType: null, - }, - }, - { - name: 'processName', - type: { - kind: TypeKind.InputObject, - name: TypeName.String, - ofType: null, - }, - }, - { - name: 'parentProcessInstanceId', - type: { - kind: TypeKind.InputObject, - name: TypeName.Id, - ofType: null, - }, - }, - { - name: 'rootProcessInstanceId', - type: { - kind: TypeKind.InputObject, - name: TypeName.Id, - ofType: null, - }, - }, - { - name: 'rootProcessId', - type: { - kind: TypeKind.InputObject, - name: TypeName.String, - ofType: null, - }, - }, - - // { - // name: 'error', - // type: { - // kind: TypeKind.InputObject, - // name: 'ProcessInstanceErrorArgument', - // ofType: null, - // }, - // }, - // { - // name: 'nodes', - // type: { - // kind: TypeKind.InputObject, - // name: 'NodeInstanceArgument', - // ofType: null, - // }, - // }, - // { - // name: 'milestones', - // type: { - // kind: TypeKind.InputObject, - // name: 'MilestoneArgument', - // ofType: null, - // }, - // }, - { - name: 'endpoint', - type: { - kind: TypeKind.InputObject, - name: TypeName.String, - ofType: null, - }, - }, - // { - // name: 'roles', - // type: { - // kind: TypeKind.InputObject, - // name: TypeName.StringArray, - // ofType: null, - // }, - // }, - { - name: 'start', - type: { - kind: TypeKind.InputObject, - name: TypeName.Date, - ofType: null, - }, - }, - { - name: 'end', - type: { - kind: TypeKind.InputObject, - name: TypeName.Date, - ofType: null, - }, - }, - // { - // name: 'addons', - // type: { - // kind: TypeKind.InputObject, - // name: TypeName.StringArray, - // ofType: null, - // }, - // }, - { - name: 'lastUpdate', - type: { - kind: TypeKind.InputObject, - name: TypeName.Date, - ofType: null, - }, - }, - { - name: 'businessKey', - type: { - kind: TypeKind.InputObject, - name: TypeName.String, - ofType: null, - }, - }, - { - name: 'createdBy', - type: { - kind: TypeKind.InputObject, - name: TypeName.String, - ofType: null, - }, - }, - { - name: 'updatedBy', - type: { - kind: TypeKind.InputObject, - name: TypeName.String, - ofType: null, - }, - }, -]; diff --git a/plugins/orchestrator-backend/src/service/api/mapping/V2Mappings.test.ts b/plugins/orchestrator-backend/src/service/api/mapping/V2Mappings.test.ts deleted file mode 100644 index a21acf5e61..0000000000 --- a/plugins/orchestrator-backend/src/service/api/mapping/V2Mappings.test.ts +++ /dev/null @@ -1,159 +0,0 @@ -import moment from 'moment'; - -import { - ProcessInstance, - ProcessInstanceState, - WorkflowOverview, - WorkflowRunStatusDTO, -} from '@janus-idp/backstage-plugin-orchestrator-common'; - -import { - generateProcessInstance, - generateTestExecuteWorkflowResponse, - generateTestWorkflowOverview, -} from '../test-utils'; -import { - getProcessInstancesStatusDTOFromString, - mapToExecuteWorkflowResponseDTO, - mapToProcessInstanceDTO, - mapToWorkflowOverviewDTO, - mapToWorkflowRunStatusDTO, - mapWorkflowCategoryDTOFromString, -} from './V2Mappings'; - -describe('scenarios to verify executeWorkflowResponseDTO', () => { - it('correctly maps positive scenario response', async () => { - const execWorkflowResp = generateTestExecuteWorkflowResponse(); - const mappedValue = mapToExecuteWorkflowResponseDTO( - 'test_workflowId', - execWorkflowResp, - ); - expect(mappedValue).toBeDefined(); - expect(mappedValue.id).toBeDefined(); - expect(Object.keys(mappedValue).length).toBe(1); - }); - - it('throws error when no id attribute present in response', async () => { - expect(() => { - mapToExecuteWorkflowResponseDTO('workflowId', { id: '' }); - }).toThrow( - `Error while mapping ExecuteWorkflowResponse to ExecuteWorkflowResponseDTO for workflow with id`, - ); - }); -}); - -describe('scenarios to verify mapToWorkflowOverviewDTO', () => { - it('correctly maps WorkflowOverview', () => { - // Arrange - const overview: WorkflowOverview = generateTestWorkflowOverview({ - category: 'assessment', - }); - - // Act - const result = mapToWorkflowOverviewDTO(overview); - - // Assert - expect(result.workflowId).toBe(overview.workflowId); - expect(result.name).toBe(overview.name); - expect(result.format).toBe(overview.format); - expect(result.lastTriggeredMs).toBe(overview.lastTriggeredMs); - expect(result.lastRunStatus).toBe( - getProcessInstancesStatusDTOFromString(overview.lastRunStatus), - ); - expect(result.category).toBe('assessment'); - expect(result.avgDurationMs).toBe(overview.avgDurationMs); - expect(result.description).toBe(overview.description); - }); -}); -describe('scenarios to verify mapWorkflowCategoryDTOFromString', () => { - test.each([ - { input: 'assessment', expected: 'assessment' }, - { input: 'infrastructure', expected: 'infrastructure' }, - { input: 'random category', expected: 'infrastructure' }, - ])('mapWorkflowCategoryDTOFromString($input)', ({ input, expected }) => { - // Arrange - const overview: WorkflowOverview = generateTestWorkflowOverview({ - category: input, - }); - - // Act - const resultCategory = mapWorkflowCategoryDTOFromString(overview.category); - - // Assert - expect(resultCategory).toBeDefined(); - expect(resultCategory).toBe(expected); - }); -}); - -describe('scenarios to verify mapToProcessInstanceDTO', () => { - it('correctly maps ProcessInstanceDTO for not completed workflow', () => { - // Arrange - const processInstanceV1: ProcessInstance = generateProcessInstance(1); - processInstanceV1.end = undefined; - - // Act - const result = mapToProcessInstanceDTO(processInstanceV1); - - // Assert - expect(result).toBeDefined(); - expect(result.id).toBeDefined(); - expect(result.start).toBeDefined(); - expect(result.start).toEqual(processInstanceV1.start); - expect(result.end).toBeUndefined(); - expect(result.duration).toBeUndefined(); - expect(result.status).toEqual( - getProcessInstancesStatusDTOFromString(processInstanceV1.state), - ); - expect(result.description).toEqual(processInstanceV1.description); - expect(result.category).toEqual('infrastructure'); - expect(result.workflowdata).toEqual( - // @ts-ignore - processInstanceV1?.variables?.workflowdata, - ); - }); - it('correctly maps ProcessInstanceDTO', () => { - // Arrange - const processIntanceV1: ProcessInstance = generateProcessInstance(1); - - const start = moment(processIntanceV1.start); - const end = moment(processIntanceV1.end); - const duration = moment.duration(start.diff(end)).humanize(); - // Act - const result = mapToProcessInstanceDTO(processIntanceV1); - - // Assert - expect(result.id).toBeDefined(); - expect(result.start).toEqual(processIntanceV1.start); - expect(result.end).toBeDefined(); - expect(result.end).toEqual(processIntanceV1.end); - expect(result.duration).toEqual(duration); - - expect(result).toBeDefined(); - expect(result.status).toEqual( - getProcessInstancesStatusDTOFromString(processIntanceV1.state), - ); - expect(result.end).toEqual(processIntanceV1.end); - expect(result.duration).toEqual(duration); - expect(result.duration).toEqual('an hour'); - expect(result.description).toEqual(processIntanceV1.description); - expect(result.category).toEqual('infrastructure'); - expect(result.workflowdata).toEqual( - // @ts-ignore - processIntanceV1?.variables?.workflowdata, - ); - }); -}); - -describe('scenarios to verify mapToWorkflowRunStatusDTO', () => { - it('correctly maps ProcessInstanceState to WorkflowRunStatusDTO', async () => { - const mappedValue: WorkflowRunStatusDTO = mapToWorkflowRunStatusDTO( - ProcessInstanceState.Active, - ); - - expect(mappedValue).toBeDefined(); - expect(mappedValue.key).toBeDefined(); - expect(mappedValue.value).toBeDefined(); - expect(mappedValue.key).toEqual('Active'); - expect(mappedValue.value).toEqual('ACTIVE'); - }); -}); diff --git a/plugins/orchestrator-backend/src/service/api/mapping/V2Mappings.ts b/plugins/orchestrator-backend/src/service/api/mapping/V2Mappings.ts deleted file mode 100644 index 9cd61d7e2c..0000000000 --- a/plugins/orchestrator-backend/src/service/api/mapping/V2Mappings.ts +++ /dev/null @@ -1,194 +0,0 @@ -import moment from 'moment'; - -import { - capitalize, - ExecuteWorkflowResponseDTO, - extractWorkflowFormat, - fromWorkflowSource, - getWorkflowCategory, - NodeInstance, - NodeInstanceDTO, - ProcessInstance, - ProcessInstanceDTO, - ProcessInstanceState, - ProcessInstanceStatusDTO, - WorkflowCategory, - WorkflowCategoryDTO, - WorkflowDefinition, - WorkflowDTO, - WorkflowExecutionResponse, - WorkflowFormatDTO, - WorkflowOverview, - WorkflowOverviewDTO, - WorkflowRunStatusDTO, -} from '@janus-idp/backstage-plugin-orchestrator-common'; - -// Mapping functions -export function mapToWorkflowOverviewDTO( - overview: WorkflowOverview, -): WorkflowOverviewDTO { - return { - name: overview.name, - format: overview.format, - workflowId: overview.workflowId, - avgDurationMs: overview.avgDurationMs, - description: overview.description, - lastRunId: overview.lastRunId, - lastRunStatus: overview.lastRunStatus - ? getProcessInstancesStatusDTOFromString(overview.lastRunStatus) - : undefined, - lastTriggeredMs: overview.lastTriggeredMs, - category: mapWorkflowCategoryDTOFromString(overview.category), - }; -} - -export function mapWorkflowCategoryDTOFromString( - category?: string, -): WorkflowCategoryDTO { - return category?.toLocaleLowerCase() === 'assessment' - ? 'assessment' - : 'infrastructure'; -} - -export function getWorkflowCategoryDTO( - definition: WorkflowDefinition | undefined, -): WorkflowCategoryDTO { - return getWorkflowCategory(definition); -} - -export function getWorkflowFormatDTO(source: string): WorkflowFormatDTO { - return extractWorkflowFormat(source); -} - -export function mapToWorkflowDTO(source: string): WorkflowDTO { - const definition = fromWorkflowSource(source); - return { - annotations: definition.annotations, - category: getWorkflowCategoryDTO(definition), - description: definition.description, - name: definition.name, - format: getWorkflowFormatDTO(source), - id: definition.id, - }; -} - -export function mapWorkflowCategoryDTO( - category?: WorkflowCategory, -): WorkflowCategoryDTO { - if (category === WorkflowCategory.ASSESSMENT) { - return 'assessment'; - } - return 'infrastructure'; -} - -export function getProcessInstancesStatusDTOFromString( - state?: string, -): ProcessInstanceStatusDTO { - switch (state) { - case ProcessInstanceState.Active.valueOf(): - return 'Active'; - case ProcessInstanceState.Error.valueOf(): - return 'Error'; - case ProcessInstanceState.Completed.valueOf(): - return 'Completed'; - case ProcessInstanceState.Aborted.valueOf(): - return 'Aborted'; - case ProcessInstanceState.Suspended.valueOf(): - return 'Suspended'; - case ProcessInstanceState.Pending.valueOf(): - return 'Pending'; - default: - throw new Error( - `state ${state} is not one of the values of type ProcessInstanceStatusDTO`, - ); - } -} - -export function getProcessInstanceStateFromStatusDTOString( - status?: ProcessInstanceStatusDTO, -): string { - switch (status) { - case 'Active': - return ProcessInstanceState.Active.valueOf(); - case 'Error': - return ProcessInstanceState.Error.valueOf(); - case 'Completed': - return ProcessInstanceState.Completed.valueOf(); - case 'Aborted': - return ProcessInstanceState.Aborted.valueOf(); - case 'Suspended': - return ProcessInstanceState.Suspended.valueOf(); - case 'Pending': - return ProcessInstanceState.Pending.valueOf(); - default: - throw new Error( - `status ${status} is not one of the values of type ProcessInstanceState`, - ); - } -} - -export function mapToProcessInstanceDTO( - processInstance: ProcessInstance, -): ProcessInstanceDTO { - const start = moment(processInstance.start); - const end = moment(processInstance.end); - const duration = processInstance.end - ? moment.duration(start.diff(end)).humanize() - : undefined; - - let variables: Record | undefined; - if (typeof processInstance?.variables === 'string') { - variables = JSON.parse(processInstance?.variables); - } else { - variables = processInstance?.variables; - } - - return { - id: processInstance.id, - processId: processInstance.processId, - processName: processInstance.processName, - description: processInstance.description, - serviceUrl: processInstance.serviceUrl, - businessKey: processInstance.businessKey, - endpoint: processInstance.endpoint, - error: processInstance.error, - category: mapWorkflowCategoryDTO(processInstance.category), - start: processInstance.start, - end: processInstance.end, - duration: duration, - // @ts-ignore - workflowdata: variables?.workflowdata, - status: getProcessInstancesStatusDTOFromString(processInstance.state), - nodes: processInstance.nodes.map(mapToNodeInstanceDTO), - }; -} - -export function mapToNodeInstanceDTO( - nodeInstance: NodeInstance, -): NodeInstanceDTO { - return { ...nodeInstance, __typename: 'NodeInstance' }; -} - -export function mapToExecuteWorkflowResponseDTO( - workflowId: string, - workflowExecutionResponse: WorkflowExecutionResponse, -): ExecuteWorkflowResponseDTO { - if (!workflowExecutionResponse?.id) { - throw new Error( - `Error while mapping ExecuteWorkflowResponse to ExecuteWorkflowResponseDTO for workflow with id ${workflowId}`, - ); - } - - return { - id: workflowExecutionResponse.id, - }; -} - -export function mapToWorkflowRunStatusDTO( - status: ProcessInstanceState, -): WorkflowRunStatusDTO { - return { - key: capitalize(status), - value: status, - }; -} diff --git a/plugins/orchestrator-backend/src/service/api/mapping/__fixtures__/assessedProcessInstance.json b/plugins/orchestrator-backend/src/service/api/mapping/__fixtures__/assessedProcessInstance.json deleted file mode 100644 index f6ebc90fc4..0000000000 --- a/plugins/orchestrator-backend/src/service/api/mapping/__fixtures__/assessedProcessInstance.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "instance": { - "id": "026f38fc-6121-46c7-9fa8-3f4b8207bab9", - "processName": "Assessment", - "processId": "assessment", - "businessKey": null, - "state": "COMPLETED", - "start": "2024-02-15T16:11:35.829Z", - "lastUpdate": "2024-02-15T16:11:35.829Z", - "end": "2024-02-15T16:11:35.822Z", - "nodes": [ - { - "id": "3290d3c5-c7c0-4920-a1dc-7a37d98d22b7", - "nodeId": "_jbpm-unique-51", - "definitionId": "_jbpm-unique-51", - "type": "WorkItemNode", - "name": "execute", - "enter": "2024-02-15T16:11:33.485Z", - "exit": "2024-02-15T16:11:35.828Z" - }, - { - "id": "2813e81e-0c38-424f-a505-639b1d33341b", - "nodeId": "_jbpm-unique-50", - "definitionId": "_jbpm-unique-50", - "type": "StartNode", - "name": "EmbeddedStart", - "enter": "2024-02-15T16:11:33.477Z", - "exit": "2024-02-15T16:11:35.829Z" - }, - { - "id": "f15d5540-0df7-401c-991e-3c45755b1302", - "nodeId": "_jbpm-unique-47", - "definitionId": "_jbpm-unique-47", - "type": "StartNode", - "name": "Start", - "enter": "2024-02-15T16:11:33.472Z", - "exit": "2024-02-15T16:11:35.829Z" - }, - { - "id": "142fcd3a-64e6-4539-a6b9-5ba2064623a1", - "nodeId": "_jbpm-unique-48", - "definitionId": "_jbpm-unique-48", - "type": "EndNode", - "name": "End", - "enter": "2024-02-15T16:11:35.821Z", - "exit": "2024-02-15T16:11:35.827Z" - }, - { - "id": "97e209c4-ae0a-4d09-8b00-4bd9ca062126", - "nodeId": "_jbpm-unique-59", - "definitionId": "_jbpm-unique-59", - "type": "ActionNode", - "name": "Script", - "enter": "2024-02-15T16:11:35.812Z", - "exit": "2024-02-15T16:11:35.827Z" - }, - { - "id": "f415ddd5-ba25-4e0a-be93-797b5f0ae6f3", - "nodeId": "_jbpm-unique-49", - "definitionId": "_jbpm-unique-49", - "type": "CompositeContextNode", - "name": "AssessRepository", - "enter": "2024-02-15T16:11:33.476Z", - "exit": "2024-02-15T16:11:35.827Z" - }, - { - "id": "10879e09-12c0-4770-be2b-d2fd27858edc", - "nodeId": "_jbpm-unique-58", - "definitionId": "_jbpm-unique-58", - "type": "EndNode", - "name": "EmbeddedEnd", - "enter": "2024-02-15T16:11:35.812Z", - "exit": "2024-02-15T16:11:35.827Z" - }, - { - "id": "96bb3b01-2a4a-44b2-b29c-da6dc7448450", - "nodeId": "_jbpm-unique-57", - "definitionId": "_jbpm-unique-57", - "type": "ActionNode", - "name": "Script", - "enter": "2024-02-15T16:11:35.811Z", - "exit": "2024-02-15T16:11:35.827Z" - }, - { - "id": "491975f5-4d6a-4a43-ac00-1e305bfcd97a", - "nodeId": "_jbpm-unique-56", - "definitionId": "_jbpm-unique-56", - "type": "ActionNode", - "name": "logOuput", - "enter": "2024-02-15T16:11:35.809Z", - "exit": "2024-02-15T16:11:35.828Z" - }, - { - "id": "bc4ddb8a-f551-442a-a0d9-7f96a8332a09", - "nodeId": "_jbpm-unique-55", - "definitionId": "_jbpm-unique-55", - "type": "ActionNode", - "name": "Script", - "enter": "2024-02-15T16:11:35.807Z", - "exit": "2024-02-15T16:11:35.828Z" - }, - { - "id": "effbf2d7-8201-48de-8f81-3983fb26d591", - "nodeId": "_jbpm-unique-54", - "definitionId": "_jbpm-unique-54", - "type": "WorkItemNode", - "name": "preCheck", - "enter": "2024-02-15T16:11:33.896Z", - "exit": "2024-02-15T16:11:35.828Z" - }, - { - "id": "54c7da48-de5c-4e62-868b-ad6c7ef25ad3", - "nodeId": "_jbpm-unique-53", - "definitionId": "_jbpm-unique-53", - "type": "ActionNode", - "name": "Script", - "enter": "2024-02-15T16:11:33.894Z", - "exit": "2024-02-15T16:11:35.828Z" - }, - { - "id": "bfc5796c-8aa7-4c4f-aa11-dc91aee24ea2", - "nodeId": "_jbpm-unique-52", - "definitionId": "_jbpm-unique-52", - "type": "ActionNode", - "name": "Script", - "enter": "2024-02-15T16:11:33.826Z", - "exit": "2024-02-15T16:11:35.828Z" - } - ], - "variables": { - "workflowdata": { - "result": "[Object]", - "preCheck": "[Object]", - "repositoryUrl": "https://java.com", - "workflowOptions": "[Object]" - } - }, - "parentProcessInstance": null, - "error": null, - "category": "assessment", - "description": "undefined" - } -} diff --git a/plugins/orchestrator-backend/src/service/api/test-utils.ts b/plugins/orchestrator-backend/src/service/api/test-utils.ts deleted file mode 100644 index 1540ed49df..0000000000 --- a/plugins/orchestrator-backend/src/service/api/test-utils.ts +++ /dev/null @@ -1,143 +0,0 @@ -import moment from 'moment'; - -import { - ProcessInstance, - ProcessInstanceState, - ProcessInstanceStateValues, - WorkflowCategory, - WorkflowDefinition, - WorkflowExecutionResponse, - WorkflowFormat, - WorkflowInfo, - WorkflowOverview, - WorkflowOverviewListResult, -} from '@janus-idp/backstage-plugin-orchestrator-common'; - -const BASE_DATE = '2023-02-19T11:45:21.123Z'; - -interface WorkflowOverviewParams { - suffix?: string; - workflowId?: string; - name?: string; - format?: WorkflowFormat; - lastTriggeredMs?: number; - lastRunStatus?: ProcessInstanceStateValues; - category?: string; - avgDurationMs?: number; - description?: string; -} -export function generateTestWorkflowOverview( - params: WorkflowOverviewParams, -): WorkflowOverview { - return { - workflowId: params.workflowId ?? `testWorkflowId${params.suffix}`, - name: params.name ?? `Test Workflow${params.suffix}`, - format: params.format ?? 'yaml', - lastTriggeredMs: - params.lastTriggeredMs ?? Date.parse('2024-02-09T10:34:56Z'), - lastRunStatus: params.lastRunStatus ?? ProcessInstanceState.Completed, - category: params.category ?? 'assessment', // validate input - avgDurationMs: params.avgDurationMs ?? 1000, - description: params.description ?? 'Test Workflow Description', - }; -} - -export function generateTestWorkflowOverviewList( - howmany: number, - inputParams?: WorkflowOverviewParams, -): WorkflowOverviewListResult { - const res: WorkflowOverviewListResult = { - items: [], - totalCount: howmany, - offset: 0, - limit: 0, - }; - - for (let i = 0; i < howmany; i++) { - const params: WorkflowOverviewParams = inputParams ?? {}; - params.suffix = i.toString(); - res.items.push(generateTestWorkflowOverview(params)); - } - - return res; -} - -export function generateTestWorkflowInfo( - id: string = 'test_workflowId', -): WorkflowInfo { - return { - id: id, - serviceUrl: 'mock/serviceurl', - }; -} - -export function generateTestExecuteWorkflowResponse( - id: string = 'test_execId', -): WorkflowExecutionResponse { - return { - id: id, - }; -} - -export const generateWorkflowDefinition: WorkflowDefinition = { - id: 'quarkus-backend-workflow-ci-switch', - version: '1.0', - specVersion: '0.8', - name: '[WF] Create a starter Quarkus Backend application with a CI pipeline - CI Switch', - description: - '[WF] Create a starter Quarkus Backend application with a CI pipeline - CI Switch', - annotations: ['test_annotation'], - states: [ - { - name: 'Test state', - type: 'operation', - end: true, - }, - ], -}; - -export function generateProcessInstances(howmany: number): ProcessInstance[] { - const processInstances: ProcessInstance[] = []; - for (let i = 0; i < howmany; i++) { - processInstances.push(generateProcessInstance(i)); - } - return processInstances; -} - -export function generateProcessInstance(id: number): ProcessInstance { - return { - id: `processInstance${id}`, - processName: `name${id}`, - processId: `proceesId${id}`, - state: ProcessInstanceState.Active, - start: BASE_DATE, - end: moment(BASE_DATE).add(1, 'hour').toISOString(), - nodes: [], - endpoint: 'enpoint/foo', - serviceUrl: 'service/bar', - source: 'my-source', - category: WorkflowCategory.INFRASTRUCTURE, - description: 'test description 1', - variables: { - foo: 'bar', - workflowdata: { - workflowOptions: { - 'my-category': { - id: 'next-workflow-1', - name: 'Next Workflow One', - }, - 'my-secod-category': [ - { - id: 'next-workflow-20', - name: 'Next Workflow Twenty', - }, - { - id: 'next-workflow-21', - name: 'Next Workflow Twenty One', - }, - ], - }, - }, - }, - }; -} diff --git a/plugins/orchestrator-backend/src/service/api/v2.test.ts b/plugins/orchestrator-backend/src/service/api/v2.test.ts deleted file mode 100644 index 5ab52c5c30..0000000000 --- a/plugins/orchestrator-backend/src/service/api/v2.test.ts +++ /dev/null @@ -1,561 +0,0 @@ -import { Request } from 'express'; - -import { - AssessedProcessInstanceDTO, - ExecuteWorkflowResponseDTO, - FieldFilterOperatorEnum, - ProcessInstanceListResultDTO, - SearchRequest, - toWorkflowYaml, - WorkflowOverview, - WorkflowOverviewDTO, - WorkflowOverviewListResultDTO, - WorkflowRunStatusDTO, -} from '@janus-idp/backstage-plugin-orchestrator-common'; - -import { buildPagination, buildPaginationTmp } from '../../types/pagination'; -import { OrchestratorService } from '../OrchestratorService'; -import { mapToWorkflowOverviewDTO } from './mapping/V2Mappings'; -import { - generateProcessInstance, - generateProcessInstances, - generateTestExecuteWorkflowResponse, - generateTestWorkflowInfo, - generateTestWorkflowOverview, - generateTestWorkflowOverviewList, - generateWorkflowDefinition, -} from './test-utils'; -import { V2 } from './v2'; - -jest.mock('../Helper.ts', () => ({ - retryAsyncFunction: jest.fn(), -})); - -jest.mock('../OrchestratorService', () => ({ - OrchestratorService: jest.fn(), -})); - -// Helper function to create a mock OrchestratorService instance -const createMockOrchestratorService = (): OrchestratorService => { - const mockOrchestratorService = new OrchestratorService( - {} as any, // Mock sonataFlowService - {} as any, // Mock dataIndexService - {} as any, // Mock workflowCacheService - ); - - mockOrchestratorService.fetchWorkflowOverviews = jest.fn(); - mockOrchestratorService.fetchWorkflowOverview = jest.fn(); - mockOrchestratorService.fetchWorkflowDefinition = jest.fn(); - mockOrchestratorService.fetchWorkflowSource = jest.fn(); - mockOrchestratorService.fetchWorkflowInfo = jest.fn(); - mockOrchestratorService.fetchInstances = jest.fn(); - mockOrchestratorService.fetchInstance = jest.fn(); - mockOrchestratorService.fetchInstancesTotalCount = jest.fn(); - mockOrchestratorService.executeWorkflow = jest.fn(); - mockOrchestratorService.abortWorkflowInstance = jest.fn(); - - return mockOrchestratorService; -}; -const mockOrchestratorService = createMockOrchestratorService(); -const v2 = new V2(mockOrchestratorService); - -describe('getWorkflowOverview', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('0 items in workflow overview list', async () => { - // Arrange - const mockRequest = { - query: {}, - headers: {}, - params: {}, - body: { - paginationInfo: { - offset: 1, - pageSize: 50, - orderBy: 'lastUpdated', - orderDirection: 'DESC', - }, - }, - } as Request; - - const mockOverviewsV1 = { - items: [], - }; - - ( - mockOrchestratorService.fetchWorkflowOverviews as jest.Mock - ).mockResolvedValue(mockOverviewsV1.items); - - // Act - const result: WorkflowOverviewListResultDTO = await v2.getWorkflowsOverview( - buildPagination(mockRequest), - ); - - // Assert - expect(result).toEqual({ - overviews: mockOverviewsV1.items.map(item => - mapToWorkflowOverviewDTO(item), - ), - paginationInfo: { - offset: 1, - pageSize: 50, - totalCount: mockOverviewsV1.items.length, - }, - }); - }); - - it('1 item in workflow overview list', async () => { - // Arrange - const mockRequest: any = { - body: {}, - }; - const mockOverviewsV1 = generateTestWorkflowOverviewList(1, {}); - - ( - mockOrchestratorService.fetchWorkflowOverviews as jest.Mock - ).mockResolvedValue(mockOverviewsV1.items); - - // Act - const result: WorkflowOverviewListResultDTO = await v2.getWorkflowsOverview( - buildPagination(mockRequest), - ); - - // Assert - expect(result).toEqual({ - overviews: mockOverviewsV1.items.map((item: WorkflowOverview) => - mapToWorkflowOverviewDTO(item), - ), - paginationInfo: { - offset: undefined, - pageSize: undefined, - totalCount: mockOverviewsV1.items.length, - }, - }); - }); - - it('many items in workflow overview list', async () => { - // Arrange - const mockRequest: any = { - body: { - paginationInfo: { - offset: 1, - pageSize: 50, - orderBy: 'lastUpdated', - orderDirection: 'DESC', - }, - }, - }; - const mockOverviewsV1 = generateTestWorkflowOverviewList(100, {}); - - ( - mockOrchestratorService.fetchWorkflowOverviews as jest.Mock - ).mockResolvedValue(mockOverviewsV1.items); - - // Act - const result: WorkflowOverviewListResultDTO = await v2.getWorkflowsOverview( - buildPagination(mockRequest), - ); - - // Assert - expect(result).toEqual({ - overviews: mockOverviewsV1.items.map((item: WorkflowOverview) => - mapToWorkflowOverviewDTO(item), - ), - paginationInfo: { - offset: 1, - pageSize: 50, - totalCount: mockOverviewsV1.items.length, - }, - }); - }); - - it('filter test', async () => { - // Arrange - // category = "electronics" AND (price <= 1000 OR (brand IN ("Apple", "Samsung") AND brand like 'Apple')) - const mockRequest: SearchRequest = { - filters: { - operator: 'AND', - filters: [ - { - field: 'category', - operator: FieldFilterOperatorEnum.Eq, - value: 'electronics', - }, - { - operator: 'OR', - filters: [ - { - field: 'price', - operator: FieldFilterOperatorEnum.Lte, - value: 1000, - }, - { - operator: 'AND', - filters: [ - { - field: 'brand', - operator: FieldFilterOperatorEnum.In, - value: ['Apple', 'Samsung'], - }, - { - field: 'brand', - operator: FieldFilterOperatorEnum.Like, - value: 'Apple', - }, - ], - }, - ], - }, - ], - }, - paginationInfo: { - offset: 1, - pageSize: 50, - orderBy: 'lastUpdated', - orderDirection: 'DESC', - }, - }; - const mockOverviewsV1 = generateTestWorkflowOverviewList(100, {}); - - ( - mockOrchestratorService.fetchWorkflowOverviews as jest.Mock - ).mockResolvedValue(mockOverviewsV1.items); - - // Act - const result: WorkflowOverviewListResultDTO = await v2.getWorkflowsOverview( - buildPaginationTmp(mockRequest.paginationInfo), - ); - - // Assert - expect(result).toEqual({ - overviews: mockOverviewsV1.items.map((item: WorkflowOverview) => - mapToWorkflowOverviewDTO(item), - ), - paginationInfo: { - offset: 1, - pageSize: 50, - totalCount: mockOverviewsV1.items.length, - }, - }); - }); - - it('undefined workflow overview list', async () => { - // Arrange - const mockRequest: any = { - query: {}, - }; - ( - mockOrchestratorService.fetchWorkflowOverviews as jest.Mock - ).mockRejectedValue(new Error('no workflow overview')); - - // Act - const promise = v2.getWorkflowsOverview(buildPagination(mockRequest)); - - // Assert - await expect(promise).rejects.toThrow('no workflow overview'); - }); -}); -describe('getWorkflowOverviewById', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('0 items in workflow overview list', async () => { - // Arrange - const mockOverviewsV1 = { - items: [], - }; - ( - mockOrchestratorService.fetchWorkflowOverview as jest.Mock - ).mockResolvedValue(mockOverviewsV1.items); - // Act - const overviewV2 = await v2.getWorkflowOverviewById('test_workflowId'); - - // Assert - expect(overviewV2).toBeDefined(); - expect(overviewV2.workflowId).toBeUndefined(); - expect(overviewV2.name).toBeUndefined(); - expect(overviewV2.format).toBeUndefined(); - expect(overviewV2.lastTriggeredMs).toBeUndefined(); - expect(overviewV2.lastRunStatus).toBeUndefined(); - expect(overviewV2.category).toEqual('infrastructure'); - expect(overviewV2.avgDurationMs).toBeUndefined(); - expect(overviewV2.description).toBeUndefined(); - }); - - it('1 item in workflow overview list', async () => { - // Arrange - const mockOverviewsV1 = generateTestWorkflowOverview({ - name: 'test_workflowId', - }); - - ( - mockOrchestratorService.fetchWorkflowOverview as jest.Mock - ).mockResolvedValue(mockOverviewsV1); - - // Act - const result: WorkflowOverviewDTO = - await v2.getWorkflowOverviewById('test_workflowId'); - - // Assert - expect(result).toEqual(mapToWorkflowOverviewDTO(mockOverviewsV1)); - }); -}); - -describe('getWorkflowById', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - it("Workflow doesn't exists", async () => { - ( - mockOrchestratorService.fetchWorkflowSource as jest.Mock - ).mockRejectedValue(new Error('No definition')); - // Act - const promise = v2.getWorkflowById('test_workflowId'); - - // Assert - await expect(promise).rejects.toThrow('No definition'); - }); - - it('1 items in workflow list', async () => { - const testFormat = 'yaml'; - const wfDefinition = generateWorkflowDefinition; - const source = toWorkflowYaml(wfDefinition); - - ( - mockOrchestratorService.fetchWorkflowSource as jest.Mock - ).mockResolvedValue(source); - // Act - const workflowV2 = await v2.getWorkflowById('test_workflowId'); - - // Assert - expect(workflowV2).toBeDefined(); - expect(workflowV2.id).toBeDefined(); - expect(workflowV2.id).toEqual(wfDefinition.id); - expect(workflowV2.name).toEqual(wfDefinition.name); - expect(workflowV2.format).toEqual(testFormat); - expect(workflowV2.description).toEqual(wfDefinition.description); - expect(workflowV2.category).toEqual('infrastructure'); - expect(workflowV2.annotations).toBeDefined(); - }); -}); - -describe('executeWorkflow', () => { - beforeEach(async () => { - jest.clearAllMocks(); - }); - it('executes a given workflow', async () => { - // Arrange - const workflowInfo = generateTestWorkflowInfo(); - const execResponse = generateTestExecuteWorkflowResponse(); - (mockOrchestratorService.fetchWorkflowInfo as jest.Mock).mockResolvedValue( - workflowInfo, - ); - - (mockOrchestratorService.executeWorkflow as jest.Mock).mockResolvedValue( - execResponse, - ); - const workflowData = { - inputData: { - customAttrib: 'My customAttrib', - }, - }; - // Act - const actualResultV2: ExecuteWorkflowResponseDTO = await v2.executeWorkflow( - workflowData, - workflowInfo.id, - 'businessKey', - ); - - // Assert - expect(actualResultV2).toBeDefined(); - expect(actualResultV2.id).toBeDefined(); - expect(actualResultV2.id).toEqual(execResponse.id); - expect(actualResultV2).toEqual(execResponse); - }); -}); - -describe('getInstances', () => { - const mockRequest: any = { - query: {}, - }; - const pagination = buildPagination(mockRequest); - beforeEach(() => { - jest.clearAllMocks(); - }); - - it("Instance doesn't exist", async () => { - // Arrange - (mockOrchestratorService.fetchInstances as jest.Mock).mockRejectedValue( - new Error('No instance'), - ); - // Act - const promise = v2.getInstances(pagination); - - // Assert - await expect(promise).rejects.toThrow('No instance'); - }); - - it('1 item in process instance list', async () => { - const processInstance = generateProcessInstance(1); - - (mockOrchestratorService.fetchInstances as jest.Mock).mockResolvedValue([ - processInstance, - ]); - - // Act - const processInstanceV2: ProcessInstanceListResultDTO = - await v2.getInstances(pagination); - - // Assert - expect(processInstanceV2).toBeDefined(); - expect(processInstanceV2.items).toBeDefined(); - expect(processInstanceV2.items).toHaveLength(1); - expect(processInstanceV2.items?.[0].id).toEqual(processInstance.id); - }); - it('10 items in process instance list', async () => { - const howmany = 10; - const processInstances = generateProcessInstances(howmany); - - (mockOrchestratorService.fetchInstances as jest.Mock).mockResolvedValue( - processInstances, - ); - - // Act - const processInstanceList: ProcessInstanceListResultDTO = - await v2.getInstances(pagination); - - // Assert - expect(processInstanceList).toBeDefined(); - expect(processInstanceList.items).toBeDefined(); - expect(processInstanceList.items).toHaveLength(howmany); - for (let i = 0; i < howmany; i++) { - expect(processInstanceList.items?.[i].id).toEqual(processInstances[i].id); - } - }); -}); - -describe('getInstanceById', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - it("Instance doesn't exist", async () => { - (mockOrchestratorService.fetchInstance as jest.Mock).mockRejectedValue( - new Error('No instance'), - ); - // Act - const promise = v2.getInstanceById('testInstanceId'); - - // Assert - await expect(promise).rejects.toThrow('No instance'); - }); - - it('Instance exists and do not include assessment', async () => { - const processInstance = generateProcessInstance(1); - - (mockOrchestratorService.fetchInstance as jest.Mock).mockResolvedValue( - processInstance, - ); - - // Act - const processInstanceV2: AssessedProcessInstanceDTO = - await v2.getInstanceById(processInstance.id); - - // Assert - expect(mockOrchestratorService.fetchInstance).toHaveBeenCalledTimes(1); - expect(processInstanceV2).toBeDefined(); - expect(processInstanceV2.instance).toBeDefined(); - expect(processInstanceV2.assessedBy).toBeUndefined(); - expect(processInstanceV2.instance.id).toEqual(processInstance.id); - }); - - it('Instance exists, assessment non empty string', async () => { - const processInstance = generateProcessInstance(1); - processInstance.businessKey = 'testBusinessKey'; - const assessedBy = generateProcessInstance(1); - assessedBy.id = processInstance.businessKey; - - (mockOrchestratorService.fetchInstance as jest.Mock) - .mockResolvedValueOnce(processInstance) - .mockResolvedValueOnce(assessedBy); - - // Act - const processInstanceV2: AssessedProcessInstanceDTO = - await v2.getInstanceById(processInstance.id, true); - - // Assert - expect(mockOrchestratorService.fetchInstance).toHaveBeenCalledTimes(2); - expect(processInstanceV2).toBeDefined(); - expect(processInstanceV2.instance).toBeDefined(); - expect(processInstanceV2.assessedBy).toBeDefined(); - expect(processInstanceV2.assessedBy?.id).toEqual( - processInstance.businessKey, - ); - expect(processInstanceV2.instance.id).toEqual(processInstance.id); - }); -}); - -describe('getWorkflowStatuses', () => { - beforeEach(async () => { - jest.clearAllMocks(); - }); - - it('returns all possible workflow status types', async () => { - const expectedResultV2 = [ - { key: 'Active', value: 'ACTIVE' }, - { key: 'Error', value: 'ERROR' }, - { key: 'Completed', value: 'COMPLETED' }, - { key: 'Aborted', value: 'ABORTED' }, - { key: 'Suspended', value: 'SUSPENDED' }, - { key: 'Pending', value: 'PENDING' }, - ]; - - // Act - const actualResultV2: WorkflowRunStatusDTO[] = - await v2.getWorkflowStatuses(); - - // Assert - expect(actualResultV2).toBeDefined(); - expect(actualResultV2).toEqual(expectedResultV2); - }); -}); - -describe('abortWorkflow', () => { - beforeEach(async () => { - jest.clearAllMocks(); - }); - - it('aborts workflows', async () => { - // Arrange - const workflowId = 'testInstanceId'; - ( - mockOrchestratorService.abortWorkflowInstance as jest.Mock - ).mockResolvedValue({} as any); - - const expectedResult = `Workflow instance ${workflowId} successfully aborted`; - - // Act - const actualResult: string = await v2.abortWorkflow(workflowId); - - // Assert - expect(actualResult).toBeDefined(); - expect(actualResult).toEqual(expectedResult); - }); - - it('throws error when abort workflows response has error attribute', async () => { - // Arrange - ( - mockOrchestratorService.abortWorkflowInstance as jest.Mock - ).mockRejectedValue(new Error('Simulated abort workflow error')); - - // Act - const promise = v2.abortWorkflow('instanceId'); - - // Assert - await expect(promise).rejects.toThrow('Simulated abort workflow error'); - }); -}); diff --git a/plugins/orchestrator-backend/src/service/api/v2.ts b/plugins/orchestrator-backend/src/service/api/v2.ts deleted file mode 100644 index 24f15b4c88..0000000000 --- a/plugins/orchestrator-backend/src/service/api/v2.ts +++ /dev/null @@ -1,262 +0,0 @@ -import { ParsedRequest } from 'openapi-backend'; - -import { - AssessedProcessInstanceDTO, - ExecuteWorkflowRequestDTO, - ExecuteWorkflowResponseDTO, - Filter, - ProcessInstance, - ProcessInstanceListResultDTO, - ProcessInstanceState, - ProcessInstanceVariables, - WorkflowDTO, - WorkflowInfo, - WorkflowOverviewDTO, - WorkflowOverviewListResultDTO, - WorkflowRunStatusDTO, -} from '@janus-idp/backstage-plugin-orchestrator-common'; - -import { Pagination } from '../../types/pagination'; -import { retryAsyncFunction } from '../Helper'; -import { OrchestratorService } from '../OrchestratorService'; -import { - mapToExecuteWorkflowResponseDTO, - mapToProcessInstanceDTO, - mapToWorkflowDTO, - mapToWorkflowOverviewDTO, - mapToWorkflowRunStatusDTO, -} from './mapping/V2Mappings'; - -const FETCH_INSTANCE_MAX_ATTEMPTS = 10; -const FETCH_INSTANCE_RETRY_DELAY_MS = 1000; - -export class V2 { - constructor(private readonly orchestratorService: OrchestratorService) {} - - public async getWorkflowsOverview( - pagination: Pagination, - filter?: Filter, - ): Promise { - const overviews = await this.orchestratorService.fetchWorkflowOverviews({ - pagination, - filter, - }); - if (!overviews) { - throw new Error("Couldn't fetch workflow overviews"); - } - const result: WorkflowOverviewListResultDTO = { - overviews: overviews.map(item => mapToWorkflowOverviewDTO(item)), - paginationInfo: { - pageSize: pagination.limit, - offset: pagination.offset, - totalCount: overviews.length, - }, - }; - return result; - } - - public async getWorkflowOverviewById( - workflowId: string, - ): Promise { - const overview = await this.orchestratorService.fetchWorkflowOverview({ - definitionId: workflowId, - cacheHandler: 'throw', - }); - - if (!overview) { - throw new Error(`Couldn't fetch workflow overview for ${workflowId}`); - } - return mapToWorkflowOverviewDTO(overview); - } - - public async getWorkflowById(workflowId: string): Promise { - const resultV1 = await this.getWorkflowSourceById(workflowId); - return mapToWorkflowDTO(resultV1); - } - - public async getWorkflowSourceById(workflowId: string): Promise { - const source = await this.orchestratorService.fetchWorkflowSource({ - definitionId: workflowId, - cacheHandler: 'throw', - }); - - if (!source) { - throw new Error(`Couldn't fetch workflow source for ${workflowId}`); - } - - return source; - } - - public async getInstances( - pagination?: Pagination, - filter?: Filter, - workflowId?: string, - ): Promise { - const instances = await this.orchestratorService.fetchInstances({ - pagination, - filter, - workflowId, - }); - const totalCount = await this.orchestratorService.fetchInstancesTotalCount( - workflowId, - filter, - ); - - const result: ProcessInstanceListResultDTO = { - items: instances?.map(mapToProcessInstanceDTO), - paginationInfo: { - pageSize: pagination?.limit, - offset: pagination?.offset, - totalCount: totalCount, - }, - }; - return result; - } - - public async getInstanceById( - instanceId: string, - includeAssessment: boolean = false, - ): Promise { - const instance = await this.orchestratorService.fetchInstance({ - instanceId, - cacheHandler: 'throw', - }); - - if (!instance) { - throw new Error(`Couldn't fetch process instance ${instanceId}`); - } - - let assessedByInstance: ProcessInstance | undefined; - - if (includeAssessment && instance.businessKey) { - assessedByInstance = await this.orchestratorService.fetchInstance({ - instanceId: instance.businessKey, - cacheHandler: 'throw', - }); - } - - return { - instance: mapToProcessInstanceDTO(instance), - assessedBy: assessedByInstance - ? mapToProcessInstanceDTO(assessedByInstance) - : undefined, - }; - } - - public async executeWorkflow( - executeWorkflowRequestDTO: ExecuteWorkflowRequestDTO, - workflowId: string, - businessKey: string | undefined, - ): Promise { - if (Object.keys(executeWorkflowRequestDTO?.inputData).length === 0) { - throw new Error( - `ExecuteWorkflowRequestDTO.inputData is required for executing workflow with id ${workflowId}`, - ); - } - - const definition = await this.orchestratorService.fetchWorkflowInfo({ - definitionId: workflowId, - cacheHandler: 'throw', - }); - if (!definition) { - throw new Error(`Couldn't fetch workflow definition for ${workflowId}`); - } - if (!definition.serviceUrl) { - throw new Error(`ServiceURL is not defined for workflow ${workflowId}`); - } - const executionResponse = await this.orchestratorService.executeWorkflow({ - definitionId: workflowId, - inputData: - executeWorkflowRequestDTO?.inputData as ProcessInstanceVariables, - serviceUrl: definition.serviceUrl, - businessKey, - cacheHandler: 'throw', - }); - - if (!executionResponse) { - throw new Error(`Couldn't execute workflow ${workflowId}`); - } - - // Making sure the instance data is available before returning - await retryAsyncFunction({ - asyncFn: () => - this.orchestratorService.fetchInstance({ - instanceId: executionResponse.id, - cacheHandler: 'throw', - }), - maxAttempts: FETCH_INSTANCE_MAX_ATTEMPTS, - delayMs: FETCH_INSTANCE_RETRY_DELAY_MS, - }); - - if (!executionResponse) { - throw new Error('Error executing workflow with id ${workflowId}'); - } - - return mapToExecuteWorkflowResponseDTO(workflowId, executionResponse); - } - - public async retriggerInstance( - workflowId: string, - instanceId: string, - ): Promise { - const definition = await this.orchestratorService.fetchWorkflowInfo({ - definitionId: workflowId, - cacheHandler: 'throw', - }); - if (!definition) { - throw new Error(`Couldn't fetch workflow definition for ${workflowId}`); - } - if (!definition.serviceUrl) { - throw new Error(`ServiceURL is not defined for workflow ${workflowId}`); - } - const response = await this.orchestratorService.retriggerWorkflow({ - definitionId: workflowId, - instanceId: instanceId, - serviceUrl: definition.serviceUrl, - cacheHandler: 'throw', - }); - - if (!response) { - throw new Error( - `Couldn't retrigger instance ${instanceId} of workflow ${workflowId}`, - ); - } - } - - public async abortWorkflow(instanceId: string): Promise { - await this.orchestratorService.abortWorkflowInstance({ - instanceId, - cacheHandler: 'throw', - }); - return `Workflow instance ${instanceId} successfully aborted`; - } - - public async getWorkflowStatuses(): Promise { - return [ - ProcessInstanceState.Active, - ProcessInstanceState.Error, - ProcessInstanceState.Completed, - ProcessInstanceState.Aborted, - ProcessInstanceState.Suspended, - ProcessInstanceState.Pending, - ].map(status => mapToWorkflowRunStatusDTO(status)); - } - - public async getWorkflowInputSchemaById( - workflowId: string, - serviceUrl: string, - ): Promise { - return this.orchestratorService.fetchWorkflowInfoOnService({ - definitionId: workflowId, - serviceUrl: serviceUrl, - cacheHandler: 'throw', - }); - } - - public extractQueryParam( - req: ParsedRequest, - key: string, - ): string | undefined { - return req.query[key] as string | undefined; - } -} diff --git a/plugins/orchestrator-backend/src/service/constants.ts b/plugins/orchestrator-backend/src/service/constants.ts deleted file mode 100644 index 3ec4d6ff6e..0000000000 --- a/plugins/orchestrator-backend/src/service/constants.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const WORKFLOW_DATA_KEY = 'workflowdata'; - -export const INTERNAL_SERVER_ERROR_MESSAGE = 'internal server error'; -export const FETCH_PROCESS_INSTANCES_SORT_FIELD = 'start'; diff --git a/plugins/orchestrator-backend/src/types/pagination.test.ts b/plugins/orchestrator-backend/src/types/pagination.test.ts deleted file mode 100644 index 3a94c71133..0000000000 --- a/plugins/orchestrator-backend/src/types/pagination.test.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { buildPagination } from './pagination'; - -describe('buildPagination()', () => { - it('should build the correct pagination obj when no query parameters are passed', () => { - const mockRequest: any = { - body: {}, - }; - expect(buildPagination(mockRequest)).toEqual({}); - }); - it('should build the correct pagination obj when partial query parameters are passed', () => { - const mockRequest: any = { - body: { - paginationInfo: { - orderBy: 'lastUpdated', - }, - }, - }; - expect(buildPagination(mockRequest)).toEqual({ - limit: undefined, - offset: undefined, - order: undefined, - sortField: 'lastUpdated', - }); - }); - it('should build the correct pagination obj when all query parameters are passed', () => { - const mockRequest: any = { - body: { - paginationInfo: { - offset: 1, - pageSize: 50, - orderBy: 'lastUpdated', - orderDirection: 'DESC', - }, - }, - }; - expect(buildPagination(mockRequest)).toEqual({ - limit: 50, - offset: 1, - order: 'DESC', - sortField: 'lastUpdated', - }); - }); - it('should build the correct pagination obj when non numeric value passed to number fields', () => { - const mockRequest: any = { - body: { - paginationInfo: { - offset: 'abc', - pageSize: 'cde', - }, - }, - }; - expect(buildPagination(mockRequest)).toEqual({ - limit: undefined, - offset: undefined, - order: undefined, - sortField: undefined, - }); - }); -}); diff --git a/plugins/orchestrator-backend/src/types/pagination.ts b/plugins/orchestrator-backend/src/types/pagination.ts deleted file mode 100644 index 884c77a78a..0000000000 --- a/plugins/orchestrator-backend/src/types/pagination.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { Request } from 'express-serve-static-core'; - -import { PaginationInfoDTO } from '@janus-idp/backstage-plugin-orchestrator-common'; - -export interface Pagination { - offset?: number; - limit?: number; - order?: string; - sortField?: string; -} - -export function buildPagination(req: Request): Pagination { - const pagination: Pagination = { - limit: undefined, - offset: undefined, - order: undefined, - sortField: undefined, - }; - - if (!req.body?.paginationInfo) { - return pagination; - } - const { offset, pageSize, orderBy, orderDirection } = req.body - .paginationInfo as PaginationInfoDTO; - - if (!isNaN(Number(offset))) { - pagination.offset = Number(offset); - } - - if (!isNaN(Number(pageSize))) { - pagination.limit = Number(pageSize); - } - - if (orderBy) { - pagination.sortField = String(orderBy); - } - - if (orderDirection) { - pagination.order = String(orderDirection).toUpperCase(); - } - return pagination; -} - -export function buildPaginationTmp( - paginationInfo?: PaginationInfoDTO, -): Pagination { - const pagination: Pagination = { - limit: undefined, - offset: undefined, - order: undefined, - sortField: undefined, - }; - - if (!paginationInfo) { - return pagination; - } - const { offset, pageSize, orderBy, orderDirection } = paginationInfo; - - if (!isNaN(Number(offset))) { - pagination.offset = Number(offset); - } - - if (!isNaN(Number(pageSize))) { - pagination.limit = Number(pageSize); - } - - if (orderBy) { - pagination.sortField = String(orderBy); - } - - if (orderDirection) { - pagination.order = String(orderDirection).toUpperCase(); - } - return pagination; -} diff --git a/plugins/orchestrator-backend/static/generated/envelope/combined.bundle.js b/plugins/orchestrator-backend/static/generated/envelope/combined.bundle.js deleted file mode 100644 index e5ee6b040c..0000000000 --- a/plugins/orchestrator-backend/static/generated/envelope/combined.bundle.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{var e={26093:(e,t,n)=>{"use strict";var r=n(39907),o=n(4364);function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function i(e,t){for(var n=0;n1?n-1:0),o=1;o1?n-1:0),o=1;o1?n-1:0),o=1;o1?n-1:0),o=1;o{"use strict";var r=n(39907);function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;te.length)&&(n=e.length),e.substring(n-t.length,n)===t}var y="",w="",Z="",x="",q={deepStrictEqual:"Expected values to be strictly deep-equal:",strictEqual:"Expected values to be strictly equal:",strictEqualObject:'Expected "actual" to be reference-equal to "expected":',deepEqual:"Expected values to be loosely deep-equal:",equal:"Expected values to be loosely equal:",notDeepStrictEqual:'Expected "actual" not to be strictly deep-equal to:',notStrictEqual:'Expected "actual" to be strictly unequal to:',notStrictEqualObject:'Expected "actual" not to be reference-equal to "expected":',notDeepEqual:'Expected "actual" not to be loosely deep-equal to:',notEqual:'Expected "actual" to be loosely unequal to:',notIdentical:"Values identical but not reference-equal:"};function W(e){var t=Object.keys(e),n=Object.create(Object.getPrototypeOf(e));return t.forEach((function(t){n[t]=e[t]})),Object.defineProperty(n,"message",{value:e.message}),n}function V(e){return v(e,{compact:!1,customInspect:!1,depth:1e3,maxArrayLength:1/0,showHidden:!1,breakLength:1/0,showProxy:!1,sorted:!0,getters:!0})}function T(e,t,n){var o="",a="",i=0,l="",c=!1,f=V(e),s=f.split("\n"),u=V(t).split("\n"),p=0,d="";if("strictEqual"===n&&"object"===b(e)&&"object"===b(t)&&null!==e&&null!==t&&(n="strictEqualObject"),1===s.length&&1===u.length&&s[0]!==u[0]){var A=s[0].length+u[0].length;if(A<=10){if(!("object"===b(e)&&null!==e||"object"===b(t)&&null!==t||0===e&&0===t))return"".concat(q[n],"\n\n")+"".concat(s[0]," !== ").concat(u[0],"\n")}else if("strictEqualObject"!==n){if(A<(r.stderr&&r.stderr.isTTY?r.stderr.columns:80)){for(;s[0][p]===u[0][p];)p++;p>2&&(d="\n ".concat(function(e,t){if(t=Math.floor(t),0==e.length||0==t)return"";var n=e.length*t;for(t=Math.floor(Math.log(t)/Math.log(2));t;)e+=e,t--;return e+e.substring(0,n-e.length)}(" ",p),"^"),p=0)}}}for(var m=s[s.length-1],v=u[u.length-1];m===v&&(p++<2?l="\n ".concat(m).concat(l):o=m,s.pop(),u.pop(),0!==s.length&&0!==u.length);)m=s[s.length-1],v=u[u.length-1];var g=Math.max(s.length,u.length);if(0===g){var W=f.split("\n");if(W.length>30)for(W[26]="".concat(y,"...").concat(x);W.length>27;)W.pop();return"".concat(q.notIdentical,"\n\n").concat(W.join("\n"),"\n")}p>3&&(l="\n".concat(y,"...").concat(x).concat(l),c=!0),""!==o&&(l="\n ".concat(o).concat(l),o="");var T=0,E=q[n]+"\n".concat(w,"+ actual").concat(x," ").concat(Z,"- expected").concat(x),O=" ".concat(y,"...").concat(x," Lines skipped");for(p=0;p1&&p>2&&(k>4?(a+="\n".concat(y,"...").concat(x),c=!0):k>3&&(a+="\n ".concat(u[p-2]),T++),a+="\n ".concat(u[p-1]),T++),i=p,o+="\n".concat(Z,"-").concat(x," ").concat(u[p]),T++;else if(u.length1&&p>2&&(k>4?(a+="\n".concat(y,"...").concat(x),c=!0):k>3&&(a+="\n ".concat(s[p-2]),T++),a+="\n ".concat(s[p-1]),T++),i=p,a+="\n".concat(w,"+").concat(x," ").concat(s[p]),T++;else{var z=u[p],P=s[p],B=P!==z&&(!h(P,",")||P.slice(0,-1)!==z);B&&h(z,",")&&z.slice(0,-1)===P&&(B=!1,P+=","),B?(k>1&&p>2&&(k>4?(a+="\n".concat(y,"...").concat(x),c=!0):k>3&&(a+="\n ".concat(s[p-2]),T++),a+="\n ".concat(s[p-1]),T++),i=p,a+="\n".concat(w,"+").concat(x," ").concat(P),o+="\n".concat(Z,"-").concat(x," ").concat(z),T+=2):(a+=o,o="",1!==k&&0!==p||(a+="\n ".concat(P),T++))}if(T>20&&p30)for(d[26]="".concat(y,"...").concat(x);d.length>27;)d.pop();t=1===d.length?p.call(this,"".concat(u," ").concat(d[0])):p.call(this,"".concat(u,"\n\n").concat(d.join("\n"),"\n"))}else{var A=V(i),m="",v=q[o];"notDeepEqual"===o||"notEqual"===o?(A="".concat(q[o],"\n\n").concat(A)).length>1024&&(A="".concat(A.slice(0,1021),"...")):(m="".concat(V(l)),A.length>512&&(A="".concat(A.slice(0,509),"...")),m.length>512&&(m="".concat(m.slice(0,509),"...")),"deepEqual"===o||"equal"===o?A="".concat(v,"\n\n").concat(A,"\n\nshould equal\n\n"):m=" ".concat(o," ").concat(m)),t=p.call(this,"".concat(A).concat(m))}return Error.stackTraceLimit=c,t.generatedMessage=!n,Object.defineProperty(s(t),"name",{value:"AssertionError [ERR_ASSERTION]",enumerable:!1,writable:!0,configurable:!0}),t.code="ERR_ASSERTION",t.actual=i,t.expected=l,t.operator=o,Error.captureStackTrace&&Error.captureStackTrace(s(t),a),t.stack,t.name="AssertionError",f(t)}return i=h,(c=[{key:"toString",value:function(){return"".concat(this.name," [").concat(this.code,"]: ").concat(this.message)}},{key:t,value:function(e,t){return v(this,a(a({},t),{},{customInspect:!1,depth:0}))}}])&&l(i.prototype,c),u&&l(i,u),Object.defineProperty(i,"prototype",{writable:!1}),h}(u(Error),v.custom);e.exports=E},41342:(e,t,n)=>{"use strict";function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}function o(e,t){for(var n=0;n2?"one of ".concat(t," ").concat(e.slice(0,n-1).join(", "),", or ")+e[n-1]:2===n?"one of ".concat(t," ").concat(e[0]," or ").concat(e[1]):"of ".concat(t," ").concat(e[0])}return"of ".concat(t," ").concat(String(e))}u("ERR_AMBIGUOUS_ARGUMENT",'The "%s" argument is ambiguous. %s',TypeError),u("ERR_INVALID_ARG_TYPE",(function(e,t,o){var a,i,l,f;if(void 0===c&&(c=n(26093)),c("string"==typeof e,"'name' must be a string"),"string"==typeof t&&(i="not ",t.substr(!l||l<0?0:+l,i.length)===i)?(a="must not be",t=t.replace(/^not /,"")):a="must be",function(e,t,n){return(void 0===n||n>e.length)&&(n=e.length),e.substring(n-t.length,n)===t}(e," argument"))f="The ".concat(e," ").concat(a," ").concat(p(t,"type"));else{var s=function(e,t,n){return"number"!=typeof n&&(n=0),!(n+t.length>e.length)&&-1!==e.indexOf(t,n)}(e,".")?"property":"argument";f='The "'.concat(e,'" ').concat(s," ").concat(a," ").concat(p(t,"type"))}return f+=". Received type ".concat(r(o))}),TypeError),u("ERR_INVALID_ARG_VALUE",(function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"is invalid";void 0===f&&(f=n(49208));var o=f.inspect(t);return o.length>128&&(o="".concat(o.slice(0,128),"...")),"The argument '".concat(e,"' ").concat(r,". Received ").concat(o)}),TypeError,RangeError),u("ERR_INVALID_RETURN_VALUE",(function(e,t,n){var o;return o=n&&n.constructor&&n.constructor.name?"instance of ".concat(n.constructor.name):"type ".concat(r(n)),"Expected ".concat(e,' to be returned from the "').concat(t,'"')+" function but got ".concat(o,".")}),TypeError),u("ERR_MISSING_ARGS",(function(){for(var e=arguments.length,t=new Array(e),r=0;r0,"At least one arg needs to be specified");var o="The ",a=t.length;switch(t=t.map((function(e){return'"'.concat(e,'"')})),a){case 1:o+="".concat(t[0]," argument");break;case 2:o+="".concat(t[0]," and ").concat(t[1]," arguments");break;default:o+=t.slice(0,a-1).join(", "),o+=", and ".concat(t[a-1]," arguments")}return"".concat(o," must be specified")}),TypeError),e.exports.codes=s},5656:(e,t,n)=>{"use strict";function r(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a,i,l=[],c=!0,f=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(l.push(r.value),l.length!==t);c=!0);}catch(e){f=!0,o=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(f)throw o}}return l}}(e,t)||function(e,t){if(!e)return;if("string"==typeof e)return o(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return o(e,t)}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n10)return!0;for(var t=0;t57)return!0}return 10===e.length&&e>=Math.pow(2,32)}function B(e){return Object.keys(e).filter(P).concat(s(e).filter(Object.prototype.propertyIsEnumerable.bind(e)))}function S(e,t){if(e===t)return 0;for(var n=e.length,r=t.length,o=0,a=Math.min(n,r);o{"use strict";var r=n(528),o=n(28498),a=o(r("String.prototype.indexOf"));e.exports=function(e,t){var n=r(e,!!t);return"function"==typeof n&&a(e,".prototype.")>-1?o(n):n}},28498:(e,t,n)=>{"use strict";var r=n(79138),o=n(528),a=o("%Function.prototype.apply%"),i=o("%Function.prototype.call%"),l=o("%Reflect.apply%",!0)||r.call(i,a),c=o("%Object.getOwnPropertyDescriptor%",!0),f=o("%Object.defineProperty%",!0),s=o("%Math.max%");if(f)try{f({},"a",{value:1})}catch(e){f=null}e.exports=function(e){var t=l(r,i,arguments);c&&f&&(c(t,"length").configurable&&f(t,"length",{value:1+s(0,e.length-(arguments.length-1))}));return t};var u=function(){return l(r,a,arguments)};f?f(e.exports,"apply",{value:u}):e.exports.apply=u},4364:(e,t,n)=>{var r=n(49208),o=n(26093);function a(){return(new Date).getTime()}var i,l=Array.prototype.slice,c={};i=void 0!==n.g&&n.g.console?n.g.console:"undefined"!=typeof window&&window.console?window.console:{};for(var f=[[function(){},"log"],[function(){i.log.apply(i,arguments)},"info"],[function(){i.log.apply(i,arguments)},"warn"],[function(){i.warn.apply(i,arguments)},"error"],[function(e){c[e]=a()},"time"],[function(e){var t=c[e];if(!t)throw new Error("No such label: "+e);delete c[e];var n=a()-t;i.log(e+": "+n+"ms")},"timeEnd"],[function(){var e=new Error;e.name="Trace",e.message=r.format.apply(null,arguments),i.error(e.stack)},"trace"],[function(e){i.log(r.inspect(e)+"\n")},"dir"],[function(e){if(!e){var t=l.call(arguments,1);o.ok(!1,r.format.apply(null,t))}},"assert"]],s=0;s{"use strict";var r=n(17239)(),o=n(528),a=r&&o("%Object.defineProperty%",!0);if(a)try{a({},"a",{value:1})}catch(e){a=!1}var i=o("%SyntaxError%"),l=o("%TypeError%"),c=n(69336);e.exports=function(e,t,n){if(!e||"object"!=typeof e&&"function"!=typeof e)throw new l("`obj` must be an object or a function`");if("string"!=typeof t&&"symbol"!=typeof t)throw new l("`property` must be a string or a symbol`");if(arguments.length>3&&"boolean"!=typeof arguments[3]&&null!==arguments[3])throw new l("`nonEnumerable`, if provided, must be a boolean or null");if(arguments.length>4&&"boolean"!=typeof arguments[4]&&null!==arguments[4])throw new l("`nonWritable`, if provided, must be a boolean or null");if(arguments.length>5&&"boolean"!=typeof arguments[5]&&null!==arguments[5])throw new l("`nonConfigurable`, if provided, must be a boolean or null");if(arguments.length>6&&"boolean"!=typeof arguments[6])throw new l("`loose`, if provided, must be a boolean");var r=arguments.length>3?arguments[3]:null,o=arguments.length>4?arguments[4]:null,f=arguments.length>5?arguments[5]:null,s=arguments.length>6&&arguments[6],u=!!c&&c(e,t);if(a)a(e,t,{configurable:null===f&&u?u.configurable:!f,enumerable:null===r&&u?u.enumerable:!r,value:n,writable:null===o&&u?u.writable:!o});else{if(!s&&(r||o||f))throw new i("This environment does not support defining a property as non-configurable, non-writable, or non-enumerable.");e[t]=n}}},41857:(e,t,n)=>{"use strict";var r=n(49228),o="function"==typeof Symbol&&"symbol"==typeof Symbol("foo"),a=Object.prototype.toString,i=Array.prototype.concat,l=n(70686),c=n(17239)(),f=function(e,t,n,r){if(t in e)if(!0===r){if(e[t]===n)return}else if("function"!=typeof(o=r)||"[object Function]"!==a.call(o)||!r())return;var o;c?l(e,t,n,!0):l(e,t,n)},s=function(e,t){var n=arguments.length>2?arguments[2]:{},a=r(t);o&&(a=i.call(a,Object.getOwnPropertySymbols(t)));for(var l=0;l{"use strict";var r=n(89617),o=Object.prototype.toString,a=Object.prototype.hasOwnProperty;e.exports=function(e,t,n){if(!r(t))throw new TypeError("iterator must be a function");var i;arguments.length>=3&&(i=n),"[object Array]"===o.call(e)?function(e,t,n){for(var r=0,o=e.length;r{"use strict";var t=Object.prototype.toString,n=Math.max,r=function(e,t){for(var n=[],r=0;r{"use strict";var r=n(28794);e.exports=Function.prototype.bind||r},528:(e,t,n)=>{"use strict";var r,o=SyntaxError,a=Function,i=TypeError,l=function(e){try{return a('"use strict"; return ('+e+").constructor;")()}catch(e){}},c=Object.getOwnPropertyDescriptor;if(c)try{c({},"")}catch(e){c=null}var f=function(){throw new i},s=c?function(){try{return f}catch(e){try{return c(arguments,"callee").get}catch(e){return f}}}():f,u=n(53558)(),p=n(66869)(),d=Object.getPrototypeOf||(p?function(e){return e.__proto__}:null),A={},m="undefined"!=typeof Uint8Array&&d?d(Uint8Array):r,b={"%AggregateError%":"undefined"==typeof AggregateError?r:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?r:ArrayBuffer,"%ArrayIteratorPrototype%":u&&d?d([][Symbol.iterator]()):r,"%AsyncFromSyncIteratorPrototype%":r,"%AsyncFunction%":A,"%AsyncGenerator%":A,"%AsyncGeneratorFunction%":A,"%AsyncIteratorPrototype%":A,"%Atomics%":"undefined"==typeof Atomics?r:Atomics,"%BigInt%":"undefined"==typeof BigInt?r:BigInt,"%BigInt64Array%":"undefined"==typeof BigInt64Array?r:BigInt64Array,"%BigUint64Array%":"undefined"==typeof BigUint64Array?r:BigUint64Array,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?r:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":"undefined"==typeof Float32Array?r:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?r:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?r:FinalizationRegistry,"%Function%":a,"%GeneratorFunction%":A,"%Int8Array%":"undefined"==typeof Int8Array?r:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?r:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?r:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":u&&d?d(d([][Symbol.iterator]())):r,"%JSON%":"object"==typeof JSON?JSON:r,"%Map%":"undefined"==typeof Map?r:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&u&&d?d((new Map)[Symbol.iterator]()):r,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?r:Promise,"%Proxy%":"undefined"==typeof Proxy?r:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":"undefined"==typeof Reflect?r:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?r:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&u&&d?d((new Set)[Symbol.iterator]()):r,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?r:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":u&&d?d(""[Symbol.iterator]()):r,"%Symbol%":u?Symbol:r,"%SyntaxError%":o,"%ThrowTypeError%":s,"%TypedArray%":m,"%TypeError%":i,"%Uint8Array%":"undefined"==typeof Uint8Array?r:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?r:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?r:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?r:Uint32Array,"%URIError%":URIError,"%WeakMap%":"undefined"==typeof WeakMap?r:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?r:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?r:WeakSet};if(d)try{null.error}catch(e){var v=d(d(e));b["%Error.prototype%"]=v}var g=function e(t){var n;if("%AsyncFunction%"===t)n=l("async function () {}");else if("%GeneratorFunction%"===t)n=l("function* () {}");else if("%AsyncGeneratorFunction%"===t)n=l("async function* () {}");else if("%AsyncGenerator%"===t){var r=e("%AsyncGeneratorFunction%");r&&(n=r.prototype)}else if("%AsyncIteratorPrototype%"===t){var o=e("%AsyncGenerator%");o&&d&&(n=d(o.prototype))}return b[t]=n,n},h={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},y=n(79138),w=n(92571),Z=y.call(Function.call,Array.prototype.concat),x=y.call(Function.apply,Array.prototype.splice),q=y.call(Function.call,String.prototype.replace),W=y.call(Function.call,String.prototype.slice),V=y.call(Function.call,RegExp.prototype.exec),T=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,E=/\\(\\)?/g,O=function(e,t){var n,r=e;if(w(h,r)&&(r="%"+(n=h[r])[0]+"%"),w(b,r)){var a=b[r];if(a===A&&(a=g(r)),void 0===a&&!t)throw new i("intrinsic "+e+" exists, but is not available. Please file an issue!");return{alias:n,name:r,value:a}}throw new o("intrinsic "+e+" does not exist!")};e.exports=function(e,t){if("string"!=typeof e||0===e.length)throw new i("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof t)throw new i('"allowMissing" argument must be a boolean');if(null===V(/^%?[^%]*%?$/,e))throw new o("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var n=function(e){var t=W(e,0,1),n=W(e,-1);if("%"===t&&"%"!==n)throw new o("invalid intrinsic syntax, expected closing `%`");if("%"===n&&"%"!==t)throw new o("invalid intrinsic syntax, expected opening `%`");var r=[];return q(e,T,(function(e,t,n,o){r[r.length]=n?q(o,E,"$1"):t||e})),r}(e),r=n.length>0?n[0]:"",a=O("%"+r+"%",t),l=a.name,f=a.value,s=!1,u=a.alias;u&&(r=u[0],x(n,Z([0,1],u)));for(var p=1,d=!0;p=n.length){var g=c(f,A);f=(d=!!g)&&"get"in g&&!("originalValue"in g.get)?g.get:f[A]}else d=w(f,A),f=f[A];d&&!s&&(b[l]=f)}}return f}},69336:(e,t,n)=>{"use strict";var r=n(528)("%Object.getOwnPropertyDescriptor%",!0);if(r)try{r([],"length")}catch(e){r=null}e.exports=r},17239:(e,t,n)=>{"use strict";var r=n(528)("%Object.defineProperty%",!0),o=function(){if(r)try{return r({},"a",{value:1}),!0}catch(e){return!1}return!1};o.hasArrayLengthDefineBug=function(){if(!o())return null;try{return 1!==r([],"length",{value:1}).length}catch(e){return!0}},e.exports=o},66869:e=>{"use strict";var t={foo:{}},n=Object;e.exports=function(){return{__proto__:t}.foo===t.foo&&!({__proto__:null}instanceof n)}},53558:(e,t,n)=>{"use strict";var r="undefined"!=typeof Symbol&&Symbol,o=n(62908);e.exports=function(){return"function"==typeof r&&("function"==typeof Symbol&&("symbol"==typeof r("foo")&&("symbol"==typeof Symbol("bar")&&o())))}},62908:e=>{"use strict";e.exports=function(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var e={},t=Symbol("test"),n=Object(t);if("string"==typeof t)return!1;if("[object Symbol]"!==Object.prototype.toString.call(t))return!1;if("[object Symbol]"!==Object.prototype.toString.call(n))return!1;for(t in e[t]=42,e)return!1;if("function"==typeof Object.keys&&0!==Object.keys(e).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(e).length)return!1;var r=Object.getOwnPropertySymbols(e);if(1!==r.length||r[0]!==t)return!1;if(!Object.prototype.propertyIsEnumerable.call(e,t))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var o=Object.getOwnPropertyDescriptor(e,t);if(42!==o.value||!0!==o.enumerable)return!1}return!0}},51913:(e,t,n)=>{"use strict";var r=n(62908);e.exports=function(){return r()&&!!Symbol.toStringTag}},92571:e=>{"use strict";var t={}.hasOwnProperty,n=Function.prototype.call;e.exports=n.bind?n.bind(t):function(e,r){return n.call(t,e,r)}},35615:e=>{"function"==typeof Object.create?e.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:e.exports=function(e,t){if(t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}}},55387:(e,t,n)=>{"use strict";var r=n(51913)(),o=n(79818)("Object.prototype.toString"),a=function(e){return!(r&&e&&"object"==typeof e&&Symbol.toStringTag in e)&&"[object Arguments]"===o(e)},i=function(e){return!!a(e)||null!==e&&"object"==typeof e&&"number"==typeof e.length&&e.length>=0&&"[object Array]"!==o(e)&&"[object Function]"===o(e.callee)},l=function(){return a(arguments)}();a.isLegacyArguments=i,e.exports=l?a:i},89617:e=>{"use strict";var t,n,r=Function.prototype.toString,o="object"==typeof Reflect&&null!==Reflect&&Reflect.apply;if("function"==typeof o&&"function"==typeof Object.defineProperty)try{t=Object.defineProperty({},"length",{get:function(){throw n}}),n={},o((function(){throw 42}),null,t)}catch(e){e!==n&&(o=null)}else o=null;var a=/^\s*class\b/,i=function(e){try{var t=r.call(e);return a.test(t)}catch(e){return!1}},l=function(e){try{return!i(e)&&(r.call(e),!0)}catch(e){return!1}},c=Object.prototype.toString,f="function"==typeof Symbol&&!!Symbol.toStringTag,s=!(0 in[,]),u=function(){return!1};if("object"==typeof document){var p=document.all;c.call(p)===c.call(document.all)&&(u=function(e){if((s||!e)&&(void 0===e||"object"==typeof e))try{var t=c.call(e);return("[object HTMLAllCollection]"===t||"[object HTML document.all class]"===t||"[object HTMLCollection]"===t||"[object Object]"===t)&&null==e("")}catch(e){}return!1})}e.exports=o?function(e){if(u(e))return!0;if(!e)return!1;if("function"!=typeof e&&"object"!=typeof e)return!1;try{o(e,null,t)}catch(e){if(e!==n)return!1}return!i(e)&&l(e)}:function(e){if(u(e))return!0;if(!e)return!1;if("function"!=typeof e&&"object"!=typeof e)return!1;if(f)return l(e);if(i(e))return!1;var t=c.call(e);return!("[object Function]"!==t&&"[object GeneratorFunction]"!==t&&!/^\[object HTML/.test(t))&&l(e)}},2625:(e,t,n)=>{"use strict";var r,o=Object.prototype.toString,a=Function.prototype.toString,i=/^\s*(?:function)?\*/,l=n(51913)(),c=Object.getPrototypeOf;e.exports=function(e){if("function"!=typeof e)return!1;if(i.test(a.call(e)))return!0;if(!l)return"[object GeneratorFunction]"===o.call(e);if(!c)return!1;if(void 0===r){var t=function(){if(!l)return!1;try{return Function("return function*() {}")()}catch(e){}}();r=!!t&&c(t)}return c(e)===r}},98006:e=>{"use strict";e.exports=function(e){return e!=e}},7838:(e,t,n)=>{"use strict";var r=n(28498),o=n(41857),a=n(98006),i=n(41591),l=n(61641),c=r(i(),Number);o(c,{getPolyfill:i,implementation:a,shim:l}),e.exports=c},41591:(e,t,n)=>{"use strict";var r=n(98006);e.exports=function(){return Number.isNaN&&Number.isNaN(NaN)&&!Number.isNaN("a")?Number.isNaN:r}},61641:(e,t,n)=>{"use strict";var r=n(41857),o=n(41591);e.exports=function(){var e=o();return r(Number,{isNaN:e},{isNaN:function(){return Number.isNaN!==e}}),e}},95943:(e,t,n)=>{"use strict";var r=n(52730);e.exports=function(e){return!!r(e)}},82372:e=>{"use strict";var t=function(e){return e!=e};e.exports=function(e,n){return 0===e&&0===n?1/e==1/n:e===n||!(!t(e)||!t(n))}},55968:(e,t,n)=>{"use strict";var r=n(41857),o=n(28498),a=n(82372),i=n(61937),l=n(85087),c=o(i(),Object);r(c,{getPolyfill:i,implementation:a,shim:l}),e.exports=c},61937:(e,t,n)=>{"use strict";var r=n(82372);e.exports=function(){return"function"==typeof Object.is?Object.is:r}},85087:(e,t,n)=>{"use strict";var r=n(61937),o=n(41857);e.exports=function(){var e=r();return o(Object,{is:e},{is:function(){return Object.is!==e}}),e}},78160:(e,t,n)=>{"use strict";var r;if(!Object.keys){var o=Object.prototype.hasOwnProperty,a=Object.prototype.toString,i=n(50968),l=Object.prototype.propertyIsEnumerable,c=!l.call({toString:null},"toString"),f=l.call((function(){}),"prototype"),s=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],u=function(e){var t=e.constructor;return t&&t.prototype===e},p={$applicationCache:!0,$console:!0,$external:!0,$frame:!0,$frameElement:!0,$frames:!0,$innerHeight:!0,$innerWidth:!0,$onmozfullscreenchange:!0,$onmozfullscreenerror:!0,$outerHeight:!0,$outerWidth:!0,$pageXOffset:!0,$pageYOffset:!0,$parent:!0,$scrollLeft:!0,$scrollTop:!0,$scrollX:!0,$scrollY:!0,$self:!0,$webkitIndexedDB:!0,$webkitStorageInfo:!0,$window:!0},d=function(){if("undefined"==typeof window)return!1;for(var e in window)try{if(!p["$"+e]&&o.call(window,e)&&null!==window[e]&&"object"==typeof window[e])try{u(window[e])}catch(e){return!0}}catch(e){return!0}return!1}();r=function(e){var t=null!==e&&"object"==typeof e,n="[object Function]"===a.call(e),r=i(e),l=t&&"[object String]"===a.call(e),p=[];if(!t&&!n&&!r)throw new TypeError("Object.keys called on a non-object");var A=f&&n;if(l&&e.length>0&&!o.call(e,0))for(var m=0;m0)for(var b=0;b{"use strict";var r=Array.prototype.slice,o=n(50968),a=Object.keys,i=a?function(e){return a(e)}:n(78160),l=Object.keys;i.shim=function(){if(Object.keys){var e=function(){var e=Object.keys(arguments);return e&&e.length===arguments.length}(1,2);e||(Object.keys=function(e){return o(e)?l(r.call(e)):l(e)})}else Object.keys=i;return Object.keys||i},e.exports=i},50968:e=>{"use strict";var t=Object.prototype.toString;e.exports=function(e){var n=t.call(e),r="[object Arguments]"===n;return r||(r="[object Array]"!==n&&null!==e&&"object"==typeof e&&"number"==typeof e.length&&e.length>=0&&"[object Function]"===t.call(e.callee)),r}},25164:(e,t,n)=>{"use strict";var r=n(49228),o=n(62908)(),a=n(79818),i=Object,l=a("Array.prototype.push"),c=a("Object.prototype.propertyIsEnumerable"),f=o?Object.getOwnPropertySymbols:null;e.exports=function(e,t){if(null==e)throw new TypeError("target must be an object");var n=i(e);if(1===arguments.length)return n;for(var a=1;a{"use strict";var r=n(25164);e.exports=function(){return Object.assign?function(){if(!Object.assign)return!1;for(var e="abcdefghijklmnopqrst",t=e.split(""),n={},r=0;r{var t,n,r=e.exports={};function o(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function i(e){if(t===setTimeout)return setTimeout(e,0);if((t===o||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(n){try{return t.call(null,e,0)}catch(n){return t.call(this,e,0)}}}!function(){try{t="function"==typeof setTimeout?setTimeout:o}catch(e){t=o}try{n="function"==typeof clearTimeout?clearTimeout:a}catch(e){n=a}}();var l,c=[],f=!1,s=-1;function u(){f&&l&&(f=!1,l.length?c=l.concat(c):s=-1,c.length&&p())}function p(){if(!f){var e=i(u);f=!0;for(var t=c.length;t;){for(l=c,c=[];++s1)for(var n=1;n{e.exports=function(e){return e&&"object"==typeof e&&"function"==typeof e.copy&&"function"==typeof e.fill&&"function"==typeof e.readUInt8}},51531:(e,t,n)=>{"use strict";var r=n(55387),o=n(2625),a=n(52730),i=n(95943);function l(e){return e.call.bind(e)}var c="undefined"!=typeof BigInt,f="undefined"!=typeof Symbol,s=l(Object.prototype.toString),u=l(Number.prototype.valueOf),p=l(String.prototype.valueOf),d=l(Boolean.prototype.valueOf);if(c)var A=l(BigInt.prototype.valueOf);if(f)var m=l(Symbol.prototype.valueOf);function b(e,t){if("object"!=typeof e)return!1;try{return t(e),!0}catch(e){return!1}}function v(e){return"[object Map]"===s(e)}function g(e){return"[object Set]"===s(e)}function h(e){return"[object WeakMap]"===s(e)}function y(e){return"[object WeakSet]"===s(e)}function w(e){return"[object ArrayBuffer]"===s(e)}function Z(e){return"undefined"!=typeof ArrayBuffer&&(w.working?w(e):e instanceof ArrayBuffer)}function x(e){return"[object DataView]"===s(e)}function q(e){return"undefined"!=typeof DataView&&(x.working?x(e):e instanceof DataView)}t.isArgumentsObject=r,t.isGeneratorFunction=o,t.isTypedArray=i,t.isPromise=function(e){return"undefined"!=typeof Promise&&e instanceof Promise||null!==e&&"object"==typeof e&&"function"==typeof e.then&&"function"==typeof e.catch},t.isArrayBufferView=function(e){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):i(e)||q(e)},t.isUint8Array=function(e){return"Uint8Array"===a(e)},t.isUint8ClampedArray=function(e){return"Uint8ClampedArray"===a(e)},t.isUint16Array=function(e){return"Uint16Array"===a(e)},t.isUint32Array=function(e){return"Uint32Array"===a(e)},t.isInt8Array=function(e){return"Int8Array"===a(e)},t.isInt16Array=function(e){return"Int16Array"===a(e)},t.isInt32Array=function(e){return"Int32Array"===a(e)},t.isFloat32Array=function(e){return"Float32Array"===a(e)},t.isFloat64Array=function(e){return"Float64Array"===a(e)},t.isBigInt64Array=function(e){return"BigInt64Array"===a(e)},t.isBigUint64Array=function(e){return"BigUint64Array"===a(e)},v.working="undefined"!=typeof Map&&v(new Map),t.isMap=function(e){return"undefined"!=typeof Map&&(v.working?v(e):e instanceof Map)},g.working="undefined"!=typeof Set&&g(new Set),t.isSet=function(e){return"undefined"!=typeof Set&&(g.working?g(e):e instanceof Set)},h.working="undefined"!=typeof WeakMap&&h(new WeakMap),t.isWeakMap=function(e){return"undefined"!=typeof WeakMap&&(h.working?h(e):e instanceof WeakMap)},y.working="undefined"!=typeof WeakSet&&y(new WeakSet),t.isWeakSet=function(e){return y(e)},w.working="undefined"!=typeof ArrayBuffer&&w(new ArrayBuffer),t.isArrayBuffer=Z,x.working="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView&&x(new DataView(new ArrayBuffer(1),0,1)),t.isDataView=q;var W="undefined"!=typeof SharedArrayBuffer?SharedArrayBuffer:void 0;function V(e){return"[object SharedArrayBuffer]"===s(e)}function T(e){return void 0!==W&&(void 0===V.working&&(V.working=V(new W)),V.working?V(e):e instanceof W)}function E(e){return b(e,u)}function O(e){return b(e,p)}function k(e){return b(e,d)}function z(e){return c&&b(e,A)}function P(e){return f&&b(e,m)}t.isSharedArrayBuffer=T,t.isAsyncFunction=function(e){return"[object AsyncFunction]"===s(e)},t.isMapIterator=function(e){return"[object Map Iterator]"===s(e)},t.isSetIterator=function(e){return"[object Set Iterator]"===s(e)},t.isGeneratorObject=function(e){return"[object Generator]"===s(e)},t.isWebAssemblyCompiledModule=function(e){return"[object WebAssembly.Module]"===s(e)},t.isNumberObject=E,t.isStringObject=O,t.isBooleanObject=k,t.isBigIntObject=z,t.isSymbolObject=P,t.isBoxedPrimitive=function(e){return E(e)||O(e)||k(e)||z(e)||P(e)},t.isAnyArrayBuffer=function(e){return"undefined"!=typeof Uint8Array&&(Z(e)||T(e))},["isProxy","isExternal","isModuleNamespaceObject"].forEach((function(e){Object.defineProperty(t,e,{enumerable:!1,value:function(){throw new Error(e+" is not supported in userland")}})}))},49208:(e,t,n)=>{var r=n(39907),o=n(4364),a=Object.getOwnPropertyDescriptors||function(e){for(var t=Object.keys(e),n={},r=0;r=o)return e;switch(e){case"%s":return String(r[n++]);case"%d":return Number(r[n++]);case"%j":try{return JSON.stringify(r[n++])}catch(e){return"[Circular]"}default:return e}})),l=r[n];n=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),v(n)?r.showHidden=n:n&&t._extend(r,n),w(r.showHidden)&&(r.showHidden=!1),w(r.depth)&&(r.depth=2),w(r.colors)&&(r.colors=!1),w(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=u),d(r,e,r.depth)}function u(e,t){var n=s.styles[t];return n?"["+s.colors[n][0]+"m"+e+"["+s.colors[n][1]+"m":e}function p(e,t){return e}function d(e,n,r){if(e.customInspect&&n&&V(n.inspect)&&n.inspect!==t.inspect&&(!n.constructor||n.constructor.prototype!==n)){var o=n.inspect(r,e);return y(o)||(o=d(e,o,r)),o}var a=function(e,t){if(w(t))return e.stylize("undefined","undefined");if(y(t)){var n="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(n,"string")}if(h(t))return e.stylize(""+t,"number");if(v(t))return e.stylize(""+t,"boolean");if(g(t))return e.stylize("null","null")}(e,n);if(a)return a;var i=Object.keys(n),l=function(e){var t={};return e.forEach((function(e,n){t[e]=!0})),t}(i);if(e.showHidden&&(i=Object.getOwnPropertyNames(n)),W(n)&&(i.indexOf("message")>=0||i.indexOf("description")>=0))return A(n);if(0===i.length){if(V(n)){var c=n.name?": "+n.name:"";return e.stylize("[Function"+c+"]","special")}if(Z(n))return e.stylize(RegExp.prototype.toString.call(n),"regexp");if(q(n))return e.stylize(Date.prototype.toString.call(n),"date");if(W(n))return A(n)}var f,s="",u=!1,p=["{","}"];(b(n)&&(u=!0,p=["[","]"]),V(n))&&(s=" [Function"+(n.name?": "+n.name:"")+"]");return Z(n)&&(s=" "+RegExp.prototype.toString.call(n)),q(n)&&(s=" "+Date.prototype.toUTCString.call(n)),W(n)&&(s=" "+A(n)),0!==i.length||u&&0!=n.length?r<0?Z(n)?e.stylize(RegExp.prototype.toString.call(n),"regexp"):e.stylize("[Object]","special"):(e.seen.push(n),f=u?function(e,t,n,r,o){for(var a=[],i=0,l=t.length;i=0&&0,e+t.replace(/\u001b\[\d\d?m/g,"").length+1}),0);if(r>60)return n[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+n[1];return n[0]+t+" "+e.join(", ")+" "+n[1]}(f,s,p)):p[0]+s+p[1]}function A(e){return"["+Error.prototype.toString.call(e)+"]"}function m(e,t,n,r,o,a){var i,l,c;if((c=Object.getOwnPropertyDescriptor(t,o)||{value:t[o]}).get?l=c.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):c.set&&(l=e.stylize("[Setter]","special")),k(r,o)||(i="["+o+"]"),l||(e.seen.indexOf(c.value)<0?(l=g(n)?d(e,c.value,null):d(e,c.value,n-1)).indexOf("\n")>-1&&(l=a?l.split("\n").map((function(e){return" "+e})).join("\n").slice(2):"\n"+l.split("\n").map((function(e){return" "+e})).join("\n")):l=e.stylize("[Circular]","special")),w(i)){if(a&&o.match(/^\d+$/))return l;(i=JSON.stringify(""+o)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(i=i.slice(1,-1),i=e.stylize(i,"name")):(i=i.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),i=e.stylize(i,"string"))}return i+": "+l}function b(e){return Array.isArray(e)}function v(e){return"boolean"==typeof e}function g(e){return null===e}function h(e){return"number"==typeof e}function y(e){return"string"==typeof e}function w(e){return void 0===e}function Z(e){return x(e)&&"[object RegExp]"===T(e)}function x(e){return"object"==typeof e&&null!==e}function q(e){return x(e)&&"[object Date]"===T(e)}function W(e){return x(e)&&("[object Error]"===T(e)||e instanceof Error)}function V(e){return"function"==typeof e}function T(e){return Object.prototype.toString.call(e)}function E(e){return e<10?"0"+e.toString(10):e.toString(10)}t.debuglog=function(e){if(e=e.toUpperCase(),!l[e])if(c.test(e)){var n=r.pid;l[e]=function(){var r=t.format.apply(t,arguments);o.error("%s %d: %s",e,n,r)}}else l[e]=function(){};return l[e]},t.inspect=s,s.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},s.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},t.types=n(51531),t.isArray=b,t.isBoolean=v,t.isNull=g,t.isNullOrUndefined=function(e){return null==e},t.isNumber=h,t.isString=y,t.isSymbol=function(e){return"symbol"==typeof e},t.isUndefined=w,t.isRegExp=Z,t.types.isRegExp=Z,t.isObject=x,t.isDate=q,t.types.isDate=q,t.isError=W,t.types.isNativeError=W,t.isFunction=V,t.isPrimitive=function(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||void 0===e},t.isBuffer=n(95272);var O=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function k(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.log=function(){var e,n;o.log("%s - %s",(e=new Date,n=[E(e.getHours()),E(e.getMinutes()),E(e.getSeconds())].join(":"),[e.getDate(),O[e.getMonth()],n].join(" ")),t.format.apply(t,arguments))},t.inherits=n(35615),t._extend=function(e,t){if(!t||!x(t))return e;for(var n=Object.keys(t),r=n.length;r--;)e[n[r]]=t[n[r]];return e};var z="undefined"!=typeof Symbol?Symbol("util.promisify.custom"):void 0;function P(e,t){if(!e){var n=new Error("Promise was rejected with a falsy value");n.reason=e,e=n}return t(e)}t.promisify=function(e){if("function"!=typeof e)throw new TypeError('The "original" argument must be of type Function');if(z&&e[z]){var t;if("function"!=typeof(t=e[z]))throw new TypeError('The "util.promisify.custom" argument must be of type Function');return Object.defineProperty(t,z,{value:t,enumerable:!1,writable:!1,configurable:!0}),t}function t(){for(var t,n,r=new Promise((function(e,r){t=e,n=r})),o=[],a=0;a{"use strict";var r=n(80705),o=n(14834),a=n(28498),i=n(79818),l=n(69336),c=i("Object.prototype.toString"),f=n(51913)(),s="undefined"==typeof globalThis?n.g:globalThis,u=o(),p=i("String.prototype.slice"),d=Object.getPrototypeOf,A=i("Array.prototype.indexOf",!0)||function(e,t){for(var n=0;n-1?t:"Object"===t&&function(e){var t=!1;return r(m,(function(n,r){if(!t)try{n(e),t=p(r,1)}catch(e){}})),t}(e)}return l?function(e){var t=!1;return r(m,(function(n,r){if(!t)try{"$"+n(e)===r&&(t=p(r,1))}catch(e){}})),t}(e):null}},88453:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},16216:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},54183:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.EditorEnvelopeLocator=t.EnvelopeMapping=t.EnvelopeContentType=void 0;var r=n(25208);!function(e){e[e.PATH=0]="PATH",e[e.CONTENT=1]="CONTENT"}(t.EnvelopeContentType||(t.EnvelopeContentType={}));var o=function(){function e(e){this.args=e,this.matcher=new r.Minimatch(e.filePathGlob,{nocase:!0,dot:!0})}return Object.defineProperty(e.prototype,"type",{get:function(){return this.args.type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"filePathGlob",{get:function(){return this.args.filePathGlob},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"resourcesPathPrefix",{get:function(){return this.args.resourcesPathPrefix},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"envelopeContent",{get:function(){return this.args.envelopeContent},enumerable:!1,configurable:!0}),e}();t.EnvelopeMapping=o;var a=function(){function e(e,t){this.targetOrigin=e,this.envelopeMappings=t}return e.prototype.getEnvelopeMapping=function(e){return this.envelopeMappings.find((function(t){return t.matcher.match(e)}))},e.prototype.hasMappingFor=function(e){return void 0!==this.getEnvelopeMapping(e)},e}();t.EditorEnvelopeLocator=a},3179:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},65056:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.EditorTheme=void 0,function(e){e[e.DARK=0]="DARK",e[e.LIGHT=1]="LIGHT",e[e.HIGH_CONTRAST=2]="HIGH_CONTRAST"}(t.EditorTheme||(t.EditorTheme={}))},15351:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},47752:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ChannelType=void 0,function(e){e.VSCODE_DESKTOP="VSCODE_DESKTOP",e.VSCODE_WEB="VSCODE_WEB",e.ONLINE="ONLINE",e.GITHUB="GITHUB",e.EMBEDDED="EMBEDDED",e.OTHER="OTHER",e.ONLINE_MULTI_FILE="ONLINE_MULTI_FILE",e.STANDALONE="STANDALONE"}(t.ChannelType||(t.ChannelType={}))},81607:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useKogitoEditorEnvelopeContext=t.KogitoEditorEnvelopeContext=void 0;var r=n(96540),o=n(96540);t.KogitoEditorEnvelopeContext=r.createContext({}),t.useKogitoEditorEnvelopeContext=function(){return(0,o.useContext)(t.KogitoEditorEnvelopeContext)}},73429:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StateControlCommand=void 0,function(e){e[e.UNDO=0]="UNDO",e[e.REDO=1]="REDO"}(t.StateControlCommand||(t.StateControlCommand={}))},65766:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),o(n(88453),t),o(n(3179),t),o(n(81607),t),o(n(15351),t),o(n(47752),t),o(n(73429),t),o(n(16216),t),o(n(54183),t),o(n(65056),t)},68951:(e,t,n)=>{"use strict";var r=n(4364);Object.defineProperty(t,"__esModule",{value:!0}),t.StateControl=void 0;var o=function(){function e(){this.commandStack=[],this.registeredCallbacks=[]}return e.prototype.subscribe=function(e){return this.registeredCallbacks.push(e),e},e.prototype.unsubscribe=function(e){var t=this.registeredCallbacks.indexOf(e);t>-1?this.registeredCallbacks.splice(t,1):r.error("Can't unsubscribe callback because it wasn't subscribed.")},e.prototype.getSavedCommand=function(){return this.savedCommand},e.prototype.getCurrentCommand=function(){return this.currentCommand},e.prototype.getCommandStack=function(){return this.commandStack},e.prototype.getRegisteredCallbacks=function(){return this.registeredCallbacks},e.prototype.setSavedCommand=function(){this.savedCommand=this.currentCommand;var e=this.isDirty();this.registeredCallbacks.forEach((function(t){return t(e)}))},e.prototype.setCurrentCommand=function(e){this.currentCommand=e;var t=this.isDirty();this.registeredCallbacks.forEach((function(e){return e(t)}))},e.prototype.isDirty=function(){return this.currentCommand!==this.savedCommand},e.prototype.undo=function(){var e,t,n,r=this.commandStack.indexOf(this.currentCommand);this.commandStack[r-1]&&(n=this.commandStack[r-1]),null===(t=null===(e=this.currentCommand)||void 0===e?void 0:e.undo)||void 0===t||t.call(e),this.setCurrentCommand(n)},e.prototype.redo=function(){var e,t=this.commandStack.indexOf(this.currentCommand);if(this.commandStack[t+1]){var n=this.commandStack[t+1];null===(e=null==n?void 0:n.redo)||void 0===e||e.call(n),this.setCurrentCommand(n)}},e.prototype.eraseRedoCommands=function(){return this.commandStack.slice(0,this.commandStack.indexOf(this.currentCommand)+1)},e.prototype.updateCommandStack=function(e){var t;this.commandStack=this.eraseRedoCommands(),e.id!==(null===(t=this.currentCommand)||void 0===t?void 0:t.id)&&(this.setCurrentCommand(e),this.commandStack=this.commandStack.concat(e))},e}();t.StateControl=o},76544:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getEditorIframeProps=void 0;var r=n(65766);t.getEditorIframeProps=function(e){return e.envelopeContent.type===r.EnvelopeContentType.CONTENT?{srcDoc:e.envelopeContent.content}:{key:e.envelopeContent.path,src:e.envelopeContent.path}}},95985:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StateControl=void 0;var r=n(68951);Object.defineProperty(t,"StateControl",{enumerable:!0,get:function(){return r.StateControl}})},87055:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useEffectAfterFirstRender=void 0;var r=n(96540);t.useEffectAfterFirstRender=function(e,t){var n=(0,r.useRef)(!0);(0,r.useEffect)((function(){n.current?n.current=!1:e()}),t)}},50272:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),o(n(87055),t)},11340:function(e,t,n){"use strict";var r=n(4364),o=this&&this.__assign||function(){return o=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0)&&!(r=a.next()).done;)i.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=a.return)&&n.call(a)}finally{if(o)throw o.error}}return i};Object.defineProperty(t,"__esModule",{value:!0}),t.EmbeddedEditor=void 0;var i=n(74848),l=n(96540),c=n(96540),f=n(95985),s=n(50272),u=n(53463),p=n(86927),d=n(31212),A=n(76544),m={display:"flex",flex:1,flexDirection:"column",width:"100%",height:"100%",border:"none",margin:0,padding:0,overflow:"hidden"};t.EmbeddedEditor=l.forwardRef((function(e,t){var n=(0,c.useRef)(null),l=(0,c.useMemo)((function(){var t;return null!==(t=e.stateControl)&&void 0!==t?t:new f.StateControl}),[e.file.getFileContents,e.stateControl]),b=a((0,c.useState)(!1),2),v=b[0],g=b[1],h=(0,c.useMemo)((function(){var t;return e.editorEnvelopeLocator.getEnvelopeMapping(null!==(t=e.file.path)&&void 0!==t?t:e.file.fileName)}),[e.editorEnvelopeLocator,e.file]),y=(0,c.useMemo)((function(){var t;return null!==(t=e.customChannelApiImpl)&&void 0!==t?t:new u.EmbeddedEditorChannelApiImpl(l,e.file,e.locale,o(o({},e),{kogitoEditor_ready:function(){var t;g(!0),null===(t=e.kogitoEditor_ready)||void 0===t||t.call(e)}}))}),[l,e]),w=(0,c.useMemo)((function(){return new p.EnvelopeServer({postMessage:function(e){var t,r;return null===(r=null===(t=n.current)||void 0===t?void 0:t.contentWindow)||void 0===r?void 0:r.postMessage(e,"*")}},e.editorEnvelopeLocator.targetOrigin,(function(t){var n;return t.envelopeApi.requests.kogitoEditor_initRequest({origin:t.origin,envelopeServerId:t.id},{fileExtension:e.file.fileExtension,resourcesPathPrefix:null!==(n=null==h?void 0:h.resourcesPathPrefix)&&void 0!==n?n:"",initialLocale:e.locale,isReadOnly:e.file.isReadOnly,channel:e.channelType})}))}),[e.editorEnvelopeLocator.targetOrigin,e.file.fileExtension,e.file.isReadOnly,e.locale,e.channelType,null==h?void 0:h.resourcesPathPrefix]);(0,d.useConnectedEnvelopeServer)(w,y),(0,s.useEffectAfterFirstRender)((function(){w.envelopeApi.notifications.kogitoI18n_localeChange.send(e.locale)}),[e.locale]),(0,s.useEffectAfterFirstRender)((function(){e.file.getFileContents().then((function(t){w.envelopeApi.requests.kogitoEditor_contentChanged({content:t,path:e.file.fileName},{showLoadingOverlay:!0})}))}),[e.file.getFileContents]);var Z=(0,c.useCallback)((function(e,t){var n,o={altKey:t.altKey,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,metaKey:t.metaKey,code:t.code,type:t.type,channelOriginalTargetTagName:null===(n=t.target)||void 0===n?void 0:n.tagName};r.debug("New keyboard event (".concat(JSON.stringify(o),")!")),e.envelopeApi.notifications.kogitoKeyboardShortcuts_channelKeyboardEvent.send(o)}),[]);return(0,c.useImperativeHandle)(t,(function(){var t;if(n.current)return{iframeRef:n,isReady:null!==(t=e.isReady)&&void 0!==t?t:v,getStateControl:function(){return l},getEnvelopeServer:function(){return w},undo:function(){return Promise.resolve(w.envelopeApi.notifications.kogitoEditor_editorUndo.send())},redo:function(){return Promise.resolve(w.envelopeApi.notifications.kogitoEditor_editorRedo.send())},getContent:function(){return w.envelopeApi.requests.kogitoEditor_contentRequest().then((function(e){return e.content}))},getPreview:function(){return w.envelopeApi.requests.kogitoEditor_previewRequest()},setContent:function(e,t){return w.envelopeApi.requests.kogitoEditor_contentChanged({path:e,content:t},{showLoadingOverlay:!1})},validate:function(){return w.envelopeApi.requests.kogitoEditor_validate()},setTheme:function(e){return Promise.resolve(w.shared.kogitoEditor_theme.set(e))},onKeyDown:function(e){return Z(w,e)}}}),[e.isReady,v,l,w,Z]),(0,i.jsxs)(i.Fragment,{children:[!h&&(0,i.jsx)(i.Fragment,{children:(0,i.jsx)("span",{children:"No Editor available for '".concat(e.file.fileExtension,"' extension")})}),h&&(0,i.jsx)("iframe",o({ref:n,id:"kogito-iframe","data-testid":"kogito-iframe",title:"Kogito editor",style:m,"data-envelope-channel":e.channelType},(0,A.getEditorIframeProps)(h)))]})}))},53463:function(e,t,n){"use strict";var r=n(4364),o=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,a){function i(e){try{c(r.next(e))}catch(e){a(e)}}function l(e){try{c(r.throw(e))}catch(e){a(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(i,l)}c((r=r.apply(e,t||[])).next())}))},a=this&&this.__generator||function(e,t){var n,r,o,a,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:l(0),throw:l(1),return:l(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function l(a){return function(l){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;i;)try{if(n=1,r&&(o=2&a[0]?r.return:a[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,a[1])).done)return o;switch(r=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return i.label++,{value:a[1],done:!1};case 5:i.label++,r=a[1],a=[0];continue;case 7:a=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0)&&!(r=a.next()).done;)i.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=a.return)&&n.call(a)}finally{if(o)throw o.error}}return i};Object.defineProperty(t,"__esModule",{value:!0}),t.useEditorRef=void 0;var o=n(96540);t.useEditorRef=function(){var e=r((0,o.useState)(void 0),2),t=e[0],n=e[1];return{editor:t,editorRef:(0,o.useCallback)((function(e){e&&n(e)}),[])}}},81279:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.EmbeddedEditorChannelApiImpl=t.useEditorRef=t.EmbeddedViewer=t.EmbeddedEditor=void 0;var r=n(11340);Object.defineProperty(t,"EmbeddedEditor",{enumerable:!0,get:function(){return r.EmbeddedEditor}});var o=n(14763);Object.defineProperty(t,"EmbeddedViewer",{enumerable:!0,get:function(){return o.EmbeddedViewer}});var a=n(32871);Object.defineProperty(t,"useEditorRef",{enumerable:!0,get:function(){return a.useEditorRef}});var i=n(53463);Object.defineProperty(t,"EmbeddedEditorChannelApiImpl",{enumerable:!0,get:function(){return i.EmbeddedEditorChannelApiImpl}})},66668:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),o(n(50272),t),o(n(81279),t),o(n(63475),t)},94387:function(e,t,n){"use strict";var r=this&&this.__read||function(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,a=n.call(e),i=[];try{for(;(void 0===t||t-- >0)&&!(r=a.next()).done;)i.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=a.return)&&n.call(a)}finally{if(o)throw o.error}}return i};Object.defineProperty(t,"__esModule",{value:!0}),t.useStateControlSubscription=t.useDirtyState=void 0;var o=n(96540);t.useDirtyState=function(e){var t=r((0,o.useState)(!1),2),n=t[0],a=t[1];return(0,o.useEffect)((function(){var t;a(null!==(t=null==e?void 0:e.getStateControl().isDirty())&&void 0!==t&&t);var n=null==e?void 0:e.getStateControl().subscribe(a);return function(){null==e||e.getStateControl().unsubscribe(n)}}),[e]),n},t.useStateControlSubscription=function(e,t,n){void 0===n&&(n={throttle:0}),(0,o.useEffect)((function(){if(null==e?void 0:e.isReady){var r,o=null==e?void 0:e.getStateControl().subscribe((function(e){n.throttle<=0?t(e):(r&&clearTimeout(r),r=window.setTimeout((function(){t(e)}),n.throttle))}));return function(){if(o)return null==e?void 0:e.getStateControl().unsubscribe(o)}}}),[e,t,n.throttle])}},63475:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),o(n(94387),t)},22900:function(e,t,n){"use strict";var r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0)&&!(r=a.next()).done;)i.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=a.return)&&n.call(a)}finally{if(o)throw o.error}}return i};Object.defineProperty(t,"__esModule",{value:!0}),t.EditorEnvelopeView=t.EditorEnvelopeViewRef=void 0;var a=n(74848),i=n(96540),l=n(24601),c=n(24901),f=n(96540);t.EditorEnvelopeViewRef=function(e,t){var n=o((0,f.useState)(void 0),2),i=n[0],s=n[1],u=o((0,f.useState)(!0),2),p=u[0],d=u[1];return(0,f.useImperativeHandle)(t,(function(){return{getEditor:function(){return i},setEditor:function(e){return s(e)},setLoading:function(){return d(!0)},setLoadingFinished:function(){return d(!1)},setLocale:function(t){return e.setLocale(t)}}}),[e,i]),(0,a.jsxs)(a.Fragment,{children:[!p&&e.showKeyBindingsOverlay&&(0,a.jsx)(c.KeyBindingsHelpOverlay,{}),(0,a.jsx)(l.LoadingScreen,{loading:p}),(0,a.jsx)("div",r({style:{position:"absolute",width:"100vw",height:"100vh",top:"0",left:"0"}},{children:i&&i.af_isReact&&i.af_componentRoot()}))]})},t.EditorEnvelopeView=i.forwardRef(t.EditorEnvelopeViewRef)},70503:function(e,t,n){"use strict";var r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0)&&!(r=a.next()).done;)i.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=a.return)&&n.call(a)}finally{if(o)throw o.error}}return i};Object.defineProperty(t,"__esModule",{value:!0}),t.KeyBindingsHelpOverlay=void 0;var l=n(74848),c=n(96540),f=n(96540),s=n(12408),u=n(22568),p=n(8778),d=n(50091),A=n(65766),m=n(47103);function b(e,t){return t===d.OperatingSystem.MACOS?e.replace("ctrl","cmd"):e}t.KeyBindingsHelpOverlay=function(){var e=this,t=i((0,f.useState)(!1),2),n=t[0],d=t[1],v=(0,A.useKogitoEditorEnvelopeContext)(),g=(0,m.useEditorEnvelopeI18nContext)().i18n,h=(0,f.useCallback)((function(){d(!n)}),[n]),y=(0,f.useMemo)((function(){return(e=v.services.keyboardShortcuts.registered(),t="combination",e.filter((function(e,n,r){return r.map((function(e){return e[t]})).indexOf(e[t])===n}))).filter((function(e){var t;return!(null===(t=e.opts)||void 0===t?void 0:t.hidden)})).map((function(e){var t,n;return{combination:b(e.combination,v.operatingSystem),category:null===(t=e.label.split("|")[0])||void 0===t?void 0:t.trim(),label:null===(n=e.label.split("|")[1])||void 0===n?void 0:n.trim()}})).reduce((function(e,t){return e.has(t.category)?e.get(t.category).add({label:t.label,combination:t.combination}):e.set(t.category,new Set([{label:t.label,combination:t.combination}])),e}),new Map);var e,t}),[v.services.keyboardShortcuts.registered()]);return(0,f.useEffect)((function(){var t=v.services.keyboardShortcuts.registerKeyPress("shift+/","".concat(g.keyBindingsHelpOverlay.categories.help," | ").concat(g.keyBindingsHelpOverlay.commands.showKeyboardOverlay),(function(){return o(e,void 0,void 0,(function(){return a(this,(function(e){return[2,d(!0)]}))}))}),{element:window});return function(){return v.services.keyboardShortcuts.deregister(t)}}),[g]),(0,f.useEffect)((function(){if(n){var t=v.services.keyboardShortcuts.registerKeyPressOnce("esc",(function(){return o(e,void 0,void 0,(function(){return a(this,(function(e){return[2,d(!1)]}))}))}),{element:window});return function(){return v.services.keyboardShortcuts.deregister(t)}}}),[n]),(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("div",r({onClick:function(){return d(!n)},className:"kie-tools--keyboard-shortcuts kie-tools--keyboard-shortcuts-icon","data-ouia-component-id":"keyboard-shortcuts-icon","data-testid":"keyboard-shortcuts-help-overlay-icon"},{children:(0,l.jsx)(p.KeyboardIcon,{})})),(0,l.jsx)(u.Modal,r({appendTo:document.body,title:g.keyBindingsHelpOverlay.title,isOpen:n,width:"60%",onClose:h,"data-testid":"keyboard-shortcuts-help-overlay",className:"kie-tools--keyboard-shortcuts"},{children:(0,l.jsx)(s.TextContent,{children:(0,l.jsx)(s.TextList,r({component:s.TextListVariants.dl},{children:Array.from(y.keys()).map((function(e){return(0,l.jsxs)(c.Fragment,{children:[(0,l.jsx)(s.Text,r({component:s.TextVariants.h2},{children:e})),Array.from(y.get(e)).map((function(e){return(0,l.jsxs)(c.Fragment,{children:[(0,l.jsx)(s.TextListItem,r({component:s.TextListItemVariants.dt},{children:(t=e.combination,t.split("+").map((function(e){return e.replace(/^\w/,(function(e){return e.toUpperCase()}))})).join(" + "))})),(0,l.jsx)(s.TextListItem,r({component:s.TextListItemVariants.dd},{children:e.label}))]},e.combination);var t}))]},e)}))}))})}))]})}},24901:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),n(58541),o(n(70503),t)},11222:function(e,t,n){"use strict";var r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0)&&!(r=a.next()).done;)i.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=a.return)&&n.call(a)}finally{if(o)throw o.error}}return i};Object.defineProperty(t,"__esModule",{value:!0}),t.LoadingScreen=void 0;var a=n(74848),i=n(96540),l=n(20444),c=n(38547),f=n(2089),s=n(47103);t.LoadingScreen=function(e){var t=o((0,i.useState)(!0),2),n=t[0],u=t[1],p=(0,s.useEditorEnvelopeI18nContext)().i18n,d=(0,i.useCallback)((function(e){e.preventDefault(),e.stopPropagation(),u(!1)}),[]),A=(0,i.useMemo)((function(){return e.loading?"":"loading-finished"}),[e.loading]);return(0,i.useLayoutEffect)((function(){e.loading&&u(!0)}),[e.loading]),n&&(0,a.jsx)("div",r({id:"loading-screen",className:"kie-tools--loading-screen"},{children:(0,a.jsx)("div",r({className:"kie-tools--loading-screen ".concat(A),onAnimationEnd:d,"data-testid":"loading-screen-div"},{children:(0,a.jsx)(f.Bullseye,{children:(0,a.jsxs)("div",r({className:"kie-tools--loading-screen-spinner"},{children:[(0,a.jsx)("div",{children:(0,a.jsx)(l.Spinner,{})}),(0,a.jsx)(c.Title,r({headingLevel:"h5"},{children:p.loadingScreen.loading}))]}))})}))}))||(0,a.jsx)(a.Fragment,{})}},24601:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),n(58541),o(n(48973),t)},72690:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},47103:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),o(n(72690),t),o(n(49370),t)},68672:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.de=void 0,t.de={keyBindingsHelpOverlay:{title:"Tastenkombinationen",categories:{edit:"Editieren",help:"Hilfe"},commands:{undo:"Letzte Änderung rückgängig machen",redo:"Letzte Änderung wiederholen",showKeyboardOverlay:"Tastenkombinationen anzeigen"}},loadingScreen:{loading:"Laden..."}}},71704:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.en=void 0,t.en={keyBindingsHelpOverlay:{title:"Keyboard shortcuts",categories:{edit:"Edit",help:"Help"},commands:{undo:"Undo last edit",redo:"Redo last edit",showKeyboardOverlay:"Show keyboard shortcuts"}},loadingScreen:{loading:"Loading..."}}},55731:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.de=t.en=void 0;var r=n(71704);Object.defineProperty(t,"en",{enumerable:!0,get:function(){return r.en}});var o=n(68672);Object.defineProperty(t,"de",{enumerable:!0,get:function(){return o.de}})},49370:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useEditorEnvelopeI18nContext=t.EditorEnvelopeI18nContext=t.editorEnvelopeI18nDictionaries=t.editorEnvelopeI18nDefaults=void 0;var r=n(96540),o=n(96540),a=n(55731),i=n(55731);t.editorEnvelopeI18nDefaults={locale:"en",dictionary:a.en},t.editorEnvelopeI18nDictionaries=new Map([["en",a.en],["de",i.de]]),t.EditorEnvelopeI18nContext=r.createContext({}),t.useEditorEnvelopeI18nContext=function(){return(0,o.useContext)(t.EditorEnvelopeI18nContext)}},30282:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),t.initCustom=t.init=void 0,n(18175);var a=n(11222),i=n(77562),l=n(24060),c=n(17423),f=n(16154),s=n(50091);function u(e){var t,n=null!==(t=e.keyboardShortcutsService)&&void 0!==t?t:new l.DefaultKeyboardShortcutsService({os:(0,s.getOperatingSystem)()}),r=new c.I18nService,o=new f.Envelope(e.bus);return new a.KogitoEditorEnvelope(e.apiImplFactory,n,r,o).start(e.container)}t.init=function(e){u({container:e.container,bus:e.bus,apiImplFactory:{create:function(t){return new i.KogitoEditorEnvelopeApiImpl(t,e.editorFactory)}},keyboardShortcutsService:e.keyboardShortcutsService})},t.initCustom=u,o(n(77562),t),o(n(24601),t)},22455:(e,t,n)=>{var r=n(49818),o=n(8505);e.exports=function(e){if(!e)return[];"{}"===e.substr(0,2)&&(e="\\{\\}"+e.substr(2));return v(function(e){return e.split("\\\\").join(a).split("\\{").join(i).split("\\}").join(l).split("\\,").join(c).split("\\.").join(f)}(e),!0).map(u)};var a="\0SLASH"+Math.random()+"\0",i="\0OPEN"+Math.random()+"\0",l="\0CLOSE"+Math.random()+"\0",c="\0COMMA"+Math.random()+"\0",f="\0PERIOD"+Math.random()+"\0";function s(e){return parseInt(e,10)==e?parseInt(e,10):e.charCodeAt(0)}function u(e){return e.split(a).join("\\").split(i).join("{").split(l).join("}").split(c).join(",").split(f).join(".")}function p(e){if(!e)return[""];var t=[],n=o("{","}",e);if(!n)return e.split(",");var r=n.pre,a=n.body,i=n.post,l=r.split(",");l[l.length-1]+="{"+a+"}";var c=p(i);return i.length&&(l[l.length-1]+=c.shift(),l.push.apply(l,c)),t.push.apply(t,l),t}function d(e){return"{"+e+"}"}function A(e){return/^-?0\d/.test(e)}function m(e,t){return e<=t}function b(e,t){return e>=t}function v(e,t){var n=[],a=o("{","}",e);if(!a||/\$$/.test(a.pre))return[e];var i,c=/^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(a.body),f=/^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(a.body),u=c||f,g=a.body.indexOf(",")>=0;if(!u&&!g)return a.post.match(/,.*\}/)?v(e=a.pre+"{"+a.body+l+a.post):[e];if(u)i=a.body.split(/\.\./);else if(1===(i=p(a.body)).length&&1===(i=v(i[0],!1).map(d)).length)return(w=a.post.length?v(a.post,!1):[""]).map((function(e){return a.pre+i[0]+e}));var h,y=a.pre,w=a.post.length?v(a.post,!1):[""];if(u){var Z=s(i[0]),x=s(i[1]),q=Math.max(i[0].length,i[1].length),W=3==i.length?Math.abs(s(i[2])):1,V=m;x0){var z=new Array(k+1).join("0");O=E<0?"-"+z+O.slice(1):z+O}}h.push(O)}}else h=r(i,(function(e){return v(e,!1)}));for(var P=0;P{var r=n(4364);e.exports=d,d.Minimatch=A;var o=function(){try{return n(57975)}catch(e){}}()||{sep:"/"};d.sep=o.sep;var a=d.GLOBSTAR=A.GLOBSTAR={},i=n(22455),l={"!":{open:"(?:(?!(?:",close:"))[^/]*?)"},"?":{open:"(?:",close:")?"},"+":{open:"(?:",close:")+"},"*":{open:"(?:",close:")*"},"@":{open:"(?:",close:")"}},c="[^/]",f=c+"*?",s="().*{}+?[]^$\\!".split("").reduce((function(e,t){return e[t]=!0,e}),{});var u=/\/+/;function p(e,t){t=t||{};var n={};return Object.keys(e).forEach((function(t){n[t]=e[t]})),Object.keys(t).forEach((function(e){n[e]=t[e]})),n}function d(e,t,n){return b(t),n||(n={}),!(!n.nocomment&&"#"===t.charAt(0))&&new A(t,n).match(e)}function A(e,t){if(!(this instanceof A))return new A(e,t);b(e),t||(t={}),e=e.trim(),t.allowWindowsEscape||"/"===o.sep||(e=e.split(o.sep).join("/")),this.options=t,this.set=[],this.pattern=e,this.regexp=null,this.negate=!1,this.comment=!1,this.empty=!1,this.partial=!!t.partial,this.make()}function m(e,t){return t||(t=this instanceof A?this.options:{}),e=void 0===e?this.pattern:e,b(e),t.nobrace||!/\{(?:(?!\{).)*\}/.test(e)?[e]:i(e)}d.filter=function(e,t){return t=t||{},function(n,r,o){return d(n,e,t)}},d.defaults=function(e){if(!e||"object"!=typeof e||!Object.keys(e).length)return d;var t=d,n=function(n,r,o){return t(n,r,p(e,o))};return(n.Minimatch=function(n,r){return new t.Minimatch(n,p(e,r))}).defaults=function(n){return t.defaults(p(e,n)).Minimatch},n.filter=function(n,r){return t.filter(n,p(e,r))},n.defaults=function(n){return t.defaults(p(e,n))},n.makeRe=function(n,r){return t.makeRe(n,p(e,r))},n.braceExpand=function(n,r){return t.braceExpand(n,p(e,r))},n.match=function(n,r,o){return t.match(n,r,p(e,o))},n},A.defaults=function(e){return d.defaults(e).Minimatch},A.prototype.debug=function(){},A.prototype.make=function(){var e=this.pattern,t=this.options;if(!t.nocomment&&"#"===e.charAt(0))return void(this.comment=!0);if(!e)return void(this.empty=!0);this.parseNegate();var n=this.globSet=this.braceExpand();t.debug&&(this.debug=function(){r.error.apply(r,arguments)});this.debug(this.pattern,n),n=this.globParts=n.map((function(e){return e.split(u)})),this.debug(this.pattern,n),n=n.map((function(e,t,n){return e.map(this.parse,this)}),this),this.debug(this.pattern,n),n=n.filter((function(e){return-1===e.indexOf(!1)})),this.debug(this.pattern,n),this.set=n},A.prototype.parseNegate=function(){var e=this.pattern,t=!1,n=this.options,r=0;if(n.nonegate)return;for(var o=0,a=e.length;o65536)throw new TypeError("pattern is too long")};A.prototype.parse=function(e,t){b(e);var n=this.options;if("**"===e){if(!n.noglobstar)return a;e="*"}if(""===e)return"";var r,o="",i=!!n.nocase,u=!1,p=[],d=[],A=!1,m=-1,g=-1,h="."===e.charAt(0)?"":n.dot?"(?!(?:^|\\/)\\.{1,2}(?:$|\\/))":"(?!\\.)",y=this;function w(){if(r){switch(r){case"*":o+=f,i=!0;break;case"?":o+=c,i=!0;break;default:o+="\\"+r}y.debug("clearStateChar %j %j",r,o),r=!1}}for(var Z,x=0,q=e.length;x-1;z--){var P=d[z],B=o.slice(0,P.reStart),S=o.slice(P.reStart,P.reEnd-8),M=o.slice(P.reEnd-8,P.reEnd),N=o.slice(P.reEnd);M+=N;var j=B.split("(").length-1,C=N;for(x=0;x=0&&!(r=e[a]);a--);for(a=0;a>> no match, partial?",e,p,t,d),p!==l))}if("string"==typeof s?(f=u===s,this.debug("string match",s,u,f)):(f=u.match(s),this.debug("pattern match",s,u,f)),!f)return!1}if(o===l&&i===c)return!0;if(o===l)return n;if(i===c)return o===l-1&&""===e[o];throw new Error("wtf?")}},53520:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.EnvelopeBusMessageDirectSender=t.EnvelopeBusMessagePurpose=void 0,function(e){e.REQUEST="request",e.RESPONSE="response",e.NOTIFICATION_SUBSCRIPTION="subscription",e.NOTIFICATION_UNSUBSCRIPTION="unsubscription",e.NOTIFICATION="notification",e.SHARED_VALUE_GET_DEFAULT="shared-value-get-default",e.SHARED_VALUE_UPDATE="shared-value-update"}(t.EnvelopeBusMessagePurpose||(t.EnvelopeBusMessagePurpose={})),function(e){e.ENVELOPE_CLIENT="envelopeClient",e.ENVELOPE_SERVER="envelopeServer"}(t.EnvelopeBusMessageDirectSender||(t.EnvelopeBusMessageDirectSender={}))},87208:function(e,t,n){"use strict";var r=n(4364),o=this&&this.__assign||function(){return o=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0)&&!(r=a.next()).done;)i.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=a.return)&&n.call(a)}finally{if(o)throw o.error}}return i},a=this&&this.__spreadArray||function(e,t,n){if(n||2===arguments.length)for(var r,o=0,a=t.length;o=0&&this.remoteNotificationsSubscriptions.splice(u,1)}else{var s=e.type;this.remoteNotificationsSubscriptions.indexOf(s)<0&&this.remoteNotificationsSubscriptions.push(s)}else{null===(n=t[s=e.type])||void 0===n||n.apply(t,e.data),this.remoteNotificationsSubscriptions.indexOf(s)>=0&&this.send({type:s,purpose:i.EnvelopeBusMessagePurpose.NOTIFICATION,data:e.data});var p=e.type;null===(l=this.localNotificationsSubscriptions.get(p))||void 0===l||l.forEach((function(t){t.apply(void 0,a([],o(e.data),!1))}))}else{var d=e,A=void 0;try{var m=t[d.type];if(void 0===m)return void r.warn("API '".concat(String(d.type),"' was not found. Request will be ignored."));A=m.apply(t,d.data)}catch(e){return r.error(e),void this.respond(d,void 0,e)}if(!(A instanceof Promise))throw new Error("Cannot make a request to '".concat(String(d.type),"' because it does not return a Promise"));A.then((function(e){c.respond(d,e)})).catch((function(e){r.error(e),c.respond(d,void 0,e)}))}else this.callback(e)},e.prototype.getNextRequestId=function(){return"".concat(this.name,"_").concat(this.requestIdCounter++)},e}();function c(e,t){return new Proxy({},{set:function(t,n,r){return e.set(n,r),!0},get:function(n,r){var o,a;return null!==(o=e.get(r))&&void 0!==o?o:e.set(r,null===(a=t.get)||void 0===a?void 0:a.call(t,n,r)).get(r)}})}t.EnvelopeBusMessageManager=l},15641:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),o(n(18421),t)},54669:function(e,t,n){"use strict";var r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0)&&!(r=a.next()).done;)i.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=a.return)&&n.call(a)}finally{if(o)throw o.error}}return i},o=this&&this.__spreadArray||function(e,t,n){if(n||2===arguments.length)for(var r,o=0,a=t.length;o0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},10474:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ContainerType=void 0,function(e){e.DIV="div",e.IFRAME="iframe"}(t.ContainerType||(t.ContainerType={}))},45449:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),o(n(10474),t)},16154:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),o(n(36732),t),o(n(78934),t)},35842:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},12998:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.I18n=void 0;var r=n(25692),o=function(){function e(e,t,n){void 0===n&&(n=e.locale),this.defaults=e,this.dictionaries=t,this.initialLocale=n,this.locale=n,this.updateDictionary()}return e.prototype.setLocale=function(e){return this.locale=e,this.updateDictionary(),this},e.prototype.updateDictionary=function(){var e,t,n=null!==(t=null!==(e=this.dictionaries.get(this.locale))&&void 0!==e?e:this.dictionaries.get(this.locale.split("-").shift()))&&void 0!==t?t:{};return this.dictionary=(0,r.immutableDeepMerge)(this.defaults.dictionary,n),this},e.prototype.getCurrent=function(){return this.dictionary},e.prototype.getLocale=function(){return this.locale},e}();t.I18n=o},99109:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.wrapped=void 0,t.wrapped=function(e){return{name:e}}},25692:(e,t)=>{"use strict";function n(e,t){return Object.keys(t).forEach((function(o){var a=t[o];a&&(e[o]="string"==typeof a||"function"==typeof a?a:n(r(e[o]),a))})),e}function r(e){return Object.assign({},e)}Object.defineProperty(t,"__esModule",{value:!0}),t.immutableDeepMerge=void 0,t.immutableDeepMerge=function(e,t){return n(r(e),t)}},15532:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),o(n(12998),t),o(n(35842),t),o(n(99109),t)},75552:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.I18nService=void 0;var n=function(){function e(e){void 0===e&&(e=[]),this.onLocaleChangeSubscriptions=e}return e.prototype.executeOnLocaleChangeSubscriptions=function(e){this.onLocaleChangeSubscriptions.forEach((function(t){null==t||t(e)}))},e.prototype.subscribeToLocaleChange=function(e){return this.onLocaleChangeSubscriptions.push(e),e},e.prototype.unsubscribeToLocaleChange=function(e){var t=this.onLocaleChangeSubscriptions.indexOf(e);t>-1&&this.onLocaleChangeSubscriptions.splice(t,1)},e}();t.I18nService=n},17423:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),o(n(75552),t)},97910:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},92256:function(e,t,n){"use strict";var r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0)&&!(r=a.next()).done;)i.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=a.return)&&n.call(a)}finally{if(o)throw o.error}}return i};Object.defineProperty(t,"__esModule",{value:!0}),t.I18nDictionariesProvider=void 0;var a=n(74848),i=n(96540),l=n(15532);t.I18nDictionariesProvider=function(e){var t,n=o((0,i.useState)(null!==(t=e.initialLocale)&&void 0!==t?t:e.defaults.locale),2),c=n[0],f=n[1],s=(0,i.useMemo)((function(){return new l.I18n(e.defaults,e.dictionaries,c)}),[c,e.defaults,e.dictionaries]),u=(0,i.useCallback)((function(e){s.setLocale(e),f(e)}),[s]),p=(0,i.useMemo)((function(){return{locale:c,setLocale:u,i18n:s.getCurrent()}}),[s,c,u]);return(0,a.jsx)(e.ctx.Provider,r({value:p},{children:e.children}))}},17244:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.I18nHtml=void 0;var r=n(74848);t.I18nHtml=function(e){var t=e.children;return Array.isArray(t)&&(t=t.join("")),(0,r.jsx)("p",{style:{display:"inline"},dangerouslySetInnerHTML:{__html:t}})}},3136:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.I18nWrapped=void 0;var r=n(74848);t.I18nWrapped=function(e){return(0,r.jsx)(r.Fragment,{children:Object.values(e.children).map((function(t){var n;return"string"==typeof t||"number"==typeof t?t:null===(n=e.components)||void 0===n?void 0:n[t.name]}))})}},26209:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),o(n(97910),t),o(n(92256),t),o(n(17244),t),o(n(3136),t)},67314:function(e,t,n){"use strict";var r=n(4364),o=this&&this.__assign||function(){return o=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(t,"__esModule",{value:!0}),t.DefaultKeyboardShortcutsService=t.ModKeys=void 0;var c,f=n(50091);!function(e){e.CTRL="ctrl",e.META="meta",e.ALT="alt",e.SHIFT="shift"}(c=t.ModKeys||(t.ModKeys={}));var s=new Map([["AltLeft","alt"],["AltRight","alt"],["CtrlLeft","ctrl"],["CtrlRight","ctrl"],["MetaLeft","meta"],["MetaRight","meta"],["ShiftLeft","shift"],["ShiftRight","shift"]]),u=new Map([["/","Slash"],["esc","Escape"],["delete","Delete"],["backspace","Backspace"],["right","ArrowRight"],["left","ArrowLeft"],["up","ArrowUp"],["down","ArrowDown"],["a","KeyA"],["b","KeyB"],["c","KeyC"],["d","KeyD"],["e","KeyE"],["f","KeyF"],["g","KeyG"],["h","KeyH"],["i","KeyI"],["j","KeyJ"],["k","KeyK"],["l","KeyL"],["m","KeyM"],["n","KeyN"],["o","KeyO"],["p","KeyP"],["q","KeyQ"],["r","KeyR"],["s","KeyS"],["t","KeyT"],["u","KeyU"],["v","KeyV"],["w","KeyW"],["x","KeyX"],["y","KeyY"],["z","KeyZ"]]),p=["INPUT","TEXTAREA","SELECT","OPTION"],d=function(){function e(e){this.args=e,this.eventIdentifiers=1,this.keyBindings=new Map}return e.prototype.registerKeyDownThenUp=function(e,t,n,o,a){var i=this;r.debug("Registering shortcut (down/up) for ".concat(e," - ").concat(t,": ").concat(null==a?void 0:a.repeat));var l={combination:e,label:t,listener:function(t){var l,c=A(e,t,a);if(!c)return!0;if("keydown"===c.type){if(m(i.combinationKeySet(e),i.pressedKeySet(c)))return r.debug("Fired (down) [".concat(e,"]!")),n(c.target),!1}else if("keyup"===c.type&&(i.combinationKeySet(e).has(null!==(l=s.get(c.code))&&void 0!==l?l:"")||i.combinationKeySet(e).has(c.code)))return r.debug("Fired (up) [".concat(e,"]!")),o(c.target),!1;return!0},opts:a};return this.keyBindings.set(this.eventIdentifiers,l),this.keyBindingElement(l).addEventListener("keydown",l.listener),this.keyBindingElement(l).addEventListener("keyup",l.listener),this.eventIdentifiers++},e.prototype.registerKeyPress=function(e,t,n,o){var a=this;r.debug("Registering shortcut (press) for ".concat(e," - ").concat(t,": ").concat(null==o?void 0:o.repeat));var i={combination:e,label:t,listener:function(t){var i=A(e,t,o);return!i||(!m(a.combinationKeySet(e),a.pressedKeySet(i))||(r.debug("Fired (press) [".concat(e,"]!")),n(i.target),!1))},opts:o};return this.keyBindings.set(this.eventIdentifiers,i),this.keyBindingElement(i).addEventListener("keydown",i.listener),this.eventIdentifiers++},e.prototype.registerKeyPressOnce=function(e,t,n){var r=this,l=this.registerKeyPress(e,"",(function(e){return a(r,void 0,void 0,(function(){return i(this,(function(n){return t(e),this.deregister(l),[2]}))}))}),n?o(o({},n),{hidden:!0}):n);return l},e.prototype.deregister=function(e){var t=this.keyBindings.get(e);t?(this.keyBindingElement(t).removeEventListener("keypress",null==t?void 0:t.listener),this.keyBindingElement(t).removeEventListener("keydown",null==t?void 0:t.listener),this.keyBindingElement(t).removeEventListener("keyup",null==t?void 0:t.listener),this.keyBindings.delete(e)):r.error("Unable to de-register keyboard shortcut with id ".concat(e," because it was not registered."))},e.prototype.keyBindingElement=function(e){var t,n;return null!==(n=null===(t=null==e?void 0:e.opts)||void 0===t?void 0:t.element)&&void 0!==n?n:window},e.prototype.combinationKeySet=function(e){var t=e.split("+").map((function(e){return e.toLowerCase()})).map((function(e){var t;return null!==(t=u.get(e))&&void 0!==t?t:e}));return this.args.os===f.OperatingSystem.MACOS?new Set(t.map((function(e){return e===c.CTRL?c.META:e}))):new Set(t)},e.prototype.pressedKeySet=function(e){var t=new Set;return e.ctrlKey&&t.add(c.CTRL),e.metaKey&&t.add(c.META),e.altKey&&t.add(c.ALT),e.shiftKey&&t.add(c.SHIFT),-1===Array.from(s.keys()).indexOf(e.code)&&t.add(e.code),t},e.prototype.registered=function(){return Array.from(this.keyBindings.values())},e.prototype.isEnabled=function(){return!0},e}();function A(e,t,n){if(t instanceof CustomEvent&&p.includes(t.detail.channelOriginalTargetTagName))return r.debug("Ignoring execution (".concat(e,") because target is ").concat(t.detail.channelOriginalTargetTagName)),null;var o=t instanceof CustomEvent?new KeyboardEvent(t.detail.type,t.detail):t;return o.target instanceof Element&&p.includes(o.target.tagName)?(r.debug("Ignoring execution (".concat(e,") because target is ").concat(o.target.tagName)),null):o.repeat&&!(null==n?void 0:n.repeat)?null:o}function m(e,t){var n,r;if(e.size!==t.size)return!1;try{for(var o=l(e),a=o.next();!a.done;a=o.next()){var i=a.value;if(!t.has(i))return!1}}catch(e){n={error:e}}finally{try{a&&!a.done&&(r=o.return)&&r.call(o)}finally{if(n)throw n.error}}return!0}t.DefaultKeyboardShortcutsService=d},69978:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},35073:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},9129:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.NoOpKeyboardShortcutsService=void 0;var n=function(){function e(){}return e.prototype.registerKeyDownThenUp=function(e,t,n,r,o){return 0},e.prototype.registerKeyPress=function(e,t,n,r){return 0},e.prototype.registerKeyPressOnce=function(e,t,n){return 0},e.prototype.deregister=function(e){},e.prototype.registered=function(){return[]},e.prototype.isEnabled=function(){return!1},e}();t.NoOpKeyboardShortcutsService=n},24060:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),o(n(67314),t),o(n(69978),t),o(n(35073),t),o(n(9129),t)},5745:(e,t)=>{"use strict";var n;Object.defineProperty(t,"__esModule",{value:!0}),t.getOperatingSystem=t.OperatingSystem=void 0,function(e){e.MACOS="MACOS",e.WINDOWS="WINDOWS",e.LINUX="LINUX"}(n=t.OperatingSystem||(t.OperatingSystem={})),t.getOperatingSystem=function(){return-1!==navigator.appVersion.indexOf("Win")?n.WINDOWS:-1!==navigator.appVersion.indexOf("Mac")?n.MACOS:-1!==navigator.appVersion.indexOf("X11")||-1!==navigator.appVersion.indexOf("Linux")?n.LINUX:void 0}},50091:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),o(n(5745),t)},47437:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ContentType=void 0,function(e){e.TEXT="text",e.BINARY="binary"}(t.ContentType||(t.ContentType={}))},19773:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ResourceContent=void 0;var r=n(47437),o=function(e,t,n){this.path=e,this.content=t,this.type=n||r.ContentType.TEXT};t.ResourceContent=o},79107:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},70764:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},39530:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},36714:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},86521:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},20529:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ResourcesList=void 0;var n=function(e,t){this.pattern=e,this.paths=t};t.ResourcesList=n},30754:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SearchType=void 0,function(e){e.TRAVERSAL="traversal",e.ASSET_FOLDER="asset-folder"}(t.SearchType||(t.SearchType={}))},55024:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},59301:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorkspaceEdit=void 0;var n=function(e){this.id=e};t.WorkspaceEdit=n},57632:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),o(n(55024),t),o(n(79107),t),o(n(36714),t),o(n(30754),t),o(n(70764),t),o(n(39530),t),o(n(59301),t),o(n(20529),t),o(n(86521),t),o(n(19773),t),o(n(47437),t)},51579:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.NoOpSwfServiceCatalogChannelApiImpl=void 0;var n=function(){function e(){}return e.prototype.kogitoSwfServiceCatalog_services=function(){return{defaultValue:[]}},e.prototype.kogitoSwfServiceCatalog_serviceRegistriesSettings=function(){return{defaultValue:{registries:[]}}},e.prototype.kogitoSwfServiceCatalog_refresh=function(){},e.prototype.kogitoSwfServiceCatalog_importFunctionFromCompletionItem=function(e){},e.prototype.kogitoSwfServiceCatalog_importEventFromCompletionItem=function(e){},e.prototype.kogitoSwfServiceCatalog_logInServiceRegistries=function(){},e.prototype.kogitoSwfServiceCatalog_setupServiceRegistriesSettings=function(){},e}();t.NoOpSwfServiceCatalogChannelApiImpl=n},42445:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.NoOpSwfStaticEnvelopeContentProviderChannelApiImpl=void 0;var n=function(){function e(){}return e.prototype.kogitoSwfGetDiagramEditorEnvelopeContent=function(){return{defaultValue:""}},e.prototype.kogitoSwfGetTextEditorEnvelopeContent=function(){return{defaultValue:""}},e}();t.NoOpSwfStaticEnvelopeContentProviderChannelApiImpl=n},78468:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ServerlessWorkflowDiagramEditorChannelApiImpl=void 0;var n=function(){function e(e){this.args=e}return e.prototype.kogitoEditor_contentRequest=function(){return this.args.defaultApiImpl.kogitoEditor_contentRequest()},e.prototype.kogitoEditor_ready=function(){this.args.defaultApiImpl.kogitoEditor_ready()},e.prototype.kogitoEditor_setContentError=function(e){this.args.defaultApiImpl.kogitoEditor_setContentError(e)},e.prototype.kogitoEditor_stateControlCommandUpdate=function(e){this.args.defaultApiImpl.kogitoEditor_stateControlCommandUpdate(e)},e.prototype.kogitoI18n_getLocale=function(){return this.args.defaultApiImpl.kogitoI18n_getLocale()},e.prototype.kogitoNotifications_createNotification=function(e){this.args.defaultApiImpl.kogitoNotifications_createNotification(e)},e.prototype.kogitoNotifications_removeNotifications=function(e){this.args.defaultApiImpl.kogitoNotifications_removeNotifications(e)},e.prototype.kogitoNotifications_setNotifications=function(e,t){this.args.defaultApiImpl.kogitoNotifications_setNotifications(e,t)},e.prototype.kogitoWorkspace_newEdit=function(e){this.args.defaultApiImpl.kogitoWorkspace_newEdit(e)},e.prototype.kogitoWorkspace_openFile=function(e){this.args.defaultApiImpl.kogitoWorkspace_openFile(e)},e.prototype.kogitoWorkspace_resourceContentRequest=function(e){return this.args.defaultApiImpl.kogitoWorkspace_resourceContentRequest(e)},e.prototype.kogitoWorkspace_resourceListRequest=function(e){return this.args.defaultApiImpl.kogitoWorkspace_resourceListRequest(e)},e.prototype.kogitoEditor_theme=function(){return this.args.defaultApiImpl.kogitoEditor_theme()},e.prototype.kogitoSwfDiagramEditor__onNodeSelected=function(e){var t;return null===(t=this.args.textEditorEnvelopeApi)||void 0===t?void 0:t.notifications.kogitoSwfTextEditor__moveCursorToNode.send(e)},e.prototype.kogitoSwfDiagramEditor__setContentSuccess=function(){},e}();t.ServerlessWorkflowDiagramEditorChannelApiImpl=n},24726:function(e,t){"use strict";var n=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,a){function i(e){try{c(r.next(e))}catch(e){a(e)}}function l(e){try{c(r.throw(e))}catch(e){a(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(i,l)}c((r=r.apply(e,t||[])).next())}))},r=this&&this.__generator||function(e,t){var n,r,o,a,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:l(0),throw:l(1),return:l(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function l(a){return function(l){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;i;)try{if(n=1,r&&(o=2&a[0]?r.return:a[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,a[1])).done)return o;switch(r=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return i.label++,{value:a[1],done:!1};case 5:i.label++,r=a[1],a=[0];continue;case 7:a=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SwfPreviewOptionsChannelApiImpl=void 0;var n=function(){function e(e){this.swfPreviewOptions=e}return e.prototype.kogitoSwfPreviewOptions_get=function(){var e;return{defaultValue:null!==(e=this.swfPreviewOptions)&&void 0!==e?e:{defaultWidth:"50%",editorMode:"full"}}},e}();t.SwfPreviewOptionsChannelApiImpl=n},15951:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SwfServiceCatalogChannelApiImpl=void 0;var n=function(){function e(e){this.args=e}return e.prototype.kogitoSwfServiceCatalog_services=function(){return{defaultValue:this.args.services}},e.prototype.kogitoSwfServiceCatalog_serviceRegistriesSettings=function(){return{defaultValue:this.args.serviceRegistriesSettings}},e.prototype.kogitoSwfServiceCatalog_refresh=function(){this.args.channelApi.notifications.kogitoSwfServiceCatalog_refresh.send()},e.prototype.kogitoSwfServiceCatalog_importFunctionFromCompletionItem=function(e){this.args.channelApi.notifications.kogitoSwfServiceCatalog_importFunctionFromCompletionItem.send(e)},e.prototype.kogitoSwfServiceCatalog_importEventFromCompletionItem=function(e){this.args.channelApi.notifications.kogitoSwfServiceCatalog_importEventFromCompletionItem.send(e)},e.prototype.kogitoSwfServiceCatalog_logInServiceRegistries=function(){this.args.channelApi.notifications.kogitoSwfServiceCatalog_logInServiceRegistries.send()},e.prototype.kogitoSwfServiceCatalog_setupServiceRegistriesSettings=function(){this.args.channelApi.notifications.kogitoSwfServiceCatalog_setupServiceRegistriesSettings.send()},e}();t.SwfServiceCatalogChannelApiImpl=n},88201:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SwfStaticEnvelopeContentProviderChannelApiImpl=void 0;var n=function(){function e(e){this.args=e}return e.prototype.kogitoSwfGetDiagramEditorEnvelopeContent=function(){return{defaultValue:this.args.diagramEditorEnvelopeContent}},e.prototype.kogitoSwfGetTextEditorEnvelopeContent=function(){return{defaultValue:this.args.textEditorEnvelopeContent}},e}();t.SwfStaticEnvelopeContentProviderChannelApiImpl=n},114:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),o(n(39039),t),o(n(29722),t),o(n(15951),t),o(n(99927),t),o(n(42445),t),o(n(88201),t),o(n(51579),t)},12269:function(e,t,n){"use strict";var r=n(4364),o=this&&this.__assign||function(){return o=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0)&&!(r=a.next()).done;)i.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=a.return)&&n.call(a)}finally{if(o)throw o.error}}return i};Object.defineProperty(t,"__esModule",{value:!0}),t.ServerlessWorkflowCombinedEditor=void 0;var c=n(74848),f=n(65766),s=n(66668),u=n(30282),p=n(31212),d=n(5957),A=n(46122),m=n(57975),b=n(96540),v=n(76679),g=n(1707),h=n(45982);t.ServerlessWorkflowCombinedEditor=(0,b.forwardRef)((function(e,t){var n,y,w=e.onStateControlCommandUpdate,Z=e.onNewEdit,x=l((0,b.useState)(void 0),2),q=x[0],W=x[1],V=l((0,b.useState)(),2),T=V[0],E=V[1],O=l((0,b.useState)(),2),k=O[0],z=O[1],P=(0,f.useKogitoEditorEnvelopeContext)(),B=l((0,p.useSharedValue)(P.channelApi.shared.kogitoSwfGetDiagramEditorEnvelopeContent),1)[0],S=l((0,p.useSharedValue)(P.channelApi.shared.kogitoSwfGetTextEditorEnvelopeContent),1)[0],M=(0,s.useEditorRef)(),N=M.editor,j=M.editorRef,C=(0,s.useEditorRef)(),R=C.editor,I=C.editorRef,F=l((0,p.useSharedValue)(null===(n=P.channelApi)||void 0===n?void 0:n.shared.kogitoSwfPreviewOptions_get),1)[0],G=(0,b.useRef)(),U=l((0,b.useState)(!1),2),X=U[0],D=U[1],Y=l((0,b.useState)(!1),2),H=Y[0],L=Y[1],K=(0,b.useMemo)((function(){return e.channelType===f.ChannelType.VSCODE_DESKTOP||e.channelType===f.ChannelType.VSCODE_WEB}),[e.channelType]),J=(0,b.useMemo)((function(){return e.channelType===f.ChannelType.STANDALONE}),[e.channelType]),Q=(0,b.useMemo)((function(){return K?"vscode":window.location.origin}),[K]),_=(0,b.useMemo)((function(){return"diagram"===(null==F?void 0:F.editorMode)?H:"text"===(null==F?void 0:F.editorMode)?X:X&&H}),[H,X,F]),$=(0,b.useCallback)((function(e,t){return J?{type:f.EnvelopeContentType.CONTENT,content:e}:{type:f.EnvelopeContentType.PATH,path:t}}),[J]),ee=(0,b.useMemo)((function(){return new f.EditorEnvelopeLocator(Q,[new f.EnvelopeMapping({type:"swf",filePathGlob:"**/*.sw.+(json|yml|yaml)",resourcesPathPrefix:e.resourcesPathPrefix+"/text",envelopeContent:$(null!=S?S:"",e.resourcesPathPrefix+"/serverless-workflow-text-editor-envelope.html")})])}),[e.resourcesPathPrefix,Q,S,$]),te=(0,b.useMemo)((function(){return new f.EditorEnvelopeLocator(Q,[new f.EnvelopeMapping({type:"swf",filePathGlob:"**/*.sw.+(json|yml|yaml)",resourcesPathPrefix:e.resourcesPathPrefix+"/diagram",envelopeContent:$(null!=B?B:"",e.resourcesPathPrefix+"/serverless-workflow-diagram-editor-envelope.html")})])}),[e.resourcesPathPrefix,Q,B,$]),ne=(0,b.useMemo)((function(){return N&&N.getEnvelopeServer().envelopeApi}),[N]);(0,b.useImperativeHandle)(t,(function(){return{setContent:function(t,n){return a(void 0,void 0,void 0,(function(){var o,l,c,f,s;return i(this,(function(u){try{o=/\.sw\.(json|yml|yaml)$/.exec(t.toLowerCase()),l=o?o[0]:(0,m.extname)(t),c=l.slice(1),f=(0,m.basename)(t),s=function(){return a(void 0,void 0,void 0,(function(){return i(this,(function(e){return[2,n]}))}))},W({content:n,path:t}),E({path:t,getFileContents:s,isReadOnly:e.isReadOnly,fileExtension:c,fileName:f}),z({path:t,getFileContents:s,isReadOnly:!0,fileExtension:c,fileName:f})}catch(e){throw r.error(e),e}return[2]}))}))},getContent:function(){return a(void 0,void 0,void 0,(function(){var e;return i(this,(function(t){return[2,null!==(e=null==q?void 0:q.content)&&void 0!==e?e:""]}))}))},getPreview:function(){return a(void 0,void 0,void 0,(function(){var e;return i(this,(function(t){return[2,null!==(e=null==R?void 0:R.getPreview())&&void 0!==e?e:""]}))}))},undo:function(){return a(void 0,void 0,void 0,(function(){return i(this,(function(e){switch(e.label){case 0:return[4,Promise.all([null==N?void 0:N.undo(),null==R?void 0:R.undo()])];case 1:return e.sent(),[2]}}))}))},redo:function(){return a(void 0,void 0,void 0,(function(){return i(this,(function(e){switch(e.label){case 0:return[4,Promise.all([null==N?void 0:N.redo(),null==R?void 0:R.redo()])];case 1:return e.sent(),[2]}}))}))},validate:function(){return a(void 0,void 0,void 0,(function(){var e;return i(this,(function(t){return[2,null!==(e=null==N?void 0:N.validate())&&void 0!==e?e:[]]}))}))},setTheme:function(e){return a(void 0,void 0,void 0,(function(){return i(this,(function(t){switch(t.label){case 0:return[4,Promise.all([null==N?void 0:N.setTheme(e),null==R?void 0:R.setTheme(e)])];case 1:return t.sent(),[2]}}))}))},colorNodes:function(e,t,n){(0,h.colorNodes)(e,t,n)},moveCursorToPosition:function(e){null==ne||ne.notifications.kogitoSwfTextEditor__moveCursorToPosition.send(e)}}}),[R,q,e.isReadOnly,N,ne]),(0,s.useStateControlSubscription)(N,(0,b.useCallback)((function(e){return a(void 0,void 0,void 0,(function(){var e;return i(this,(function(t){switch(t.label){case 0:return N?[4,N.getContent()]:[2];case 1:return e=t.sent(),W((function(t){return o(o({},t),{content:e})})),[2]}}))}))}),[N])),(0,s.useStateControlSubscription)(R,(0,b.useCallback)((function(e){return a(void 0,void 0,void 0,(function(){var e;return i(this,(function(t){switch(t.label){case 0:return R?[4,R.getContent()]:[2];case 1:return e=t.sent(),W((function(t){return o(o({},t),{content:e})})),[2]}}))}))}),[R]));var re=(0,b.useCallback)((function(e){return a(void 0,void 0,void 0,(function(){return i(this,(function(t){switch(t.label){case 0:return N&&R?[4,R.setContent(e.path,e.content)]:[2];case 1:return t.sent(),[2]}}))}))}),[R,N]);(0,b.useEffect)((function(){void 0!==(null==q?void 0:q.content)&&q.content!==G.current&&(G.current=q.content,re(q))}),[q,e,re]);var oe=(0,b.useCallback)((function(){D(!0)}),[]),ae=(0,b.useCallback)((function(){r.error("Error setting content on text editor")}),[]),ie=(0,b.useCallback)((function(){L(!0)}),[]),le=(0,b.useCallback)((function(){r.error("Error setting content on diagram editor")}),[]),ce=(0,b.useMemo)((function(){return{channelApi:P.channelApi,locale:e.locale,embeddedEditorFile:k,onEditorReady:ie,swfTextEditorEnvelopeApi:null==N?void 0:N.getEnvelopeServer().envelopeApi}}),[P,k,ie,N,e.locale]),fe=(0,b.useCallback)((function(e){Z(e)}),[Z]),se=(0,b.useCallback)((function(e){switch(e){case f.StateControlCommand.UNDO:w(f.StateControlCommand.UNDO);break;case f.StateControlCommand.REDO:w(f.StateControlCommand.REDO);break;default:r.info("Unknown message type received: ".concat(e))}}),[w]),ue=(0,b.useMemo)((function(){return{apiOverrides:{kogitoWorkspace_newEdit:fe,kogitoEditor_stateControlCommandUpdate:se,kogitoEditor_ready:oe,kogitoEditor_setContentError:ae},channelApi:P.channelApi,locale:e.locale,embeddedEditorFile:T,swfDiagramEditorEnvelopeApi:null==R?void 0:R.getEnvelopeServer().envelopeApi}}),[fe,se,oe,ae,P.channelApi,e.locale,T,R]),pe=(0,v.useSwfDiagramEditorChannelApi)(ce),de=pe.stateControl,Ae=pe.channelApi,me=(0,g.useSwfTextEditorChannelApi)(ue),be=me.stateControl,ve=me.channelApi,ge=function(){return T&&(0,c.jsx)(s.EmbeddedEditor,{ref:j,file:T,channelType:e.channelType,editorEnvelopeLocator:ee,locale:e.locale,customChannelApiImpl:ve,stateControl:be,isReady:X})},he=function(){return k&&(0,c.jsx)(s.EmbeddedEditor,{ref:I,file:k,channelType:e.channelType,kogitoEditor_ready:ie,kogitoEditor_setContentError:le,editorEnvelopeLocator:te,locale:e.locale,customChannelApiImpl:Ae,stateControl:de})};return window.editor=(0,b.useMemo)((function(){return new d.SwfStunnerEditor(null==R?void 0:R.getEnvelopeServer().envelopeApi)}),[R]),(0,b.useEffect)((function(){_&&P.channelApi.notifications.kogitoSwfCombinedEditor_combinedEditorReady.send()}),[P,_]),(0,c.jsxs)("div",o({style:{height:"100%"}},{children:[(0,c.jsx)(u.LoadingScreen,{loading:!_}),"diagram"===(null==F?void 0:F.editorMode)?he():"text"===(null==F?void 0:F.editorMode)?ge():(0,c.jsx)(A.Drawer,o({isExpanded:!0,isInline:!0},{children:(0,c.jsx)(A.DrawerContent,o({panelContent:(0,c.jsx)(A.DrawerPanelContent,o({isResizable:!0,defaultSize:null!==(y=null==F?void 0:F.defaultWidth)&&void 0!==y?y:"50%"},{children:(0,c.jsx)(A.DrawerPanelBody,o({style:{padding:0}},{children:he()}))}))},{children:(0,c.jsx)(A.DrawerContentBody,{children:ge()})}))}))]}))}))},50979:function(e,t,n){"use strict";var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,a){function i(e){try{c(r.next(e))}catch(e){a(e)}}function l(e){try{c(r.throw(e))}catch(e){a(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(i,l)}c((r=r.apply(e,t||[])).next())}))},o=this&&this.__generator||function(e,t){var n,r,o,a,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:l(0),throw:l(1),return:l(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function l(a){return function(l){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;i;)try{if(n=1,r&&(o=2&a[0]?r.return:a[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,a[1])).done)return o;switch(r=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return i.label++,{value:a[1],done:!1};case 5:i.label++,r=a[1],a=[0];continue;case 7:a=i.ops.pop(),i.trys.pop();continue;default:if(!(o=i.trys,(o=o.length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useSwfDiagramEditorChannelApi=void 0;var r=n(95985),o=n(66668),a=n(96540),i=n(78468);t.useSwfDiagramEditorChannelApi=function(e){var t,n=(0,a.useMemo)((function(){return new r.StateControl}),[null===(t=e.embeddedEditorFile)||void 0===t?void 0:t.getFileContents]),l=(0,a.useMemo)((function(){return e.embeddedEditorFile&&new o.EmbeddedEditorChannelApiImpl(n,e.embeddedEditorFile,e.locale,{kogitoEditor_ready:function(){e.onEditorReady()}})}),[e,n]),c=(0,a.useMemo)((function(){return e.channelApi&&l&&e.swfTextEditorEnvelopeApi&&new i.ServerlessWorkflowDiagramEditorChannelApiImpl({defaultApiImpl:l,textEditorEnvelopeApi:e.swfTextEditorEnvelopeApi})}),[e.channelApi,l,e.swfTextEditorEnvelopeApi]);return{stateControl:n,channelApi:c}}},1707:function(e,t,n){"use strict";var r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0)&&!(r=a.next()).done;)i.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=a.return)&&n.call(a)}finally{if(o)throw o.error}}return i};Object.defineProperty(t,"__esModule",{value:!0}),t.useSwfTextEditorChannelApi=void 0;var a=n(95985),i=n(66668),l=n(31212),c=n(96540),f=n(114),s=n(24726);t.useSwfTextEditorChannelApi=function(e){var t,n,u,p=o((0,l.useSharedValue)(null===(t=e.channelApi)||void 0===t?void 0:t.shared.kogitoSwfServiceCatalog_services),1)[0],d=o((0,l.useSharedValue)(null===(n=e.channelApi)||void 0===n?void 0:n.shared.kogitoSwfServiceCatalog_serviceRegistriesSettings),1)[0],A=(0,c.useMemo)((function(){return new a.StateControl}),[null===(u=e.embeddedEditorFile)||void 0===u?void 0:u.getFileContents]),m=(0,c.useMemo)((function(){return e.embeddedEditorFile&&new i.EmbeddedEditorChannelApiImpl(A,e.embeddedEditorFile,e.locale,r({},e.apiOverrides))}),[e,A]),b=(0,c.useMemo)((function(){return e.channelApi&&p&&d&&new f.SwfServiceCatalogChannelApiImpl({channelApi:e.channelApi,services:p,serviceRegistriesSettings:d})}),[e.channelApi,d,p]),v=(0,c.useMemo)((function(){return m&&e.channelApi&&new s.ServerlessWorkflowTextEditorChannelApiImpl({defaultApiImpl:m,channelApi:e.channelApi,swfServiceCatalogApiImpl:b,diagramEditorEnvelopeApi:e.swfDiagramEditorEnvelopeApi})}),[m,e,b]);return{stateControl:A,channelApi:v}}},19718:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),o(n(12269),t),o(n(50979),t),o(n(9e4),t)},278:function(e,t,n){"use strict";var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)});Object.defineProperty(t,"__esModule",{value:!0}),t.ServerlessWorkflowCombinedEditorEnvelopeApiImpl=void 0;var a=function(e){function t(t,n){var r=e.call(this,t,n)||this;return r.serverlessWorkflowArgs=t,r}return o(t,e),t.prototype.kogitoSwfCombinedEditor_colorNodes=function(e){this.getEditorOrThrowError().colorNodes(e.nodeNames,e.color,e.colorConnectedEnds)},t.prototype.kogitoSwfCombinedEditor_moveCursorToPosition=function(e){this.getEditorOrThrowError().moveCursorToPosition(e)},t}(n(30282).KogitoEditorEnvelopeApiImpl);t.ServerlessWorkflowCombinedEditorEnvelopeApiImpl=a},50959:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),o(n(278),t)},5957:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SwfStunnerEditor=void 0;var n=function(e){this.session={getAllNodesUUID:function(){return e.requests.editor_session_getAllNodesUUID()},getEdgeByUUID:function(t){return e.requests.editor_session_getEdgeByUUID(t)},getNodeByUUID:function(t){return e.requests.editor_session_getNodeByUUID(t)},getDefinitionByElementUUID:function(t){return e.requests.editor_session_getDefinitionByElementUUID(t)},getNodeByName:function(t){return e.requests.editor_session_getNodeByName(t)},getNodeName:function(t){return e.requests.editor_session_getNodeName(t)},getSelectedElementUUID:function(){return e.requests.editor_session_getSelectedElementUUID()},getSelectedNode:function(){return e.requests.editor_session_getSelectedNode()},getSelectedEdge:function(){return e.requests.editor_session_getSelectedEdge()},getSelectedDefinition:function(){return e.requests.editor_session_getSelectedDefinition()},selectByUUID:function(t){return e.requests.editor_session_selectByUUID(t),Promise.resolve()},selectByName:function(t){return e.requests.editor_session_selectByName(t),Promise.resolve()},clearSelection:function(){return e.requests.editor_session_clearSelection(),Promise.resolve()}},this.canvas={getShapeIds:function(){return e.requests.editor_canvas_getShapeIds()},getBackgroundColor:function(t){return e.requests.editor_canvas_getBackgroundColor(t)},setBackgroundColor:function(t,n){return e.requests.editor_canvas_setBackgroundColor(t,n),Promise.resolve()},getBorderColor:function(t){return e.requests.editor_canvas_getBorderColor(t)},setBorderColor:function(t,n){return e.requests.editor_canvas_setBorderColor(t,n),Promise.resolve()},getLocation:function(t){return e.requests.editor_canvas_getLocation(t)},getAbsoluteLocation:function(t){return e.requests.editor_canvas_getAbsoluteLocation(t)},getDimensions:function(t){return e.requests.editor_canvas_getDimensions(t)},center:function(t){return e.requests.editor_canvas_center(t),Promise.resolve()},draw:function(){return e.requests.editor_canvas_draw(),Promise.resolve()}}};t.SwfStunnerEditor=n},46891:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Backdrop=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=n(33774),i=r.__importDefault(n(15319));t.Backdrop=e=>{var{children:t=null,className:n=""}=e,l=r.__rest(e,["children","className"]);return o.createElement("div",Object.assign({},l,{className:(0,a.css)(i.default.backdrop,n)}),t)},t.Backdrop.displayName="Backdrop"},54165:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Badge=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=n(33774),i=r.__importDefault(n(3889));t.Badge=e=>{var{isRead:t=!1,className:n="",children:l="",screenReaderText:c}=e,f=r.__rest(e,["isRead","className","children","screenReaderText"]);return o.createElement("span",Object.assign({},f,{className:(0,a.css)(i.default.badge,t?i.default.modifiers.read:i.default.modifiers.unread,n)}),l,c&&o.createElement("span",{className:"pf-screen-reader"},c))},t.Badge.displayName="Badge"},24418:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});n(31635).__exportStar(n(54165),t)},35419:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Button=t.ButtonType=t.ButtonVariant=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=r.__importDefault(n(57319)),i=n(33774),l=n(20444),c=n(36255),f=n(24418);var s,u;!function(e){e.primary="primary",e.secondary="secondary",e.tertiary="tertiary",e.danger="danger",e.warning="warning",e.link="link",e.plain="plain",e.control="control"}(s=t.ButtonVariant||(t.ButtonVariant={})),function(e){e.button="button",e.submit="submit",e.reset="reset"}(u=t.ButtonType||(t.ButtonType={}));const p=e=>{var{children:n=null,className:p="",component:d="button",isActive:A=!1,isBlock:m=!1,isDisabled:b=!1,isAriaDisabled:v=!1,isLoading:g=null,isDanger:h=!1,spinnerAriaValueText:y,spinnerAriaLabelledBy:w,spinnerAriaLabel:Z,isSmall:x=!1,isLarge:q=!1,inoperableEvents:W=["onClick","onKeyPress"],isInline:V=!1,type:T=u.button,variant:E=s.primary,iconPosition:O="left","aria-label":k=null,icon:z=null,ouiaId:P,ouiaSafe:B=!0,tabIndex:S=null,innerRef:M,countOptions:N}=e,j=r.__rest(e,["children","className","component","isActive","isBlock","isDisabled","isAriaDisabled","isLoading","isDanger","spinnerAriaValueText","spinnerAriaLabelledBy","spinnerAriaLabel","isSmall","isLarge","inoperableEvents","isInline","type","variant","iconPosition","aria-label","icon","ouiaId","ouiaSafe","tabIndex","innerRef","countOptions"]);const C=(0,c.useOUIAProps)(t.Button.displayName,P,B,E),R=d,I="button"===R,F=V&&"span"===R,G=W.reduce(((e,t)=>Object.assign(Object.assign({},e),{[t]:e=>{e.preventDefault()}})),{});return o.createElement(R,Object.assign({},j,v?G:null,{"aria-disabled":b||v,"aria-label":k,className:(0,i.css)(a.default.button,a.default.modifiers[E],m&&a.default.modifiers.block,b&&a.default.modifiers.disabled,v&&a.default.modifiers.ariaDisabled,A&&a.default.modifiers.active,V&&E===s.link&&a.default.modifiers.inline,h&&(E===s.secondary||E===s.link)&&a.default.modifiers.danger,null!==g&&null!==n&&a.default.modifiers.progress,g&&a.default.modifiers.inProgress,x&&a.default.modifiers.small,q&&a.default.modifiers.displayLg,p),disabled:I?b:null,tabIndex:null!==S?S:b?I?null:-1:v?null:F?0:void 0,type:I||F?T:null,role:F?"button":null,ref:M},C),g&&o.createElement("span",{className:(0,i.css)(a.default.buttonProgress)},o.createElement(l.Spinner,{size:l.spinnerSize.md,isInline:V,"aria-valuetext":y,"aria-label":Z,"aria-labelledby":w})),E===s.plain&&null===n&&z?z:null,E!==s.plain&&z&&"left"===O&&o.createElement("span",{className:(0,i.css)(a.default.buttonIcon,a.default.modifiers.start)},z),n,E!==s.plain&&z&&"right"===O&&o.createElement("span",{className:(0,i.css)(a.default.buttonIcon,a.default.modifiers.end)},z),N&&o.createElement("span",{className:(0,i.css)(a.default.buttonCount,N.className)},o.createElement(f.Badge,{isRead:N.isRead},N.count)))};t.Button=o.forwardRef(((e,t)=>o.createElement(p,Object.assign({innerRef:t},e)))),t.Button.displayName="Button"},27451:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});n(31635).__exportStar(n(35419),t)},57117:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Drawer=t.DrawerContext=t.DrawerColorVariant=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=r.__importDefault(n(52809)),i=n(33774);!function(e){e.default="default",e.light200="light-200"}(t.DrawerColorVariant||(t.DrawerColorVariant={})),t.DrawerContext=o.createContext({isExpanded:!1,isStatic:!1,onExpand:()=>{},position:"right",drawerRef:null,drawerContentRef:null,isInline:!1});t.Drawer=e=>{var{className:n="",children:l,isExpanded:c=!1,isInline:f=!1,isStatic:s=!1,position:u="right",onExpand:p=(()=>{})}=e,d=r.__rest(e,["className","children","isExpanded","isInline","isStatic","position","onExpand"]);const A=o.useRef(),m=o.useRef();return o.createElement(t.DrawerContext.Provider,{value:{isExpanded:c,isStatic:s,onExpand:p,position:u,drawerRef:A,drawerContentRef:m,isInline:f}},o.createElement("div",Object.assign({className:(0,i.css)(a.default.drawer,c&&a.default.modifiers.expanded,f&&a.default.modifiers.inline,s&&a.default.modifiers.static,"left"===u&&a.default.modifiers.panelLeft,"bottom"===u&&a.default.modifiers.panelBottom,n),ref:A},d),l))},t.Drawer.displayName="Drawer"},2682:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DrawerActions=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=r.__importDefault(n(52809)),i=n(33774);t.DrawerActions=e=>{var{className:t="",children:n}=e,l=r.__rest(e,["className","children"]);return o.createElement("div",Object.assign({className:(0,i.css)(a.default.drawerActions,t)},l),n)},t.DrawerActions.displayName="DrawerActions"},54905:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DrawerCloseButton=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=r.__importDefault(n(52809)),i=n(33774),l=n(27451),c=r.__importDefault(n(26403));t.DrawerCloseButton=e=>{var{className:t="",onClose:n=(()=>{}),"aria-label":f="Close drawer panel"}=e,s=r.__rest(e,["className","onClose","aria-label"]);return o.createElement("div",Object.assign({className:(0,i.css)(a.default.drawerClose,t)},s),o.createElement(l.Button,{variant:"plain",onClick:n,"aria-label":f},o.createElement(c.default,null)))},t.DrawerCloseButton.displayName="DrawerCloseButton"},1264:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DrawerContent=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=r.__importDefault(n(52809)),i=n(33774),l=n(99800),c=n(57117);t.DrawerContent=e=>{var{className:t="",children:n,panelContent:f,colorVariant:s=c.DrawerColorVariant.default}=e,u=r.__rest(e,["className","children","panelContent","colorVariant"]);const{drawerContentRef:p}=o.useContext(c.DrawerContext);return o.createElement(l.DrawerMain,null,o.createElement("div",Object.assign({className:(0,i.css)(a.default.drawerContent,s===c.DrawerColorVariant.light200&&a.default.modifiers.light_200,t),ref:p},u),n),f)},t.DrawerContent.displayName="DrawerContent"},24680:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DrawerContentBody=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=r.__importDefault(n(52809)),i=n(33774);t.DrawerContentBody=e=>{var{className:t="",children:n,hasPadding:l=!1}=e,c=r.__rest(e,["className","children","hasPadding"]);return o.createElement("div",Object.assign({className:(0,i.css)(a.default.drawerBody,l&&a.default.modifiers.padding,t)},c),n)},t.DrawerContentBody.displayName="DrawerContentBody"},24555:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DrawerHead=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=r.__importDefault(n(52809)),i=n(33774),l=n(86315);t.DrawerHead=e=>{var{className:t="",children:n,hasNoPadding:c=!1}=e,f=r.__rest(e,["className","children","hasNoPadding"]);return o.createElement(l.DrawerPanelBody,{hasNoPadding:c},o.createElement("div",Object.assign({className:(0,i.css)(a.default.drawerHead,t)},f),n))},t.DrawerHead.displayName="DrawerHead"},99800:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DrawerMain=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=r.__importDefault(n(52809)),i=n(33774);t.DrawerMain=e=>{var{className:t="",children:n}=e,l=r.__rest(e,["className","children"]);return o.createElement("div",Object.assign({className:(0,i.css)(a.default.drawerMain,t)},l),n)},t.DrawerMain.displayName="DrawerMain"},86315:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DrawerPanelBody=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=r.__importDefault(n(52809)),i=n(33774);t.DrawerPanelBody=e=>{var{className:t="",children:n,hasNoPadding:l=!1}=e,c=r.__rest(e,["className","children","hasNoPadding"]);return o.createElement("div",Object.assign({className:(0,i.css)(a.default.drawerBody,l&&a.default.modifiers.noPadding,t)},c),n)},t.DrawerPanelBody.displayName="DrawerPanelBody"},36454:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DrawerPanelContent=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=r.__importDefault(n(52809)),i=n(33774),l=n(57117),c=n(67551),f=n(35290);let s=null,u=0;t.DrawerPanelContent=e=>{var{className:t="",id:n,children:p,hasNoBorder:d=!1,isResizable:A=!1,onResize:m,minSize:b,defaultSize:v,maxSize:g,increment:h=5,resizeAriaLabel:y="Resize",widths:w,colorVariant:Z=l.DrawerColorVariant.default}=e,x=r.__rest(e,["className","id","children","hasNoBorder","isResizable","onResize","minSize","defaultSize","maxSize","increment","resizeAriaLabel","widths","colorVariant"]);const q=o.useRef(),W=o.useRef(),[V,T]=o.useState(0),{position:E,isExpanded:O,isStatic:k,onExpand:z,drawerRef:P,drawerContentRef:B,isInline:S}=o.useContext(l.DrawerContext),M=!k&&!O,[N,j]=o.useState(!M);let C,R,I,F,G=0,U=!0;o.useEffect((()=>{!k&&O&&j(O)}),[k,O]);const X=()=>{let e,t;S&&"right"===E?(e=q.current.getBoundingClientRect().right-W.current.getBoundingClientRect().left,t=P.current.getBoundingClientRect().right-P.current.getBoundingClientRect().left):S&&"left"===E?(e=W.current.getBoundingClientRect().right-q.current.getBoundingClientRect().left,t=P.current.getBoundingClientRect().right-P.current.getBoundingClientRect().left):"right"===E?(e=B.current.getBoundingClientRect().right-W.current.getBoundingClientRect().left,t=B.current.getBoundingClientRect().right-B.current.getBoundingClientRect().left):"left"===E?(e=W.current.getBoundingClientRect().right-B.current.getBoundingClientRect().left,t=B.current.getBoundingClientRect().right-B.current.getBoundingClientRect().left):"bottom"===E&&(e=B.current.getBoundingClientRect().bottom-W.current.getBoundingClientRect().top,t=B.current.getBoundingClientRect().bottom-B.current.getBoundingClientRect().top);const n=e/t*100;return Math.round(100*(n+Number.EPSILON))/100},D=e=>{e.stopPropagation(),document.addEventListener("touchmove",J,{passive:!1}),document.addEventListener("touchend",K),s=!0},Y=e=>{e.stopPropagation(),e.preventDefault(),document.addEventListener("mousemove",L),document.addEventListener("mouseup",Q),P.current.classList.add((0,i.css)(a.default.modifiers.resizing)),s=!0,U=!0},H=(e,t)=>{if(e.stopPropagation(),!s)return;U&&(C=q.current.getBoundingClientRect(),R=C.right,I=C.left,F=C.bottom,U=!1);let n=0;n="right"===E?R-t:"left"===E?t-I:F-t,"bottom"===E&&(q.current.style.overflowAnchor="none"),q.current.style.setProperty("--pf-c-drawer__panel--md--FlexBasis",n+"px"),G=n,T(X())},L=o.useCallback((e=>{const t="bottom"===E?e.clientY:e.clientX;H(e,t)}),[]),K=o.useCallback((e=>{e.stopPropagation(),s&&(s=!1,m&&m(G,n),document.removeEventListener("touchmove",J),document.removeEventListener("touchend",K))}),[]),J=o.useCallback((e=>{e.preventDefault(),e.stopImmediatePropagation();const t="bottom"===E?e.touches[0].clientY:e.touches[0].clientX;H(e,t)}),[]),Q=o.useCallback((()=>{s&&(P.current.classList.remove((0,i.css)(a.default.modifiers.resizing)),s=!1,m&&m(G,n),U=!0,document.removeEventListener("mousemove",L),document.removeEventListener("mouseup",Q))}),[]),_=e=>{const t=e.key;if("Escape"!==t&&"Enter"!==t&&"ArrowUp"!==t&&"ArrowDown"!==t&&"ArrowLeft"!==t&&"ArrowRight"!==t)return void(s&&e.preventDefault());e.preventDefault(),"Escape"!==t&&"Enter"!==t||m&&m(G,n);const r=q.current.getBoundingClientRect();u="bottom"===E?r.height:r.width;let o=0;"ArrowRight"===t?o="left"===E?h:-h:"ArrowLeft"===t?o="left"===E?-h:h:"ArrowUp"===t?o=h:"ArrowDown"===t&&(o=-h),u+=o,"bottom"===E&&(q.current.style.overflowAnchor="none"),q.current.style.setProperty("--pf-c-drawer__panel--md--FlexBasis",u+"px"),G=u,T(X())},$={};return v&&($["--pf-c-drawer__panel--md--FlexBasis"]=v),b&&($["--pf-c-drawer__panel--md--FlexBasis--min"]=b),g&&($["--pf-c-drawer__panel--md--FlexBasis--max"]=g),o.createElement(f.GenerateId,{prefix:"pf-drawer-panel-"},(e=>o.createElement("div",Object.assign({id:n||e,className:(0,i.css)(a.default.drawerPanel,A&&a.default.modifiers.resizable,d&&a.default.modifiers.noBorder,(0,c.formatBreakpointMods)(w,a.default),Z===l.DrawerColorVariant.light200&&a.default.modifiers.light_200,t),ref:q,onTransitionEnd:e=>{M||"transform"!==e.nativeEvent.propertyName||z(),j(!M)},hidden:M},(v||b||g)&&{style:$},x),N&&o.createElement(o.Fragment,null,A&&o.createElement(o.Fragment,null,o.createElement("div",{className:(0,i.css)(a.default.drawerSplitter,"bottom"!==E&&a.default.modifiers.vertical),role:"separator",tabIndex:0,"aria-orientation":"bottom"===E?"horizontal":"vertical","aria-label":y,"aria-valuenow":V,"aria-valuemin":0,"aria-valuemax":100,"aria-controls":n||e,onMouseDown:Y,onKeyDown:_,onTouchStart:D,ref:W},o.createElement("div",{className:(0,i.css)(a.default.drawerSplitterHandle),"aria-hidden":!0})),o.createElement("div",{className:(0,i.css)(a.default.drawerPanelMain)},p)),!A&&p))))},t.DrawerPanelContent.displayName="DrawerPanelContent"},36590:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DrawerSection=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=r.__importDefault(n(52809)),i=n(33774),l=n(57117);t.DrawerSection=e=>{var{className:t="",children:n,colorVariant:c=l.DrawerColorVariant.default}=e,f=r.__rest(e,["className","children","colorVariant"]);return o.createElement("div",Object.assign({className:(0,i.css)(a.default.drawerSection,c===l.DrawerColorVariant.light200&&a.default.modifiers.light_200,t)},f),n)},t.DrawerSection.displayName="DrawerSection"},46122:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635);r.__exportStar(n(57117),t),r.__exportStar(n(2682),t),r.__exportStar(n(54905),t),r.__exportStar(n(1264),t),r.__exportStar(n(24680),t),r.__exportStar(n(24555),t),r.__exportStar(n(86315),t),r.__exportStar(n(36454),t),r.__exportStar(n(36590),t)},54217:(e,t,n)=>{"use strict";var r=n(4364);Object.defineProperty(t,"__esModule",{value:!0}),t.Modal=t.ModalVariant=void 0;const o=n(31635),a=o.__importStar(n(96540)),i=o.__importStar(n(40961)),l=n(36255),c=n(33774),f=o.__importDefault(n(15319)),s=n(60308),u=n(36255);!function(e){e.small="small",e.medium="medium",e.large="large",e.default="default"}(t.ModalVariant||(t.ModalVariant={}));class p extends a.Component{constructor(e){super(e),this.boxId="",this.labelId="",this.descriptorId="",this.handleEscKeyClick=e=>{var t,n;const{onEscapePress:r}=this.props;e.key===l.KeyTypes.Escape&&this.props.isOpen&&(r?r(e):null===(n=(t=this.props).onClose)||void 0===n||n.call(t))},this.getElement=e=>"function"==typeof e?e():e||document.body,this.toggleSiblingsFromScreenReaders=e=>{const{appendTo:t}=this.props,n=this.getElement(t).children;for(const t of Array.from(n))t!==this.state.container&&(e?t.setAttribute("aria-hidden",""+e):t.removeAttribute("aria-hidden"))},this.isEmpty=e=>null==e||""===e;const t=p.currentId++,n=t+1,r=t+2;this.boxId=e.id||`pf-modal-part-${t}`,this.labelId=`pf-modal-part-${n}`,this.descriptorId=`pf-modal-part-${r}`,this.state={container:void 0,ouiaStateId:(0,u.getDefaultOUIAId)(p.displayName,e.variant)}}componentDidMount(){const{appendTo:e,title:t,"aria-label":n,"aria-labelledby":o,hasNoBodyWrapper:a,header:i}=this.props,l=this.getElement(e),s=document.createElement("div");this.setState({container:s}),l.appendChild(s),l.addEventListener("keydown",this.handleEscKeyClick,!1),this.props.isOpen?l.classList.add((0,c.css)(f.default.backdropOpen)):l.classList.remove((0,c.css)(f.default.backdropOpen)),this.isEmpty(t)&&this.isEmpty(n)&&this.isEmpty(o)&&r.error("Modal: Specify at least one of: title, aria-label, aria-labelledby."),this.isEmpty(n)&&this.isEmpty(o)&&(a||i)&&r.error("Modal: When using hasNoBodyWrapper or setting a custom header, ensure you assign an accessible name to the the modal container with aria-label or aria-labelledby.")}componentDidUpdate(){const{appendTo:e}=this.props,t=this.getElement(e);this.props.isOpen?(t.classList.add((0,c.css)(f.default.backdropOpen)),this.toggleSiblingsFromScreenReaders(!0)):(t.classList.remove((0,c.css)(f.default.backdropOpen)),this.toggleSiblingsFromScreenReaders(!1))}componentWillUnmount(){const{appendTo:e}=this.props,t=this.getElement(e);this.state.container&&t.removeChild(this.state.container),t.removeEventListener("keydown",this.handleEscKeyClick,!1),t.classList.remove((0,c.css)(f.default.backdropOpen))}render(){const e=this.props,{appendTo:t,onEscapePress:n,"aria-labelledby":r,"aria-label":c,"aria-describedby":f,bodyAriaLabel:u,bodyAriaRole:p,title:d,titleIconVariant:A,titleLabel:m,ouiaId:b,ouiaSafe:v}=e,g=o.__rest(e,["appendTo","onEscapePress","aria-labelledby","aria-label","aria-describedby","bodyAriaLabel","bodyAriaRole","title","titleIconVariant","titleLabel","ouiaId","ouiaSafe"]),{container:h}=this.state;return l.canUseDOM&&h?i.createPortal(a.createElement(s.ModalContent,Object.assign({},g,{boxId:this.boxId,labelId:this.labelId,descriptorId:this.descriptorId,title:d,titleIconVariant:A,titleLabel:m,"aria-label":c,"aria-describedby":f,"aria-labelledby":r,bodyAriaLabel:u,bodyAriaRole:p,ouiaId:void 0!==b?b:this.state.ouiaStateId,ouiaSafe:v})),h):null}}t.Modal=p,p.displayName="Modal",p.currentId=0,p.defaultProps={className:"",isOpen:!1,title:"",titleIconVariant:null,titleLabel:"","aria-label":"",showClose:!0,"aria-describedby":"","aria-labelledby":"",id:void 0,actions:[],onClose:()=>{},variant:"default",hasNoBodyWrapper:!1,appendTo:()=>document.body,ouiaSafe:!0}},33392:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ModalBox=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=n(33774),i=r.__importDefault(n(18704)),l=r.__importDefault(n(33214));t.ModalBox=e=>{var{children:t,className:n="",variant:c="default",position:f,positionOffset:s,"aria-labelledby":u,"aria-label":p="","aria-describedby":d,style:A}=e,m=r.__rest(e,["children","className","variant","position","positionOffset","aria-labelledby","aria-label","aria-describedby","style"]);return s&&((A=A||{})[l.default.name]=s),o.createElement("div",Object.assign({},m,{role:"dialog","aria-label":p||null,"aria-labelledby":u||null,"aria-describedby":d,"aria-modal":"true",className:(0,a.css)(i.default.modalBox,n,"top"===f&&i.default.modifiers.alignTop,"large"===c&&i.default.modifiers.lg,"small"===c&&i.default.modifiers.sm,"medium"===c&&i.default.modifiers.md),style:A}),t)},t.ModalBox.displayName="ModalBox"},76840:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ModalBoxBody=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=n(33774),i=r.__importDefault(n(18704));t.ModalBoxBody=e=>{var{children:t=null,className:n=""}=e,l=r.__rest(e,["children","className"]);return o.createElement("div",Object.assign({},l,{className:(0,a.css)(i.default.modalBoxBody,n)}),t)},t.ModalBoxBody.displayName="ModalBoxBody"},97550:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ModalBoxCloseButton=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=n(27451),i=r.__importDefault(n(26403));t.ModalBoxCloseButton=e=>{var{className:n="",onClose:l=(()=>{}),ouiaId:c}=e,f=r.__rest(e,["className","onClose","ouiaId"]);return o.createElement(a.Button,Object.assign({className:n,variant:"plain",onClick:l,"aria-label":"Close"},c&&{ouiaId:`${c}-${t.ModalBoxCloseButton.displayName}`},f),o.createElement(i.default,null))},t.ModalBoxCloseButton.displayName="ModalBoxCloseButton"},81132:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ModalBoxDescription=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=n(33774),i=r.__importDefault(n(18704));t.ModalBoxDescription=e=>{var{children:t=null,className:n="",id:l=""}=e,c=r.__rest(e,["children","className","id"]);return o.createElement("div",Object.assign({},c,{id:l,className:(0,a.css)(i.default.modalBoxDescription,n)}),t)},t.ModalBoxDescription.displayName="ModalBoxDescription"},27159:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ModalBoxFooter=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=n(33774),i=r.__importDefault(n(18704));t.ModalBoxFooter=e=>{var{children:t=null,className:n=""}=e,l=r.__rest(e,["children","className"]);return o.createElement("footer",Object.assign({},l,{className:(0,a.css)(i.default.modalBoxFooter,n)}),t)},t.ModalBoxFooter.displayName="ModalBoxFooter"},21189:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ModalBoxHeader=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=n(33774),i=r.__importDefault(n(18704));t.ModalBoxHeader=e=>{var{children:t=null,className:n="",help:l=null}=e,c=r.__rest(e,["children","className","help"]);return o.createElement("header",Object.assign({className:(0,a.css)(i.default.modalBoxHeader,l&&i.default.modifiers.help,n)},c),l&&o.createElement(o.Fragment,null,o.createElement("div",{className:(0,a.css)(i.default.modalBoxHeaderMain)},t),o.createElement("div",{className:"pf-c-modal-box__header-help"},l)),!l&&t)},t.ModalBoxHeader.displayName="ModalBoxHeader"},81880:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ModalBoxTitle=t.isVariantIcon=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=r.__importDefault(n(18704)),i=n(33774),l=r.__importDefault(n(18913)),c=n(36255),f=n(51682),s=r.__importDefault(n(42600)),u=r.__importDefault(n(87945)),p=r.__importDefault(n(98457)),d=r.__importDefault(n(47836)),A=r.__importDefault(n(56846)),m=n(36255);t.isVariantIcon=e=>["success","danger","warning","info","default"].includes(e);t.ModalBoxTitle=e=>{var{className:n="",id:b,title:v,titleIconVariant:g,titleLabel:h=""}=e,y=r.__rest(e,["className","id","title","titleIconVariant","titleLabel"]);const[w,Z]=o.useState(!1),x=o.useRef(null),q=h||((0,t.isVariantIcon)(g)?`${(0,c.capitalize)(g)} alert:`:h),W={success:o.createElement(s.default,null),danger:o.createElement(u.default,null),warning:o.createElement(p.default,null),info:o.createElement(d.default,null),default:o.createElement(A.default,null)},V=!(0,t.isVariantIcon)(g)&&g;(0,m.useIsomorphicLayoutEffect)((()=>{Z(x.current&&x.current.offsetWidth{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ModalContent=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=n(36255),i=r.__importDefault(n(18704)),l=r.__importDefault(n(46646)),c=n(33774),f=n(36255),s=n(46891),u=n(76840),p=n(97550),d=n(33392),A=n(27159),m=n(81132),b=n(21189),v=n(81880);t.ModalContent=e=>{var{children:n,className:g="",isOpen:h=!1,header:y=null,help:w=null,description:Z=null,title:x="",titleIconVariant:q=null,titleLabel:W="","aria-label":V="","aria-describedby":T,"aria-labelledby":E,bodyAriaLabel:O,bodyAriaRole:k,showClose:z=!0,footer:P=null,actions:B=[],onClose:S=(()=>{}),variant:M="default",position:N,positionOffset:j,width:C=-1,boxId:R,labelId:I,descriptorId:F,disableFocusTrap:G=!1,hasNoBodyWrapper:U=!1,ouiaId:X,ouiaSafe:D=!0}=e,Y=r.__rest(e,["children","className","isOpen","header","help","description","title","titleIconVariant","titleLabel","aria-label","aria-describedby","aria-labelledby","bodyAriaLabel","bodyAriaRole","showClose","footer","actions","onClose","variant","position","positionOffset","width","boxId","labelId","descriptorId","disableFocusTrap","hasNoBodyWrapper","ouiaId","ouiaSafe"]);if(!h)return null;const H=y?o.createElement(b.ModalBoxHeader,{help:w},y):x&&o.createElement(b.ModalBoxHeader,{help:w},o.createElement(v.ModalBoxTitle,{title:x,titleIconVariant:q,titleLabel:W,id:I}),Z&&o.createElement(m.ModalBoxDescription,{id:F},Z)),L=P?o.createElement(A.ModalBoxFooter,null,P):B.length>0&&o.createElement(A.ModalBoxFooter,null,B),K=O?"region":void 0,J=U?n:o.createElement(u.ModalBoxBody,Object.assign({"aria-label":O,role:k||K},Y,!Z&&!T&&{id:F}),n),Q=-1===C?{}:{width:C},_=o.createElement(d.ModalBox,Object.assign({id:R,style:Q,className:(0,c.css)(g,(0,v.isVariantIcon)(q)&&i.default.modifiers[q]),variant:M,position:N,positionOffset:j,"aria-label":V,"aria-labelledby":(()=>{if(null===E)return null;const e=[];return""!==(V&&R)&&e.push(V&&R),E&&e.push(E),x&&e.push(I),e.join(" ")})(),"aria-describedby":T||(U?null:F)},(0,f.getOUIAProps)(t.ModalContent.displayName,X,D)),z&&o.createElement(p.ModalBoxCloseButton,{onClose:S,ouiaId:X}),H,J,L);return o.createElement(s.Backdrop,null,o.createElement(a.FocusTrap,{active:!G,focusTrapOptions:{clickOutsideDeactivates:!0,tabbableOptions:{displayCheck:"none"}},className:(0,c.css)(l.default.bullseye)},_))},t.ModalContent.displayName="ModalContent"},22568:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635);r.__exportStar(n(54217),t),r.__exportStar(n(33392),t),r.__exportStar(n(76840),t),r.__exportStar(n(97550),t),r.__exportStar(n(21189),t),r.__exportStar(n(27159),t),r.__exportStar(n(60308),t)},79469:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Spinner=t.spinnerSize=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=r.__importDefault(n(6169)),i=n(33774);!function(e){e.sm="sm",e.md="md",e.lg="lg",e.xl="xl"}(t.spinnerSize||(t.spinnerSize={}));t.Spinner=e=>{var{className:t="",size:n="xl","aria-valuetext":l="Loading...",isSVG:c=!1,diameter:f,isInline:s=!1,"aria-label":u,"aria-labelledBy":p}=e,d=r.__rest(e,["className","size","aria-valuetext","isSVG","diameter","isInline","aria-label","aria-labelledBy"]);const A=c?"svg":"span";return o.createElement(A,Object.assign({className:(0,i.css)(a.default.spinner,s?a.default.modifiers.inline:a.default.modifiers[n],t),role:"progressbar","aria-valuetext":l},c&&{viewBox:"0 0 100 100"},f&&{style:{"--pf-c-spinner--diameter":f}},u&&{"aria-label":u},p&&{"aria-labelledBy":p},!u&&!p&&{"aria-label":"Contents"},d),c?o.createElement("circle",{className:a.default.spinnerPath,cx:"50",cy:"50",r:"45",fill:"none"}):o.createElement(o.Fragment,null,o.createElement("span",{className:(0,i.css)(a.default.spinnerClipper)}),o.createElement("span",{className:(0,i.css)(a.default.spinnerLeadBall)}),o.createElement("span",{className:(0,i.css)(a.default.spinnerTailBall)})))},t.Spinner.displayName="Spinner"},20444:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});n(31635).__exportStar(n(79469),t)},16873:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Text=t.TextVariants=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=n(33774),i=r.__importDefault(n(37969)),l=n(36255);var c;!function(e){e.h1="h1",e.h2="h2",e.h3="h3",e.h4="h4",e.h5="h5",e.h6="h6",e.p="p",e.a="a",e.small="small",e.blockquote="blockquote",e.pre="pre"}(c=t.TextVariants||(t.TextVariants={}));t.Text=e=>{var{children:n=null,className:f="",component:s=c.p,isVisitedLink:u=!1,ouiaId:p,ouiaSafe:d=!0}=e,A=r.__rest(e,["children","className","component","isVisitedLink","ouiaId","ouiaSafe"]);const m=s,b=(0,l.useOUIAProps)(t.Text.displayName,p,d);return o.createElement(m,Object.assign({},b,A,{"data-pf-content":!0,className:(0,a.css)(u&&s===c.a&&i.default.modifiers.visited,f)}),n)},t.Text.displayName="Text"},87348:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TextContent=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=r.__importDefault(n(37969)),i=n(33774);t.TextContent=e=>{var{children:t,className:n="",isVisited:l=!1}=e,c=r.__rest(e,["children","className","isVisited"]);return o.createElement("div",Object.assign({},c,{className:(0,i.css)(a.default.content,l&&a.default.modifiers.visited,n)}),t)},t.TextContent.displayName="TextContent"},8365:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TextList=t.TextListVariants=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=r.__importDefault(n(37969)),i=n(33774);var l;!function(e){e.ul="ul",e.ol="ol",e.dl="dl"}(l=t.TextListVariants||(t.TextListVariants={}));t.TextList=e=>{var{children:t=null,className:n="",component:c=l.ul,isPlain:f=!1}=e,s=r.__rest(e,["children","className","component","isPlain"]);const u=c;return o.createElement(u,Object.assign({},s,{className:(0,i.css)(f&&a.default.modifiers.plain,n)}),t)},t.TextList.displayName="TextList"},47778:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TextListItem=t.TextListItemVariants=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=n(33774);var i;!function(e){e.li="li",e.dt="dt",e.dd="dd"}(i=t.TextListItemVariants||(t.TextListItemVariants={}));t.TextListItem=e=>{var{children:t=null,className:n="",component:l=i.li}=e,c=r.__rest(e,["children","className","component"]);const f=l;return o.createElement(f,Object.assign({},c,{className:(0,a.css)(n)}),t)},t.TextListItem.displayName="TextListItem"},12408:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635);r.__exportStar(n(87348),t),r.__exportStar(n(16873),t),r.__exportStar(n(8365),t),r.__exportStar(n(47778),t)},4937:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Title=t.TitleSizes=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=n(33774),i=r.__importDefault(n(76741)),l=n(36255);var c;!function(e){e.md="md",e.lg="lg",e.xl="xl",e["2xl"]="2xl",e["3xl"]="3xl",e["4xl"]="4xl"}(t.TitleSizes||(t.TitleSizes={})),function(e){e.h1="2xl",e.h2="xl",e.h3="lg",e.h4="md",e.h5="md",e.h6="md"}(c||(c={}));t.Title=e=>{var{className:n="",children:f="",headingLevel:s,size:u=c[s],ouiaId:p,ouiaSafe:d=!0}=e,A=r.__rest(e,["className","children","headingLevel","size","ouiaId","ouiaSafe"]);const m=(0,l.useOUIAProps)(t.Title.displayName,p,d);return o.createElement(s,Object.assign({},m,A,{className:(0,a.css)(i.default.title,u&&i.default.modifiers[u],n)}),f)},t.Title.displayName="Title"},38547:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});n(31635).__exportStar(n(4937),t)},56005:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Tooltip=t.TooltipPosition=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=r.__importDefault(n(6881)),i=n(33774),l=n(600),c=n(18452),f=n(58722),s=r.__importDefault(n(7986)),u=n(37642);!function(e){e.auto="auto",e.top="top",e.bottom="bottom",e.left="left",e.right="right",e.topStart="top-start",e.topEnd="top-end",e.bottomStart="bottom-start",e.bottomEnd="bottom-end",e.leftStart="left-start",e.leftEnd="left-end",e.rightStart="right-start",e.rightEnd="right-end"}(t.TooltipPosition||(t.TooltipPosition={}));let p=1;t.Tooltip=e=>{var{content:t,position:n="top",trigger:d="mouseenter focus",isVisible:A=!1,isContentLeftAligned:m=!1,enableFlip:b=!0,className:v="",entryDelay:g=300,exitDelay:h=300,appendTo:y=(()=>document.body),zIndex:w=9999,maxWidth:Z=s.default.value,distance:x=15,aria:q="describedby",flipBehavior:W=["top","right","bottom","left","top","right","bottom"],id:V="pf-tooltip-"+p++,children:T,animationDuration:E=300,reference:O,"aria-live":k=(O?"polite":"off"),boundary:z,isAppLauncher:P,tippyProps:B,removeFindDomNode:S=!1,onTooltipHidden:M=(()=>{})}=e,N=r.__rest(e,["content","position","trigger","isVisible","isContentLeftAligned","enableFlip","className","entryDelay","exitDelay","appendTo","zIndex","maxWidth","distance","aria","flipBehavior","id","children","animationDuration","reference","aria-live","boundary","isAppLauncher","tippyProps","removeFindDomNode","onTooltipHidden"]);const j=d.includes("mouseenter"),C=d.includes("focus"),R=d.includes("click"),I="manual"===d,[F,G]=o.useState(!1),[U,X]=o.useState(0),D=o.useRef(null),Y=o.useRef(null),H=o.useRef(null),L=o.useRef(),K=e=>{e.forEach((e=>{e.current&&clearTimeout(e.current)}))};o.useEffect((()=>()=>{K([D,H,Y])}),[]);o.useEffect((()=>{A?J():Q()}),[A]),o.useEffect((()=>{L.current{X(0),D.current=setTimeout((()=>{G(!1),M()}),E)}),h)),L.current=h}),[h]);const J=()=>{K([D,H]),Y.current=setTimeout((()=>{G(!0),X(1)}),g)},Q=()=>{K([Y]),H.current=setTimeout((()=>{X(0),D.current=setTimeout((()=>{G(!1),M()}),E)}),h)},_={top:a.default.modifiers.top,bottom:a.default.modifiers.bottom,left:a.default.modifiers.left,right:a.default.modifiers.right,"top-start":a.default.modifiers.topLeft,"top-end":a.default.modifiers.topRight,"bottom-start":a.default.modifiers.bottomLeft,"bottom-end":a.default.modifiers.bottomRight,"left-start":a.default.modifiers.leftTop,"left-end":a.default.modifiers.leftBottom,"right-start":a.default.modifiers.rightTop,"right-end":a.default.modifiers.rightBottom},$=Z!==s.default.value,ee=o.createElement("div",Object.assign({"aria-live":k,className:(0,i.css)(a.default.tooltip,v),role:"tooltip",id:V,style:{maxWidth:$?Z:null,opacity:U,transition:(0,u.getOpacityTransition)(E)}},N),o.createElement(c.TooltipArrow,null),o.createElement(l.TooltipContent,{isLeftAligned:m},t));return o.createElement(u.Popper,{trigger:"none"!==q&&F?"describedby"===q&&T&&T.props&&!T.props["aria-describedby"]?o.cloneElement(T,{"aria-describedby":V}):"labelledby"===q&&T.props&&!T.props["aria-labelledby"]?o.cloneElement(T,{"aria-labelledby":V}):T:T,reference:O,popper:ee,popperMatchesTriggerWidth:!1,appendTo:y,isVisible:F,positionModifiers:_,distance:x,placement:n,onMouseEnter:j&&J,onMouseLeave:j&&Q,onPopperMouseEnter:j&&J,onPopperMouseLeave:j&&Q,onFocus:C&&J,onBlur:C&&Q,onDocumentClick:R&&((e,t)=>{F?Q():e.target===t&&J()}),onDocumentKeyDown:I?null:e=>{I||e.key===f.KeyTypes.Escape&&F&&Q()},onTriggerEnter:I?null:e=>{e.key===f.KeyTypes.Enter&&(F?Q():J())},enableFlip:b,zIndex:w,flipBehavior:W,removeFindDomNode:S})},t.Tooltip.displayName="Tooltip"},18452:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TooltipArrow=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=r.__importDefault(n(6881)),i=n(33774);t.TooltipArrow=e=>{var{className:t}=e,n=r.__rest(e,["className"]);return o.createElement("div",Object.assign({className:(0,i.css)(a.default.tooltipArrow,t)},n))},t.TooltipArrow.displayName="TooltipArrow"},600:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TooltipContent=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=r.__importDefault(n(6881)),i=n(33774);t.TooltipContent=e=>{var{className:t,children:n,isLeftAligned:l}=e,c=r.__rest(e,["className","children","isLeftAligned"]);return o.createElement("div",Object.assign({className:(0,i.css)(a.default.tooltipContent,l&&a.default.modifiers.textAlignLeft,t)},c),n)},t.TooltipContent.displayName="TooltipContent"},51682:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});n(31635).__exportStar(n(56005),t)},23160:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FocusTrap=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=n(2078);class i extends o.Component{constructor(e){super(e),this.divRef=this.props.innerRef||o.createRef(),"undefined"!=typeof document&&(this.previouslyFocusedElement=document.activeElement)}componentDidMount(){this.focusTrap=(0,a.createFocusTrap)(this.divRef.current,Object.assign(Object.assign({},this.props.focusTrapOptions),{returnFocusOnDeactivate:!1})),this.props.active&&this.focusTrap.activate(),this.props.paused&&this.focusTrap.pause()}componentDidUpdate(e){e.active&&!this.props.active?this.focusTrap.deactivate():!e.active&&this.props.active&&this.focusTrap.activate(),e.paused&&!this.props.paused?this.focusTrap.unpause():!e.paused&&this.props.paused&&this.focusTrap.pause()}componentWillUnmount(){this.focusTrap.deactivate(),!1!==this.props.focusTrapOptions.returnFocusOnDeactivate&&this.previouslyFocusedElement&&this.previouslyFocusedElement.focus&&this.previouslyFocusedElement.focus({preventScroll:this.props.preventScrollOnDeactivate})}render(){const e=this.props,{children:t,className:n,focusTrapOptions:a,active:i,paused:l,preventScrollOnDeactivate:c,innerRef:f}=e,s=r.__rest(e,["children","className","focusTrapOptions","active","paused","preventScrollOnDeactivate","innerRef"]);return o.createElement("div",Object.assign({ref:this.divRef,className:n},s),t)}}i.displayName="FocusTrap",i.defaultProps={active:!0,paused:!1,focusTrapOptions:{},preventScrollOnDeactivate:!1},t.FocusTrap=o.forwardRef(((e,t)=>o.createElement(i,Object.assign({innerRef:t},e))))},35290:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.GenerateId=void 0;const r=n(31635).__importStar(n(96540));let o=0;class a extends r.Component{constructor(){super(...arguments),this.id=`${this.props.prefix}${o++}`}render(){return this.props.children(this.id)}}t.GenerateId=a,a.displayName="GenerateId",a.defaultProps={prefix:"pf-random-id-"}},22748:(e,t,n)=>{"use strict";var r=n(4364);Object.defineProperty(t,"__esModule",{value:!0}),t.KeyboardHandler=t.setTabIndex=t.handleArrows=void 0;const o=n(31635).__importStar(n(96540)),a=n(67551);t.handleArrows=(e,t,n=(e=>document.activeElement.contains(e)),r=(e=>e),o=["A","BUTTON","INPUT"],a=!1,i=!1,l=!0,c=!0)=>{const f=document.activeElement,s=e.key;let u=null;if(!a&&["ArrowUp","ArrowDown"].includes(s)){e.preventDefault(),e.stopImmediatePropagation();let o=-1;t.forEach(((e,a)=>{if(n(e)){let e=0;for(;!u&&e=t.length&&(o=0),o<0&&(o=t.length-1),u=r(t[o])}}))}if(!i&&["ArrowLeft","ArrowRight"].includes(s)){e.preventDefault(),e.stopImmediatePropagation();let r=-1;t.forEach(((a,i)=>{if(n(a)){const n=t[i].querySelectorAll(o.join(","));if(!n.length||c){let e=f;for(;e;)if(e="ArrowLeft"===s?e.previousElementSibling:e.nextElementSibling,e&&o.includes(e.tagName)){u=e;break}}else n.forEach(((t,o)=>{if(e.target===t){r=o+("ArrowLeft"===s?-1:1),r>=n.length&&(r=0),r<0&&(r=n.length-1),u=n[r]}}))}}))}u&&(l&&(f.tabIndex=-1,u.tabIndex=0),u.focus())};t.setTabIndex=e=>{e&&e.length>0&&(e.forEach((e=>{e.tabIndex=-1})),e[0].tabIndex=0)};class i extends o.Component{constructor(){super(...arguments),this.keyHandler=e=>{const{isEventFromContainer:n}=this.props;if(n?!n(e):!this._isEventFromContainer(e))return;const{isActiveElement:o,getFocusableElement:a,noVerticalArrowHandling:i,noHorizontalArrowHandling:l,noEnterHandling:c,noSpaceHandling:f,updateTabIndex:s,validSiblingTags:u,additionalKeyHandler:p,createNavigableElements:d,onlyTraverseSiblings:A}=this.props;p&&p(e);const m=d();if(!m)return void r.warn("No navigable elements have been passed to the KeyboardHandler. Keyboard navigation provided by this component will be ignored.");const b=e.key;c||"Enter"===b&&(e.preventDefault(),e.stopImmediatePropagation(),document.activeElement.click()),f||" "===b&&(e.preventDefault(),e.stopImmediatePropagation(),document.activeElement.click()),(0,t.handleArrows)(e,m,o,a,u,i,l,s,A)},this._isEventFromContainer=e=>{const{containerRef:t}=this.props;return t.current&&t.current.contains(e.target)}}componentDidMount(){a.canUseDOM&&window.addEventListener("keydown",this.keyHandler)}componentWillUnmount(){a.canUseDOM&&window.removeEventListener("keydown",this.keyHandler)}render(){return null}}t.KeyboardHandler=i,i.displayName="KeyboardHandler",i.defaultProps={containerRef:null,createNavigableElements:()=>null,isActiveElement:e=>document.activeElement===e,getFocusableElement:e=>e,validSiblingTags:["BUTTON","A"],onlyTraverseSiblings:!0,updateTabIndex:!0,noHorizontalArrowHandling:!1,noVerticalArrowHandling:!1,noEnterHandling:!1,noSpaceHandling:!1}},39762:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getDefaultOUIAId=t.useOUIAId=t.useOUIAProps=t.getOUIAProps=void 0;const r=n(96540);let o=0;const a="OUIA-Generated-",i={};t.getOUIAProps=function(e,t,n=!0){return{"data-ouia-component-type":`PF4/${e}`,"data-ouia-safe":n,"data-ouia-component-id":t}};t.useOUIAProps=(e,n,r=!0,o)=>({"data-ouia-component-type":`PF4/${e}`,"data-ouia-safe":r,"data-ouia-component-id":(0,t.useOUIAId)(e,n,o)});function l(e,t){try{let n;return n="undefined"!=typeof window?`${window.location.href}-${e}-${t||""}`:`${e}-${t||""}`,i[n]||(i[n]=0),`${a}${e}-${t?`${t}-`:""}${++i[n]}`}catch(n){return`${a}${e}-${t?`${t}-`:""}${++o}`}}t.useOUIAId=(e,t,n)=>{const o=(0,r.useMemo)((()=>l(e,n)),[e,n]);return null!=t?t:o},t.getDefaultOUIAId=l},58519:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FindRefWrapper=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=r.__importStar(n(40961));class i extends o.Component{componentDidMount(){const e=a.findDOMNode(this);this.props.onFoundRef(e)}render(){return this.props.children||null}}t.FindRefWrapper=i,i.displayName="FindRefWrapper"},37642:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Popper=t.getOpacityTransition=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=r.__importStar(n(40961)),i=n(54964),l=n(33774),c=n(58519);n(94033);const f={left:"right",right:"left",bottom:"top",top:"bottom","top-start":"bottom-end","top-end":"bottom-start","bottom-start":"top-end","bottom-end":"top-start","left-start":"right-end","left-end":"right-start","right-start":"left-end","right-end":"left-start"};t.getOpacityTransition=e=>`opacity ${e}ms cubic-bezier(.54, 1.5, .38, 1.11)`;t.Popper=({trigger:e,popper:t,popperMatchesTriggerWidth:n=!0,direction:r="down",position:s="left",placement:u,appendTo:p=(()=>document.body),zIndex:d=9999,isVisible:A=!0,positionModifiers:m,distance:b=0,onMouseEnter:v,onMouseLeave:g,onFocus:h,onBlur:y,onDocumentClick:w,onTriggerClick:Z,onTriggerEnter:x,onPopperClick:q,onPopperMouseEnter:W,onPopperMouseLeave:V,onDocumentKeyDown:T,enableFlip:E=!0,flipBehavior:O="flip",reference:k,removeFindDomNode:z=!1,popperRef:P})=>{const[B,S]=o.useState(null),[M,N]=o.useState(null),[j,C]=o.useState(null),[R,I]=o.useState(!1),F=M||B,G=o.useCallback((e=>w(e,F,j)),[A,B,M,j,w]);o.useEffect((()=>{I(!0)}),[]),o.useEffect((()=>{k&&(k.current?N(k.current):"function"==typeof k&&N(k()))}),[k]),o.useEffect((()=>{P&&(P.current?C(P.current):"function"==typeof P&&C(P()))}),[A,P]);const U=(e,t,n,r=!1)=>{e&&t&&t.addEventListener(n,e,{capture:r})},X=(e,t,n,r=!1)=>{e&&t&&t.removeEventListener(n,e,{capture:r})};o.useEffect((()=>{U(v,F,"mouseenter"),U(g,F,"mouseleave"),U(h,F,"focus"),U(y,F,"blur"),U(Z,F,"click"),U(x,F,"keydown"),U(q,j,"click"),U(W,j,"mouseenter"),U(V,j,"mouseleave"),w&&U(G,document,"click",!0),U(T,document,"keydown",!0);const e=new MutationObserver((()=>{Q&&Q()}));return j&&e.observe(j,{attributes:!0,childList:!0,subtree:!0}),()=>{X(v,F,"mouseenter"),X(g,F,"mouseleave"),X(h,F,"focus"),X(y,F,"blur"),X(Z,F,"click"),X(x,F,"keydown"),X(q,j,"click"),X(W,j,"mouseenter"),X(V,j,"mouseleave"),w&&X(G,document,"click",!0),X(T,document,"keydown",!0),e.disconnect()}}),[B,j,v,g,h,y,Z,x,q,W,V,w,T,M]);const D=()=>{if(u)return u;let e="up"===r?"top":"bottom";return"center"!==s&&(e=`${e}-${"right"===s?"end":"start"}`),e},Y=o.useMemo(D,[r,s,u]),H=o.useMemo((()=>(e=>e.replace(/left|right|bottom|top|top-start|top-end|bottom-start|bottom-end|right-start|right-end|left-start|left-end/g,(e=>f[e])))(D())),[r,s,u]),L=o.useMemo((()=>({name:"sameWidth",enabled:n,phase:"beforeWrite",requires:["computeStyles"],fn:({state:e})=>{e.styles.popper.width=`${e.rects.reference.width}px`},effect:({state:e})=>(e.elements.popper.style.width=`${e.elements.reference.offsetWidth}px`,()=>{})})),[n]),{styles:K,attributes:J,update:Q,forceUpdate:_}=(0,i.usePopper)(F,j,{placement:Y,modifiers:[{name:"offset",options:{offset:[0,b]}},{name:"preventOverflow",enabled:!1},{name:"hide",enabled:!0},{name:"flip",enabled:Y.startsWith("auto")||E,options:{fallbackPlacements:"flip"===O?[H]:O}},L]});o.useEffect((()=>{_&&_()}),[t]);const $=Object.assign({className:(0,l.css)(t.props&&t.props.className,m&&(()=>{if(J&&J.popper&&J.popper["data-popper-placement"]){const e=J.popper["data-popper-placement"];return m[e]}return m.top})()),style:Object.assign(Object.assign(Object.assign({},t.props&&t.props.style||{}),K.popper),{zIndex:d})},J.popper),ee=o.cloneElement(t,$);let te;return te=z?o.createElement("div",{style:{display:"contents"},ref:e=>C(null==e?void 0:e.firstElementChild)},ee):P?ee:o.createElement(c.FindRefWrapper,{onFoundRef:e=>C(e)},ee),o.createElement(o.Fragment,null,!k&&e&&o.isValidElement(e)&&!z&&o.createElement(c.FindRefWrapper,{onFoundRef:e=>S(e)},e),!k&&e&&o.isValidElement(e)&&z&&o.createElement("div",{style:{display:"contents"},ref:e=>S(null==e?void 0:e.firstElementChild)},e),R&&A&&a.createPortal(te,"function"==typeof p?p():p))},t.Popper.displayName="Popper"},71429:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const n=Boolean(t.getRootNode&&t.getRootNode().host);if(e.contains(t))return!0;if(n){let n=t;do{if(n&&e.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}},6491:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){const t=e.getBoundingClientRect();return{width:t.width,height:t.height,top:t.top,right:t.right,bottom:t.bottom,left:t.left,x:t.left,y:t.top}}},46146:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635),o=n(98843),a=r.__importDefault(n(73598)),i=r.__importDefault(n(13261)),l=r.__importDefault(n(99568)),c=r.__importDefault(n(50757)),f=r.__importDefault(n(49819)),s=r.__importDefault(n(13196)),u=n(80866),p=r.__importDefault(n(6491)),d=r.__importDefault(n(65134)),A=r.__importDefault(n(71429)),m=r.__importDefault(n(78897)),b=r.__importDefault(n(74353));function v(e,t){return t===o.viewport?(0,b.default)((0,a.default)(e)):(0,u.isHTMLElement)(t)?function(e){const t=(0,p.default)(e);return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}(t):(0,b.default)((0,i.default)((0,f.default)(e)))}t.default=function(e,t,n){const r=[..."clippingParents"===t?function(e){const t=(0,l.default)((0,d.default)(e)),n=["absolute","fixed"].indexOf((0,s.default)(e).position)>=0&&(0,u.isHTMLElement)(e)?(0,c.default)(e):e;return(0,u.isElement)(n)?t.filter((e=>(0,u.isElement)(e)&&(0,A.default)(e,n)&&"body"!==(0,m.default)(e))):[]}(e):[].concat(t),n],o=r[0],a=r.reduce(((t,n)=>{const r=v(e,n);return t.top=Math.max(r.top,t.top),t.right=Math.min(r.right,t.right),t.bottom=Math.min(r.bottom,t.bottom),t.left=Math.max(r.left,t.left),t}),v(e,o));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}},7093:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635),o=r.__importDefault(n(6491)),a=r.__importDefault(n(28739)),i=r.__importDefault(n(78897)),l=n(80866),c=r.__importDefault(n(71408)),f=r.__importDefault(n(49819)),s=r.__importDefault(n(59417));t.default=function(e,t,n=!1){const r=(0,f.default)(t),u=(0,o.default)(e),p=(0,l.isHTMLElement)(t);let d={scrollLeft:0,scrollTop:0},A={x:0,y:0};return(p||!p&&!n)&&(("body"!==(0,i.default)(t)||(0,s.default)(r))&&(d=(0,a.default)(t)),(0,l.isHTMLElement)(t)?(A=(0,o.default)(t),A.x+=t.clientLeft,A.y+=t.clientTop):r&&(A.x=(0,c.default)(r))),{x:u.left+d.scrollLeft-A.x,y:u.top+d.scrollTop-A.y,width:u.width,height:u.height}}},13196:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635).__importDefault(n(71270));t.default=function(e){return(0,r.default)(e).getComputedStyle(e)}},49819:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(80866);t.default=function(e){return((0,r.isElement)(e)?e.ownerDocument:e.document).documentElement}},13261:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635),o=r.__importDefault(n(49819)),a=r.__importDefault(n(13196)),i=r.__importDefault(n(71408)),l=r.__importDefault(n(85387));t.default=function(e){const t=(0,o.default)(e),n=(0,l.default)(e),r=e.ownerDocument.body,c=Math.max(t.scrollWidth,t.clientWidth,r?r.scrollWidth:0,r?r.clientWidth:0),f=Math.max(t.scrollHeight,t.clientHeight,r?r.scrollHeight:0,r?r.clientHeight:0);let s=-n.scrollLeft+(0,i.default)(e);const u=-n.scrollTop;return"rtl"===(0,a.default)(r||t).direction&&(s+=Math.max(t.clientWidth,r?r.clientWidth:0)-c),{width:c,height:f,x:s,y:u}}},58706:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}},51674:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return{x:e.offsetLeft,y:e.offsetTop,width:e.offsetWidth,height:e.offsetHeight}}},78897:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e?(e.nodeName||"").toLowerCase():null}},28739:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635),o=r.__importDefault(n(85387)),a=r.__importDefault(n(71270)),i=n(80866),l=r.__importDefault(n(58706));t.default=function(e){return e!==(0,a.default)(e)&&(0,i.isHTMLElement)(e)?(0,l.default)(e):(0,o.default)(e)}},50757:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635),o=r.__importDefault(n(71270)),a=r.__importDefault(n(78897)),i=r.__importDefault(n(13196)),l=n(80866),c=r.__importDefault(n(22536)),f=r.__importDefault(n(65134)),s=r.__importDefault(n(49819));function u(e){if(!(0,l.isHTMLElement)(e)||"fixed"===(0,i.default)(e).position)return null;const t=e.offsetParent;if(t){const e=(0,s.default)(t);if("body"===(0,a.default)(t)&&"static"===(0,i.default)(t).position&&"static"!==(0,i.default)(e).position)return e}return t}t.default=function(e){const t=(0,o.default)(e);let n=u(e);for(;n&&(0,c.default)(n)&&"static"===(0,i.default)(n).position;)n=u(n);return n&&"body"===(0,a.default)(n)&&"static"===(0,i.default)(n).position?t:n||function(e){let t=(0,f.default)(e);for(;(0,l.isHTMLElement)(t)&&["html","body"].indexOf((0,a.default)(t))<0;){const e=(0,i.default)(t);if("none"!==e.transform||"none"!==e.perspective||e.willChange&&"auto"!==e.willChange)return t;t=t.parentNode}return null}(e)||t}},65134:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635),o=r.__importDefault(n(78897)),a=r.__importDefault(n(49819));t.default=function(e){return"html"===(0,o.default)(e)?e:e.assignedSlot||e.parentNode||e.host||(0,a.default)(e)}},45067:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635),o=r.__importDefault(n(65134)),a=r.__importDefault(n(59417)),i=r.__importDefault(n(78897)),l=n(80866);t.default=function e(t){return["html","body","#document"].indexOf((0,i.default)(t))>=0?t.ownerDocument.body:(0,l.isHTMLElement)(t)&&(0,a.default)(t)?t:e((0,o.default)(t))}},73598:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635),o=r.__importDefault(n(71270)),a=r.__importDefault(n(49819)),i=r.__importDefault(n(71408));t.default=function(e){const t=(0,o.default)(e),n=(0,a.default)(e),r=t.visualViewport;let l=n.clientWidth,c=n.clientHeight,f=0,s=0;return r&&(l=r.width,c=r.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(f=r.offsetLeft,s=r.offsetTop)),{width:l,height:c,x:f+(0,i.default)(e),y:s}}},71270:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if("[object Window]"!==e.toString()){const t=e.ownerDocument;return t?t.defaultView:window}return e}},85387:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635).__importDefault(n(71270));t.default=function(e){const t=(0,r.default)(e);return{scrollLeft:t.pageXOffset,scrollTop:t.pageYOffset}}},71408:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635),o=r.__importDefault(n(6491)),a=r.__importDefault(n(49819)),i=r.__importDefault(n(85387));t.default=function(e){return(0,o.default)((0,a.default)(e)).left+(0,i.default)(e).scrollLeft}},80866:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isHTMLElement=t.isElement=void 0;const r=n(31635).__importDefault(n(71270));t.isElement=function(e){return e instanceof(0,r.default)(e).Element||e instanceof Element},t.isHTMLElement=function(e){return e instanceof(0,r.default)(e).HTMLElement||e instanceof HTMLElement}},59417:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635).__importDefault(n(13196));t.default=function(e){const{overflow:t,overflowX:n,overflowY:o}=(0,r.default)(e);return/auto|scroll|overlay|hidden/.test(t+o+n)}},22536:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635).__importDefault(n(78897));t.default=function(e){return["table","td","th"].indexOf((0,r.default)(e))>=0}},99568:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635),o=r.__importDefault(n(45067)),a=r.__importDefault(n(65134)),i=r.__importDefault(n(78897)),l=r.__importDefault(n(71270)),c=r.__importDefault(n(59417));t.default=function e(t,n=[]){const r=(0,o.default)(t),f="body"===(0,i.default)(r),s=(0,l.default)(r),u=f?[s].concat(s.visualViewport||[],(0,c.default)(r)?r:[]):r,p=n.concat(u);return f?p:p.concat(e((0,a.default)(u)))}},98843:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.modifierPhases=t.afterWrite=t.write=t.beforeWrite=t.afterMain=t.main=t.beforeMain=t.afterRead=t.read=t.beforeRead=t.placements=t.variationPlacements=t.reference=t.popper=t.viewport=t.clippingParents=t.end=t.start=t.basePlacements=t.auto=t.left=t.right=t.bottom=t.top=void 0,t.top="top",t.bottom="bottom",t.right="right",t.left="left",t.auto="auto",t.basePlacements=[t.top,t.bottom,t.right,t.left],t.start="start",t.end="end",t.clippingParents="clippingParents",t.viewport="viewport",t.popper="popper",t.reference="reference",t.variationPlacements=t.basePlacements.reduce(((e,n)=>e.concat([`${n}-${t.start}`,`${n}-${t.end}`])),[]),t.placements=[...t.basePlacements,t.auto].reduce(((e,n)=>e.concat([n,`${n}-${t.start}`,`${n}-${t.end}`])),[]),t.beforeRead="beforeRead",t.read="read",t.afterRead="afterRead",t.beforeMain="beforeMain",t.main="main",t.afterMain="afterMain",t.beforeWrite="beforeWrite",t.write="write",t.afterWrite="afterWrite",t.modifierPhases=[t.beforeRead,t.read,t.afterRead,t.beforeMain,t.main,t.afterMain,t.beforeWrite,t.write,t.afterWrite]},62733:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.detectOverflow=t.createPopper=t.popperGenerator=void 0;const r=n(31635),o=r.__importDefault(n(7093)),a=r.__importDefault(n(51674)),i=r.__importDefault(n(99568)),l=r.__importDefault(n(50757)),c=(r.__importDefault(n(13196)),r.__importDefault(n(79661))),f=r.__importDefault(n(31412)),s=(r.__importDefault(n(7347)),r.__importDefault(n(90961)),r.__importDefault(n(3519)),r.__importDefault(n(36065))),u=r.__importDefault(n(76914));t.detectOverflow=u.default;const p=n(80866);n(98843);r.__exportStar(n(87412),t),r.__exportStar(n(98843),t);const d={placement:"bottom",modifiers:[],strategy:"absolute"};function A(...e){return!e.some((e=>!(e&&"function"==typeof e.getBoundingClientRect)))}function m(e={}){const{defaultModifiers:t=[],defaultOptions:n=d}=e;return function(e,r,u=n){let m={placement:"bottom",orderedModifiers:[],options:Object.assign(Object.assign({},d),n),modifiersData:{},elements:{reference:e,popper:r},attributes:{},styles:{}},b=[],v=!1;const g={state:m,setOptions(o){h(),m.options=Object.assign(Object.assign(Object.assign({},n),m.options),o),m.scrollParents={reference:(0,p.isElement)(e)?(0,i.default)(e):e.contextElement?(0,i.default)(e.contextElement):[],popper:(0,i.default)(r)};const a=(0,c.default)((0,s.default)([...t,...m.options.modifiers]));return m.orderedModifiers=a.filter((e=>e.enabled)),m.orderedModifiers.forEach((({name:e,options:t={},effect:n})=>{if("function"==typeof n){const r=n({state:m,name:e,instance:g,options:t}),o=()=>{};b.push(r||o)}})),g.update()},forceUpdate(){if(v)return;const{reference:e,popper:t}=m.elements;if(!A(e,t))return void 0;m.rects={reference:(0,o.default)(e,(0,l.default)(t),"fixed"===m.options.strategy),popper:(0,a.default)(t)},m.reset=!1,m.placement=m.options.placement,m.orderedModifiers.forEach((e=>m.modifiersData[e.name]=Object.assign({},e.data)));for(let e=0;enew Promise((e=>{g.forceUpdate(),e(m)})))),destroy(){h(),v=!0}};if(!A(e,r))return g;function h(){b.forEach((e=>e())),b=[]}return g.setOptions(u).then((e=>{!v&&u.onFirstUpdate&&u.onFirstUpdate(e)})),g}}t.popperGenerator=m,t.createPopper=m()},84102:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635).__importDefault(n(78897)),o=n(80866);t.default={name:"applyStyles",enabled:!0,phase:"write",fn:function({state:e}){Object.keys(e.elements).forEach((t=>{const n=e.styles[t]||{},a=e.attributes[t]||{},i=e.elements[t];(0,o.isHTMLElement)(i)&&(0,r.default)(i)&&(Object.assign(i.style,n),Object.keys(a).forEach((e=>{const t=a[e];!1===t?i.removeAttribute(e):i.setAttribute(e,!0===t?"":t)})))}))},effect:function({state:e}){const t={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,t.popper),e.elements.arrow&&Object.assign(e.elements.arrow.style,t.arrow),()=>{Object.keys(e.elements).forEach((n=>{const a=e.elements[n],i=e.attributes[n]||{},l=Object.keys(e.styles.hasOwnProperty(n)?e.styles[n]:t[n]).reduce(((e,t)=>(e[t]="",e)),{});(0,o.isHTMLElement)(a)&&(0,r.default)(a)&&(Object.assign(a.style,l),Object.keys(i).forEach((e=>{a.removeAttribute(e)})))}))}},requires:["computeStyles"]}},38441:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635),o=r.__importDefault(n(3519)),a=r.__importDefault(n(51674)),i=r.__importDefault(n(71429)),l=r.__importDefault(n(50757)),c=r.__importDefault(n(78936)),f=r.__importDefault(n(85088)),s=r.__importDefault(n(72621)),u=r.__importDefault(n(89422)),p=n(98843);n(80866);t.default={name:"arrow",enabled:!0,phase:"main",fn:function({state:e,name:t}){const n=e.elements.arrow,r=e.modifiersData.popperOffsets,i=(0,o.default)(e.placement),s=(0,c.default)(i),u=[p.left,p.right].indexOf(i)>=0?"height":"width";if(!n||!r)return;const d=e.modifiersData[`${t}#persistent`].padding,A=(0,a.default)(n),m="y"===s?p.top:p.left,b="y"===s?p.bottom:p.right,v=e.rects.reference[u]+e.rects.reference[s]-r[s]-e.rects.popper[u],g=r[s]-e.rects.reference[s],h=(0,l.default)(n),y=h?"y"===s?h.clientHeight||0:h.clientWidth||0:0,w=v/2-g/2,Z=d[m],x=y-A[u]-d[b],q=y/2-A[u]/2+w,W=(0,f.default)(Z,q,x),V=s;e.modifiersData[t]={[V]:W,centerOffset:W-q}},effect:function({state:e,options:t,name:n}){let{element:r="[data-popper-arrow]",padding:o=0}=t;null!=r&&("string"!=typeof r||(r=e.elements.popper.querySelector(r),r))&&(0,i.default)(e.elements.popper,r)&&(e.elements.arrow=r,e.modifiersData[`${n}#persistent`]={padding:(0,s.default)("number"!=typeof o?o:(0,u.default)(o,p.basePlacements))})},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]}},61651:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.mapToStyles=void 0;const r=n(31635),o=n(98843),a=r.__importDefault(n(50757)),i=r.__importDefault(n(71270)),l=r.__importDefault(n(49819)),c=(r.__importDefault(n(13196)),r.__importDefault(n(3519))),f={top:"auto",right:"auto",bottom:"auto",left:"auto"};function s({popper:e,popperRect:t,placement:n,offsets:r,position:c,gpuAcceleration:s,adaptive:u}){let{x:p,y:d}=function({x:e,y:t}){const n=window.devicePixelRatio||1;return{x:Math.round(e*n)/n||0,y:Math.round(t*n)/n||0}}(r);const A=r.hasOwnProperty("x"),m=r.hasOwnProperty("y");let b=o.left,v=o.top;const g=window;if(u){let r=(0,a.default)(e);r===(0,i.default)(e)&&(r=(0,l.default)(e)),n===o.top&&(v=o.bottom,d-=r.clientHeight-t.height,d*=s?1:-1),n===o.left&&(b=o.right,p-=r.clientWidth-t.width,p*=s?1:-1)}const h=Object.assign({position:c},u&&f);return s?Object.assign(Object.assign({},h),{[v]:m?"0":"",[b]:A?"0":"",transform:(g.devicePixelRatio||1)<2?`translate(${p}px, ${d}px)`:`translate3d(${p}px, ${d}px, 0)`}):Object.assign(Object.assign({},h),{[v]:m?`${d}px`:"",[b]:A?`${p}px`:"",transform:""})}t.mapToStyles=s,t.default={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function({state:e,options:t}){const{gpuAcceleration:n=!0,adaptive:r=!0}=t,o={placement:(0,c.default)(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:n};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign(Object.assign({},e.styles.popper),s(Object.assign(Object.assign({},o),{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign(Object.assign({},e.styles.arrow),s(Object.assign(Object.assign({},o),{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1})))),e.attributes.popper=Object.assign(Object.assign({},e.attributes.popper),{"data-popper-placement":e.placement})},data:{}}},72539:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635).__importDefault(n(71270)),o={passive:!0};t.default={name:"eventListeners",enabled:!0,phase:"write",fn:()=>{},effect:function({state:e,instance:t,options:n}){const{scroll:a=!0,resize:i=!0}=n,l=(0,r.default)(e.elements.popper),c=[...e.scrollParents.reference,...e.scrollParents.popper];return a&&c.forEach((e=>{e.addEventListener("scroll",t.update,o)})),i&&l.addEventListener("resize",t.update,o),()=>{a&&c.forEach((e=>{e.removeEventListener("scroll",t.update,o)})),i&&l.removeEventListener("resize",t.update,o)}},data:{}}},99009:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635),o=r.__importDefault(n(49919)),a=r.__importDefault(n(3519)),i=r.__importDefault(n(59066)),l=r.__importDefault(n(76914)),c=r.__importDefault(n(59746)),f=n(98843),s=r.__importDefault(n(5598));t.default={name:"flip",enabled:!0,phase:"main",fn:function({state:e,options:t,name:n}){if(e.modifiersData[n]._skip)return;const{mainAxis:r=!0,altAxis:u=!0,fallbackPlacements:p,padding:d,boundary:A,rootBoundary:m,altBoundary:b,flipVariations:v=!0,allowedAutoPlacements:g}=t,h=e.options.placement,y=(0,a.default)(h),w=[h,...p||(y===h||!v?[(0,o.default)(h)]:function(e){if((0,a.default)(e)===f.auto)return[];const t=(0,o.default)(e);return[(0,i.default)(e),t,(0,i.default)(t)]}(h))].reduce(((t,n)=>t.concat((0,a.default)(n)===f.auto?(0,c.default)(e,{placement:n,boundary:A,rootBoundary:m,padding:d,flipVariations:v,allowedAutoPlacements:g}):n)),[]),Z=e.rects.reference,x=e.rects.popper,q=new Map;let W=!0,V=w[0];for(let t=0;t=0,v=p?"width":"height",g=(0,l.default)(e,{placement:n,boundary:A,rootBoundary:m,altBoundary:b,padding:d});let h=p?c?f.right:f.left:c?f.bottom:f.top;Z[v]>x[v]&&(h=(0,o.default)(h));const y=(0,o.default)(h),T=[];if(r&&T.push(g[i]<=0),u&&T.push(g[h]<=0,g[y]<=0),T.every((e=>e))){V=n,W=!1;break}q.set(n,T)}if(W){for(let e=v?3:1;e>0;e--){const t=w.find((t=>{const n=q.get(t);if(n)return n.slice(0,e).every((e=>e))}));if(t){V=t;break}}}e.placement!==V&&(e.modifiersData[n]._skip=!0,e.placement=V,e.reset=!0)},requiresIfExists:["offset"],data:{_skip:!1}}},42414:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635),o=n(98843),a=r.__importDefault(n(76914));function i(e,t,n={x:0,y:0}){return{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function l(e){return[o.top,o.right,o.bottom,o.left].some((t=>e[t]>=0))}t.default={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function({state:e,name:t}){const n=e.rects.reference,r=e.rects.popper,o=e.modifiersData.preventOverflow,c=(0,a.default)(e,{elementContext:"reference"}),f=(0,a.default)(e,{altBoundary:!0}),s=i(c,n),u=i(f,r,o),p=l(s),d=l(u);e.modifiersData[t]={referenceClippingOffsets:s,popperEscapeOffsets:u,isReferenceHidden:p,hasPopperEscaped:d},e.attributes.popper=Object.assign(Object.assign({},e.attributes.popper),{"data-popper-reference-hidden":p,"data-popper-escaped":d})}}},56549:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.distanceAndSkiddingToXY=void 0;const r=n(31635).__importDefault(n(3519)),o=n(98843);function a(e,t,n){const a=(0,r.default)(e),i=[o.left,o.top].indexOf(a)>=0?-1:1;let[l,c]="function"==typeof n?n(Object.assign(Object.assign({},t),{placement:e})):n;return l=l||0,c=(c||0)*i,[o.left,o.right].indexOf(a)>=0?{x:c,y:l}:{x:l,y:c}}t.distanceAndSkiddingToXY=a,t.default={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function({state:e,options:t,name:n}){const{offset:r=[0,0]}=t,i=o.placements.reduce(((t,n)=>(t[n]=a(n,e.rects,r),t)),{}),{x:l,y:c}=i[e.placement];null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=i}}},79678:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635).__importDefault(n(69160));t.default={name:"popperOffsets",enabled:!0,phase:"read",fn:function({state:e,name:t}){e.modifiersData[t]=(0,r.default)({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}}},81960:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635),o=n(98843),a=r.__importDefault(n(3519)),i=r.__importDefault(n(78936)),l=r.__importDefault(n(35161)),c=r.__importDefault(n(85088)),f=r.__importDefault(n(51674)),s=r.__importDefault(n(50757)),u=r.__importDefault(n(76914)),p=r.__importDefault(n(5598)),d=r.__importDefault(n(69203));t.default={name:"preventOverflow",enabled:!0,phase:"main",fn:function({state:e,options:t,name:n}){const{mainAxis:r=!0,altAxis:A=!1,boundary:m,rootBoundary:b,altBoundary:v,padding:g,tether:h=!0,tetherOffset:y=0}=t,w=(0,u.default)(e,{boundary:m,rootBoundary:b,padding:g,altBoundary:v}),Z=(0,a.default)(e.placement),x=(0,p.default)(e.placement),q=!x,W=(0,i.default)(Z),V=(0,l.default)(W),T=e.modifiersData.popperOffsets,E=e.rects.reference,O=e.rects.popper,k="function"==typeof y?y(Object.assign(Object.assign({},e.rects),{placement:e.placement})):y,z={x:0,y:0};if(T){if(r){const t="y"===W?o.top:o.left,n="y"===W?o.bottom:o.right,r="y"===W?"height":"width",a=T[W],i=T[W]+w[t],l=T[W]-w[n],u=h?-O[r]/2:0,p=x===o.start?E[r]:O[r],A=x===o.start?-O[r]:-E[r],m=e.elements.arrow,b=h&&m?(0,f.default)(m):{width:0,height:0},v=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:(0,d.default)(),g=v[t],y=v[n],Z=(0,c.default)(0,E[r],b[r]),V=q?E[r]/2-u-Z-g-k:p-Z-g-k,P=q?-E[r]/2+u+Z+y+k:A+Z+y+k,B=e.elements.arrow&&(0,s.default)(e.elements.arrow),S=B?"y"===W?B.clientTop||0:B.clientLeft||0:0,M=e.modifiersData.offset?e.modifiersData.offset[e.placement][W]:0,N=T[W]+V-M-S,j=T[W]+P-M,C=(0,c.default)(h?Math.min(i,N):i,a,h?Math.max(l,j):l);T[W]=C,z[W]=C-a}if(A){const e="x"===W?o.top:o.left,t="x"===W?o.bottom:o.right,n=T[V],r=n+w[e],a=n-w[t],i=(0,c.default)(r,n,a);T[V]=i,z[V]=i-n}e.modifiersData[n]=z}},requiresIfExists:["offset"]}},10219:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.detectOverflow=t.defaultModifiers=t.popperGenerator=t.createPopper=void 0;const r=n(31635),o=n(62733);Object.defineProperty(t,"popperGenerator",{enumerable:!0,get:function(){return o.popperGenerator}}),Object.defineProperty(t,"detectOverflow",{enumerable:!0,get:function(){return o.detectOverflow}});const a=r.__importDefault(n(72539)),i=r.__importDefault(n(79678)),l=r.__importDefault(n(61651)),c=r.__importDefault(n(84102)),f=r.__importDefault(n(56549)),s=r.__importDefault(n(99009)),u=r.__importDefault(n(81960)),p=r.__importDefault(n(38441)),d=r.__importDefault(n(42414));r.__exportStar(n(87412),t);const A=[a.default,i.default,l.default,c.default,f.default,s.default,u.default,p.default,d.default];t.defaultModifiers=A;const m=(0,o.popperGenerator)({defaultModifiers:A});t.createPopper=m},87412:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},59746:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635),o=r.__importDefault(n(5598)),a=n(98843),i=r.__importDefault(n(76914)),l=r.__importDefault(n(3519));t.default=function(e,t={}){const{placement:n,boundary:r,rootBoundary:c,padding:f,flipVariations:s,allowedAutoPlacements:u=a.placements}=t,p=(0,o.default)(n),d=p?s?a.variationPlacements:a.variationPlacements.filter((e=>(0,o.default)(e)===p)):a.basePlacements;let A=d.filter((e=>u.indexOf(e)>=0));0===A.length&&(A=d);const m=A.reduce(((t,n)=>(t[n]=(0,i.default)(e,{placement:n,boundary:r,rootBoundary:c,padding:f})[(0,l.default)(n)],t)),{});return Object.keys(m).sort(((e,t)=>m[e]-m[t]))}},69160:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635),o=r.__importDefault(n(3519)),a=r.__importDefault(n(5598)),i=r.__importDefault(n(78936)),l=n(98843);t.default=function({reference:e,element:t,placement:n}){const r=n?(0,o.default)(n):null,c=n?(0,a.default)(n):null,f=e.x+e.width/2-t.width/2,s=e.y+e.height/2-t.height/2;let u;switch(r){case l.top:u={x:f,y:e.y-t.height};break;case l.bottom:u={x:f,y:e.y+e.height};break;case l.right:u={x:e.x+e.width,y:s};break;case l.left:u={x:e.x-t.width,y:s};break;default:u={x:e.x,y:e.y}}const p=r?(0,i.default)(r):null;if(null!=p){const n="y"===p?"height":"width";switch(c){case l.start:u[p]=Math.floor(u[p])-Math.floor(e[n]/2-t[n]/2);break;case l.end:u[p]=Math.floor(u[p])+Math.ceil(e[n]/2-t[n]/2)}}return u}},31412:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){let t;return()=>(t||(t=new Promise((n=>{Promise.resolve().then((()=>{t=void 0,n(e())}))}))),t)}},76914:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635),o=r.__importDefault(n(6491)),a=r.__importDefault(n(46146)),i=r.__importDefault(n(49819)),l=r.__importDefault(n(69160)),c=r.__importDefault(n(74353)),f=n(98843),s=n(80866),u=r.__importDefault(n(72621)),p=r.__importDefault(n(89422));t.default=function(e,t={}){const{placement:n=e.placement,boundary:r=f.clippingParents,rootBoundary:d=f.viewport,elementContext:A=f.popper,altBoundary:m=!1,padding:b=0}=t,v=(0,u.default)("number"!=typeof b?b:(0,p.default)(b,f.basePlacements)),g=A===f.popper?f.reference:f.popper,h=e.elements.reference,y=e.rects.popper,w=e.elements[m?g:A],Z=(0,a.default)((0,s.isElement)(w)?w:w.contextElement||(0,i.default)(e.elements.popper),r,d),x=(0,o.default)(h),q=(0,l.default)({reference:x,element:y,strategy:"absolute",placement:n}),W=(0,c.default)(Object.assign(Object.assign({},y),q)),V=A===f.popper?W:x,T={top:Z.top-V.top+v.top,bottom:V.bottom-Z.bottom+v.bottom,left:Z.left-V.left+v.left,right:V.right-Z.right+v.right},E=e.modifiersData.offset;if(A===f.popper&&E){const e=E[n];Object.keys(T).forEach((t=>{const n=[f.right,f.bottom].indexOf(t)>=0?1:-1,r=[f.top,f.bottom].indexOf(t)>=0?"y":"x";T[t]+=e[r]*n}))}return T}},89422:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){return t.reduce(((t,n)=>(t[n]=e,t)),{})}},18692:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,...t){return[...t].reduce(((e,t)=>e.replace(/%s/,t)),e)}},35161:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return"x"===e?"y":"x"}},3519:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e.split("-")[0]}},69203:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return{top:0,right:0,bottom:0,left:0}}},78936:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}},49919:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n={left:"right",right:"left",bottom:"top",top:"bottom"};t.default=function(e){return e.replace(/left|right|bottom|top/g,(e=>n[e]))}},59066:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n={start:"end",end:"start"};t.default=function(e){return e.replace(/start|end/g,(e=>n[e]))}},5598:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e.split("-")[1]}},36065:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){const t=e.reduce(((e,t)=>{const n=e[t.name];return e[t.name]=n?Object.assign(Object.assign(Object.assign({},n),t),{options:Object.assign(Object.assign({},n.options),t.options),data:Object.assign(Object.assign({},n.data),t.data)}):t,e}),{});return Object.keys(t).map((e=>t[e]))}},72621:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635).__importDefault(n(69203));t.default=function(e){return Object.assign(Object.assign({},(0,r.default)()),e)}},79661:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(98843);function o(e){const t=new Map,n=new Set,r=[];function o(e){n.add(e.name);[...e.requires||[],...e.requiresIfExists||[]].forEach((e=>{if(!n.has(e)){const n=t.get(e);n&&o(n)}})),r.push(e)}return e.forEach((e=>{t.set(e.name,e)})),e.forEach((e=>{n.has(e.name)||o(e)})),r}t.default=function(e){const t=o(e);return r.modifierPhases.reduce(((e,n)=>e.concat(t.filter((e=>e.phase===n)))),[])}},74353:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return Object.assign(Object.assign({},e),{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}},90961:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const n=new Set;return e.filter((e=>{const r=t(e);if(!n.has(r))return n.add(r),!0}))}},7347:(e,t,n)=>{"use strict";var r=n(4364);Object.defineProperty(t,"__esModule",{value:!0});const o=n(31635).__importDefault(n(18692)),a=n(98843),i='Popper: modifier "%s" provided an invalid %s property, expected %s but got %s',l=["name","enabled","phase","fn","effect","requires","options"];t.default=function(e){e.forEach((t=>{Object.keys(t).forEach((n=>{switch(n){case"name":"string"!=typeof t.name&&r.error((0,o.default)(i,String(t.name),'"name"','"string"',`"${String(t.name)}"`));break;case"enabled":"boolean"!=typeof t.enabled&&r.error((0,o.default)(i,t.name,'"enabled"','"boolean"',`"${String(t.enabled)}"`));case"phase":a.modifierPhases.indexOf(t.phase)<0&&r.error((0,o.default)(i,t.name,'"phase"',`either ${a.modifierPhases.join(", ")}`,`"${String(t.phase)}"`));break;case"fn":"function"!=typeof t.fn&&r.error((0,o.default)(i,t.name,'"fn"','"function"',`"${String(t.fn)}"`));break;case"effect":"function"!=typeof t.effect&&r.error((0,o.default)(i,t.name,'"effect"','"function"',`"${String(t.fn)}"`));break;case"requires":Array.isArray(t.requires)||r.error((0,o.default)(i,t.name,'"requires"','"array"',`"${String(t.requires)}"`));break;case"requiresIfExists":Array.isArray(t.requiresIfExists)||r.error((0,o.default)(i,t.name,'"requiresIfExists"','"array"',`"${String(t.requiresIfExists)}"`));break;case"options":case"data":break;default:r.error(`PopperJS: an invalid property has been provided to the "${t.name}" modifier, valid properties are ${l.map((e=>`"${e}"`)).join(", ")}; but "${n}" was provided.`)}t.requires&&t.requires.forEach((n=>{null==e.find((e=>e.name===n))&&r.error((0,o.default)('Popper: modifier "%s" requires "%s", but "%s" modifier is not available',String(t.name),n,n))}))}))}))}},85088:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,n){return Math.max(e,Math.min(t,n))}},54964:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.usePopper=void 0;const r=n(31635).__importStar(n(96540)),o=n(10219),a=n(76511),i=e=>e.reduce(((e,[t,n])=>(e[t]=n,e)),{}),l=[];t.usePopper=(e,t,n={})=>{const c=r.useRef(null),f={onFirstUpdate:n.onFirstUpdate,placement:n.placement||"bottom",strategy:n.strategy||"absolute",modifiers:n.modifiers||l},[s,u]=r.useState({styles:{popper:{position:f.strategy,left:"0",top:"0"}},attributes:{}}),p=r.useMemo((()=>({name:"updateState",enabled:!0,phase:"write",fn:({state:e})=>{const t=Object.keys(e.elements);u({styles:i(t.map((t=>[t,e.styles[t]||{}]))),attributes:i(t.map((t=>[t,e.attributes[t]])))})},requires:["computeStyles"]})),[]),d=r.useMemo((()=>{const e={onFirstUpdate:f.onFirstUpdate,placement:f.placement,strategy:f.strategy,modifiers:[...f.modifiers,p,{name:"applyStyles",enabled:!1}]};return t=c.current,n=e,JSON.stringify(t)===JSON.stringify(n)?c.current||e:(c.current=e,e);var t,n}),[f.onFirstUpdate,f.placement,f.strategy,f.modifiers,p]),A=r.useRef();return(0,a.useIsomorphicLayoutEffect)((()=>{A&&A.current&&A.current.setOptions(d)}),[d]),(0,a.useIsomorphicLayoutEffect)((()=>{if(null==e||null==t)return;const r=(n.createPopper||o.createPopper)(e,t,d);return A.current=r,()=>{r.destroy(),A.current=null}}),[e,t,n.createPopper]),{state:A.current?A.current.state:null,styles:s.styles,attributes:s.attributes,update:A.current?A.current.update:null,forceUpdate:A.current?A.current.forceUpdate:null}}},58722:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.globalHeightBreakpoints=t.globalWidthBreakpoints=t.KeyTypes=t.ValidatedOptions=t.KEYHANDLER_DIRECTION=t.SIDE=t.KEY_CODES=void 0;const r=n(31635),o=r.__importDefault(n(51418)),a=r.__importDefault(n(58551)),i=r.__importDefault(n(16359)),l=r.__importDefault(n(94342)),c=r.__importDefault(n(87510)),f=r.__importDefault(n(22596)),s=r.__importDefault(n(98437)),u=r.__importDefault(n(58865)),p=r.__importDefault(n(92692)),d=r.__importDefault(n(63164));t.KEY_CODES={ARROW_UP:38,ARROW_DOWN:40,ESCAPE_KEY:27,TAB:9,ENTER:13,SPACE:32},t.SIDE={RIGHT:"right",LEFT:"left",BOTH:"both",NONE:"none"},t.KEYHANDLER_DIRECTION={UP:"up",DOWN:"down",RIGHT:"right",LEFT:"left"},function(e){e.success="success",e.error="error",e.warning="warning",e.default="default"}(t.ValidatedOptions||(t.ValidatedOptions={})),t.KeyTypes={Tab:"Tab",Space:" ",Escape:"Escape",Enter:"Enter",ArrowUp:"ArrowUp",ArrowDown:"ArrowDown",ArrowLeft:"ArrowLeft",ArrowRight:"ArrowRight"},t.globalWidthBreakpoints={sm:parseInt(o.default.value),md:parseInt(a.default.value),lg:parseInt(i.default.value),xl:parseInt(l.default.value),"2xl":parseInt(c.default.value)},t.globalHeightBreakpoints={sm:parseInt(f.default.value),md:parseInt(s.default.value),lg:parseInt(u.default.value),xl:parseInt(p.default.value),"2xl":parseInt(d.default.value)}},84965:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isValidDate=void 0;t.isValidDate=e=>Boolean(e&&!isNaN(e))},66945:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ASTERISK=void 0,t.ASTERISK="*"},36255:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=n(31635);r.__exportStar(n(58722),t),r.__exportStar(n(23160),t),r.__exportStar(n(35290),t),r.__exportStar(n(66945),t),r.__exportStar(n(51378),t),r.__exportStar(n(39762),t),r.__exportStar(n(67551),t),r.__exportStar(n(37642),t),r.__exportStar(n(76511),t),r.__exportStar(n(22748),t),r.__exportStar(n(11617),t),r.__exportStar(n(18089),t),r.__exportStar(n(84965),t)},11617:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getResizeObserver=void 0;const r=n(67551);t.getResizeObserver=(e,t,n=!0)=>{let o;if(r.canUseDOM){const{ResizeObserver:r}=window;if(e&&r){const a=new r((e=>{n?window.requestAnimationFrame((()=>{Array.isArray(e)&&e.length>0&&t()})):Array.isArray(e)&&e.length>0&&t()}));a.observe(e),o=()=>a.unobserve(e)}else window.addEventListener("resize",t),o=()=>window.removeEventListener("resize",t)}return()=>{o&&o()}}},51378:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},18089:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useInterval=void 0;const r=n(31635).__importStar(n(96540));t.useInterval=function(e,t){const n=r.useRef((()=>{}));r.useEffect((()=>{n.current=e}),[e]),r.useEffect((()=>{if(null!==t){const e=setInterval((function(){n.current()}),t);return()=>clearInterval(e)}}),[t])}},76511:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useIsomorphicLayoutEffect=void 0;const r=n(31635).__importStar(n(96540)),o=n(67551);t.useIsomorphicLayoutEffect=o.canUseDOM?r.useLayoutEffect:r.useEffect},67551:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.preventedEvents=t.trimLeft=t.innerDimensions=t.getTextWidth=t.canUseDOM=t.toCamel=t.getBreakpoint=t.getVerticalBreakpoint=t.formatBreakpointMods=t.setBreakpointCssVars=t.pluralize=t.getNextIndex=t.findTabbableElements=t.keyHandler=t.fillTemplate=t.sideElementIsOutOfView=t.isElementInView=t.debounce=t.getUniqueId=t.capitalize=void 0;const r=n(31635).__importStar(n(40961)),o=n(58722);t.capitalize=function(e){return e[0].toUpperCase()+e.substring(1)},t.getUniqueId=function(e="pf"){return`${e}-${(new Date).getTime()+Math.random().toString(36).slice(2)}`},t.debounce=function(e,t){let n;return(...r)=>{clearTimeout(n),n=setTimeout((()=>e.apply(this,r)),t)}},t.isElementInView=function(e,t,n,r=!1){if(!e||!t)return!1;const o=e.getBoundingClientRect(),a=t.getBoundingClientRect(),i=Math.ceil(o.left),l=Math.floor(o.right),c=Math.ceil(a.left),f=Math.floor(a.right),s=c>=i&&f<=l,u=(n||!r&&o.widthi||f>l&&ci;let f=o.SIDE.NONE;return c&&l?f=o.SIDE.BOTH:c?f=o.SIDE.RIGHT:l&&(f=o.SIDE.LEFT),f},t.fillTemplate=function(e,t){return e.replace(/\${(.*?)}/g,((e,n)=>t[n]||""))},t.keyHandler=function e(t,n,o,a,i,l=!1){if(!Array.isArray(i))return;const c=a.filter((e=>e))[0].constructor===Array;let f=t,s=n;if("up"===o?f=0===t?i.length-1:t-1:"down"===o?f=t===i.length-1?0:t+1:"left"===o?s=0===n?a[t].length-1:n-1:"right"===o&&(s=n===a[t].length-1?0:n+1),null===a[f]||void 0===a[f]||c&&(null===a[f][s]||void 0===a[f][s]))e(f,s,o,a,i,l);else if(l){a[f].focus&&a[f].focus();r.findDOMNode(a[f]).focus()}else"tab"!==o&&(c?a[f][s].focus():a[f].focus())},t.findTabbableElements=function(e,t){const n=e.current.querySelectorAll(t);return Array.prototype.filter.call(n,(function(e){return e.tabIndex>="0"}))},t.getNextIndex=function e(t,n,r){let o;return o="up"===n?0===t?r.length-1:t-1:t===r.length-1?0:t+1,void 0===r[o]||null===r[o][0]?e(o,n,r):o},t.pluralize=function(e,t,n){return n||(n=`${t}s`),`${e||0} ${1===e?t:n}`};t.setBreakpointCssVars=(e,t)=>Object.entries(e||{}).reduce(((e,[n,r])=>"default"===n?Object.assign(Object.assign({},e),{[t]:r}):Object.assign(Object.assign({},e),{[`${t}-on-${n}`]:r})),{});t.formatBreakpointMods=(e,n,r="",o,a)=>{if(!e)return"";if(o&&!a){if(o in e)return n.modifiers[(0,t.toCamel)(`${r}${e[o]}`)];const a=["2xl","xl","lg","md","sm","default"];for(let i=a.indexOf(o);i`${r}${t}${"default"!==e?`-on-${e}`:""}${a&&"default"!==e?"-height":""}`)).map(t.toCamel).map((e=>e.replace(/-?(\dxl)/gi,((e,t)=>`_${t}`)))).map((e=>n.modifiers[e])).filter(Boolean).join(" ")};t.getVerticalBreakpoint=e=>null===e?null:e>=o.globalHeightBreakpoints["2xl"]?"2xl":e>=o.globalHeightBreakpoints.xl?"xl":e>=o.globalHeightBreakpoints.lg?"lg":e>=o.globalHeightBreakpoints.md?"md":e>=o.globalHeightBreakpoints.sm?"sm":"default";t.getBreakpoint=e=>null===e?null:e>=o.globalWidthBreakpoints["2xl"]?"2xl":e>=o.globalWidthBreakpoints.xl?"xl":e>=o.globalWidthBreakpoints.lg?"lg":e>=o.globalWidthBreakpoints.md?"md":e>=o.globalWidthBreakpoints.sm?"sm":"default";const a=e=>e.toUpperCase().replace("-","").replace("_","");t.toCamel=e=>e.replace(/([-_][a-z])/gi,a),t.canUseDOM=!("undefined"==typeof window||!window.document||!window.document.createElement);t.getTextWidth=(e,t)=>{const n=getComputedStyle(t),r=document.createElement("canvas").getContext("2d");return r.font=n.font||(()=>{let e="";const t={"50%":"ultra-condensed","62.5%":"extra-condensed","75%":"condensed","87.5%":"semi-condensed","100%":"normal","112.5%":"semi-expanded","125%":"expanded","150%":"extra-expanded","200%":"ultra-expanded"};let r;return r=n.fontStretch in t?t[n.fontStretch]:"normal",e=n.fontStyle+" "+n.fontVariant+" "+n.fontWeight+" "+r+" "+n.fontSize+"/"+n.lineHeight+" "+n.fontFamily,e})(),r.measureText(e).width};t.innerDimensions=e=>{const t=getComputedStyle(e);let n=e.clientWidth,r=e.clientHeight;return r-=parseFloat(t.paddingTop)+parseFloat(t.paddingBottom),n-=parseFloat(t.paddingLeft)+parseFloat(t.paddingRight),{height:r,width:n}};t.trimLeft=(e,n)=>{const r=(0,t.innerDimensions)(e).width;let o=n;if((0,t.getTextWidth)(n,e)>r){for(;(0,t.getTextWidth)(`...${o}`,e)>r;)o=o.substring(1);e.value?e.value=`...${o}`:e.innerText=`...${o}`}else e.value?e.value=n:e.innerText=n};t.preventedEvents=e=>e.reduce(((e,t)=>Object.assign(Object.assign({},e),{[t]:e=>{e.preventDefault()}})),{})},70058:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Bullseye=void 0;const r=n(31635),o=r.__importStar(n(96540)),a=n(33774),i=r.__importDefault(n(46646));t.Bullseye=e=>{var{children:t=null,className:n="",component:l="div"}=e,c=r.__rest(e,["children","className","component"]);const f=l;return o.createElement(f,Object.assign({className:(0,a.css)(i.default.bullseye,n)},c),t)},t.Bullseye.displayName="Bullseye"},2089:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});n(31635).__exportStar(n(70058),t)},74769:(e,t,n)=>{"use strict";t.wt=t.YC=t.lK=void 0;const r=n(31635),o=r.__importStar(n(96540));var a;!function(e){e.sm="sm",e.md="md",e.lg="lg",e.xl="xl"}(a=t.lK||(t.lK={}));t.YC=e=>{switch(e){case a.sm:return"1em";case a.md:return"1.5em";case a.lg:return"2em";case a.xl:return"3em";default:return"1em"}};let i=0;t.wt=function({name:e,xOffset:n=0,yOffset:l=0,width:c,height:f,svgPath:s}){var u;return(u=class extends o.Component{constructor(){super(...arguments),this.id="icon-title-"+i++}render(){const e=this.props,{size:a,color:i,title:u,noVerticalAlign:p}=e,d=r.__rest(e,["size","color","title","noVerticalAlign"]),A=Boolean(u),m=(0,t.YC)(a),b=-.125*Number.parseFloat(m),v=p?null:{verticalAlign:`${b}em`},g=[n,l,c,f].join(" ");return o.createElement("svg",Object.assign({style:v,fill:i,height:m,width:m,viewBox:g,"aria-labelledby":A?this.id:null,"aria-hidden":!A||null,role:"img"},d),A&&o.createElement("title",{id:this.id},u),o.createElement("path",{d:s}))}}).displayName=e,u.defaultProps={color:"currentColor",size:a.sm,noVerticalAlign:!1},u}},56846:(e,t,n)=>{"use strict";t.__esModule=!0,t.BellIconConfig={name:"BellIcon",height:1024,width:896,svgPath:"M448,0 C465.333333,0 480.333333,6.33333333 493,19 C505.666667,31.6666667 512,46.6666667 512,64 L512,106 L514.23,106.45 C587.89,121.39 648.48,157.24 696,214 C744,271.333333 768,338.666667 768,416 C768,500 780,568.666667 804,622 C818.666667,652.666667 841.333333,684 872,716 C873.773676,718.829136 875.780658,721.505113 878,724 C890,737.333333 896,752.333333 896,769 C896,785.666667 890,800.333333 878,813 C866,825.666667 850.666667,832 832,832 L63.3,832 C44.9533333,831.84 29.8533333,825.506667 18,813 C6,800.333333 0,785.666667 0,769 C0,752.333333 6,737.333333 18,724 L24,716 L25.06,714.9 C55.1933333,683.28 77.5066667,652.313333 92,622 C116,568.666667 128,500 128,416 C128,338.666667 152,271.333333 200,214 C248,156.666667 309.333333,120.666667 384,106 L384,63.31 C384.166667,46.27 390.5,31.5 403,19 C415.666667,6.33333333 430.666667,0 448,0 Z M576,896 L576,897.08 C575.74,932.6 563.073333,962.573333 538,987 C512.666667,1011.66667 482.666667,1024 448,1024 C413.333333,1024 383.333333,1011.66667 358,987 C332.666667,962.333333 320,932 320,896 L576,896 Z",yOffset:0,xOffset:0},t.BellIcon=n(74769).wt(t.BellIconConfig),t.default=t.BellIcon},42600:(e,t,n)=>{"use strict";t.__esModule=!0,t.CheckCircleIconConfig={name:"CheckCircleIcon",height:512,width:512,svgPath:"M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zM227.314 387.314l184-184c6.248-6.248 6.248-16.379 0-22.627l-22.627-22.627c-6.248-6.249-16.379-6.249-22.628 0L216 308.118l-70.059-70.059c-6.248-6.248-16.379-6.248-22.628 0l-22.627 22.627c-6.248 6.248-6.248 16.379 0 22.627l104 104c6.249 6.249 16.379 6.249 22.628.001z",yOffset:0,xOffset:0},t.CheckCircleIcon=n(74769).wt(t.CheckCircleIconConfig),t.default=t.CheckCircleIcon},87945:(e,t,n)=>{"use strict";t.__esModule=!0,t.ExclamationCircleIconConfig={name:"ExclamationCircleIcon",height:512,width:512,svgPath:"M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zm-248 50c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z",yOffset:0,xOffset:0},t.ExclamationCircleIcon=n(74769).wt(t.ExclamationCircleIconConfig),t.default=t.ExclamationCircleIcon},98457:(e,t,n)=>{"use strict";t.__esModule=!0,t.ExclamationTriangleIconConfig={name:"ExclamationTriangleIcon",height:512,width:576,svgPath:"M569.517 440.013C587.975 472.007 564.806 512 527.94 512H48.054c-36.937 0-59.999-40.055-41.577-71.987L246.423 23.985c18.467-32.009 64.72-31.951 83.154 0l239.94 416.028zM288 354c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z",yOffset:0,xOffset:0},t.ExclamationTriangleIcon=n(74769).wt(t.ExclamationTriangleIconConfig),t.default=t.ExclamationTriangleIcon},47836:(e,t,n)=>{"use strict";t.__esModule=!0,t.InfoCircleIconConfig={name:"InfoCircleIcon",height:512,width:512,svgPath:"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z",yOffset:0,xOffset:0},t.InfoCircleIcon=n(74769).wt(t.InfoCircleIconConfig),t.default=t.InfoCircleIcon},8778:(e,t,n)=>{"use strict";t.__esModule=!0,t.KeyboardIconConfig={name:"KeyboardIcon",height:512,width:576,svgPath:"M528 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h480c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48zM128 180v-40c0-6.627-5.373-12-12-12H76c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm-336 96v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm-336 96v-40c0-6.627-5.373-12-12-12H76c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm288 0v-40c0-6.627-5.373-12-12-12H172c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h232c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12z",yOffset:0,xOffset:0},t.KeyboardIcon=n(74769).wt(t.KeyboardIconConfig),t.default=t.KeyboardIcon},26403:(e,t,n)=>{"use strict";t.__esModule=!0,t.TimesIconConfig={name:"TimesIcon",height:512,width:352,svgPath:"M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z",yOffset:0,xOffset:0},t.TimesIcon=n(74769).wt(t.TimesIconConfig),t.default=t.TimesIcon},15319:(e,t,n)=>{"use strict";t.__esModule=!0,n(35437),t.default={backdrop:"pf-c-backdrop",backdropOpen:"pf-c-backdrop__open"}},3889:(e,t,n)=>{"use strict";t.__esModule=!0,n(41719),t.default={badge:"pf-c-badge",modifiers:{read:"pf-m-read",unread:"pf-m-unread"},themeDark:"pf-theme-dark"}},57319:(e,t,n)=>{"use strict";t.__esModule=!0,n(61365),t.default={badge:"pf-c-badge",button:"pf-c-button",buttonCount:"pf-c-button__count",buttonIcon:"pf-c-button__icon",buttonProgress:"pf-c-button__progress",modifiers:{active:"pf-m-active",block:"pf-m-block",small:"pf-m-small",primary:"pf-m-primary",displayLg:"pf-m-display-lg",secondary:"pf-m-secondary",tertiary:"pf-m-tertiary",link:"pf-m-link",unread:"pf-m-unread",inline:"pf-m-inline",danger:"pf-m-danger",warning:"pf-m-warning",control:"pf-m-control",expanded:"pf-m-expanded",plain:"pf-m-plain",disabled:"pf-m-disabled",ariaDisabled:"pf-m-aria-disabled",progress:"pf-m-progress",inProgress:"pf-m-in-progress",start:"pf-m-start",end:"pf-m-end",overpassFont:"pf-m-overpass-font"},spinner:"pf-c-spinner",themeDark:"pf-theme-dark"}},37969:(e,t,n)=>{"use strict";t.__esModule=!0,n(96175),t.default={content:"pf-c-content",modifiers:{visited:"pf-m-visited",plain:"pf-m-plain",overpassFont:"pf-m-overpass-font"}}},52809:(e,t,n)=>{"use strict";t.__esModule=!0,n(9079),t.default={drawer:"pf-c-drawer",drawerActions:"pf-c-drawer__actions",drawerBody:"pf-c-drawer__body",drawerClose:"pf-c-drawer__close",drawerContent:"pf-c-drawer__content",drawerHead:"pf-c-drawer__head",drawerMain:"pf-c-drawer__main",drawerPanel:"pf-c-drawer__panel",drawerPanelMain:"pf-c-drawer__panel-main",drawerSection:"pf-c-drawer__section",drawerSplitter:"pf-c-drawer__splitter",drawerSplitterHandle:"pf-c-drawer__splitter-handle",modifiers:{panelBottom:"pf-m-panel-bottom",inline:"pf-m-inline",noBorder:"pf-m-no-border",resizable:"pf-m-resizable",static:"pf-m-static",panelLeft:"pf-m-panel-left",expanded:"pf-m-expanded",resizing:"pf-m-resizing",noBackground:"pf-m-no-background",light_200:"pf-m-light-200",noPadding:"pf-m-no-padding",padding:"pf-m-padding",vertical:"pf-m-vertical",width_25:"pf-m-width-25",width_33:"pf-m-width-33",width_50:"pf-m-width-50",width_66:"pf-m-width-66",width_75:"pf-m-width-75",width_100:"pf-m-width-100",width_25OnLg:"pf-m-width-25-on-lg",width_33OnLg:"pf-m-width-33-on-lg",width_50OnLg:"pf-m-width-50-on-lg",width_66OnLg:"pf-m-width-66-on-lg",width_75OnLg:"pf-m-width-75-on-lg",width_100OnLg:"pf-m-width-100-on-lg",width_25OnXl:"pf-m-width-25-on-xl",width_33OnXl:"pf-m-width-33-on-xl",width_50OnXl:"pf-m-width-50-on-xl",width_66OnXl:"pf-m-width-66-on-xl",width_75OnXl:"pf-m-width-75-on-xl",width_100OnXl:"pf-m-width-100-on-xl",width_25On_2xl:"pf-m-width-25-on-2xl",width_33On_2xl:"pf-m-width-33-on-2xl",width_50On_2xl:"pf-m-width-50-on-2xl",width_66On_2xl:"pf-m-width-66-on-2xl",width_75On_2xl:"pf-m-width-75-on-2xl",width_100On_2xl:"pf-m-width-100-on-2xl",inlineOnLg:"pf-m-inline-on-lg",staticOnLg:"pf-m-static-on-lg",inlineOnXl:"pf-m-inline-on-xl",staticOnXl:"pf-m-static-on-xl",inlineOn_2xl:"pf-m-inline-on-2xl",staticOn_2xl:"pf-m-static-on-2xl"},pageMain:"pf-c-page__main",themeDark:"pf-theme-dark"}},18704:(e,t,n)=>{"use strict";t.__esModule=!0,n(85708),t.default={button:"pf-c-button",modalBox:"pf-c-modal-box",modalBoxBody:"pf-c-modal-box__body",modalBoxDescription:"pf-c-modal-box__description",modalBoxFooter:"pf-c-modal-box__footer",modalBoxHeader:"pf-c-modal-box__header",modalBoxHeaderMain:"pf-c-modal-box__header-main",modalBoxTitle:"pf-c-modal-box__title",modalBoxTitleIcon:"pf-c-modal-box__title-icon",modalBoxTitleText:"pf-c-modal-box__title-text",modifiers:{sm:"pf-m-sm",md:"pf-m-md",lg:"pf-m-lg",alignTop:"pf-m-align-top",danger:"pf-m-danger",warning:"pf-m-warning",success:"pf-m-success",default:"pf-m-default",info:"pf-m-info",help:"pf-m-help",icon:"pf-m-icon"},themeDark:"pf-theme-dark"}},6169:(e,t,n)=>{"use strict";t.__esModule=!0,n(37303),t.default={modifiers:{inline:"pf-m-inline",sm:"pf-m-sm",md:"pf-m-md",lg:"pf-m-lg",xl:"pf-m-xl"},spinner:"pf-c-spinner",spinnerClipper:"pf-c-spinner__clipper",spinnerLeadBall:"pf-c-spinner__lead-ball",spinnerPath:"pf-c-spinner__path",spinnerTailBall:"pf-c-spinner__tail-ball"}},76741:(e,t,n)=>{"use strict";t.__esModule=!0,n(75235),t.default={modifiers:{"4xl":"pf-m-4xl","3xl":"pf-m-3xl","2xl":"pf-m-2xl",xl:"pf-m-xl",lg:"pf-m-lg",md:"pf-m-md",overpassFont:"pf-m-overpass-font"},title:"pf-c-title"}},6881:(e,t,n)=>{"use strict";t.__esModule=!0,n(93175),t.default={modifiers:{top:"pf-m-top",topLeft:"pf-m-top-left",topRight:"pf-m-top-right",bottom:"pf-m-bottom",bottomLeft:"pf-m-bottom-left",bottomRight:"pf-m-bottom-right",left:"pf-m-left",leftTop:"pf-m-left-top",leftBottom:"pf-m-left-bottom",right:"pf-m-right",rightTop:"pf-m-right-top",rightBottom:"pf-m-right-bottom",textAlignLeft:"pf-m-text-align-left"},themeDark:"pf-theme-dark",tooltip:"pf-c-tooltip",tooltipArrow:"pf-c-tooltip__arrow",tooltipContent:"pf-c-tooltip__content"}},46646:(e,t,n)=>{"use strict";t.__esModule=!0,n(3866),t.default={bullseye:"pf-l-bullseye"}},18913:(e,t,n)=>{"use strict";t.__esModule=!0,n(31447),t.default={hidden:"pf-u-hidden",hiddenOnLg:"pf-u-hidden-on-lg",hiddenOnMd:"pf-u-hidden-on-md",hiddenOnSm:"pf-u-hidden-on-sm",hiddenOnXl:"pf-u-hidden-on-xl",hiddenOn_2xl:"pf-u-hidden-on-2xl",screenReader:"pf-u-screen-reader",screenReaderOnLg:"pf-u-screen-reader-on-lg",screenReaderOnMd:"pf-u-screen-reader-on-md",screenReaderOnSm:"pf-u-screen-reader-on-sm",screenReaderOnXl:"pf-u-screen-reader-on-xl",screenReaderOn_2xl:"pf-u-screen-reader-on-2xl",visible:"pf-u-visible",visibleOnLg:"pf-u-visible-on-lg",visibleOnMd:"pf-u-visible-on-md",visibleOnSm:"pf-u-visible-on-sm",visibleOnXl:"pf-u-visible-on-xl",visibleOn_2xl:"pf-u-visible-on-2xl"}},33774:(e,t,n)=>{"use strict";function r(...e){const t=[],n={}.hasOwnProperty;return e.filter(Boolean).forEach((e=>{const o=typeof e;if("string"===o||"number"===o)t.push(e);else if(Array.isArray(e)&&e.length){const n=r(...e);n&&t.push(n)}else if("object"===o)for(const r in e)n.call(e,r)&&e[r]&&t.push(r)})),t.join(" ")}n.r(t),n.d(t,{css:()=>r})},33214:(e,t)=>{"use strict";t.__esModule=!0,t.c_modal_box_m_align_top_spacer={name:"--pf-c-modal-box--m-align-top--spacer",value:"0.5rem",var:"var(--pf-c-modal-box--m-align-top--spacer)"},t.default=t.c_modal_box_m_align_top_spacer},7986:(e,t)=>{"use strict";t.__esModule=!0,t.c_tooltip_MaxWidth={name:"--pf-c-tooltip--MaxWidth",value:"18.75rem",var:"var(--pf-c-tooltip--MaxWidth)"},t.default=t.c_tooltip_MaxWidth},87510:(e,t)=>{"use strict";t.__esModule=!0,t.global_breakpoint_2xl={name:"--pf-global--breakpoint--2xl",value:"1450px",var:"var(--pf-global--breakpoint--2xl)"},t.default=t.global_breakpoint_2xl},16359:(e,t)=>{"use strict";t.__esModule=!0,t.global_breakpoint_lg={name:"--pf-global--breakpoint--lg",value:"992px",var:"var(--pf-global--breakpoint--lg)"},t.default=t.global_breakpoint_lg},58551:(e,t)=>{"use strict";t.__esModule=!0,t.global_breakpoint_md={name:"--pf-global--breakpoint--md",value:"768px",var:"var(--pf-global--breakpoint--md)"},t.default=t.global_breakpoint_md},51418:(e,t)=>{"use strict";t.__esModule=!0,t.global_breakpoint_sm={name:"--pf-global--breakpoint--sm",value:"576px",var:"var(--pf-global--breakpoint--sm)"},t.default=t.global_breakpoint_sm},94342:(e,t)=>{"use strict";t.__esModule=!0,t.global_breakpoint_xl={name:"--pf-global--breakpoint--xl",value:"1200px",var:"var(--pf-global--breakpoint--xl)"},t.default=t.global_breakpoint_xl},63164:(e,t)=>{"use strict";t.__esModule=!0,t.global_height_breakpoint_2xl={name:"--pf-global--height-breakpoint--2xl",value:"80rem",var:"var(--pf-global--height-breakpoint--2xl)"},t.default=t.global_height_breakpoint_2xl},58865:(e,t)=>{"use strict";t.__esModule=!0,t.global_height_breakpoint_lg={name:"--pf-global--height-breakpoint--lg",value:"48rem",var:"var(--pf-global--height-breakpoint--lg)"},t.default=t.global_height_breakpoint_lg},98437:(e,t)=>{"use strict";t.__esModule=!0,t.global_height_breakpoint_md={name:"--pf-global--height-breakpoint--md",value:"40rem",var:"var(--pf-global--height-breakpoint--md)"},t.default=t.global_height_breakpoint_md},22596:(e,t)=>{"use strict";t.__esModule=!0,t.global_height_breakpoint_sm={name:"--pf-global--height-breakpoint--sm",value:"0",var:"var(--pf-global--height-breakpoint--sm)"},t.default=t.global_height_breakpoint_sm},92692:(e,t)=>{"use strict";t.__esModule=!0,t.global_height_breakpoint_xl={name:"--pf-global--height-breakpoint--xl",value:"60rem",var:"var(--pf-global--height-breakpoint--xl)"},t.default=t.global_height_breakpoint_xl},8505:e=>{"use strict";function t(e,t,o){e instanceof RegExp&&(e=n(e,o)),t instanceof RegExp&&(t=n(t,o));var a=r(e,t,o);return a&&{start:a[0],end:a[1],pre:o.slice(0,a[0]),body:o.slice(a[0]+e.length,a[1]),post:o.slice(a[1]+t.length)}}function n(e,t){var n=t.match(e);return n?n[0]:null}function r(e,t,n){var r,o,a,i,l,c=n.indexOf(e),f=n.indexOf(t,c+1),s=c;if(c>=0&&f>0){if(e===t)return[c,f];for(r=[],a=n.length;s>=0&&!l;)s==c?(r.push(s),c=n.indexOf(e,s+1)):1==r.length?l=[r.pop(),f]:((o=r.pop())=0?c:f;r.length&&(l=[a,i])}return l}e.exports=t,t.range=r},49818:e=>{e.exports=function(e,n){for(var r=[],o=0;o{"use strict";n.d(t,{A:()=>kt});var r=n(31601),o=n.n(r),a=n(76314),i=n.n(a),l=n(4417),c=n.n(l),f=new URL(n(21844),n.b),s=new URL(n(25298),n.b),u=new URL(n(98053),n.b),p=new URL(n(43901),n.b),d=new URL(n(89145),n.b),A=new URL(n(86841),n.b),m=new URL(n(63856),n.b),b=new URL(n(32742),n.b),v=new URL(n(41105),n.b),g=new URL(n(21537),n.b),h=new URL(n(54974),n.b),y=new URL(n(17415),n.b),w=new URL(n(46235),n.b),Z=new URL(n(82170),n.b),x=new URL(n(30515),n.b),q=new URL(n(27722),n.b),W=new URL(n(25219),n.b),V=new URL(n(8802),n.b),T=new URL(n(39872),n.b),E=new URL(n(91443),n.b),O=new URL(n(56589),n.b),k=new URL(n(89894),n.b),z=new URL(n(41335),n.b),P=new URL(n(13111),n.b),B=new URL(n(34144),n.b),S=new URL(n(17878),n.b),M=new URL(n(57916),n.b),N=new URL(n(87370),n.b),j=new URL(n(74453),n.b),C=new URL(n(45869),n.b),R=new URL(n(73762),n.b),I=new URL(n(32288),n.b),F=new URL(n(14883),n.b),G=new URL(n(83963),n.b),U=new URL(n(13930),n.b),X=new URL(n(76664),n.b),D=new URL(n(58958),n.b),Y=new URL(n(42052),n.b),H=new URL(n(27433),n.b),L=new URL(n(33001),n.b),K=new URL(n(44130),n.b),J=new URL(n(78656),n.b),Q=new URL(n(84423),n.b),_=new URL(n(91847),n.b),$=new URL(n(73168),n.b),ee=new URL(n(41446),n.b),te=new URL(n(21481),n.b),ne=new URL(n(7529),n.b),re=new URL(n(63522),n.b),oe=new URL(n(3360),n.b),ae=new URL(n(40723),n.b),ie=new URL(n(95979),n.b),le=new URL(n(67580),n.b),ce=new URL(n(51850),n.b),fe=new URL(n(49286),n.b),se=new URL(n(22636),n.b),ue=new URL(n(60758),n.b),pe=new URL(n(40732),n.b),de=new URL(n(74325),n.b),Ae=new URL(n(32845),n.b),me=new URL(n(79507),n.b),be=new URL(n(23211),n.b),ve=new URL(n(60692),n.b),ge=new URL(n(5266),n.b),he=i()(o()),ye=c()(f),we=c()(s),Ze=c()(u),xe=c()(p),qe=c()(d),We=c()(A),Ve=c()(m),Te=c()(b),Ee=c()(v),Oe=c()(g),ke=c()(h),ze=c()(y),Pe=c()(w),Be=c()(Z),Se=c()(x),Me=c()(q),Ne=c()(W),je=c()(V),Ce=c()(T),Re=c()(E),Ie=c()(O),Fe=c()(k),Ge=c()(z),Ue=c()(P),Xe=c()(B),De=c()(S),Ye=c()(M),He=c()(N),Le=c()(j),Ke=c()(C),Je=c()(R),Qe=c()(I),_e=c()(F),$e=c()(G),et=c()(U),tt=c()(X),nt=c()(D),rt=c()(Y),ot=c()(H),at=c()(L),it=c()(K),lt=c()(J),ct=c()(Q),ft=c()(_),st=c()($),ut=c()(ee),pt=c()(te),dt=c()(ne),At=c()(re),mt=c()(oe),bt=c()(ae),vt=c()(ie),gt=c()(le),ht=c()(ce),yt=c()(fe),wt=c()(se),Zt=c()(ue),xt=c()(pe),qt=c()(de),Wt=c()(Ae),Vt=c()(me),Tt=c()(be),Et=c()(ve),Ot=c()(ge);he.push([e.id,`.pf-t-light {\n --pf-global--Color--100: var(--pf-global--Color--dark-100);\n --pf-global--Color--200: var(--pf-global--Color--dark-200);\n --pf-global--BorderColor--100: var(--pf-global--BorderColor--dark-100);\n --pf-global--primary-color--100: var(--pf-global--primary-color--dark-100);\n --pf-global--link--Color: var(--pf-global--link--Color--dark);\n --pf-global--link--Color--hover: var(--pf-global--link--Color--dark--hover);\n --pf-global--BackgroundColor--100: var(--pf-global--BackgroundColor--light-100);\n}\n\n.pf-t-dark {\n --pf-global--Color--100: var(--pf-global--Color--light-100);\n --pf-global--Color--200: var(--pf-global--Color--light-200);\n --pf-global--BorderColor--100: var(--pf-global--BorderColor--light-100);\n --pf-global--primary-color--100: var(--pf-global--primary-color--light-100);\n --pf-global--link--Color: var(--pf-global--link--Color--light);\n --pf-global--link--Color--hover: var(--pf-global--link--Color--light);\n --pf-global--BackgroundColor--100: var(--pf-global--BackgroundColor--dark-100);\n}\n\n.pf-t-dark .pf-c-card {\n --pf-c-card--BackgroundColor: var(--pf-global--BackgroundColor--dark-transparent-200);\n}\n\n.pf-t-dark .pf-c-button {\n --pf-c-button--m-primary--Color: var(--pf-global--primary-color--dark-100);\n --pf-c-button--m-primary--hover--Color: var(--pf-global--primary-color--dark-100);\n --pf-c-button--m-primary--focus--Color: var(--pf-global--primary-color--dark-100);\n --pf-c-button--m-primary--active--Color: var(--pf-global--primary-color--dark-100);\n --pf-c-button--m-primary--BackgroundColor: var(--pf-global--BackgroundColor--light-100);\n --pf-c-button--m-primary--hover--BackgroundColor: var(--pf-global--BackgroundColor--light-300);\n --pf-c-button--m-primary--focus--BackgroundColor: var(--pf-global--BackgroundColor--light-300);\n --pf-c-button--m-primary--active--BackgroundColor: var(--pf-global--BackgroundColor--light-300);\n --pf-c-button--m-secondary--Color: var(--pf-global--Color--light-100);\n --pf-c-button--m-secondary--hover--Color: var(--pf-global--Color--light-100);\n --pf-c-button--m-secondary--focus--Color: var(--pf-global--Color--light-100);\n --pf-c-button--m-secondary--active--Color: var(--pf-global--Color--light-100);\n --pf-c-button--m-secondary--BorderColor: var(--pf-global--Color--light-100);\n --pf-c-button--m-secondary--hover--BorderColor: var(--pf-global--Color--light-100);\n --pf-c-button--m-secondary--focus--BorderColor: var(--pf-global--Color--light-100);\n --pf-c-button--m-secondary--active--BorderColor: var(--pf-global--Color--light-100);\n}\n\n:root {\n --pf-global--palette--black-100: #fafafa;\n --pf-global--palette--black-150: #f5f5f5;\n --pf-global--palette--black-200: #f0f0f0;\n --pf-global--palette--black-300: #d2d2d2;\n --pf-global--palette--black-400: #b8bbbe;\n --pf-global--palette--black-500: #8a8d90;\n --pf-global--palette--black-600: #6a6e73;\n --pf-global--palette--black-700: #4f5255;\n --pf-global--palette--black-800: #3c3f42;\n --pf-global--palette--black-850: #212427;\n --pf-global--palette--black-900: #151515;\n --pf-global--palette--black-1000: #030303;\n --pf-global--palette--blue-50: #e7f1fa;\n --pf-global--palette--blue-100: #bee1f4;\n --pf-global--palette--blue-200: #73bcf7;\n --pf-global--palette--blue-300: #2b9af3;\n --pf-global--palette--blue-400: #06c;\n --pf-global--palette--blue-500: #004080;\n --pf-global--palette--blue-600: #002952;\n --pf-global--palette--blue-700: #001223;\n --pf-global--palette--cyan-50: #f2f9f9;\n --pf-global--palette--cyan-100: #a2d9d9;\n --pf-global--palette--cyan-200: #73c5c5;\n --pf-global--palette--cyan-300: #009596;\n --pf-global--palette--cyan-400: #005f60;\n --pf-global--palette--cyan-500: #003737;\n --pf-global--palette--cyan-600: #002323;\n --pf-global--palette--cyan-700: #000f0f;\n --pf-global--palette--gold-50: #fdf7e7;\n --pf-global--palette--gold-100: #f9e0a2;\n --pf-global--palette--gold-200: #f6d173;\n --pf-global--palette--gold-300: #f4c145;\n --pf-global--palette--gold-400: #f0ab00;\n --pf-global--palette--gold-500: #c58c00;\n --pf-global--palette--gold-600: #795600;\n --pf-global--palette--gold-700: #3d2c00;\n --pf-global--palette--green-50: #f3faf2;\n --pf-global--palette--green-100: #bde5b8;\n --pf-global--palette--green-200: #95d58e;\n --pf-global--palette--green-300: #6ec664;\n --pf-global--palette--green-400: #5ba352;\n --pf-global--palette--green-500: #3e8635;\n --pf-global--palette--green-600: #1e4f18;\n --pf-global--palette--green-700: #0f280d;\n --pf-global--palette--light-blue-100: #beedf9;\n --pf-global--palette--light-blue-200: #7cdbf3;\n --pf-global--palette--light-blue-300: #35caed;\n --pf-global--palette--light-blue-400: #00b9e4;\n --pf-global--palette--light-blue-500: #008bad;\n --pf-global--palette--light-blue-600: #005c73;\n --pf-global--palette--light-blue-700: #002d39;\n --pf-global--palette--light-green-100: #e4f5bc;\n --pf-global--palette--light-green-200: #c8eb79;\n --pf-global--palette--light-green-300: #ace12e;\n --pf-global--palette--light-green-400: #92d400;\n --pf-global--palette--light-green-500: #6ca100;\n --pf-global--palette--light-green-600: #486b00;\n --pf-global--palette--light-green-700: #253600;\n --pf-global--palette--orange-50: #fff6ec;\n --pf-global--palette--orange-100: #f4b678;\n --pf-global--palette--orange-200: #ef9234;\n --pf-global--palette--orange-300: #ec7a08;\n --pf-global--palette--orange-400: #c46100;\n --pf-global--palette--orange-500: #8f4700;\n --pf-global--palette--orange-600: #773d00;\n --pf-global--palette--orange-700: #3b1f00;\n --pf-global--palette--purple-50: #f2f0fc;\n --pf-global--palette--purple-100: #cbc1ff;\n --pf-global--palette--purple-200: #b2a3ff;\n --pf-global--palette--purple-300: #a18fff;\n --pf-global--palette--purple-400: #8476d1;\n --pf-global--palette--purple-500: #6753ac;\n --pf-global--palette--purple-600: #40199a;\n --pf-global--palette--purple-700: #1f0066;\n --pf-global--palette--red-50: #faeae8;\n --pf-global--palette--red-100: #c9190b;\n --pf-global--palette--red-200: #a30000;\n --pf-global--palette--red-300: #7d1007;\n --pf-global--palette--red-400: #470000;\n --pf-global--palette--red-500: #2c0000;\n --pf-global--palette--white: #fff;\n --pf-global--BackgroundColor--100: #fff;\n --pf-global--BackgroundColor--150: #fafafa;\n --pf-global--BackgroundColor--200: #f0f0f0;\n --pf-global--BackgroundColor--light-100: #fff;\n --pf-global--BackgroundColor--light-200: #fafafa;\n --pf-global--BackgroundColor--light-300: #f0f0f0;\n --pf-global--BackgroundColor--dark-100: #151515;\n --pf-global--BackgroundColor--dark-200: #3c3f42;\n --pf-global--BackgroundColor--dark-300: #212427;\n --pf-global--BackgroundColor--dark-400: #4f5255;\n --pf-global--BackgroundColor--dark-transparent-100: rgba(3, 3, 3, 0.62);\n --pf-global--BackgroundColor--dark-transparent-200: rgba(3, 3, 3, 0.32);\n --pf-global--Color--100: #151515;\n --pf-global--Color--200: #6a6e73;\n --pf-global--Color--300: #3c3f42;\n --pf-global--Color--400: #8a8d90;\n --pf-global--Color--light-100: #fff;\n --pf-global--Color--light-200: #f0f0f0;\n --pf-global--Color--light-300: #d2d2d2;\n --pf-global--Color--dark-100: #151515;\n --pf-global--Color--dark-200: #6a6e73;\n --pf-global--active-color--100: #06c;\n --pf-global--active-color--200: #bee1f4;\n --pf-global--active-color--300: #2b9af3;\n --pf-global--active-color--400: #73bcf7;\n --pf-global--disabled-color--100: #6a6e73;\n --pf-global--disabled-color--200: #d2d2d2;\n --pf-global--disabled-color--300: #f0f0f0;\n --pf-global--primary-color--100: #06c;\n --pf-global--primary-color--200: #004080;\n --pf-global--primary-color--light-100: #73bcf7;\n --pf-global--primary-color--dark-100: #06c;\n --pf-global--secondary-color--100: #6a6e73;\n --pf-global--default-color--100: #73c5c5;\n --pf-global--default-color--200: #009596;\n --pf-global--default-color--300: #003737;\n --pf-global--success-color--100: #3e8635;\n --pf-global--success-color--200: #1e4f18;\n --pf-global--info-color--100: #2b9af3;\n --pf-global--info-color--200: #002952;\n --pf-global--warning-color--100: #f0ab00;\n --pf-global--warning-color--200: #795600;\n --pf-global--danger-color--100: #c9190b;\n --pf-global--danger-color--200: #a30000;\n --pf-global--danger-color--300: #470000;\n --pf-global--BoxShadow--sm: 0 0.0625rem 0.125rem 0 rgba(3, 3, 3, 0.12), 0 0 0.125rem 0 rgba(3, 3, 3, 0.06);\n --pf-global--BoxShadow--sm-top: 0 -0.125rem 0.25rem -0.0625rem rgba(3, 3, 3, 0.16);\n --pf-global--BoxShadow--sm-right: 0.125rem 0 0.25rem -0.0625rem rgba(3, 3, 3, 0.16);\n --pf-global--BoxShadow--sm-bottom: 0 0.125rem 0.25rem -0.0625rem rgba(3, 3, 3, 0.16);\n --pf-global--BoxShadow--sm-left: -0.125rem 0 0.25rem -0.0625rem rgba(3, 3, 3, 0.16);\n --pf-global--BoxShadow--md: 0 0.25rem 0.5rem 0rem rgba(3, 3, 3, 0.12), 0 0 0.25rem 0 rgba(3, 3, 3, 0.06);\n --pf-global--BoxShadow--md-top: 0 -0.5rem 0.5rem -0.375rem rgba(3, 3, 3, 0.18);\n --pf-global--BoxShadow--md-right: 0.5rem 0 0.5rem -0.375rem rgba(3, 3, 3, 0.18);\n --pf-global--BoxShadow--md-bottom: 0 0.5rem 0.5rem -0.375rem rgba(3, 3, 3, 0.18);\n --pf-global--BoxShadow--md-left: -0.5rem 0 0.5rem -0.375rem rgba(3, 3, 3, 0.18);\n --pf-global--BoxShadow--lg: 0 0.5rem 1rem 0 rgba(3, 3, 3, 0.16), 0 0 0.375rem 0 rgba(3, 3, 3, 0.08);\n --pf-global--BoxShadow--lg-top: 0 -0.75rem 0.75rem -0.5rem rgba(3, 3, 3, 0.18);\n --pf-global--BoxShadow--lg-right: 0.75rem 0 0.75rem -0.5rem rgba(3, 3, 3, 0.18);\n --pf-global--BoxShadow--lg-bottom: 0 0.75rem 0.75rem -0.5rem rgba(3, 3, 3, 0.18);\n --pf-global--BoxShadow--lg-left: -0.75rem 0 0.75rem -0.5rem rgba(3, 3, 3, 0.18);\n --pf-global--BoxShadow--xl: 0 1rem 2rem 0 rgba(3, 3, 3, 0.16), 0 0 0.5rem 0 rgba(3, 3, 3, 0.1);\n --pf-global--BoxShadow--xl-top: 0 -1rem 1rem -0.5rem rgba(3, 3, 3, 0.2);\n --pf-global--BoxShadow--xl-right: 1rem 0 1rem -0.5rem rgba(3, 3, 3, 0.2);\n --pf-global--BoxShadow--xl-bottom: 0 1rem 1rem -0.5rem rgba(3, 3, 3, 0.2);\n --pf-global--BoxShadow--xl-left: -1rem 0 1rem -0.5rem rgba(3, 3, 3, 0.2);\n --pf-global--BoxShadow--inset: inset 0 0 0.625rem 0 rgba(3, 3, 3, 0.25);\n --pf-global--font-path: "./assets/fonts";\n --pf-global--fonticon-path: "./assets/pficon";\n --pf-global--spacer--xs: 0.25rem;\n --pf-global--spacer--sm: 0.5rem;\n --pf-global--spacer--md: 1rem;\n --pf-global--spacer--lg: 1.5rem;\n --pf-global--spacer--xl: 2rem;\n --pf-global--spacer--2xl: 3rem;\n --pf-global--spacer--3xl: 4rem;\n --pf-global--spacer--4xl: 5rem;\n --pf-global--spacer--form-element: 0.375rem;\n --pf-global--gutter: 1rem;\n --pf-global--gutter--md: 1.5rem;\n --pf-global--ZIndex--xs: 100;\n --pf-global--ZIndex--sm: 200;\n --pf-global--ZIndex--md: 300;\n --pf-global--ZIndex--lg: 400;\n --pf-global--ZIndex--xl: 500;\n --pf-global--ZIndex--2xl: 600;\n --pf-global--breakpoint--xs: 0;\n --pf-global--breakpoint--sm: 576px;\n --pf-global--breakpoint--md: 768px;\n --pf-global--breakpoint--lg: 992px;\n --pf-global--breakpoint--xl: 1200px;\n --pf-global--breakpoint--2xl: 1450px;\n --pf-global--height-breakpoint--sm: 0;\n --pf-global--height-breakpoint--md: 40rem;\n --pf-global--height-breakpoint--lg: 48rem;\n --pf-global--height-breakpoint--xl: 60rem;\n --pf-global--height-breakpoint--2xl: 80rem;\n --pf-global--link--Color: #06c;\n --pf-global--link--Color--hover: #004080;\n --pf-global--link--Color--light: #2b9af3;\n --pf-global--link--Color--light--hover: #73bcf7;\n --pf-global--link--Color--dark: #06c;\n --pf-global--link--Color--dark--hover: #004080;\n --pf-global--link--Color--visited: #40199a;\n --pf-global--link--TextDecoration: none;\n --pf-global--link--TextDecoration--hover: underline;\n --pf-global--BorderWidth--sm: 1px;\n --pf-global--BorderWidth--md: 2px;\n --pf-global--BorderWidth--lg: 3px;\n --pf-global--BorderWidth--xl: 4px;\n --pf-global--BorderColor--100: #d2d2d2;\n --pf-global--BorderColor--200: #8a8d90;\n --pf-global--BorderColor--300: #f0f0f0;\n --pf-global--BorderColor--dark-100: #d2d2d2;\n --pf-global--BorderColor--light-100: #b8bbbe;\n --pf-global--BorderRadius--sm: 3px;\n --pf-global--BorderRadius--lg: 30em;\n --pf-global--icon--Color--light: #6a6e73;\n --pf-global--icon--Color--dark: #151515;\n --pf-global--icon--FontSize--sm: 0.625rem;\n --pf-global--icon--FontSize--md: 1.125rem;\n --pf-global--icon--FontSize--lg: 1.5rem;\n --pf-global--icon--FontSize--xl: 3.375rem;\n --pf-global--FontFamily--sans-serif: "RedHatText", "Overpass", overpass, helvetica, arial, sans-serif;\n --pf-global--FontFamily--heading--sans-serif: "RedHatDisplay", "Overpass", overpass, helvetica, arial, sans-serif;\n --pf-global--FontFamily--monospace: "Liberation Mono", consolas, "SFMono-Regular", menlo, monaco, "Courier New", monospace;\n --pf-global--FontFamily--redhat-updated--sans-serif: "RedHatTextUpdated", "Overpass", overpass, helvetica, arial, sans-serif;\n --pf-global--FontFamily--redhat-updated--heading--sans-serif: "RedHatDisplayUpdated", "Overpass", overpass, helvetica, arial, sans-serif;\n --pf-global--FontFamily--redhat--monospace: "RedHatMono", "Liberation Mono", consolas, "SFMono-Regular", menlo, monaco, "Courier New", monospace;\n --pf-global--FontFamily--redhatVF--sans-serif: "RedHatTextVF", "RedHatText", "Overpass", overpass, helvetica, arial, sans-serif;\n --pf-global--FontFamily--redhatVF--heading--sans-serif: "RedHatDisplayVF", "RedHatDisplay", "Overpass", overpass, helvetica, arial, sans-serif;\n --pf-global--FontFamily--redhatVF--monospace: "RedHatMonoVF", "RedHatMono", "Liberation Mono", consolas, "SFMono-Regular", menlo, monaco, "Courier New", monospace;\n --pf-global--FontFamily--overpass--sans-serif: "overpass", overpass, "open sans", -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";\n --pf-global--FontFamily--overpass--monospace: "overpass-mono", overpass-mono, "SFMono-Regular", menlo, monaco, consolas, "Liberation Mono", "Courier New", monospace;\n --pf-global--FontSize--4xl: 2.25rem;\n --pf-global--FontSize--3xl: 1.75rem;\n --pf-global--FontSize--2xl: 1.5rem;\n --pf-global--FontSize--xl: 1.25rem;\n --pf-global--FontSize--lg: 1.125rem;\n --pf-global--FontSize--md: 1rem;\n --pf-global--FontSize--sm: 0.875rem;\n --pf-global--FontSize--xs: 0.75rem;\n --pf-global--FontWeight--light: 300;\n --pf-global--FontWeight--normal: 400;\n --pf-global--FontWeight--semi-bold: 700;\n --pf-global--FontWeight--overpass--semi-bold: 500;\n --pf-global--FontWeight--bold: 700;\n --pf-global--FontWeight--overpass--bold: 600;\n --pf-global--LineHeight--sm: 1.3;\n --pf-global--LineHeight--md: 1.5;\n --pf-global--ListStyle: disc outside;\n --pf-global--Transition: all 250ms cubic-bezier(0.42, 0, 0.58, 1);\n --pf-global--TimingFunction: cubic-bezier(0.645, 0.045, 0.355, 1);\n --pf-global--TransitionDuration: 250ms;\n --pf-global--arrow--width: 0.9375rem;\n --pf-global--arrow--width-lg: 1.5625rem;\n --pf-global--target-size--MinWidth: 44px;\n --pf-global--target-size--MinHeight: 44px;\n}\n\n.pf-m-overpass-font {\n --pf-global--FontFamily--sans-serif: var(--pf-global--FontFamily--overpass--sans-serif);\n --pf-global--FontFamily--heading--sans-serif: var(--pf-global--FontFamily--sans-serif);\n --pf-global--FontFamily--monospace: var(--pf-global--FontFamily--overpass--monospace);\n --pf-global--FontWeight--semi-bold: var(--pf-global--FontWeight--overpass--semi-bold);\n --pf-global--FontWeight--bold: var(--pf-global--FontWeight--overpass--bold);\n}\n\n.pf-m-redhat-updated-font {\n --pf-global--FontFamily--sans-serif: var(--pf-global--FontFamily--redhat-updated--sans-serif);\n --pf-global--FontFamily--heading--sans-serif: var(--pf-global--FontFamily--redhat-updated--heading--sans-serif);\n}\n\n.pf-m-redhatmono-font {\n --pf-global--FontFamily--monospace: var(--pf-global--FontFamily--redhat--monospace);\n}\n\n.pf-m-redhatVF-font {\n --pf-global--FontFamily--sans-serif: var(--pf-global--FontFamily--redhatVF--sans-serif);\n --pf-global--FontFamily--heading--sans-serif: var(--pf-global--FontFamily--redhatVF--heading--sans-serif);\n --pf-global--FontFamily--monospace: var(--pf-global--FontFamily--redhatVF--monospace);\n}\n\n:root:where(.pf-theme-dark) {\n --pf-global--palette--black-50: #e0e0e0;\n --pf-global--palette--black-100: #c6c7c8;\n --pf-global--palette--black-200: #aaabac;\n --pf-global--palette--black-300: #868789;\n --pf-global--palette--black-400: #57585a;\n --pf-global--palette--black-500: #444548;\n --pf-global--palette--black-600: #36373a;\n --pf-global--palette--black-700: #26292d;\n --pf-global--palette--black-800: #1b1d21;\n --pf-global--palette--black-900: #0f1214;\n --pf-global--palette--red-9999: #fe5142;\n --pf-global--palette--red-8888: #ff7468;\n --pf-global--palette--blue-300: #1fa7f8;\n --pf-global--BackgroundColor--100: #1b1d21;\n --pf-global--BackgroundColor--150: #212427;\n --pf-global--BackgroundColor--200: #0f1214;\n --pf-global--BackgroundColor--300: #26292d;\n --pf-global--BackgroundColor--400: #36373a;\n --pf-global--BorderColor--100: #444548;\n --pf-global--BorderColor--200: #444548;\n --pf-global--BorderColor--300: #57585a;\n --pf-global--BorderColor--400: #aaabac;\n --pf-global--Color--100: #e0e0e0;\n --pf-global--Color--200: #aaabac;\n --pf-global--active-color--100: #1fa7f8;\n --pf-global--primary-color--100: #1fa7f8;\n --pf-global--primary-color--300: #06c;\n --pf-global--success-color--100: #5ba352;\n --pf-global--warning-color--100: #f0ab00;\n --pf-global--warning-color--200: #f4c145;\n --pf-global--danger-color--100: #fe5142;\n --pf-global--danger-color--200: #ff7468;\n --pf-global--link--Color: #1fa7f8;\n --pf-global--link--Color--hover: #73bcf7;\n --pf-global--link--Color--visited: #a18fff;\n --pf-global--disabled-color--100: #57585a;\n --pf-global--disabled-color--200: #444548;\n --pf-global--disabled-color--300: #aaabac;\n --pf-global--icon--Color--light: #aaabac;\n --pf-global--icon--Color--dark: #aaabac;\n --pf-global--Color--dark-100: #e0e0e0;\n --pf-global--Color--dark-200: #aaabac;\n --pf-global--Color--light-100: #e0e0e0;\n --pf-global--Color--light-200: #aaabac;\n --pf-global--Color--light-300: #3c3f42;\n --pf-global--BorderColor--dark-100: #444548;\n --pf-global--BorderColor--light-100: #444548;\n --pf-global--primary-color--light-100: #1fa7f8;\n --pf-global--primary-color--dark-100: #1fa7f8;\n --pf-global--link--Color--light: #1fa7f8;\n --pf-global--link--Color--light--hover: #73bcf7;\n --pf-global--link--Color--dark: #1fa7f8;\n --pf-global--link--Color--dark--hover: #73bcf7;\n --pf-global--BackgroundColor--light-100: #1b1d21;\n --pf-global--BackgroundColor--light-200: #0f1214;\n --pf-global--BackgroundColor--light-300: #26292d;\n --pf-global--BackgroundColor--dark-100: #1b1d21;\n --pf-global--BackgroundColor--dark-200: #0f1214;\n --pf-global--BackgroundColor--dark-300: #26292d;\n --pf-global--BackgroundColor--dark-400: #36373a;\n --pf-global--BoxShadow--sm: 0 0.0625rem 0.125rem 0 rgba(3, 3, 3, 0.48), 0 0 0.125rem 0 rgba(3, 3, 3, 0.24);\n --pf-global--BoxShadow--sm-top: 0 -0.125rem 0.25rem -0.0625rem rgba(3, 3, 3, 0.64);\n --pf-global--BoxShadow--sm-right: 0.125rem 0 0.25rem -0.0625rem rgba(3, 3, 3, 0.64);\n --pf-global--BoxShadow--sm-bottom: 0 0.125rem 0.25rem -0.0625rem rgba(3, 3, 3, 0.64);\n --pf-global--BoxShadow--sm-left: -0.125rem 0 0.25rem -0.0625rem rgba(3, 3, 3, 0.64);\n --pf-global--BoxShadow--md: 0 0.25rem 0.5rem 0rem rgba(3, 3, 3, 0.48), 0 0 0.25rem 0 rgba(3, 3, 3, 0.24);\n --pf-global--BoxShadow--md-top: 0 -0.5rem 0.5rem -0.375rem rgba(3, 3, 3, 0.72);\n --pf-global--BoxShadow--md-right: 0.5rem 0 0.5rem -0.375rem rgba(3, 3, 3, 0.72);\n --pf-global--BoxShadow--md-bottom: 0 0.5rem 0.5rem -0.375rem rgba(3, 3, 3, 0.72);\n --pf-global--BoxShadow--md-left: -0.5rem 0 0.5rem -0.375rem rgba(3, 3, 3, 0.72);\n --pf-global--BoxShadow--lg: 0 0.5rem 1rem 0 rgba(3, 3, 3, 0.64), 0 0 0.375rem 0 rgba(3, 3, 3, 0.32);\n --pf-global--BoxShadow--lg-top: 0 -0.75rem 0.75rem -0.5rem rgba(3, 3, 3, 0.72);\n --pf-global--BoxShadow--lg-right: 0.75rem 0 0.75rem -0.5rem rgba(3, 3, 3, 0.72);\n --pf-global--BoxShadow--lg-bottom: 0 0.75rem 0.75rem -0.5rem rgba(3, 3, 3, 0.72);\n --pf-global--BoxShadow--lg-left: -0.75rem 0 0.75rem -0.5rem rgba(3, 3, 3, 0.72);\n --pf-global--BoxShadow--xl: 0 1rem 2rem 0 rgba(3, 3, 3, 0.64), 0 0 0.5rem 0 rgba(3, 3, 3, 0.4);\n --pf-global--BoxShadow--xl-top: 0 -1rem 1rem -0.5rem rgba(3, 3, 3, 0.8);\n --pf-global--BoxShadow--xl-right: 1rem 0 1rem -0.5rem rgba(3, 3, 3, 0.8);\n --pf-global--BoxShadow--xl-bottom: 0 1rem 1rem -0.5rem rgba(3, 3, 3, 0.8);\n --pf-global--BoxShadow--xl-left: -1rem 0 1rem -0.5rem rgba(3, 3, 3, 0.8);\n --pf-global--BoxShadow--inset: inset 0 0 0.625rem 0 #030303;\n}\n\n@font-face {\n font-family: "RedHatDisplay";\n src: url(${ye}) format("woff2"), url(${we}) format("woff");\n font-style: normal;\n font-weight: 300;\n text-rendering: optimizelegibility;\n}\n\n@font-face {\n font-family: "RedHatDisplay";\n src: url(${Ze}) format("woff2"), url(${xe}) format("woff");\n font-style: normal;\n font-weight: 400;\n text-rendering: optimizelegibility;\n}\n\n@font-face {\n font-family: "RedHatDisplay";\n src: url(${qe}) format("woff2"), url(${We}) format("woff");\n font-style: normal;\n font-weight: 700;\n text-rendering: optimizelegibility;\n}\n\n@font-face {\n font-family: "RedHatText";\n src: url(${Ve}) format("woff2"), url(${Te}) format("woff");\n font-style: normal;\n font-weight: 400;\n text-rendering: optimizelegibility;\n}\n\n@font-face {\n font-family: "RedHatText";\n src: url(${Ee}) format("woff2"), url(${Oe}) format("woff");\n font-style: normal;\n font-weight: 700;\n text-rendering: optimizelegibility;\n}\n\n@font-face {\n font-family: "RedHatDisplayUpdated";\n src: url(${ke}) format("woff2");\n font-style: normal;\n font-weight: 300;\n text-rendering: optimizelegibility;\n}\n\n@font-face {\n font-family: "RedHatDisplayUpdated";\n src: url(${ze}) format("woff2");\n font-style: normal;\n font-weight: 400;\n text-rendering: optimizelegibility;\n}\n\n@font-face {\n font-family: "RedHatDisplayUpdated";\n src: url(${Pe}) format("woff2");\n font-style: normal;\n font-weight: 700;\n text-rendering: optimizelegibility;\n}\n\n@font-face {\n font-family: "RedHatTextUpdated";\n src: url(${Be}) format("woff2");\n font-style: normal;\n font-weight: 400;\n text-rendering: optimizelegibility;\n}\n\n@font-face {\n font-family: "RedHatTextUpdated";\n src: url(${Se}) format("woff2");\n font-style: normal;\n font-weight: 700;\n text-rendering: optimizelegibility;\n}\n\n@font-face {\n font-family: "RedHatMono";\n src: url(${Me}) format("woff2");\n font-style: normal;\n font-weight: 400;\n font-display: fallback;\n}\n\n@font-face {\n font-family: "RedHatDisplayVF";\n src: url(${Ne}) format("woff2-variations");\n font-style: normal;\n font-weight: 300 900;\n font-display: fallback;\n}\n\n@font-face {\n font-family: "RedHatDisplayVF";\n src: url(${je}) format("woff2-variations");\n font-style: italic;\n font-weight: 300 900;\n font-display: fallback;\n}\n\n@font-face {\n font-family: "RedHatTextVF";\n src: url(${Ce}) format("woff2-variations");\n font-style: normal;\n font-weight: 400 500;\n font-display: fallback;\n}\n\n@font-face {\n font-family: "RedHatTextVF";\n src: url(${Re}) format("woff2-variations");\n font-style: italic;\n font-weight: 400 500;\n font-display: fallback;\n}\n\n@font-face {\n font-family: "RedHatMonoVF";\n src: url(${Ie}) format("woff2-variations");\n font-style: normal;\n font-weight: 300 700;\n font-display: fallback;\n}\n\n@font-face {\n font-family: "RedHatMonoVF";\n src: url(${Fe}) format("woff2-variations");\n font-style: italic;\n font-weight: 300 700;\n font-display: fallback;\n}\n\n@font-face {\n font-family: "overpass";\n font-style: normal;\n font-weight: 200;\n src: url(${Ge}) format("woff2"), url(${Ue}) format("woff");\n}\n\n@font-face {\n font-family: "overpass";\n font-style: italic;\n font-weight: 200;\n src: url(${Xe}) format("woff2"), url(${De}) format("woff");\n}\n\n@font-face {\n font-family: "overpass";\n font-style: normal;\n font-weight: 300;\n src: url(${Ye}) format("woff2"), url(${He}) format("woff");\n}\n\n@font-face {\n font-family: "overpass";\n font-style: italic;\n font-weight: 300;\n src: url(${Le}) format("woff2"), url(${Ke}) format("woff");\n}\n\n@font-face {\n font-family: "overpass";\n font-style: normal;\n font-weight: 400;\n src: url(${Je}) format("woff2"), url(${Qe}) format("woff");\n}\n\n@font-face {\n font-family: "overpass";\n font-style: italic;\n font-weight: 400;\n src: url(${_e}) format("woff2"), url(${$e}) format("woff");\n}\n\n@font-face {\n font-family: "overpass";\n font-style: normal;\n font-weight: 500;\n src: url(${et}) format("woff2"), url(${tt}) format("woff");\n}\n\n@font-face {\n font-family: "overpass";\n font-style: italic;\n font-weight: 500;\n src: url(${nt}) format("woff2"), url(${rt}) format("woff");\n}\n\n@font-face {\n font-family: "overpass";\n font-style: normal;\n font-weight: 600;\n src: url(${ot}) format("woff2"), url(${at}) format("woff");\n}\n\n@font-face {\n font-family: "overpass";\n font-style: italic;\n font-weight: 600;\n src: url(${it}) format("woff2"), url(${lt}) format("woff");\n}\n\n@font-face {\n font-family: "overpass";\n font-style: normal;\n font-weight: 700;\n src: url(${ct}) format("woff2"), url(${ft}) format("woff");\n}\n\n@font-face {\n font-family: "overpass";\n font-style: italic;\n font-weight: 700;\n src: url(${st}) format("woff2"), url(${ut}) format("woff");\n}\n\n@font-face {\n font-family: "overpass";\n font-style: normal;\n font-weight: 800;\n src: url(${pt}) format("woff2"), url(${dt}) format("woff");\n}\n\n@font-face {\n font-family: "overpass";\n font-style: italic;\n font-weight: 800;\n src: url(${At}) format("woff2"), url(${mt}) format("woff");\n}\n\n@font-face {\n font-family: "overpass";\n font-style: normal;\n font-weight: 900;\n src: url(${bt}) format("woff2"), url(${vt}) format("woff");\n}\n\n@font-face {\n font-family: "overpass";\n font-style: italic;\n font-weight: 900;\n src: url(${gt}) format("woff2"), url(${ht}) format("woff");\n}\n\n@font-face {\n font-family: "overpass-mono";\n font-style: normal;\n font-weight: 300;\n src: url(${yt}) format("woff2"), url(${wt}) format("woff");\n}\n\n@font-face {\n font-family: "overpass-mono";\n font-style: normal;\n font-weight: 400;\n src: url(${Zt}) format("woff2"), url(${xt}) format("woff");\n}\n\n@font-face {\n font-family: "overpass-mono";\n font-style: normal;\n font-weight: 500;\n src: url(${qt}) format("woff2"), url(${Wt}) format("woff");\n}\n\n@font-face {\n font-family: "overpass-mono";\n font-style: normal;\n font-weight: 600;\n src: url(${Vt}) format("woff2"), url(${Tt}) format("woff");\n}\n\n[class*=pf-c-],\n[class*=pf-c-]::before,\n[class*=pf-c-]::after {\n padding: 0;\n margin: 0;\n background-color: transparent;\n}\n\nhtml {\n font-size: var(--pf-global--root--FontSize, unset) !important;\n}\n\n.pf-screen-reader {\n position: fixed;\n top: 0;\n left: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.pf-screen-reader.pf-m-full-size {\n width: 100%;\n height: 100%;\n}\n\n.pf-screen-reader.pf-m-absolute {\n position: absolute;\n}\n\n.pf-m-tabular-nums {\n font-variant-numeric: tabular-nums;\n}\n\nhtml,\nbody,\np,\nol,\nul,\nli,\ndl,\ndt,\ndd,\nblockquote,\nfigure,\nfieldset,\nlegend,\ntextarea,\npre,\niframe,\nhr,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n padding: 0;\n margin: 0;\n}\n\nhtml,\nbody {\n height: 100%;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: 100%;\n font-weight: var(--pf-global--FontWeight--normal);\n}\n\nul {\n list-style: none;\n}\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: 100%;\n line-height: var(--pf-global--LineHeight--md);\n color: var(--pf-global--Color--100);\n}\n\nimg,\nembed,\niframe,\nobject,\naudio,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\niframe {\n border: 0;\n}\n\ntable {\n border-spacing: 0;\n border-collapse: collapse;\n}\n\ntd,\nth {\n padding: 0;\n text-align: left;\n}\n\ncode,\npre {\n font-family: var(--pf-global--FontFamily--monospace);\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n}\n\nbody {\n font-family: var(--pf-global--FontFamily--sans-serif);\n font-size: var(--pf-global--FontSize--md);\n font-weight: var(--pf-global--FontWeight--normal);\n line-height: var(--pf-global--LineHeight--md);\n text-align: left;\n background-color: var(--pf-global--BackgroundColor--100);\n}\n\na {\n font-weight: var(--pf-global--link--FontWeight);\n color: var(--pf-global--link--Color);\n text-decoration: var(--pf-global--link--TextDecoration);\n}\n\na:hover {\n --pf-global--link--Color: var(--pf-global--link--Color--hover);\n --pf-global--link--TextDecoration: var(--pf-global--link--TextDecoration--hover);\n}\n\nbutton,\na {\n cursor: pointer;\n}\n\n.pf-m-overpass-font a {\n font-weight: var(--pf-global--FontWeight--semi-bold);\n}\n\n:root:where(.pf-theme-dark) {\n color-scheme: dark;\n}\n\n.pf-t-dark.pf-m-transparent {\n background-color: transparent;\n}\n\n.pf-t-dark.pf-m-transparent-100 {\n background-color: rgba(3, 3, 3, 0.42);\n}\n\n.pf-t-dark.pf-m-transparent-200 {\n background-color: rgba(3, 3, 3, 0.6);\n}\n\n.pf-t-dark.pf-m-opaque-100 {\n background-color: #1b1d21;\n}\n\n.pf-t-dark.pf-m-opaque-200 {\n background-color: #0f1214;\n}\n\n.pf-t-light.pf-m-transparent {\n background-color: transparent;\n}\n\n.pf-t-light.pf-m-opaque-100 {\n background-color: #fff;\n}\n\n.pf-t-light.pf-m-opaque-200 {\n background-color: #c6c7c8;\n}\n\n.pf-t-light.pf-m-opaque-300 {\n background-color: #aaabac;\n}\n\n@font-face {\n font-family: "pficon";\n src: url(${Et}) format("woff2"), url(${Ot}) format("woff");\n}\n\n.pf-icon-zone:before,\n.pf-icon-warning-triangle:before,\n.pf-icon-volume:before,\n.pf-icon-virtual-machine:before,\n.pf-icon-users:before,\n.pf-icon-user:before,\n.pf-icon-unplugged:before,\n.pf-icon-unlocked:before,\n.pf-icon-unknown:before,\n.pf-icon-trend-up:before,\n.pf-icon-trend-down:before,\n.pf-icon-topology:before,\n.pf-icon-thumb-tack:before,\n.pf-icon-tenant:before,\n.pf-icon-task:before,\n.pf-icon-storage-domain:before,\n.pf-icon-spinner2:before,\n.pf-icon-spinner:before,\n.pf-icon-services:before,\n.pf-icon-service:before,\n.pf-icon-service-catalog:before,\n.pf-icon-server:before,\n.pf-icon-server-group:before,\n.pf-icon-security:before,\n.pf-icon-screen:before,\n.pf-icon-save:before,\n.pf-icon-running:before,\n.pf-icon-resources-full:before,\n.pf-icon-resources-empty:before,\n.pf-icon-resources-almost-full:before,\n.pf-icon-resources-almost-empty:before,\n.pf-icon-resource-pool:before,\n.pf-icon-repository:before,\n.pf-icon-replicator:before,\n.pf-icon-remove2:before,\n.pf-icon-registry:before,\n.pf-icon-regions:before,\n.pf-icon-rebooting:before,\n.pf-icon-rebalance:before,\n.pf-icon-project:before,\n.pf-icon-process-automation:before,\n.pf-icon-private:before,\n.pf-icon-print:before,\n.pf-icon-port:before,\n.pf-icon-plugged:before,\n.pf-icon-pficon-vcenter:before,\n.pf-icon-pficon-template:before,\n.pf-icon-pficon-sort-common-desc:before,\n.pf-icon-pficon-sort-common-asc:before,\n.pf-icon-pficon-satellite:before,\n.pf-icon-pficon-network-range:before,\n.pf-icon-pficon-history:before,\n.pf-icon-pficon-dragdrop:before,\n.pf-icon-pending:before,\n.pf-icon-paused:before,\n.pf-icon-panel-open:before,\n.pf-icon-panel-close:before,\n.pf-icon-package:before,\n.pf-icon-os-image:before,\n.pf-icon-orders:before,\n.pf-icon-optimize:before,\n.pf-icon-openstack:before,\n.pf-icon-openshift:before,\n.pf-icon-open-drawer-right:before,\n.pf-icon-on:before,\n.pf-icon-on-running:before,\n.pf-icon-ok:before,\n.pf-icon-off:before,\n.pf-icon-not-started:before,\n.pf-icon-new-process:before,\n.pf-icon-network:before,\n.pf-icon-namespaces:before,\n.pf-icon-monitoring:before,\n.pf-icon-module:before,\n.pf-icon-migration:before,\n.pf-icon-middleware:before,\n.pf-icon-messages:before,\n.pf-icon-memory:before,\n.pf-icon-maintenance:before,\n.pf-icon-locked:before,\n.pf-icon-key:before,\n.pf-icon-integration:before,\n.pf-icon-infrastructure:before,\n.pf-icon-info:before,\n.pf-icon-in-progress:before,\n.pf-icon-import:before,\n.pf-icon-home:before,\n.pf-icon-history:before,\n.pf-icon-help:before,\n.pf-icon-globe-route:before,\n.pf-icon-folder-open:before,\n.pf-icon-folder-close:before,\n.pf-icon-flavor:before,\n.pf-icon-filter:before,\n.pf-icon-export:before,\n.pf-icon-error-circle-o:before,\n.pf-icon-equalizer:before,\n.pf-icon-enterprise:before,\n.pf-icon-enhancement:before,\n.pf-icon-edit:before,\n.pf-icon-domain:before,\n.pf-icon-disconnected:before,\n.pf-icon-degraded:before,\n.pf-icon-data-source:before,\n.pf-icon-data-sink:before,\n.pf-icon-data-processor:before,\n.pf-icon-critical-risk:before,\n.pf-icon-cpu:before,\n.pf-icon-container-node:before,\n.pf-icon-connected:before,\n.pf-icon-cluster:before,\n.pf-icon-cloud-tenant:before,\n.pf-icon-cloud-security:before,\n.pf-icon-close:before,\n.pf-icon-chat:before,\n.pf-icon-catalog:before,\n.pf-icon-bundle:before,\n.pf-icon-builder-image:before,\n.pf-icon-build:before,\n.pf-icon-blueprint:before,\n.pf-icon-bell:before,\n.pf-icon-automation:before,\n.pf-icon-attention-bell:before,\n.pf-icon-asleep:before,\n.pf-icon-arrow:before,\n.pf-icon-applications:before,\n.pf-icon-ansible-tower:before,\n.pf-icon-add-circle-o:before {\n font-family: "pficon";\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n font-style: normal;\n font-variant: normal;\n font-weight: normal;\n text-decoration: none;\n text-transform: none;\n}\n\n.pf-icon-add-circle-o:before {\n content: "\\e61b";\n}\n\n.pf-icon-ansible-tower:before {\n content: "\\e950";\n}\n\n.pf-icon-applications:before {\n content: "\\e936";\n}\n\n.pf-icon-arrow:before {\n content: "\\e929";\n}\n\n.pf-icon-asleep:before {\n content: "\\e92e";\n}\n\n.pf-icon-attention-bell:before {\n content: "\\e951";\n}\n\n.pf-icon-automation:before {\n content: "\\e937";\n}\n\n.pf-icon-bell:before {\n content: "\\e952";\n}\n\n.pf-icon-blueprint:before {\n content: "\\e915";\n}\n\n.pf-icon-build:before {\n content: "\\e902";\n}\n\n.pf-icon-builder-image:before {\n content: "\\e800";\n}\n\n.pf-icon-bundle:before {\n content: "\\e918";\n}\n\n.pf-icon-catalog:before {\n content: "\\e953";\n}\n\n.pf-icon-chat:before {\n content: "\\e954";\n}\n\n.pf-icon-close:before {\n content: "\\e60b";\n}\n\n.pf-icon-cloud-security:before {\n content: "\\e903";\n}\n\n.pf-icon-cloud-tenant:before {\n content: "\\e904";\n}\n\n.pf-icon-cluster:before {\n content: "\\e620";\n}\n\n.pf-icon-connected:before {\n content: "\\e938";\n}\n\n.pf-icon-container-node:before {\n content: "\\e621";\n}\n\n.pf-icon-cpu:before {\n content: "\\e927";\n}\n\n.pf-icon-critical-risk:before {\n content: "\\e976";\n}\n\n.pf-icon-data-processor:before {\n content: "\\e97b";\n}\n\n.pf-icon-data-sink:before {\n content: "\\e978";\n}\n\n.pf-icon-data-source:before {\n content: "\\e979";\n}\n\n.pf-icon-degraded:before {\n content: "\\e91b";\n}\n\n.pf-icon-disconnected:before {\n content: "\\e955";\n}\n\n.pf-icon-domain:before {\n content: "\\e919";\n}\n\n.pf-icon-edit:before {\n content: "\\e60a";\n}\n\n.pf-icon-enhancement:before {\n content: "\\e93a";\n}\n\n.pf-icon-enterprise:before {\n content: "\\e906";\n}\n\n.pf-icon-equalizer:before {\n content: "\\e956";\n}\n\n.pf-icon-error-circle-o:before {\n content: "\\e926";\n}\n\n.pf-icon-export:before {\n content: "\\e616";\n}\n\n.pf-icon-filter:before {\n content: "\\e943";\n}\n\n.pf-icon-flavor:before {\n content: "\\e957";\n}\n\n.pf-icon-folder-close:before {\n content: "\\e607";\n}\n\n.pf-icon-folder-open:before {\n content: "\\e606";\n}\n\n.pf-icon-globe-route:before {\n content: "\\e958";\n}\n\n.pf-icon-help:before {\n content: "\\e605";\n}\n\n.pf-icon-history:before {\n content: "\\e617";\n}\n\n.pf-icon-home:before {\n content: "\\e618";\n}\n\n.pf-icon-import:before {\n content: "\\e615";\n}\n\n.pf-icon-in-progress:before {\n content: "\\e933";\n}\n\n.pf-icon-info:before {\n content: "\\e92b";\n}\n\n.pf-icon-infrastructure:before {\n content: "\\e93d";\n}\n\n.pf-icon-integration:before {\n content: "\\e948";\n}\n\n.pf-icon-key:before {\n content: "\\e924";\n}\n\n.pf-icon-locked:before {\n content: "\\e923";\n}\n\n.pf-icon-maintenance:before {\n content: "\\e932";\n}\n\n.pf-icon-memory:before {\n content: "\\e908";\n}\n\n.pf-icon-messages:before {\n content: "\\e603";\n}\n\n.pf-icon-middleware:before {\n content: "\\e917";\n}\n\n.pf-icon-migration:before {\n content: "\\e931";\n}\n\n.pf-icon-module:before {\n content: "\\e959";\n}\n\n.pf-icon-monitoring:before {\n content: "\\e95a";\n}\n\n.pf-icon-namespaces:before {\n content: "\\e95b";\n}\n\n.pf-icon-network:before {\n content: "\\e909";\n}\n\n.pf-icon-new-process:before {\n content: "\\e95c";\n}\n\n.pf-icon-not-started:before {\n content: "\\e95d";\n}\n\n.pf-icon-off:before {\n content: "\\e92d";\n}\n\n.pf-icon-ok:before {\n content: "\\e602";\n}\n\n.pf-icon-on-running:before {\n content: "\\e925";\n}\n\n.pf-icon-on:before {\n content: "\\e92c";\n}\n\n.pf-icon-open-drawer-right:before {\n content: "\\e977";\n}\n\n.pf-icon-openshift:before {\n content: "\\e95e";\n}\n\n.pf-icon-openstack:before {\n content: "\\e95f";\n}\n\n.pf-icon-optimize:before {\n content: "\\e93e";\n}\n\n.pf-icon-orders:before {\n content: "\\e93f";\n}\n\n.pf-icon-os-image:before {\n content: "\\e960";\n}\n\n.pf-icon-package:before {\n content: "\\e961";\n}\n\n.pf-icon-panel-close:before {\n content: "\\e962";\n}\n\n.pf-icon-panel-open:before {\n content: "\\e963";\n}\n\n.pf-icon-paused:before {\n content: "\\e92f";\n}\n\n.pf-icon-pending:before {\n content: "\\e964";\n}\n\n.pf-icon-pficon-dragdrop:before {\n content: "\\e965";\n}\n\n.pf-icon-pficon-history:before {\n content: "\\e966";\n}\n\n.pf-icon-pficon-network-range:before {\n content: "\\e967";\n}\n\n.pf-icon-pficon-satellite:before {\n content: "\\e968";\n}\n\n.pf-icon-pficon-sort-common-asc:before {\n content: "\\e94e";\n}\n\n.pf-icon-pficon-sort-common-desc:before {\n content: "\\e94f";\n}\n\n.pf-icon-pficon-template:before {\n content: "\\e94c";\n}\n\n.pf-icon-pficon-vcenter:before {\n content: "\\e969";\n}\n\n.pf-icon-plugged:before {\n content: "\\e96a";\n}\n\n.pf-icon-port:before {\n content: "\\e96b";\n}\n\n.pf-icon-print:before {\n content: "\\e612";\n}\n\n.pf-icon-private:before {\n content: "\\e914";\n}\n\n.pf-icon-process-automation:before {\n content: "\\e949";\n}\n\n.pf-icon-project:before {\n content: "\\e96c";\n}\n\n.pf-icon-rebalance:before {\n content: "\\e91c";\n}\n\n.pf-icon-rebooting:before {\n content: "\\e96d";\n}\n\n.pf-icon-regions:before {\n content: "\\e90a";\n}\n\n.pf-icon-registry:before {\n content: "\\e623";\n}\n\n.pf-icon-remove2:before {\n content: "\\e96e";\n}\n\n.pf-icon-replicator:before {\n content: "\\e624";\n}\n\n.pf-icon-repository:before {\n content: "\\e90b";\n}\n\n.pf-icon-resource-pool:before {\n content: "\\e90c";\n}\n\n.pf-icon-resources-almost-empty:before {\n content: "\\e91d";\n}\n\n.pf-icon-resources-almost-full:before {\n content: "\\e912";\n}\n\n.pf-icon-resources-empty:before {\n content: "\\e96f";\n}\n\n.pf-icon-resources-full:before {\n content: "\\e913";\n}\n\n.pf-icon-running:before {\n content: "\\e970";\n}\n\n.pf-icon-save:before {\n content: "\\e601";\n}\n\n.pf-icon-screen:before {\n content: "\\e971";\n}\n\n.pf-icon-security:before {\n content: "\\e946";\n}\n\n.pf-icon-server-group:before {\n content: "\\e91a";\n}\n\n.pf-icon-server:before {\n content: "\\e90d";\n}\n\n.pf-icon-service-catalog:before {\n content: "\\e972";\n}\n\n.pf-icon-service:before {\n content: "\\e61e";\n}\n\n.pf-icon-services:before {\n content: "\\e947";\n}\n\n.pf-icon-spinner:before {\n content: "\\e973";\n}\n\n.pf-icon-spinner2:before {\n content: "\\e613";\n}\n\n.pf-icon-storage-domain:before {\n content: "\\e90e";\n}\n\n.pf-icon-task:before {\n content: "\\e974";\n}\n\n.pf-icon-tenant:before {\n content: "\\e916";\n}\n\n.pf-icon-thumb-tack:before {\n content: "\\e920";\n}\n\n.pf-icon-topology:before {\n content: "\\e608";\n}\n\n.pf-icon-trend-down:before {\n content: "\\e900";\n}\n\n.pf-icon-trend-up:before {\n content: "\\e901";\n}\n\n.pf-icon-unknown:before {\n content: "\\e935";\n}\n\n.pf-icon-unlocked:before {\n content: "\\e922";\n}\n\n.pf-icon-unplugged:before {\n content: "\\e942";\n}\n\n.pf-icon-user:before {\n content: "\\e91e";\n}\n\n.pf-icon-users:before {\n content: "\\e91f";\n}\n\n.pf-icon-virtual-machine:before {\n content: "\\e90f";\n}\n\n.pf-icon-volume:before {\n content: "\\e910";\n}\n\n.pf-icon-warning-triangle:before {\n content: "\\e975";\n}\n\n.pf-icon-zone:before {\n content: "\\e911";\n}`,""]);const kt=he},26204:(e,t,n)=>{"use strict";n.d(t,{A:()=>l});var r=n(31601),o=n.n(r),a=n(76314),i=n.n(a)()(o());i.push([e.id,".pf-c-backdrop {\n --pf-c-backdrop--Position: fixed;\n --pf-c-backdrop--ZIndex: var(--pf-global--ZIndex--lg);\n --pf-c-backdrop--BackgroundColor: var(--pf-global--BackgroundColor--dark-transparent-100);\n position: var(--pf-c-backdrop--Position);\n top: 0;\n left: 0;\n z-index: var(--pf-c-backdrop--ZIndex);\n width: 100%;\n height: 100%;\n background-color: var(--pf-c-backdrop--BackgroundColor);\n}\n\n.pf-c-backdrop__open {\n overflow: hidden;\n}",""]);const l=i},60010:(e,t,n)=>{"use strict";n.d(t,{A:()=>l});var r=n(31601),o=n.n(r),a=n(76314),i=n.n(a)()(o());i.push([e.id,".pf-c-badge {\n --pf-c-badge--BorderRadius: var(--pf-global--BorderRadius--lg);\n --pf-c-badge--FontSize: var(--pf-global--FontSize--xs);\n --pf-c-badge--FontWeight: var(--pf-global--FontWeight--bold);\n --pf-c-badge--PaddingRight: var(--pf-global--spacer--sm);\n --pf-c-badge--PaddingLeft: var(--pf-global--spacer--sm);\n --pf-c-badge--Color: var(--pf-global--Color--dark-100);\n --pf-c-badge--MinWidth: var(--pf-global--spacer--xl);\n --pf-c-badge--m-read--BackgroundColor: var(--pf-global--BackgroundColor--200);\n --pf-c-badge--m-read--Color: var(--pf-global--Color--dark-100);\n --pf-c-badge--m-unread--BackgroundColor: var(--pf-global--primary-color--100);\n --pf-c-badge--m-unread--Color: var(--pf-global--Color--light-100);\n display: inline-block;\n min-width: var(--pf-c-badge--MinWidth);\n padding-right: var(--pf-c-badge--PaddingRight);\n padding-left: var(--pf-c-badge--PaddingLeft);\n font-size: var(--pf-c-badge--FontSize);\n font-weight: var(--pf-c-badge--FontWeight);\n color: var(--pf-c-badge--Color);\n text-align: center;\n background-color: var(--pf-c-badge--BackgroundColor);\n border-radius: var(--pf-c-badge--BorderRadius);\n}\n.pf-c-badge.pf-m-read {\n --pf-c-badge--Color: var(--pf-c-badge--m-read--Color);\n --pf-c-badge--BackgroundColor: var(--pf-c-badge--m-read--BackgroundColor);\n}\n.pf-c-badge.pf-m-unread {\n --pf-c-badge--Color: var(--pf-c-badge--m-unread--Color);\n --pf-c-badge--BackgroundColor: var(--pf-c-badge--m-unread--BackgroundColor);\n}\n\n:where(.pf-theme-dark) .pf-c-badge {\n --pf-c-badge--m-read--BackgroundColor: var(--pf-global--palette--black-500);\n --pf-c-badge--m-unread--BackgroundColor: var(--pf-global--primary-color--300);\n}",""]);const l=i},5348:(e,t,n)=>{"use strict";n.d(t,{A:()=>l});var r=n(31601),o=n.n(r),a=n(76314),i=n.n(a)()(o());i.push([e.id,'.pf-c-button {\n --pf-c-button--PaddingTop: var(--pf-global--spacer--form-element);\n --pf-c-button--PaddingRight: var(--pf-global--spacer--md);\n --pf-c-button--PaddingBottom: var(--pf-global--spacer--form-element);\n --pf-c-button--PaddingLeft: var(--pf-global--spacer--md);\n --pf-c-button--LineHeight: var(--pf-global--LineHeight--md);\n --pf-c-button--FontWeight: var(--pf-global--FontWeight--normal);\n --pf-c-button--FontSize: var(--pf-global--FontSize--md);\n --pf-c-button--BackgroundColor: transparent;\n --pf-c-button--BorderRadius: var(--pf-global--BorderRadius--sm);\n --pf-c-button--after--BorderRadius: var(--pf-global--BorderRadius--sm);\n --pf-c-button--after--BorderColor: transparent;\n --pf-c-button--after--BorderWidth: var(--pf-global--BorderWidth--sm);\n --pf-c-button--hover--after--BorderWidth: var(--pf-global--BorderWidth--md);\n --pf-c-button--focus--after--BorderWidth: var(--pf-global--BorderWidth--md);\n --pf-c-button--active--after--BorderWidth: var(--pf-global--BorderWidth--md);\n --pf-c-button--disabled--Color: var(--pf-global--disabled-color--100);\n --pf-c-button--disabled--BackgroundColor: var(--pf-global--disabled-color--200);\n --pf-c-button--disabled--after--BorderColor: transparent;\n --pf-c-button--m-primary--BackgroundColor: var(--pf-global--primary-color--100);\n --pf-c-button--m-primary--Color: var(--pf-global--Color--light-100);\n --pf-c-button--m-primary--hover--BackgroundColor: var(--pf-global--primary-color--200);\n --pf-c-button--m-primary--hover--Color: var(--pf-global--Color--light-100);\n --pf-c-button--m-primary--focus--BackgroundColor: var(--pf-global--primary-color--200);\n --pf-c-button--m-primary--focus--Color: var(--pf-global--Color--light-100);\n --pf-c-button--m-primary--active--BackgroundColor: var(--pf-global--primary-color--200);\n --pf-c-button--m-primary--active--Color: var(--pf-global--Color--light-100);\n --pf-c-button--m-secondary--BackgroundColor: transparent;\n --pf-c-button--m-secondary--after--BorderColor: var(--pf-global--primary-color--100);\n --pf-c-button--m-secondary--Color: var(--pf-global--primary-color--100);\n --pf-c-button--m-secondary--hover--BackgroundColor: transparent;\n --pf-c-button--m-secondary--hover--after--BorderColor: var(--pf-global--primary-color--100);\n --pf-c-button--m-secondary--hover--Color: var(--pf-global--primary-color--100);\n --pf-c-button--m-secondary--focus--BackgroundColor: transparent;\n --pf-c-button--m-secondary--focus--after--BorderColor: var(--pf-global--primary-color--100);\n --pf-c-button--m-secondary--focus--Color: var(--pf-global--primary-color--100);\n --pf-c-button--m-secondary--active--BackgroundColor: transparent;\n --pf-c-button--m-secondary--active--after--BorderColor: var(--pf-global--primary-color--100);\n --pf-c-button--m-secondary--active--Color: var(--pf-global--primary-color--100);\n --pf-c-button--m-secondary--m-danger--BackgroundColor: transparent;\n --pf-c-button--m-secondary--m-danger--Color: var(--pf-global--danger-color--100);\n --pf-c-button--m-secondary--m-danger--after--BorderColor: var(--pf-global--danger-color--100);\n --pf-c-button--m-secondary--m-danger--hover--BackgroundColor: transparent;\n --pf-c-button--m-secondary--m-danger--hover--Color: var(--pf-global--danger-color--200);\n --pf-c-button--m-secondary--m-danger--hover--after--BorderColor: var(--pf-global--danger-color--100);\n --pf-c-button--m-secondary--m-danger--focus--BackgroundColor: transparent;\n --pf-c-button--m-secondary--m-danger--focus--Color: var(--pf-global--danger-color--200);\n --pf-c-button--m-secondary--m-danger--focus--after--BorderColor: var(--pf-global--danger-color--100);\n --pf-c-button--m-secondary--m-danger--active--BackgroundColor: transparent;\n --pf-c-button--m-secondary--m-danger--active--Color: var(--pf-global--danger-color--200);\n --pf-c-button--m-secondary--m-danger--active--after--BorderColor: var(--pf-global--danger-color--100);\n --pf-c-button--m-tertiary--BackgroundColor: transparent;\n --pf-c-button--m-tertiary--after--BorderColor: var(--pf-global--Color--100);\n --pf-c-button--m-tertiary--Color: var(--pf-global--Color--100);\n --pf-c-button--m-tertiary--hover--BackgroundColor: transparent;\n --pf-c-button--m-tertiary--hover--after--BorderColor: var(--pf-global--Color--100);\n --pf-c-button--m-tertiary--hover--Color: var(--pf-global--Color--100);\n --pf-c-button--m-tertiary--focus--BackgroundColor: transparent;\n --pf-c-button--m-tertiary--focus--after--BorderColor: var(--pf-global--Color--100);\n --pf-c-button--m-tertiary--focus--Color: var(--pf-global--Color--100);\n --pf-c-button--m-tertiary--active--BackgroundColor: transparent;\n --pf-c-button--m-tertiary--active--after--BorderColor: var(--pf-global--Color--100);\n --pf-c-button--m-tertiary--active--Color: var(--pf-global--Color--100);\n --pf-c-button--m-warning--BackgroundColor: var(--pf-global--warning-color--100);\n --pf-c-button--m-warning--Color: var(--pf-global--Color--dark-100);\n --pf-c-button--m-warning--hover--BackgroundColor: var(--pf-global--palette--gold-500);\n --pf-c-button--m-warning--hover--Color: var(--pf-global--Color--dark-100);\n --pf-c-button--m-warning--focus--BackgroundColor: var(--pf-global--palette--gold-500);\n --pf-c-button--m-warning--focus--Color: var(--pf-global--Color--dark-100);\n --pf-c-button--m-warning--active--BackgroundColor: var(--pf-global--palette--gold-500);\n --pf-c-button--m-warning--active--Color: var(--pf-global--Color--dark-100);\n --pf-c-button--m-danger--BackgroundColor: var(--pf-global--danger-color--100);\n --pf-c-button--m-danger--Color: var(--pf-global--Color--light-100);\n --pf-c-button--m-danger--hover--BackgroundColor: var(--pf-global--danger-color--200);\n --pf-c-button--m-danger--hover--Color: var(--pf-global--Color--light-100);\n --pf-c-button--m-danger--focus--BackgroundColor: var(--pf-global--danger-color--200);\n --pf-c-button--m-danger--focus--Color: var(--pf-global--Color--light-100);\n --pf-c-button--m-danger--active--BackgroundColor: var(--pf-global--danger-color--200);\n --pf-c-button--m-danger--active--Color: var(--pf-global--Color--light-100);\n --pf-c-button--m-link--BackgroundColor: transparent;\n --pf-c-button--m-link--Color: var(--pf-global--link--Color);\n --pf-c-button--m-link--hover--BackgroundColor: transparent;\n --pf-c-button--m-link--hover--Color: var(--pf-global--link--Color--hover);\n --pf-c-button--m-link--focus--BackgroundColor: transparent;\n --pf-c-button--m-link--focus--Color: var(--pf-global--link--Color--hover);\n --pf-c-button--m-link--active--BackgroundColor: transparent;\n --pf-c-button--m-link--active--Color: var(--pf-global--link--Color--hover);\n --pf-c-button--m-link--disabled--BackgroundColor: transparent;\n --pf-c-button--m-link--m-inline--FontSize: inherit;\n --pf-c-button--m-link--m-inline--hover--TextDecoration: var(--pf-global--link--TextDecoration--hover);\n --pf-c-button--m-link--m-inline--hover--Color: var(--pf-global--link--Color--hover);\n --pf-c-button--m-link--m-inline--PaddingTop: 0;\n --pf-c-button--m-link--m-inline--PaddingRight: 0;\n --pf-c-button--m-link--m-inline--PaddingBottom: 0;\n --pf-c-button--m-link--m-inline--PaddingLeft: 0;\n --pf-c-button--m-link--m-inline__progress--Left: var(--pf-global--spacer--xs);\n --pf-c-button--m-link--m-inline--m-in-progress--PaddingLeft: calc(var(--pf-c-button--m-link--m-inline__progress--Left) + 1rem + var(--pf-global--spacer--sm));\n --pf-c-button--m-link--m-danger--BackgroundColor: transparent;\n --pf-c-button--m-link--m-danger--Color: var(--pf-global--danger-color--100);\n --pf-c-button--m-link--m-danger--hover--BackgroundColor: transparent;\n --pf-c-button--m-link--m-danger--hover--Color: var(--pf-global--danger-color--200);\n --pf-c-button--m-link--m-danger--focus--BackgroundColor: transparent;\n --pf-c-button--m-link--m-danger--focus--Color: var(--pf-global--danger-color--200);\n --pf-c-button--m-link--m-danger--active--BackgroundColor: transparent;\n --pf-c-button--m-link--m-danger--active--Color: var(--pf-global--danger-color--200);\n --pf-c-button--m-plain--BackgroundColor: transparent;\n --pf-c-button--m-plain--Color: var(--pf-global--Color--200);\n --pf-c-button--m-plain--hover--BackgroundColor: transparent;\n --pf-c-button--m-plain--hover--Color: var(--pf-global--Color--100);\n --pf-c-button--m-plain--focus--BackgroundColor: transparent;\n --pf-c-button--m-plain--focus--Color: var(--pf-global--Color--100);\n --pf-c-button--m-plain--active--BackgroundColor: transparent;\n --pf-c-button--m-plain--active--Color: var(--pf-global--Color--100);\n --pf-c-button--m-plain--disabled--Color: var(--pf-global--disabled-color--200);\n --pf-c-button--m-plain--disabled--BackgroundColor: transparent;\n --pf-c-button--m-control--BackgroundColor: var(--pf-global--BackgroundColor--100);\n --pf-c-button--m-control--Color: var(--pf-global--Color--100);\n --pf-c-button--m-control--BorderRadius: 0;\n --pf-c-button--m-control--after--BorderWidth: var(--pf-global--BorderWidth--sm);\n --pf-c-button--m-control--after--BorderTopColor: var(--pf-global--BorderColor--300);\n --pf-c-button--m-control--after--BorderRightColor: var(--pf-global--BorderColor--300);\n --pf-c-button--m-control--after--BorderBottomColor: var(--pf-global--BorderColor--200);\n --pf-c-button--m-control--after--BorderLeftColor: var(--pf-global--BorderColor--300);\n --pf-c-button--m-control--disabled--BackgroundColor: var(--pf-global--disabled-color--300);\n --pf-c-button--m-control--hover--BackgroundColor: var(--pf-global--BackgroundColor--100);\n --pf-c-button--m-control--hover--Color: var(--pf-global--Color--100);\n --pf-c-button--m-control--hover--after--BorderBottomWidth: var(--pf-global--BorderWidth--md);\n --pf-c-button--m-control--hover--after--BorderBottomColor: var(--pf-global--active-color--100);\n --pf-c-button--m-control--active--BackgroundColor: var(--pf-global--BackgroundColor--100);\n --pf-c-button--m-control--active--Color: var(--pf-global--Color--100);\n --pf-c-button--m-control--active--after--BorderBottomWidth: var(--pf-global--BorderWidth--md);\n --pf-c-button--m-control--active--after--BorderBottomColor: var(--pf-global--active-color--100);\n --pf-c-button--m-control--focus--BackgroundColor: var(--pf-global--BackgroundColor--100);\n --pf-c-button--m-control--focus--Color: var(--pf-global--Color--100);\n --pf-c-button--m-control--focus--after--BorderBottomWidth: var(--pf-global--BorderWidth--md);\n --pf-c-button--m-control--focus--after--BorderBottomColor: var(--pf-global--active-color--100);\n --pf-c-button--m-control--m-expanded--BackgroundColor: var(--pf-global--BackgroundColor--100);\n --pf-c-button--m-control--m-expanded--Color: var(--pf-global--Color--100);\n --pf-c-button--m-control--m-expanded--after--BorderBottomWidth: var(--pf-global--BorderWidth--md);\n --pf-c-button--m-control--m-expanded--after--BorderBottomColor: var(--pf-global--active-color--100);\n --pf-c-button--m-small--FontSize: var(--pf-global--FontSize--sm);\n --pf-c-button--m-display-lg--PaddingTop: var(--pf-global--spacer--md);\n --pf-c-button--m-display-lg--PaddingRight: var(--pf-global--spacer--xl);\n --pf-c-button--m-display-lg--PaddingBottom: var(--pf-global--spacer--md);\n --pf-c-button--m-display-lg--PaddingLeft: var(--pf-global--spacer--xl);\n --pf-c-button--m-display-lg--FontWeight: var(--pf-global--FontWeight--bold);\n --pf-c-button--m-link--m-display-lg--FontSize: var(--pf-global--FontSize--lg);\n --pf-c-button__icon--m-start--MarginRight: var(--pf-global--spacer--xs);\n --pf-c-button__icon--m-end--MarginLeft: var(--pf-global--spacer--xs);\n --pf-c-button__progress--width: calc(var(--pf-global--icon--FontSize--md) + var(--pf-global--spacer--sm));\n --pf-c-button__progress--Opacity: 0;\n --pf-c-button__progress--TranslateY: -50%;\n --pf-c-button__progress--TranslateX: 0;\n --pf-c-button__progress--Top: 50%;\n --pf-c-button__progress--Left: var(--pf-global--spacer--md);\n --pf-c-button--m-progress--TransitionProperty: padding;\n --pf-c-button--m-progress--TransitionDuration: var(--pf-global--TransitionDuration);\n --pf-c-button--m-progress--PaddingRight: calc(var(--pf-global--spacer--md) + var(--pf-c-button__progress--width) / 2);\n --pf-c-button--m-progress--PaddingLeft: calc(var(--pf-global--spacer--md) + var(--pf-c-button__progress--width) / 2);\n --pf-c-button--m-in-progress--PaddingRight: var(--pf-global--spacer--md);\n --pf-c-button--m-in-progress--PaddingLeft: calc(var(--pf-global--spacer--md) + var(--pf-c-button__progress--width));\n --pf-c-button--m-in-progress--m-plain--Color: var(--pf-global--primary-color--100);\n --pf-c-button--m-in-progress--m-plain__progress--Left: 50%;\n --pf-c-button--m-in-progress--m-plain__progress--TranslateX: -50%;\n --pf-c-button__count--MarginLeft: var(--pf-global--spacer--sm);\n --pf-c-button--disabled__c-badge--Color: var(--pf-global--Color--dark-100);\n --pf-c-button--disabled__c-badge--BackgroundColor: var(--pf-global--BackgroundColor--200);\n --pf-c-button--m-primary__c-badge--BorderColor: var(--pf-global--BorderColor--300);\n --pf-c-button--m-primary__c-badge--BorderWidth: var(--pf-global--BorderWidth--sm);\n position: relative;\n display: inline-block;\n padding: var(--pf-c-button--PaddingTop) var(--pf-c-button--PaddingRight) var(--pf-c-button--PaddingBottom) var(--pf-c-button--PaddingLeft);\n font-size: var(--pf-c-button--FontSize);\n font-weight: var(--pf-c-button--FontWeight);\n line-height: var(--pf-c-button--LineHeight);\n text-align: center;\n white-space: nowrap;\n user-select: none;\n border: 0;\n border-radius: var(--pf-c-button--BorderRadius);\n}\n.pf-c-button::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n pointer-events: none;\n content: "";\n border: var(--pf-c-button--after--BorderWidth) solid;\n border-color: var(--pf-c-button--after--BorderColor);\n border-radius: var(--pf-c-button--after--BorderRadius);\n}\n.pf-c-button:hover {\n --pf-c-button--after--BorderWidth: var(--pf-c-button--hover--after--BorderWidth);\n text-decoration: none;\n}\n.pf-c-button:focus {\n --pf-c-button--after--BorderWidth: var(--pf-c-button--focus--after--BorderWidth);\n}\n.pf-c-button:active, .pf-c-button.pf-m-active {\n --pf-c-button--after--BorderWidth: var(--pf-c-button--active--after--BorderWidth);\n}\n.pf-c-button.pf-m-block {\n display: block;\n width: 100%;\n}\n.pf-c-button.pf-m-small {\n --pf-c-button--FontSize: var(--pf-c-button--m-small--FontSize);\n}\n.pf-c-button.pf-m-primary.pf-m-display-lg, .pf-c-button.pf-m-secondary.pf-m-display-lg, .pf-c-button.pf-m-tertiary.pf-m-display-lg, .pf-c-button.pf-m-link.pf-m-display-lg {\n --pf-c-button--PaddingTop: var(--pf-c-button--m-display-lg--PaddingTop);\n --pf-c-button--PaddingRight: var(--pf-c-button--m-display-lg--PaddingRight);\n --pf-c-button--PaddingBottom: var(--pf-c-button--m-display-lg--PaddingBottom);\n --pf-c-button--PaddingLeft: var(--pf-c-button--m-display-lg--PaddingLeft);\n --pf-c-button--FontWeight: var(--pf-c-button--m-display-lg--FontWeight);\n}\n.pf-c-button.pf-m-primary {\n color: var(--pf-c-button--m-primary--Color);\n background-color: var(--pf-c-button--m-primary--BackgroundColor);\n}\n.pf-c-button.pf-m-primary:hover {\n --pf-c-button--m-primary--Color: var(--pf-c-button--m-primary--hover--Color);\n --pf-c-button--m-primary--BackgroundColor: var(--pf-c-button--m-primary--hover--BackgroundColor);\n}\n.pf-c-button.pf-m-primary:focus {\n --pf-c-button--m-primary--Color: var(--pf-c-button--m-primary--focus--Color);\n --pf-c-button--m-primary--BackgroundColor: var(--pf-c-button--m-primary--focus--BackgroundColor);\n}\n.pf-c-button.pf-m-primary:active, .pf-c-button.pf-m-primary.pf-m-active {\n --pf-c-button--m-primary--Color: var(--pf-c-button--m-primary--active--Color);\n --pf-c-button--m-primary--BackgroundColor: var(--pf-c-button--m-primary--active--BackgroundColor);\n}\n.pf-c-button.pf-m-primary .pf-c-badge.pf-m-unread {\n border: var(--pf-c-button--m-primary__c-badge--BorderWidth) solid var(--pf-c-button--m-primary__c-badge--BorderColor);\n}\n.pf-c-button.pf-m-secondary {\n --pf-c-button--after--BorderColor: var(--pf-c-button--m-secondary--after--BorderColor);\n color: var(--pf-c-button--m-secondary--Color);\n background-color: var(--pf-c-button--m-secondary--BackgroundColor);\n}\n.pf-c-button.pf-m-secondary:hover {\n --pf-c-button--m-secondary--Color: var(--pf-c-button--m-secondary--hover--Color);\n --pf-c-button--m-secondary--BackgroundColor: var(--pf-c-button--m-secondary--hover--BackgroundColor);\n --pf-c-button--after--BorderColor: var(--pf-c-button--m-secondary--hover--after--BorderColor);\n}\n.pf-c-button.pf-m-secondary:focus {\n --pf-c-button--m-secondary--Color: var(--pf-c-button--m-secondary--focus--Color);\n --pf-c-button--m-secondary--BackgroundColor: var(--pf-c-button--m-secondary--focus--BackgroundColor);\n --pf-c-button--after--BorderColor: var(--pf-c-button--m-secondary--focus--after--BorderColor);\n}\n.pf-c-button.pf-m-secondary.pf-m-active, .pf-c-button.pf-m-secondary:active {\n --pf-c-button--m-secondary--Color: var(--pf-c-button--m-secondary--active--Color);\n --pf-c-button--m-secondary--BackgroundColor: var(--pf-c-button--m-secondary--active--BackgroundColor);\n --pf-c-button--after--BorderColor: var(--pf-c-button--m-secondary--active--after--BorderColor);\n}\n.pf-c-button.pf-m-tertiary {\n --pf-c-button--after--BorderColor: var(--pf-c-button--m-tertiary--after--BorderColor);\n color: var(--pf-c-button--m-tertiary--Color);\n background-color: var(--pf-c-button--m-tertiary--BackgroundColor);\n}\n.pf-c-button.pf-m-tertiary:hover {\n --pf-c-button--m-tertiary--Color: var(--pf-c-button--m-tertiary--hover--Color);\n --pf-c-button--m-tertiary--BackgroundColor: var(--pf-c-button--m-tertiary--hover--BackgroundColor);\n --pf-c-button--after--BorderColor: var(--pf-c-button--m-tertiary--hover--after--BorderColor);\n}\n.pf-c-button.pf-m-tertiary:focus {\n --pf-c-button--m-tertiary--Color: var(--pf-c-button--m-tertiary--focus--Color);\n --pf-c-button--m-tertiary--BackgroundColor: var(--pf-c-button--m-tertiary--focus--BackgroundColor);\n --pf-c-button--after--BorderColor: var(--pf-c-button--m-tertiary--focus--after--BorderColor);\n}\n.pf-c-button.pf-m-tertiary:active, .pf-c-button.pf-m-tertiary.pf-m-active {\n --pf-c-button--m-tertiary--Color: var(--pf-c-button--m-tertiary--active--Color);\n --pf-c-button--m-tertiary--BackgroundColor: var(--pf-c-button--m-tertiary--active--BackgroundColor);\n --pf-c-button--after--BorderColor: var(--pf-c-button--m-tertiary--active--after--BorderColor);\n}\n.pf-c-button.pf-m-link {\n --pf-c-button--disabled--BackgroundColor: var(--pf-c-button--m-link--disabled--BackgroundColor);\n color: var(--pf-c-button--m-link--Color);\n background-color: var(--pf-c-button--m-link--BackgroundColor);\n}\n.pf-c-button.pf-m-link:not(.pf-m-inline):hover {\n --pf-c-button--m-link--Color: var(--pf-c-button--m-link--hover--Color);\n --pf-c-button--m-link--BackgroundColor: var(--pf-c-button--m-link--hover--BackgroundColor);\n}\n.pf-c-button.pf-m-link:not(.pf-m-inline):focus {\n --pf-c-button--m-link--Color: var(--pf-c-button--m-link--focus--Color);\n --pf-c-button--m-link--BackgroundColor: var(--pf-c-button--m-link--focus--BackgroundColor);\n}\n.pf-c-button.pf-m-link:not(.pf-m-inline):active, .pf-c-button.pf-m-link:not(.pf-m-inline).pf-m-active {\n --pf-c-button--m-link--Color: var(--pf-c-button--m-link--active--Color);\n --pf-c-button--m-link--BackgroundColor: var(--pf-c-button--m-link--active--BackgroundColor);\n}\n.pf-c-button.pf-m-link.pf-m-inline {\n --pf-c-button--FontSize: var(--pf-c-button--m-link--m-inline--FontSize);\n --pf-c-button__progress--Left: var(--pf-c-button--m-link--m-inline__progress--Left);\n display: inline;\n padding: var(--pf-c-button--m-link--m-inline--PaddingTop) var(--pf-c-button--m-link--m-inline--PaddingRight) var(--pf-c-button--m-link--m-inline--PaddingBottom) var(--pf-c-button--m-link--m-inline--PaddingLeft);\n text-align: left;\n white-space: normal;\n cursor: pointer;\n}\n.pf-c-button.pf-m-link.pf-m-inline:hover {\n --pf-c-button--m-link--Color: var(--pf-c-button--m-link--m-inline--hover--Color);\n text-decoration: var(--pf-c-button--m-link--m-inline--hover--TextDecoration);\n}\n.pf-c-button.pf-m-link.pf-m-display-lg {\n --pf-c-button--FontSize: var(--pf-c-button--m-link--m-display-lg--FontSize);\n}\n.pf-c-button.pf-m-danger {\n color: var(--pf-c-button--m-danger--Color);\n background-color: var(--pf-c-button--m-danger--BackgroundColor);\n}\n.pf-c-button.pf-m-danger:hover {\n --pf-c-button--m-danger--Color: var(--pf-c-button--m-danger--hover--Color);\n --pf-c-button--m-danger--BackgroundColor: var(--pf-c-button--m-danger--hover--BackgroundColor);\n}\n.pf-c-button.pf-m-danger:focus {\n --pf-c-button--m-danger--Color: var(--pf-c-button--m-danger--focus--Color);\n --pf-c-button--m-danger--BackgroundColor: var(--pf-c-button--m-danger--focus--BackgroundColor);\n}\n.pf-c-button.pf-m-danger:active, .pf-c-button.pf-m-danger.pf-m-active {\n --pf-c-button--m-danger--Color: var(--pf-c-button--m-danger--active--Color);\n --pf-c-button--m-danger--BackgroundColor: var(--pf-c-button--m-danger--active--BackgroundColor);\n}\n.pf-c-button.pf-m-danger.pf-m-secondary {\n --pf-c-button--m-danger--Color: var(--pf-c-button--m-secondary--m-danger--Color);\n --pf-c-button--m-danger--BackgroundColor: var(--pf-c-button--m-secondary--m-danger--BackgroundColor);\n --pf-c-button--after--BorderColor: var(--pf-c-button--m-secondary--m-danger--after--BorderColor);\n}\n.pf-c-button.pf-m-danger.pf-m-secondary:hover {\n --pf-c-button--m-secondary--m-danger--Color: var(--pf-c-button--m-secondary--m-danger--hover--Color);\n --pf-c-button--m-secondary--m-danger--BackgroundColor: var(--pf-c-button--m-secondary--m-danger--hover--BackgroundColor);\n --pf-c-button--after--BorderColor: var(--pf-c-button--m-secondary--m-danger--hover--after--BorderColor);\n}\n.pf-c-button.pf-m-danger.pf-m-secondary:focus {\n --pf-c-button--m-secondary--m-danger--Color: var(--pf-c-button--m-secondary--m-danger--focus--Color);\n --pf-c-button--m-secondary--m-danger--BackgroundColor: var(--pf-c-button--m-secondary--m-danger--focus--BackgroundColor);\n --pf-c-button--after--BorderColor: var(--pf-c-button--m-secondary--m-danger--focus--after--BorderColor);\n}\n.pf-c-button.pf-m-danger.pf-m-secondary:active, .pf-c-button.pf-m-danger.pf-m-secondary.pf-m-active {\n --pf-c-button--m-secondary--m-danger--Color: var(--pf-c-button--m-secondary--m-danger--active--Color);\n --pf-c-button--m-secondary--m-danger--BackgroundColor: var(--pf-c-button--m-secondary--m-danger--active--BackgroundColor);\n --pf-c-button--after--BorderColor: var(--pf-c-button--m-secondary--m-danger--active--after--BorderColor);\n}\n.pf-c-button.pf-m-danger.pf-m-link {\n --pf-c-button--m-danger--Color: var(--pf-c-button--m-link--m-danger--Color);\n --pf-c-button--m-danger--BackgroundColor: var(--pf-c-button--m-link--m-danger--BackgroundColor);\n}\n.pf-c-button.pf-m-danger.pf-m-link:hover {\n --pf-c-button--m-link--m-danger--Color: var(--pf-c-button--m-link--m-danger--hover--Color);\n --pf-c-button--m-link--m-danger--BackgroundColor: var(--pf-c-button--m-link--m-danger--hover--BackgroundColor);\n}\n.pf-c-button.pf-m-danger.pf-m-link:focus {\n --pf-c-button--m-link--m-danger--Color: var(--pf-c-button--m-link--m-danger--focus--Color);\n --pf-c-button--m-link--m-danger--BackgroundColor: var(--pf-c-button--m-link--m-danger--focus--BackgroundColor);\n}\n.pf-c-button.pf-m-danger.pf-m-link:active, .pf-c-button.pf-m-danger.pf-m-link.pf-m-active {\n --pf-c-button--m-link--m-danger--Color: var(--pf-c-button--m-link--m-danger--active--Color);\n --pf-c-button--m-link--m-danger--BackgroundColor: var(--pf-c-button--m-link--m-danger--active--BackgroundColor);\n}\n.pf-c-button.pf-m-warning {\n color: var(--pf-c-button--m-warning--Color);\n background-color: var(--pf-c-button--m-warning--BackgroundColor);\n}\n.pf-c-button.pf-m-warning:hover {\n --pf-c-button--m-warning--Color: var(--pf-c-button--m-warning--hover--Color);\n --pf-c-button--m-warning--BackgroundColor: var(--pf-c-button--m-warning--hover--BackgroundColor);\n}\n.pf-c-button.pf-m-warning:focus {\n --pf-c-button--m-warning--Color: var(--pf-c-button--m-warning--focus--Color);\n --pf-c-button--m-warning--BackgroundColor: var(--pf-c-button--m-warning--focus--BackgroundColor);\n}\n.pf-c-button.pf-m-warning:active, .pf-c-button.pf-m-warning.pf-m-active {\n --pf-c-button--m-warning--Color: var(--pf-c-button--m-warning--active--Color);\n --pf-c-button--m-warning--BackgroundColor: var(--pf-c-button--m-warning--active--BackgroundColor);\n}\n.pf-c-button.pf-m-control {\n --pf-c-button--BorderRadius: var(--pf-c-button--m-control--BorderRadius);\n --pf-c-button--disabled--BackgroundColor: var(--pf-c-button--m-control--disabled--BackgroundColor);\n --pf-c-button--after--BorderWidth: var(--pf-c-button--m-control--after--BorderWidth);\n --pf-c-button--after--BorderColor: var(--pf-c-button--m-control--after--BorderTopColor) var(--pf-c-button--m-control--after--BorderRightColor) var(--pf-c-button--m-control--after--BorderBottomColor) var(--pf-c-button--m-control--after--BorderLeftColor);\n color: var(--pf-c-button--m-control--Color);\n background-color: var(--pf-c-button--m-control--BackgroundColor);\n}\n.pf-c-button.pf-m-control::after {\n border-radius: initial;\n}\n.pf-c-button.pf-m-control:hover {\n --pf-c-button--m-control--Color: var(--pf-c-button--m-control--hover--Color);\n --pf-c-button--m-control--BackgroundColor: var(--pf-c-button--m-control--hover--BackgroundColor);\n --pf-c-button--m-control--after--BorderBottomColor: var(--pf-c-button--m-control--hover--after--BorderBottomColor);\n}\n.pf-c-button.pf-m-control:hover::after {\n border-bottom-width: var(--pf-c-button--m-control--hover--after--BorderBottomWidth);\n}\n.pf-c-button.pf-m-control:active, .pf-c-button.pf-m-control.pf-m-active {\n --pf-c-button--m-control--Color: var(--pf-c-button--m-control--active--Color);\n --pf-c-button--m-control--BackgroundColor: var(--pf-c-button--m-control--active--BackgroundColor);\n --pf-c-button--m-control--after--BorderBottomColor: var(--pf-c-button--m-control--active--after--BorderBottomColor);\n}\n.pf-c-button.pf-m-control:active::after, .pf-c-button.pf-m-control.pf-m-active::after {\n border-bottom-width: var(--pf-c-button--m-control--active--after--BorderBottomWidth);\n}\n.pf-c-button.pf-m-control:focus {\n --pf-c-button--m-control--Color: var(--pf-c-button--m-control--focus--Color);\n --pf-c-button--m-control--BackgroundColor: var(--pf-c-button--m-control--focus--BackgroundColor);\n --pf-c-button--m-control--after--BorderBottomColor: var(--pf-c-button--m-control--focus--after--BorderBottomColor);\n}\n.pf-c-button.pf-m-control:focus::after {\n border-bottom-width: var(--pf-c-button--m-control--focus--after--BorderBottomWidth);\n}\n.pf-c-button.pf-m-control.pf-m-expanded {\n --pf-c-button--m-control--Color: var(--pf-c-button--m-control--m-expanded--Color);\n --pf-c-button--m-control--BackgroundColor: var(--pf-c-button--m-control--m-expanded--BackgroundColor);\n --pf-c-button--m-control--after--BorderBottomColor: var(--pf-c-button--m-control--m-expanded--after--BorderBottomColor);\n}\n.pf-c-button.pf-m-control.pf-m-expanded::after {\n border-bottom-width: var(--pf-c-button--m-control--m-expanded--after--BorderBottomWidth);\n}\n.pf-c-button.pf-m-plain {\n --pf-c-button--disabled--Color: var(--pf-c-button--m-plain--disabled--Color);\n --pf-c-button--disabled--BackgroundColor: var(--pf-c-button--m-plain--disabled--BackgroundColor);\n color: var(--pf-c-button--m-plain--Color);\n background-color: var(--pf-c-button--m-plain--BackgroundColor);\n}\n.pf-c-button.pf-m-plain:hover {\n --pf-c-button--m-plain--Color: var(--pf-c-button--m-plain--hover--Color);\n --pf-c-button--m-plain--BackgroundColor: var(--pf-c-button--m-plain--hover--BackgroundColor);\n}\n.pf-c-button.pf-m-plain:active, .pf-c-button.pf-m-plain.pf-m-active {\n --pf-c-button--m-plain--Color: var(--pf-c-button--m-plain--active--Color);\n --pf-c-button--m-plain--BackgroundColor: var(--pf-c-button--m-plain--active--BackgroundColor);\n}\n.pf-c-button.pf-m-plain:focus {\n --pf-c-button--m-plain--Color: var(--pf-c-button--m-plain--focus--Color);\n --pf-c-button--m-plain--BackgroundColor: var(--pf-c-button--m-plain--focus--BackgroundColor);\n}\n.pf-c-button:disabled, .pf-c-button.pf-m-disabled {\n pointer-events: none;\n}\n.pf-c-button:disabled, .pf-c-button.pf-m-disabled, .pf-c-button.pf-m-aria-disabled {\n color: var(--pf-c-button--disabled--Color);\n background-color: var(--pf-c-button--disabled--BackgroundColor);\n}\n.pf-c-button:disabled::after, .pf-c-button.pf-m-disabled::after, .pf-c-button.pf-m-aria-disabled::after {\n border-color: var(--pf-c-button--disabled--after--BorderColor);\n}\n.pf-c-button:disabled .pf-c-badge, .pf-c-button.pf-m-disabled .pf-c-badge, .pf-c-button.pf-m-aria-disabled .pf-c-badge {\n --pf-c-badge--m-unread--Color: var(--pf-c-button--disabled__c-badge--Color);\n --pf-c-badge--m-unread--BackgroundColor: var(--pf-c-button--disabled__c-badge--BackgroundColor);\n --pf-c-button--m-primary__c-badge--BorderWidth: 0;\n}\n.pf-c-button.pf-m-aria-disabled {\n --pf-c-button--after--BorderWidth: 0;\n --pf-c-button--m-link--m-inline--hover--TextDecoration: none;\n cursor: default;\n}\n.pf-c-button.pf-m-progress {\n --pf-c-button--PaddingRight: var(--pf-c-button--m-progress--PaddingRight);\n --pf-c-button--PaddingLeft: var(--pf-c-button--m-progress--PaddingLeft);\n transition: var(--pf-c-button--m-progress--TransitionProperty) var(--pf-c-button--m-progress--TransitionDuration);\n}\n.pf-c-button.pf-m-in-progress {\n --pf-c-button--m-link--m-inline--PaddingLeft: var(--pf-c-button--m-link--m-inline--m-in-progress--PaddingLeft);\n}\n.pf-c-button.pf-m-in-progress:not(.pf-m-plain) {\n --pf-c-button--PaddingRight: var(--pf-c-button--m-in-progress--PaddingRight);\n --pf-c-button--PaddingLeft: var(--pf-c-button--m-in-progress--PaddingLeft);\n}\n.pf-c-button.pf-m-in-progress.pf-m-plain {\n --pf-c-button--m-plain--Color: var(--pf-c-button--m-in-progress--m-plain--Color);\n --pf-c-button__progress--Left: var(--pf-c-button--m-in-progress--m-plain__progress--Left);\n --pf-c-button__progress--TranslateX: var(--pf-c-button--m-in-progress--m-plain__progress--TranslateX);\n}\n.pf-c-button.pf-m-in-progress.pf-m-plain > :not(.pf-c-button__progress) {\n opacity: 0;\n}\n\n.pf-c-button__icon.pf-m-start {\n margin-right: var(--pf-c-button__icon--m-start--MarginRight);\n}\n.pf-c-button__icon.pf-m-end {\n margin-left: var(--pf-c-button__icon--m-end--MarginLeft);\n}\n\n.pf-c-button__progress {\n position: absolute;\n top: var(--pf-c-button__progress--Top);\n left: var(--pf-c-button__progress--Left);\n line-height: 1;\n transform: translate(var(--pf-c-button__progress--TranslateX), var(--pf-c-button__progress--TranslateY));\n}\n.pf-c-button__progress .pf-c-spinner {\n --pf-c-spinner--Color: currentcolor;\n}\n\n.pf-c-button__count {\n display: inline-flex;\n align-items: center;\n margin-left: var(--pf-c-button__count--MarginLeft);\n}\n\n.pf-m-overpass-font .pf-c-button {\n --pf-c-button--FontWeight: var(--pf-global--FontWeight--semi-bold);\n}\n\n:where(.pf-theme-dark) .pf-c-button {\n --pf-c-button--disabled--Color: var(--pf-global--disabled-color--300);\n --pf-c-button--m-primary--BackgroundColor: var(--pf-global--primary-color--300);\n --pf-c-button--m-tertiary--after--BorderColor: var(--pf-global--BorderColor--100);\n --pf-c-button--m-tertiary--Color: var(--pf-global--palette--black-100);\n --pf-c-button--m-tertiary--hover--after--BorderColor: var(--pf-global--BorderColor--100);\n --pf-c-button--m-tertiary--hover--Color: var(--pf-global--palette--black-100);\n --pf-c-button--m-tertiary--focus--after--BorderColor: var(--pf-global--BorderColor--100);\n --pf-c-button--m-tertiary--focus--Color: var(--pf-global--palette--black-100);\n --pf-c-button--m-tertiary--active--after--BorderColor: var(--pf-global--BorderColor--100);\n --pf-c-button--m-tertiary--active--Color: var(--pf-global--palette--black-100);\n --pf-c-button--m-warning--Color: var(--pf-global--palette--black-900);\n --pf-c-button--m-warning--hover--Color: var(--pf-global--palette--black-900);\n --pf-c-button--m-warning--focus--Color: var(--pf-global--palette--black-900);\n --pf-c-button--m-warning--active--Color: var(--pf-global--palette--black-900);\n --pf-c-button--m-warning--hover--BackgroundColor: var(--pf-global--warning-color--200);\n --pf-c-button--m-warning--focus--BackgroundColor: var(--pf-global--warning-color--200);\n --pf-c-button--m-warning--active--BackgroundColor: var(--pf-global--warning-color--200);\n --pf-c-button--m-danger--Color: var(--pf-global--palette--black-900);\n --pf-c-button--m-danger--hover--Color: var(--pf-global--palette--black-900);\n --pf-c-button--m-danger--focus--Color: var(--pf-global--palette--black-900);\n --pf-c-button--m-danger--active--Color: var(--pf-global--palette--black-900);\n --pf-c-button--m-control--BackgroundColor: var(--pf-global--BackgroundColor--400);\n --pf-c-button--m-control--hover--BackgroundColor: var(--pf-global--BackgroundColor--400);\n --pf-c-button--m-control--active--BackgroundColor: var(--pf-global--BackgroundColor--400);\n --pf-c-button--m-control--focus--BackgroundColor: var(--pf-global--BackgroundColor--400);\n --pf-c-button--m-control--m-expanded--BackgroundColor: var(--pf-global--BackgroundColor--400);\n --pf-c-button--m-control--after--BorderTopColor: transparent;\n --pf-c-button--m-control--after--BorderRightColor: transparent;\n --pf-c-button--m-control--after--BorderBottomColor: var(--pf-global--BorderColor--400);\n --pf-c-button--m-control--after--BorderLeftColor: transparent;\n --pf-c-button--m-control--hover--after--BorderBottomColor: var(--pf-global--primary-color--100);\n --pf-c-button--m-control--active--after--BorderBottomColor: var(--pf-global--primary-color--100);\n --pf-c-button--m-control--focus--after--BorderBottomColor: var(--pf-global--primary-color--100);\n --pf-c-button--m-control--m-expanded--after--BorderBottomColor: var(--pf-global--primary-color--100);\n --pf-c-button--m-control--disabled--BackgroundColor: var(--pf-global--disabled-color--200);\n --pf-c-button--m-primary__c-badge--BorderColor: var(--pf-global--Color--100);\n}\n:where(.pf-theme-dark) .pf-c-button.pf-m-control:disabled::after {\n border: 0;\n border-bottom: var(--pf-global--BorderWidth--sm) solid var(--pf-global--palette--black-700);\n}',""]);const l=i},13746:(e,t,n)=>{"use strict";n.d(t,{A:()=>l});var r=n(31601),o=n.n(r),a=n(76314),i=n.n(a)()(o());i.push([e.id,".pf-c-content {\n --pf-c-content--MarginBottom: var(--pf-global--spacer--md);\n --pf-c-content--LineHeight: var(--pf-global--LineHeight--md);\n --pf-c-content--FontSize: var(--pf-global--FontSize--md);\n --pf-c-content--FontWeight: var(--pf-global--FontWeight--normal);\n --pf-c-content--Color: var(--pf-global--Color--100);\n --pf-c-content--heading--FontFamily: var(--pf-global--FontFamily--heading--sans-serif);\n --pf-c-content--h1--MarginTop: var(--pf-global--spacer--lg);\n --pf-c-content--h1--MarginBottom: var(--pf-global--spacer--sm);\n --pf-c-content--h1--LineHeight: var(--pf-global--LineHeight--sm);\n --pf-c-content--h1--FontSize: var(--pf-global--FontSize--2xl);\n --pf-c-content--h1--FontWeight: var(--pf-global--FontWeight--normal);\n --pf-c-content--h2--MarginTop: var(--pf-global--spacer--lg);\n --pf-c-content--h2--MarginBottom: var(--pf-global--spacer--sm);\n --pf-c-content--h2--LineHeight: var(--pf-global--LineHeight--md);\n --pf-c-content--h2--FontSize: var(--pf-global--FontSize--xl);\n --pf-c-content--h2--FontWeight: var(--pf-global--FontWeight--normal);\n --pf-c-content--h3--MarginTop: var(--pf-global--spacer--lg);\n --pf-c-content--h3--MarginBottom: var(--pf-global--spacer--sm);\n --pf-c-content--h3--LineHeight: var(--pf-global--LineHeight--md);\n --pf-c-content--h3--FontSize: var(--pf-global--FontSize--lg);\n --pf-c-content--h3--FontWeight: var(--pf-global--FontWeight--normal);\n --pf-c-content--h4--MarginTop: var(--pf-global--spacer--lg);\n --pf-c-content--h4--MarginBottom: var(--pf-global--spacer--sm);\n --pf-c-content--h4--LineHeight: var(--pf-global--LineHeight--md);\n --pf-c-content--h4--FontSize: var(--pf-global--FontSize--md);\n --pf-c-content--h4--FontWeight: var(--pf-global--FontWeight--normal);\n --pf-c-content--h5--MarginTop: var(--pf-global--spacer--lg);\n --pf-c-content--h5--MarginBottom: var(--pf-global--spacer--sm);\n --pf-c-content--h5--LineHeight: var(--pf-global--LineHeight--md);\n --pf-c-content--h5--FontSize: var(--pf-global--FontSize--md);\n --pf-c-content--h5--FontWeight: var(--pf-global--FontWeight--normal);\n --pf-c-content--h6--MarginTop: var(--pf-global--spacer--lg);\n --pf-c-content--h6--MarginBottom: var(--pf-global--spacer--sm);\n --pf-c-content--h6--LineHeight: var(--pf-global--LineHeight--md);\n --pf-c-content--h6--FontSize: var(--pf-global--FontSize--md);\n --pf-c-content--h6--FontWeight: var(--pf-global--FontWeight--normal);\n --pf-c-content--small--MarginBottom: var(--pf-global--spacer--md);\n --pf-c-content--small--LineHeight: var(--pf-global--LineHeight--md);\n --pf-c-content--small--FontSize: var(--pf-global--FontSize--sm);\n --pf-c-content--small--Color: var(--pf-global--Color--200);\n --pf-c-content--a--Color: var(--pf-global--link--Color);\n --pf-c-content--a--TextDecoration: var(--pf-global--link--TextDecoration);\n --pf-c-content--a--hover--Color: var(--pf-global--link--Color--hover);\n --pf-c-content--a--hover--TextDecoration: var(--pf-global--link--TextDecoration--hover);\n --pf-c-content--a--visited--Color: var(--pf-global--link--Color--visited);\n --pf-c-content--blockquote--PaddingTop: var(--pf-global--spacer--md);\n --pf-c-content--blockquote--PaddingRight: var(--pf-global--spacer--md);\n --pf-c-content--blockquote--PaddingBottom: var(--pf-global--spacer--md);\n --pf-c-content--blockquote--PaddingLeft: var(--pf-global--spacer--md);\n --pf-c-content--blockquote--Color: var(--pf-global--Color--200);\n --pf-c-content--blockquote--BorderLeftColor: var(--pf-global--BorderColor--100);\n --pf-c-content--blockquote--BorderLeftWidth: var(--pf-global--BorderWidth--lg);\n --pf-c-content--ol--PaddingLeft: var(--pf-global--spacer--lg);\n --pf-c-content--ol--MarginLeft: var(--pf-global--spacer--lg);\n --pf-c-content--ol--nested--MarginTop: var(--pf-global--spacer--sm);\n --pf-c-content--ol--nested--MarginLeft: var(--pf-global--spacer--sm);\n --pf-c-content--ul--PaddingLeft: var(--pf-global--spacer--lg);\n --pf-c-content--ul--MarginLeft: var(--pf-global--spacer--lg);\n --pf-c-content--ul--nested--MarginTop: var(--pf-global--spacer--sm);\n --pf-c-content--ul--nested--MarginLeft: var(--pf-global--spacer--sm);\n --pf-c-content--ul--ListStyle: var(--pf-global--ListStyle);\n --pf-c-content--li--MarginTop: var(--pf-global--spacer--sm);\n --pf-c-content--dl--ColumnGap: var(--pf-global--spacer--2xl);\n --pf-c-content--dl--RowGap: var(--pf-global--spacer--md);\n --pf-c-content--dt--FontWeight: var(--pf-global--FontWeight--semi-bold);\n --pf-c-content--dt--MarginTop: var(--pf-global--spacer--md);\n --pf-c-content--dt--sm--MarginTop: 0;\n --pf-c-content--hr--Height: var(--pf-global--BorderWidth--sm);\n --pf-c-content--hr--BackgroundColor: var(--pf-global--BorderColor--100);\n font-size: var(--pf-c-content--FontSize);\n line-height: var(--pf-c-content--LineHeight);\n color: var(--pf-c-content--Color);\n}\n.pf-c-content a {\n color: var(--pf-c-content--a--Color);\n text-decoration: var(--pf-c-content--a--TextDecoration);\n}\n.pf-c-content a:hover {\n --pf-c-content--a--Color: var(--pf-c-content--a--hover--Color);\n --pf-c-content--a--TextDecoration: var(--pf-c-content--a--hover--TextDecoration);\n}\n.pf-c-content.pf-m-visited a:visited,\n.pf-c-content a.pf-m-visited:visited {\n color: var(--pf-c-content--a--visited--Color);\n}\n.pf-c-content li + li {\n margin-top: var(--pf-c-content--li--MarginTop);\n}\n.pf-c-content p:not(:last-child),\n.pf-c-content dl:not(:last-child),\n.pf-c-content ol:not(:last-child),\n.pf-c-content ul:not(:last-child),\n.pf-c-content blockquote:not(:last-child),\n.pf-c-content small:not(:last-child),\n.pf-c-content pre:not(:last-child),\n.pf-c-content table:not(:last-child),\n.pf-c-content hr:not(:last-child) {\n margin-bottom: var(--pf-c-content--MarginBottom);\n}\n.pf-c-content h1,\n.pf-c-content h2,\n.pf-c-content h3,\n.pf-c-content h4,\n.pf-c-content h5,\n.pf-c-content h6 {\n margin: 0;\n font-family: var(--pf-c-content--heading--FontFamily);\n}\n.pf-c-content h1:first-child,\n.pf-c-content h2:first-child,\n.pf-c-content h3:first-child,\n.pf-c-content h4:first-child,\n.pf-c-content h5:first-child,\n.pf-c-content h6:first-child {\n margin-top: 0;\n}\n.pf-c-content h1:last-child,\n.pf-c-content h2:last-child,\n.pf-c-content h3:last-child,\n.pf-c-content h4:last-child,\n.pf-c-content h5:last-child,\n.pf-c-content h6:last-child {\n margin-bottom: 0;\n}\n.pf-c-content ol,\n.pf-c-content ul {\n margin: 0;\n}\n.pf-c-content ol.pf-m-plain,\n.pf-c-content ul.pf-m-plain {\n padding-left: 0;\n margin-left: 0;\n list-style: none;\n}\n.pf-c-content h1 {\n margin-top: var(--pf-c-content--h1--MarginTop);\n margin-bottom: var(--pf-c-content--h1--MarginBottom);\n font-size: var(--pf-c-content--h1--FontSize);\n font-weight: var(--pf-c-content--h1--FontWeight);\n line-height: var(--pf-c-content--h1--LineHeight);\n}\n.pf-c-content h2 {\n margin-top: var(--pf-c-content--h2--MarginTop);\n margin-bottom: var(--pf-c-content--h2--MarginBottom);\n font-size: var(--pf-c-content--h2--FontSize);\n font-weight: var(--pf-c-content--h2--FontWeight);\n line-height: var(--pf-c-content--h2--LineHeight);\n}\n.pf-c-content h3 {\n margin-top: var(--pf-c-content--h3--MarginTop);\n margin-bottom: var(--pf-c-content--h3--MarginBottom);\n font-size: var(--pf-c-content--h3--FontSize);\n font-weight: var(--pf-c-content--h3--FontWeight);\n line-height: var(--pf-c-content--h3--LineHeight);\n}\n.pf-c-content h4 {\n margin-top: var(--pf-c-content--h4--MarginTop);\n margin-bottom: var(--pf-c-content--h4--MarginBottom);\n font-size: var(--pf-c-content--h4--FontSize);\n font-weight: var(--pf-c-content--h4--FontWeight);\n line-height: var(--pf-c-content--h4--LineHeight);\n}\n.pf-c-content h5 {\n margin-top: var(--pf-c-content--h5--MarginTop);\n margin-bottom: var(--pf-c-content--h5--MarginBottom);\n font-size: var(--pf-c-content--h5--FontSize);\n font-weight: var(--pf-c-content--h5--FontWeight);\n line-height: var(--pf-c-content--h5--LineHeight);\n}\n.pf-c-content h6 {\n margin-top: var(--pf-c-content--h6--MarginTop);\n margin-bottom: var(--pf-c-content--h6--MarginBottom);\n font-size: var(--pf-c-content--h6--FontSize);\n font-weight: var(--pf-c-content--h6--FontWeight);\n line-height: var(--pf-c-content--h6--LineHeight);\n}\n.pf-c-content small {\n display: block;\n font-size: var(--pf-c-content--small--FontSize);\n line-height: var(--pf-c-content--small--LineHeight);\n color: var(--pf-c-content--small--Color);\n}\n.pf-c-content small:not(:last-child) {\n margin-bottom: var(--pf-c-content--small--MarginBottom);\n}\n.pf-c-content blockquote {\n padding: var(--pf-c-content--blockquote--PaddingTop) var(--pf-c-content--blockquote--PaddingRight) var(--pf-c-content--blockquote--PaddingBottom) var(--pf-c-content--blockquote--PaddingLeft);\n color: var(--pf-c-content--blockquote--Color);\n border-left: var(--pf-c-content--blockquote--BorderLeftWidth) solid var(--pf-c-content--blockquote--BorderLeftColor);\n}\n.pf-c-content hr {\n height: var(--pf-c-content--hr--Height);\n background-color: var(--pf-c-content--hr--BackgroundColor);\n border: none;\n}\n.pf-c-content ol {\n padding-left: var(--pf-c-content--ol--PaddingLeft);\n margin-left: var(--pf-c-content--ol--MarginLeft);\n}\n.pf-c-content ol ul {\n margin-top: var(--pf-c-content--ul--nested--MarginTop);\n --pf-c-content--ul--MarginLeft: var(--pf-c-content--ul--nested--MarginLeft);\n}\n.pf-c-content ol ol {\n margin-top: var(--pf-c-content--ol--nested--MarginTop);\n --pf-c-content--ol--MarginLeft: var(--pf-c-content--ol--nested--MarginLeft);\n}\n.pf-c-content ul {\n padding-left: var(--pf-c-content--ul--PaddingLeft);\n margin-left: var(--pf-c-content--ul--MarginLeft);\n list-style: var(--pf-c-content--ul--ListStyle);\n}\n.pf-c-content ul ul {\n margin-top: var(--pf-c-content--ul--nested--MarginTop);\n --pf-c-content--ul--MarginLeft: var(--pf-c-content--ul--nested--MarginLeft);\n}\n.pf-c-content ul ol {\n margin-top: var(--pf-c-content--ol--nested--MarginTop);\n --pf-c-content--ol--MarginLeft: var(--pf-c-content--ol--nested--MarginLeft);\n}\n.pf-c-content dl {\n display: grid;\n grid-template-columns: 1fr;\n}\n@media screen and (min-width: 576px) {\n .pf-c-content dl {\n grid-template: auto/auto 1fr;\n grid-column-gap: var(--pf-c-content--dl--ColumnGap);\n grid-row-gap: var(--pf-c-content--dl--RowGap);\n }\n}\n.pf-c-content dt {\n font-weight: var(--pf-c-content--dt--FontWeight);\n}\n.pf-c-content dt:not(:first-child) {\n margin-top: var(--pf-c-content--dt--MarginTop);\n}\n@media screen and (min-width: 576px) {\n .pf-c-content dt:not(:first-child) {\n --pf-c-content--dt--MarginTop: var(--pf-c-content--dt--sm--MarginTop);\n }\n}\n@media screen and (min-width: 576px) {\n .pf-c-content dt {\n grid-column: 1;\n }\n}\n@media screen and (min-width: 576px) {\n .pf-c-content dd {\n grid-column: 2;\n }\n}\n\n.pf-m-overpass-font .pf-c-content {\n --pf-c-content--h2--LineHeight: var(--pf-global--LineHeight--sm);\n --pf-c-content--h4--FontWeight: var(--pf-global--FontWeight--semi-bold);\n --pf-c-content--h5--FontWeight: var(--pf-global--FontWeight--semi-bold);\n --pf-c-content--h6--FontWeight: var(--pf-global--FontWeight--semi-bold);\n}\n.pf-m-overpass-font .pf-c-content blockquote {\n font-weight: var(--pf-global--FontWeight--light);\n}",""]);const l=i},97986:(e,t,n)=>{"use strict";n.d(t,{A:()=>l});var r=n(31601),o=n.n(r),a=n(76314),i=n.n(a)()(o());i.push([e.id,'.pf-c-drawer {\n --pf-c-drawer__section--BackgroundColor: var(--pf-global--BackgroundColor--100);\n --pf-c-drawer__section--m-light-200--BackgroundColor: var(--pf-global--BackgroundColor--200);\n --pf-c-drawer__content--FlexBasis: 100%;\n --pf-c-drawer__content--BackgroundColor: var(--pf-global--BackgroundColor--100);\n --pf-c-drawer__content--m-light-200--BackgroundColor: var(--pf-global--BackgroundColor--200);\n --pf-c-drawer__content--ZIndex: var(--pf-global--ZIndex--xs);\n --pf-c-drawer__panel--MinWidth: 50%;\n --pf-c-drawer__panel--MaxHeight: auto;\n --pf-c-drawer__panel--ZIndex: var(--pf-global--ZIndex--sm);\n --pf-c-drawer__panel--BackgroundColor: var(--pf-global--BackgroundColor--100);\n --pf-c-drawer__panel--m-light-200--BackgroundColor: var(--pf-global--BackgroundColor--200);\n --pf-c-drawer__panel--TransitionDuration: var(--pf-global--TransitionDuration);\n --pf-c-drawer__panel--TransitionProperty: margin, transform, box-shadow, flex-basis;\n --pf-c-drawer__panel--FlexBasis: 100%;\n --pf-c-drawer__panel--md--FlexBasis--min: 1.5rem;\n --pf-c-drawer__panel--md--FlexBasis: 50%;\n --pf-c-drawer__panel--md--FlexBasis--max: 100%;\n --pf-c-drawer__panel--xl--MinWidth: 28.125rem;\n --pf-c-drawer__panel--xl--FlexBasis: 28.125rem;\n --pf-c-drawer--m-panel-bottom__panel--md--MinHeight: 50%;\n --pf-c-drawer--m-panel-bottom__panel--xl--MinHeight: 18.75rem;\n --pf-c-drawer--m-panel-bottom__panel--xl--FlexBasis: 18.75rem;\n --pf-c-drawer__panel--m-resizable--FlexDirection: row;\n --pf-c-drawer__panel--m-resizable--md--FlexBasis--min: var(--pf-c-drawer__splitter--m-vertical--Width);\n --pf-c-drawer__panel--m-resizable--MinWidth: 1.5rem;\n --pf-c-drawer--m-panel-bottom__panel--m-resizable--FlexDirection: column;\n --pf-c-drawer--m-panel-bottom__panel--m-resizable--md--FlexBasis--min: 1.5rem;\n --pf-c-drawer--m-panel-bottom__panel--m-resizable--MinHeight: 1.5rem;\n --pf-c-drawer--child--PaddingTop: var(--pf-global--spacer--md);\n --pf-c-drawer--child--PaddingRight: var(--pf-global--spacer--md);\n --pf-c-drawer--child--PaddingBottom: var(--pf-global--spacer--md);\n --pf-c-drawer--child--PaddingLeft: var(--pf-global--spacer--md);\n --pf-c-drawer--child--md--PaddingTop: var(--pf-global--spacer--lg);\n --pf-c-drawer--child--md--PaddingRight: var(--pf-global--spacer--lg);\n --pf-c-drawer--child--md--PaddingBottom: var(--pf-global--spacer--lg);\n --pf-c-drawer--child--md--PaddingLeft: var(--pf-global--spacer--lg);\n --pf-c-drawer--child--m-padding--PaddingTop: var(--pf-global--spacer--md);\n --pf-c-drawer--child--m-padding--PaddingRight: var(--pf-global--spacer--md);\n --pf-c-drawer--child--m-padding--PaddingBottom: var(--pf-global--spacer--md);\n --pf-c-drawer--child--m-padding--PaddingLeft: var(--pf-global--spacer--md);\n --pf-c-drawer--child--m-padding--md--PaddingTop: var(--pf-global--spacer--lg);\n --pf-c-drawer--child--m-padding--md--PaddingRight: var(--pf-global--spacer--lg);\n --pf-c-drawer--child--m-padding--md--PaddingBottom: var(--pf-global--spacer--lg);\n --pf-c-drawer--child--m-padding--md--PaddingLeft: var(--pf-global--spacer--lg);\n --pf-c-drawer__content--child--PaddingTop: 0;\n --pf-c-drawer__content--child--PaddingRight: 0;\n --pf-c-drawer__content--child--PaddingBottom: 0;\n --pf-c-drawer__content--child--PaddingLeft: 0;\n --pf-c-drawer__splitter--Height: 0.5625rem;\n --pf-c-drawer__splitter--Width: 100%;\n --pf-c-drawer__splitter--BackgroundColor: var(--pf-global--BackgroundColor--100);\n --pf-c-drawer__splitter--Cursor: row-resize;\n --pf-c-drawer__splitter--m-vertical--Height: 100%;\n --pf-c-drawer__splitter--m-vertical--Width: 0.5625rem;\n --pf-c-drawer__splitter--m-vertical--Cursor: col-resize;\n --pf-c-drawer--m-inline__splitter--focus--OutlineOffset: -0.0625rem;\n --pf-c-drawer__splitter--after--BorderColor: var(--pf-global--BorderColor--100);\n --pf-c-drawer__splitter--after--border-width--base: var(--pf-global--BorderWidth--sm);\n --pf-c-drawer__splitter--after--BorderTopWidth: 0;\n --pf-c-drawer__splitter--after--BorderRightWidth: var(--pf-c-drawer__splitter--after--border-width--base);\n --pf-c-drawer__splitter--after--BorderBottomWidth: 0;\n --pf-c-drawer__splitter--after--BorderLeftWidth: 0;\n --pf-c-drawer--m-panel-left__splitter--after--BorderLeftWidth: var(--pf-c-drawer__splitter--after--border-width--base);\n --pf-c-drawer--m-panel-bottom__splitter--after--BorderBottomWidth: var(--pf-c-drawer__splitter--after--border-width--base);\n --pf-c-drawer--m-inline__splitter--m-vertical--Width: 0.625rem;\n --pf-c-drawer--m-inline__splitter-handle--Left: 50%;\n --pf-c-drawer--m-inline__splitter--after--BorderRightWidth: var(--pf-c-drawer__splitter--after--border-width--base);\n --pf-c-drawer--m-inline__splitter--after--BorderLeftWidth: var(--pf-c-drawer__splitter--after--border-width--base);\n --pf-c-drawer--m-inline--m-panel-bottom__splitter--Height: 0.625rem;\n --pf-c-drawer--m-inline--m-panel-bottom__splitter-handle--Top: 50%;\n --pf-c-drawer--m-inline--m-panel-bottom__splitter--after--BorderTopWidth: var(--pf-c-drawer__splitter--after--border-width--base);\n --pf-c-drawer__splitter-handle--Top: 50%;\n --pf-c-drawer__splitter-handle--Left: calc(50% - var(--pf-c-drawer__splitter--after--border-width--base));\n --pf-c-drawer--m-panel-left__splitter-handle--Left: 50%;\n --pf-c-drawer--m-panel-bottom__splitter-handle--Top: calc(50% - var(--pf-c-drawer__splitter--after--border-width--base));\n --pf-c-drawer__splitter-handle--after--BorderColor: var(--pf-global--Color--200);\n --pf-c-drawer__splitter-handle--after--BorderTopWidth: var(--pf-global--BorderWidth--sm);\n --pf-c-drawer__splitter-handle--after--BorderRightWidth: 0;\n --pf-c-drawer__splitter-handle--after--BorderBottomWidth: var(--pf-global--BorderWidth--sm);\n --pf-c-drawer__splitter-handle--after--BorderLeftWidth: 0;\n --pf-c-drawer__splitter--hover__splitter-handle--after--BorderColor: var(--pf-global--Color--100);\n --pf-c-drawer__splitter--focus__splitter-handle--after--BorderColor: var(--pf-global--Color--100);\n --pf-c-drawer__splitter--m-vertical__splitter-handle--after--BorderTopWidth: 0;\n --pf-c-drawer__splitter--m-vertical__splitter-handle--after--BorderRightWidth: var(--pf-global--BorderWidth--sm);\n --pf-c-drawer__splitter--m-vertical__splitter-handle--after--BorderBottomWidth: 0;\n --pf-c-drawer__splitter--m-vertical__splitter-handle--after--BorderLeftWidth: var(--pf-global--BorderWidth--sm);\n --pf-c-drawer__splitter-handle--after--Width: 0.75rem;\n --pf-c-drawer__splitter-handle--after--Height: 0.25rem;\n --pf-c-drawer__splitter--m-vertical__splitter-handle--after--Width: 0.25rem;\n --pf-c-drawer__splitter--m-vertical__splitter-handle--after--Height: 0.75rem;\n --pf-c-drawer__actions--MarginTop: calc(var(--pf-global--spacer--form-element) * -1);\n --pf-c-drawer__actions--MarginRight: calc(var(--pf-global--spacer--form-element) * -1);\n --pf-c-drawer__panel--BoxShadow: none;\n --pf-c-drawer--m-expanded__panel--BoxShadow: var(--pf-global--BoxShadow--lg-left);\n --pf-c-drawer--m-expanded--m-panel-left__panel--BoxShadow: var(--pf-global--BoxShadow--lg-right);\n --pf-c-drawer--m-expanded--m-panel-bottom__panel--BoxShadow: var(--pf-global--BoxShadow--lg-top);\n --pf-c-drawer__panel--after--Width: var(--pf-global--BorderWidth--sm);\n --pf-c-drawer--m-panel-bottom__panel--after--Height: var(--pf-global--BorderWidth--sm);\n --pf-c-drawer__panel--after--BackgroundColor: transparent;\n --pf-c-drawer--m-inline--m-expanded__panel--after--BackgroundColor: var(--pf-global--BorderColor--100);\n --pf-c-drawer--m-inline__panel--PaddingLeft: var(--pf-c-drawer__panel--after--Width);\n --pf-c-drawer--m-panel-left--m-inline__panel--PaddingRight: var(--pf-c-drawer__panel--after--Width);\n --pf-c-drawer--m-panel-bottom--m-inline__panel--PaddingTop: var(--pf-c-drawer__panel--after--Width);\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow-x: hidden;\n}\n@media screen and (min-width: 768px) {\n .pf-c-drawer {\n --pf-c-drawer--child--PaddingTop: var(--pf-c-drawer--child--md--PaddingTop);\n --pf-c-drawer--child--PaddingRight: var(--pf-c-drawer--child--md--PaddingRight);\n --pf-c-drawer--child--PaddingBottom: var(--pf-c-drawer--child--md--PaddingBottom);\n --pf-c-drawer--child--PaddingLeft: var(--pf-c-drawer--child--md--PaddingLeft);\n --pf-c-drawer--child--m-padding--PaddingTop: var(--pf-c-drawer--child--m-padding--md--PaddingTop);\n --pf-c-drawer--child--m-padding--PaddingRight: var(--pf-c-drawer--child--m-padding--md--PaddingRight);\n --pf-c-drawer--child--m-padding--PaddingBottom: var(--pf-c-drawer--child--m-padding--md--PaddingBottom);\n --pf-c-drawer--child--m-padding--PaddingLeft: var(--pf-c-drawer--child--m-padding--md--PaddingLeft);\n }\n}\n@media screen and (min-width: 1200px) {\n .pf-c-drawer {\n --pf-c-drawer__panel--MinWidth: var(--pf-c-drawer__panel--xl--MinWidth);\n }\n .pf-c-drawer.pf-m-panel-bottom {\n --pf-c-drawer__panel--MinWidth: auto;\n --pf-c-drawer__panel--MinHeight: var(--pf-c-drawer--m-panel-bottom__panel--xl--MinHeight);\n }\n}\n.pf-c-drawer.pf-m-inline > .pf-c-drawer__main > .pf-c-drawer__panel:not(.pf-m-no-border, .pf-m-resizable), .pf-c-drawer.pf-m-static > .pf-c-drawer__main > .pf-c-drawer__panel:not(.pf-m-no-border, .pf-m-resizable) {\n padding-left: var(--pf-c-drawer--m-inline__panel--PaddingLeft);\n}\n.pf-c-drawer.pf-m-panel-left > .pf-c-drawer__main > .pf-c-drawer__panel {\n order: 0;\n margin-right: calc(var(--pf-c-drawer__panel--FlexBasis) * -1);\n transform: translateX(-100%);\n}\n.pf-c-drawer.pf-m-panel-left > .pf-c-drawer__main > .pf-c-drawer__content {\n order: 1;\n}\n.pf-c-drawer.pf-m-panel-bottom > .pf-c-drawer__main {\n flex-direction: column;\n}\n.pf-c-drawer.pf-m-expanded > .pf-c-drawer__main > .pf-c-drawer__panel {\n transform: translateX(-100%);\n}\n.pf-c-drawer.pf-m-expanded.pf-m-panel-left > .pf-c-drawer__main > .pf-c-drawer__panel {\n transform: translateX(0);\n}\n.pf-c-drawer.pf-m-expanded.pf-m-panel-bottom > .pf-c-drawer__main > .pf-c-drawer__panel {\n transform: translate(0, -100%);\n}\n.pf-c-drawer.pf-m-resizing {\n --pf-c-drawer__panel--TransitionProperty: none;\n pointer-events: none;\n}\n.pf-c-drawer.pf-m-resizing .pf-c-drawer__splitter {\n pointer-events: auto;\n}\n\n.pf-c-drawer__section {\n flex-grow: 0;\n background-color: var(--pf-c-drawer__section--BackgroundColor);\n}\n.pf-c-drawer__section.pf-m-no-background {\n --pf-c-drawer__section--BackgroundColor: transparent;\n}\n.pf-c-drawer__section.pf-m-light-200 {\n --pf-c-drawer__section--BackgroundColor: var(--pf-c-drawer__section--m-light-200--BackgroundColor);\n}\n\n.pf-c-drawer__main {\n display: flex;\n flex: 1;\n overflow: hidden;\n}\n\n.pf-c-drawer__content,\n.pf-c-drawer__panel,\n.pf-c-drawer__panel-main {\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n overflow: auto;\n}\n\n.pf-c-drawer__content {\n z-index: var(--pf-c-drawer__content--ZIndex);\n flex-basis: var(--pf-c-drawer__content--FlexBasis);\n order: 0;\n background-color: var(--pf-c-drawer__content--BackgroundColor);\n}\n.pf-c-drawer__content.pf-m-no-background {\n --pf-c-drawer__content--BackgroundColor: transparent;\n}\n.pf-c-drawer__content.pf-m-light-200 {\n --pf-c-drawer__content--BackgroundColor: var(--pf-c-drawer__content--m-light-200--BackgroundColor);\n}\n.pf-c-drawer__content > .pf-c-drawer__body {\n padding: var(--pf-c-drawer__content--child--PaddingTop) var(--pf-c-drawer__content--child--PaddingRight) var(--pf-c-drawer__content--child--PaddingBottom) var(--pf-c-drawer__content--child--PaddingLeft);\n}\n\n.pf-c-drawer__panel {\n position: relative;\n z-index: var(--pf-c-drawer__panel--ZIndex);\n flex-basis: var(--pf-c-drawer__panel--FlexBasis);\n order: 1;\n max-height: var(--pf-c-drawer__panel--MaxHeight);\n overflow: auto;\n background-color: var(--pf-c-drawer__panel--BackgroundColor);\n box-shadow: var(--pf-c-drawer__panel--BoxShadow);\n transition-duration: var(--pf-c-drawer__panel--TransitionDuration);\n transition-property: var(--pf-c-drawer__panel--TransitionProperty);\n -webkit-overflow-scrolling: touch;\n}\n.pf-c-drawer__panel::after {\n position: absolute;\n top: 0;\n left: 0;\n width: var(--pf-c-drawer__panel--after--Width);\n height: 100%;\n content: "";\n background-color: var(--pf-c-drawer__panel--after--BackgroundColor);\n}\n.pf-c-drawer__panel.pf-m-no-background {\n --pf-c-drawer__panel--BackgroundColor: transparent;\n}\n.pf-c-drawer__panel.pf-m-light-200 {\n --pf-c-drawer__panel--BackgroundColor: var(--pf-c-drawer__panel--m-light-200--BackgroundColor);\n}\n@media screen and (min-width: 768px) {\n .pf-c-drawer__panel {\n --pf-c-drawer__panel--FlexBasis:\n max(\n var(--pf-c-drawer__panel--md--FlexBasis--min),\n min(var(--pf-c-drawer__panel--md--FlexBasis), var(--pf-c-drawer__panel--md--FlexBasis--max))\n );\n }\n}\n@media screen and (min-width: 1200px) {\n .pf-c-drawer__panel {\n --pf-c-drawer__panel--md--FlexBasis: var(--pf-c-drawer__panel--xl--FlexBasis);\n }\n .pf-c-drawer.pf-m-panel-bottom .pf-c-drawer__panel {\n --pf-c-drawer__panel--md--FlexBasis: var(--pf-c-drawer--m-panel-bottom__panel--xl--FlexBasis);\n }\n}\n\n.pf-c-drawer__panel-main {\n flex-grow: 1;\n}\n\n@keyframes pf-remove-tab-focus {\n to {\n visibility: hidden;\n }\n}\n.pf-c-drawer__panel[hidden] {\n animation-name: pf-remove-tab-focus;\n animation-delay: var(--pf-c-drawer__panel--TransitionDuration);\n animation-fill-mode: forwards;\n}\n\n.pf-c-drawer__head {\n display: grid;\n grid-template-columns: auto;\n grid-auto-columns: max-content;\n}\n.pf-c-drawer__head > * {\n grid-column: 1;\n}\n\n.pf-c-drawer__actions {\n grid-column: 2;\n grid-row: 1;\n display: flex;\n align-self: baseline;\n margin-top: var(--pf-c-drawer__actions--MarginTop);\n margin-right: var(--pf-c-drawer__actions--MarginRight);\n}\n\n.pf-c-drawer__body {\n min-height: 0;\n padding: var(--pf-c-drawer--child--PaddingTop) var(--pf-c-drawer--child--PaddingRight) var(--pf-c-drawer--child--PaddingBottom) var(--pf-c-drawer--child--PaddingLeft);\n}\n.pf-c-drawer__body.pf-m-no-padding {\n padding: 0;\n}\n.pf-c-drawer__body.pf-m-no-padding > .pf-c-drawer__actions,\n.pf-c-drawer__body.pf-m-no-padding > .pf-c-drawer__head > .pf-c-drawer__actions {\n margin-top: 0;\n margin-right: 0;\n}\n.pf-c-drawer__body.pf-m-padding {\n padding: var(--pf-c-drawer--child--m-padding--PaddingTop) var(--pf-c-drawer--child--m-padding--PaddingRight) var(--pf-c-drawer--child--m-padding--PaddingBottom) var(--pf-c-drawer--child--m-padding--PaddingLeft);\n}\n.pf-c-drawer__body:not(.pf-m-no-padding) + * {\n padding-top: 0;\n}\n.pf-c-drawer__body:last-child {\n flex: 1 1;\n}\n\n.pf-c-drawer__body > .pf-c-page__main {\n height: 100%;\n}\n\n.pf-c-drawer__splitter {\n position: relative;\n display: none;\n width: var(--pf-c-drawer__splitter--Width);\n height: var(--pf-c-drawer__splitter--Height);\n cursor: var(--pf-c-drawer__splitter--Cursor);\n visibility: hidden;\n background-color: var(--pf-c-drawer__splitter--BackgroundColor);\n}\n.pf-c-drawer__splitter.pf-m-vertical {\n --pf-c-drawer__splitter--Height: var(--pf-c-drawer__splitter--m-vertical--Height);\n --pf-c-drawer__splitter--Width: var(--pf-c-drawer__splitter--m-vertical--Width);\n --pf-c-drawer__splitter--Cursor: var(--pf-c-drawer__splitter--m-vertical--Cursor);\n --pf-c-drawer__splitter-handle--after--Width: var(--pf-c-drawer__splitter--m-vertical__splitter-handle--after--Width);\n --pf-c-drawer__splitter-handle--after--Height: var(--pf-c-drawer__splitter--m-vertical__splitter-handle--after--Height);\n --pf-c-drawer__splitter-handle--after--BorderTopWidth: var(--pf-c-drawer__splitter--m-vertical__splitter-handle--after--BorderTopWidth);\n --pf-c-drawer__splitter-handle--after--BorderRightWidth: var(--pf-c-drawer__splitter--m-vertical__splitter-handle--after--BorderRightWidth);\n --pf-c-drawer__splitter-handle--after--BorderBottomWidth: var(--pf-c-drawer__splitter--m-vertical__splitter-handle--after--BorderBottomWidth);\n --pf-c-drawer__splitter-handle--after--BorderLeftWidth: var(--pf-c-drawer__splitter--m-vertical__splitter-handle--after--BorderLeftWidth);\n}\n.pf-c-drawer__splitter:hover {\n --pf-c-drawer__splitter-handle--after--BorderColor: var(--pf-c-drawer__splitter--hover__splitter-handle--after--BorderColor);\n}\n.pf-c-drawer__splitter:focus {\n --pf-c-drawer__splitter-handle--after--BorderColor: var(--pf-c-drawer__splitter--focus__splitter-handle--after--BorderColor);\n}\n.pf-c-drawer__splitter::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n content: "";\n border: solid var(--pf-c-drawer__splitter--after--BorderColor);\n border-width: var(--pf-c-drawer__splitter--after--BorderTopWidth) var(--pf-c-drawer__splitter--after--BorderRightWidth) var(--pf-c-drawer__splitter--after--BorderBottomWidth) var(--pf-c-drawer__splitter--after--BorderLeftWidth);\n}\n\n.pf-c-drawer__splitter-handle {\n position: absolute;\n top: var(--pf-c-drawer__splitter-handle--Top);\n left: var(--pf-c-drawer__splitter-handle--Left);\n transform: translate(-50%, -50%);\n}\n.pf-c-drawer__splitter-handle::after {\n display: block;\n width: var(--pf-c-drawer__splitter-handle--after--Width);\n height: var(--pf-c-drawer__splitter-handle--after--Height);\n content: "";\n border-color: var(--pf-c-drawer__splitter-handle--after--BorderColor);\n border-style: solid;\n border-width: var(--pf-c-drawer__splitter-handle--after--BorderTopWidth) var(--pf-c-drawer__splitter-handle--after--BorderRightWidth) var(--pf-c-drawer__splitter-handle--after--BorderBottomWidth) var(--pf-c-drawer__splitter-handle--after--BorderLeftWidth);\n}\n\n@media screen and (min-width: 768px) {\n .pf-c-drawer {\n min-width: var(--pf-c-drawer__panel--MinWidth);\n }\n .pf-c-drawer.pf-m-expanded > .pf-c-drawer__main > .pf-c-drawer__panel {\n box-shadow: var(--pf-c-drawer--m-expanded__panel--BoxShadow);\n }\n .pf-c-drawer > .pf-c-drawer__main > .pf-c-drawer__panel.pf-m-resizable {\n --pf-c-drawer__panel--md--FlexBasis--min: var(--pf-c-drawer__panel--m-resizable--md--FlexBasis--min);\n flex-direction: var(--pf-c-drawer__panel--m-resizable--FlexDirection);\n min-width: var(--pf-c-drawer__panel--m-resizable--MinWidth);\n }\n .pf-c-drawer > .pf-c-drawer__main > .pf-c-drawer__panel.pf-m-resizable::after {\n width: 0;\n height: 0;\n }\n .pf-c-drawer > .pf-c-drawer__main > .pf-c-drawer__panel.pf-m-resizable > .pf-c-drawer__splitter {\n flex-shrink: 0;\n }\n .pf-c-drawer > .pf-c-drawer__main > .pf-c-drawer__panel.pf-m-resizable > .pf-c-drawer__panel-main {\n flex-shrink: 1;\n }\n .pf-c-drawer.pf-m-panel-left {\n --pf-c-drawer--m-expanded__panel--BoxShadow: var(--pf-c-drawer--m-expanded--m-panel-left__panel--BoxShadow);\n }\n .pf-c-drawer.pf-m-panel-left.pf-m-inline > .pf-c-drawer__main > .pf-c-drawer__panel:not(.pf-m-no-border, .pf-m-resizable), .pf-c-drawer.pf-m-panel-left.pf-m-static > .pf-c-drawer__main > .pf-c-drawer__panel:not(.pf-m-no-border, .pf-m-resizable) {\n padding-right: var(--pf-c-drawer--m-panel-left--m-inline__panel--PaddingRight);\n padding-left: 0;\n }\n .pf-c-drawer.pf-m-panel-left.pf-m-expanded > .pf-c-drawer__main > .pf-c-drawer__panel {\n transform: translateX(0);\n }\n .pf-c-drawer.pf-m-panel-left > .pf-c-drawer__main > .pf-c-drawer__panel::after {\n right: 0;\n left: auto;\n }\n .pf-c-drawer.pf-m-panel-left > .pf-c-drawer__main > .pf-c-drawer__panel.pf-m-resizable > .pf-c-drawer__splitter {\n --pf-c-drawer__splitter-handle--Left: var(--pf-c-drawer--m-panel-left__splitter-handle--Left);\n --pf-c-drawer__splitter--after--BorderRightWidth: 0;\n --pf-c-drawer__splitter--after--BorderLeftWidth: var(--pf-c-drawer--m-panel-left__splitter--after--BorderLeftWidth);\n order: 1;\n }\n .pf-c-drawer.pf-m-panel-bottom {\n --pf-c-drawer--m-expanded__panel--BoxShadow: var(--pf-c-drawer--m-expanded--m-panel-bottom__panel--BoxShadow);\n --pf-c-drawer__panel--MaxHeight: 100%;\n --pf-c-drawer__panel--FlexBasis--min: var(--pf-c-drawer--m-panel-bottom__panel--FlexBasis--min);\n min-width: auto;\n min-height: var(--pf-c-drawer--m-panel-bottom__panel--md--MinHeight);\n }\n .pf-c-drawer.pf-m-panel-bottom.pf-m-inline > .pf-c-drawer__main > .pf-c-drawer__panel:not(.pf-m-no-border, .pf-m-resizable), .pf-c-drawer.pf-m-panel-bottom.pf-m-static > .pf-c-drawer__main > .pf-c-drawer__panel:not(.pf-m-no-border, .pf-m-resizable) {\n padding-top: var(--pf-c-drawer--m-panel-bottom--m-inline__panel--PaddingTop);\n padding-left: 0;\n }\n .pf-c-drawer.pf-m-panel-bottom > .pf-c-drawer__main > .pf-c-drawer__panel::after {\n top: 0;\n left: auto;\n width: 100%;\n height: var(--pf-c-drawer--m-panel-bottom__panel--after--Height);\n }\n .pf-c-drawer.pf-m-panel-bottom > .pf-c-drawer__main > .pf-c-drawer__panel.pf-m-resizable {\n --pf-c-drawer__panel--md--FlexBasis--min: var(--pf-c-drawer--m-panel-bottom__panel--m-resizable--md--FlexBasis--min);\n --pf-c-drawer__panel--m-resizable--FlexDirection: var(--pf-c-drawer--m-panel-bottom__panel--m-resizable--FlexDirection);\n --pf-c-drawer__panel--m-resizable--MinWidth: 0;\n min-height: var(--pf-c-drawer--m-panel-bottom__panel--m-resizable--MinHeight);\n }\n .pf-c-drawer.pf-m-panel-bottom > .pf-c-drawer__main > .pf-c-drawer__panel.pf-m-resizable > .pf-c-drawer__splitter {\n --pf-c-drawer__splitter-handle--Top: var(--pf-c-drawer--m-panel-bottom__splitter-handle--Top);\n --pf-c-drawer__splitter--after--BorderRightWidth: 0;\n --pf-c-drawer__splitter--after--BorderBottomWidth: var(--pf-c-drawer--m-panel-bottom__splitter--after--BorderBottomWidth);\n }\n .pf-c-drawer.pf-m-inline > .pf-c-drawer__main > .pf-c-drawer__panel.pf-m-resizable > .pf-c-drawer__splitter {\n --pf-c-drawer__splitter--m-vertical--Width: var(--pf-c-drawer--m-inline__splitter--m-vertical--Width);\n --pf-c-drawer__splitter-handle--Left: var(--pf-c-drawer--m-inline__splitter-handle--Left);\n --pf-c-drawer__splitter--after--BorderRightWidth: var(--pf-c-drawer--m-inline__splitter--after--BorderRightWidth);\n --pf-c-drawer__splitter--after--BorderLeftWidth: var(--pf-c-drawer--m-inline__splitter--after--BorderLeftWidth);\n outline-offset: var(--pf-c-drawer--m-inline__splitter--focus--OutlineOffset);\n }\n .pf-c-drawer.pf-m-inline.pf-m-panel-bottom > .pf-c-drawer__main > .pf-c-drawer__panel.pf-m-resizable > .pf-c-drawer__splitter {\n --pf-c-drawer__splitter--Height: var(--pf-c-drawer--m-inline--m-panel-bottom__splitter--Height);\n --pf-c-drawer__splitter-handle--Top: var(--pf-c-drawer--m-inline--m-panel-bottom__splitter-handle--Top);\n --pf-c-drawer__splitter--after--BorderTopWidth: var(--pf-c-drawer--m-inline--m-panel-bottom__splitter--after--BorderTopWidth);\n --pf-c-drawer__splitter--after--BorderRightWidth: 0;\n --pf-c-drawer__splitter--after--BorderLeftWidth: 0;\n }\n .pf-c-drawer > .pf-c-drawer__main > .pf-c-drawer__panel.pf-m-no-border,\n.pf-c-drawer.pf-m-panel-left > .pf-c-drawer__main > .pf-c-drawer__panel.pf-m-no-border {\n --pf-c-drawer--m-expanded__panel--BoxShadow: none;\n }\n .pf-c-drawer__splitter {\n display: block;\n visibility: visible;\n }\n}\n@media (min-width: 768px) {\n .pf-c-drawer__panel.pf-m-width-25 {\n --pf-c-drawer__panel--md--FlexBasis: 25%;\n }\n .pf-c-drawer__panel.pf-m-width-33 {\n --pf-c-drawer__panel--md--FlexBasis: 33%;\n }\n .pf-c-drawer__panel.pf-m-width-50 {\n --pf-c-drawer__panel--md--FlexBasis: 50%;\n }\n .pf-c-drawer__panel.pf-m-width-66 {\n --pf-c-drawer__panel--md--FlexBasis: 66%;\n }\n .pf-c-drawer__panel.pf-m-width-75 {\n --pf-c-drawer__panel--md--FlexBasis: 75%;\n }\n .pf-c-drawer__panel.pf-m-width-100 {\n --pf-c-drawer__panel--md--FlexBasis: 100%;\n }\n}\n@media (min-width: 992px) {\n .pf-c-drawer__panel.pf-m-width-25-on-lg {\n --pf-c-drawer__panel--md--FlexBasis: 25%;\n }\n .pf-c-drawer__panel.pf-m-width-33-on-lg {\n --pf-c-drawer__panel--md--FlexBasis: 33%;\n }\n .pf-c-drawer__panel.pf-m-width-50-on-lg {\n --pf-c-drawer__panel--md--FlexBasis: 50%;\n }\n .pf-c-drawer__panel.pf-m-width-66-on-lg {\n --pf-c-drawer__panel--md--FlexBasis: 66%;\n }\n .pf-c-drawer__panel.pf-m-width-75-on-lg {\n --pf-c-drawer__panel--md--FlexBasis: 75%;\n }\n .pf-c-drawer__panel.pf-m-width-100-on-lg {\n --pf-c-drawer__panel--md--FlexBasis: 100%;\n }\n}\n@media (min-width: 1200px) {\n .pf-c-drawer__panel.pf-m-width-25-on-xl {\n --pf-c-drawer__panel--md--FlexBasis: 25%;\n }\n .pf-c-drawer__panel.pf-m-width-33-on-xl {\n --pf-c-drawer__panel--md--FlexBasis: 33%;\n }\n .pf-c-drawer__panel.pf-m-width-50-on-xl {\n --pf-c-drawer__panel--md--FlexBasis: 50%;\n }\n .pf-c-drawer__panel.pf-m-width-66-on-xl {\n --pf-c-drawer__panel--md--FlexBasis: 66%;\n }\n .pf-c-drawer__panel.pf-m-width-75-on-xl {\n --pf-c-drawer__panel--md--FlexBasis: 75%;\n }\n .pf-c-drawer__panel.pf-m-width-100-on-xl {\n --pf-c-drawer__panel--md--FlexBasis: 100%;\n }\n}\n@media (min-width: 1450px) {\n .pf-c-drawer__panel.pf-m-width-25-on-2xl {\n --pf-c-drawer__panel--md--FlexBasis: 25%;\n }\n .pf-c-drawer__panel.pf-m-width-33-on-2xl {\n --pf-c-drawer__panel--md--FlexBasis: 33%;\n }\n .pf-c-drawer__panel.pf-m-width-50-on-2xl {\n --pf-c-drawer__panel--md--FlexBasis: 50%;\n }\n .pf-c-drawer__panel.pf-m-width-66-on-2xl {\n --pf-c-drawer__panel--md--FlexBasis: 66%;\n }\n .pf-c-drawer__panel.pf-m-width-75-on-2xl {\n --pf-c-drawer__panel--md--FlexBasis: 75%;\n }\n .pf-c-drawer__panel.pf-m-width-100-on-2xl {\n --pf-c-drawer__panel--md--FlexBasis: 100%;\n }\n}\n@media (min-width: 768px) {\n .pf-c-drawer.pf-m-inline > .pf-c-drawer__main > .pf-c-drawer__content,\n.pf-c-drawer.pf-m-static > .pf-c-drawer__main > .pf-c-drawer__content {\n flex-shrink: 1;\n }\n .pf-c-drawer.pf-m-inline > .pf-c-drawer__main > .pf-c-drawer__panel,\n.pf-c-drawer.pf-m-static > .pf-c-drawer__main > .pf-c-drawer__panel {\n --pf-c-drawer--m-expanded__panel--BoxShadow: none;\n }\n .pf-c-drawer.pf-m-inline > .pf-c-drawer__main > .pf-c-drawer__panel:not(.pf-m-no-border)::after,\n.pf-c-drawer.pf-m-static > .pf-c-drawer__main > .pf-c-drawer__panel:not(.pf-m-no-border)::after {\n background-color: var(--pf-c-drawer--m-inline--m-expanded__panel--after--BackgroundColor);\n }\n .pf-c-drawer.pf-m-inline > .pf-c-drawer__main > .pf-c-drawer__content {\n overflow-x: auto;\n }\n .pf-c-drawer.pf-m-inline > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-left: calc(var(--pf-c-drawer__panel--FlexBasis) * -1);\n transform: translateX(100%);\n }\n .pf-c-drawer.pf-m-inline.pf-m-expanded > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-left: 0;\n transform: translateX(0);\n }\n .pf-c-drawer.pf-m-inline > .pf-c-drawer__main > .pf-c-drawer__panel > .pf-c-drawer__body > .pf-c-drawer__head .pf-c-drawer__close {\n display: unset;\n visibility: visible;\n }\n .pf-c-drawer.pf-m-inline.pf-m-panel-left > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-right: calc(var(--pf-c-drawer__panel--FlexBasis) * -1);\n margin-left: 0;\n transform: translateX(-100%);\n }\n .pf-c-drawer.pf-m-inline.pf-m-panel-left.pf-m-expanded > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-right: 0;\n transform: translateX(0);\n }\n .pf-c-drawer.pf-m-inline.pf-m-panel-left > .pf-c-drawer__main > .pf-c-drawer__panel > .pf-c-drawer__body > .pf-c-drawer__head .pf-c-drawer__close {\n display: unset;\n visibility: visible;\n }\n .pf-c-drawer.pf-m-inline.pf-m-panel-bottom > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-bottom: calc(var(--pf-c-drawer__panel--FlexBasis) * -1);\n transform: translateY(100%);\n }\n .pf-c-drawer.pf-m-inline.pf-m-panel-bottom.pf-m-expanded > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-bottom: 0;\n transform: translateY(0);\n }\n .pf-c-drawer.pf-m-static > .pf-c-drawer__main > .pf-c-drawer__panel {\n transform: translateX(0);\n }\n .pf-c-drawer.pf-m-static.pf-m-panel-left > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-right: 0;\n transform: translateX(0);\n }\n .pf-c-drawer.pf-m-static.pf-m-panel-bottom > .pf-c-drawer__main > .pf-c-drawer__panel {\n transform: translateX(0);\n }\n .pf-c-drawer.pf-m-static > .pf-c-drawer__main > .pf-c-drawer__panel > .pf-c-drawer__body > .pf-c-drawer__head .pf-c-drawer__close {\n display: none;\n visibility: hidden;\n }\n}\n@media (min-width: 992px) {\n .pf-c-drawer.pf-m-inline-on-lg > .pf-c-drawer__main > .pf-c-drawer__content,\n.pf-c-drawer.pf-m-static-on-lg > .pf-c-drawer__main > .pf-c-drawer__content {\n flex-shrink: 1;\n }\n .pf-c-drawer.pf-m-inline-on-lg > .pf-c-drawer__main > .pf-c-drawer__panel,\n.pf-c-drawer.pf-m-static-on-lg > .pf-c-drawer__main > .pf-c-drawer__panel {\n --pf-c-drawer--m-expanded__panel--BoxShadow: none;\n }\n .pf-c-drawer.pf-m-inline-on-lg > .pf-c-drawer__main > .pf-c-drawer__panel:not(.pf-m-no-border)::after,\n.pf-c-drawer.pf-m-static-on-lg > .pf-c-drawer__main > .pf-c-drawer__panel:not(.pf-m-no-border)::after {\n background-color: var(--pf-c-drawer--m-inline--m-expanded__panel--after--BackgroundColor);\n }\n .pf-c-drawer.pf-m-inline-on-lg > .pf-c-drawer__main > .pf-c-drawer__content {\n overflow-x: auto;\n }\n .pf-c-drawer.pf-m-inline-on-lg > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-left: calc(var(--pf-c-drawer__panel--FlexBasis) * -1);\n transform: translateX(100%);\n }\n .pf-c-drawer.pf-m-inline-on-lg.pf-m-expanded > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-left: 0;\n transform: translateX(0);\n }\n .pf-c-drawer.pf-m-inline-on-lg > .pf-c-drawer__main > .pf-c-drawer__panel > .pf-c-drawer__body > .pf-c-drawer__head .pf-c-drawer__close {\n display: unset;\n visibility: visible;\n }\n .pf-c-drawer.pf-m-inline-on-lg.pf-m-panel-left > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-right: calc(var(--pf-c-drawer__panel--FlexBasis) * -1);\n margin-left: 0;\n transform: translateX(-100%);\n }\n .pf-c-drawer.pf-m-inline-on-lg.pf-m-panel-left.pf-m-expanded > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-right: 0;\n transform: translateX(0);\n }\n .pf-c-drawer.pf-m-inline-on-lg.pf-m-panel-left > .pf-c-drawer__main > .pf-c-drawer__panel > .pf-c-drawer__body > .pf-c-drawer__head .pf-c-drawer__close {\n display: unset;\n visibility: visible;\n }\n .pf-c-drawer.pf-m-inline-on-lg.pf-m-panel-bottom > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-bottom: calc(var(--pf-c-drawer__panel--FlexBasis) * -1);\n transform: translateY(100%);\n }\n .pf-c-drawer.pf-m-inline-on-lg.pf-m-panel-bottom.pf-m-expanded > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-bottom: 0;\n transform: translateY(0);\n }\n .pf-c-drawer.pf-m-static-on-lg > .pf-c-drawer__main > .pf-c-drawer__panel {\n transform: translateX(0);\n }\n .pf-c-drawer.pf-m-static-on-lg.pf-m-panel-left > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-right: 0;\n transform: translateX(0);\n }\n .pf-c-drawer.pf-m-static-on-lg.pf-m-panel-bottom > .pf-c-drawer__main > .pf-c-drawer__panel {\n transform: translateX(0);\n }\n .pf-c-drawer.pf-m-static-on-lg > .pf-c-drawer__main > .pf-c-drawer__panel > .pf-c-drawer__body > .pf-c-drawer__head .pf-c-drawer__close {\n display: none;\n visibility: hidden;\n }\n}\n@media (min-width: 1200px) {\n .pf-c-drawer.pf-m-inline-on-xl > .pf-c-drawer__main > .pf-c-drawer__content,\n.pf-c-drawer.pf-m-static-on-xl > .pf-c-drawer__main > .pf-c-drawer__content {\n flex-shrink: 1;\n }\n .pf-c-drawer.pf-m-inline-on-xl > .pf-c-drawer__main > .pf-c-drawer__panel,\n.pf-c-drawer.pf-m-static-on-xl > .pf-c-drawer__main > .pf-c-drawer__panel {\n --pf-c-drawer--m-expanded__panel--BoxShadow: none;\n }\n .pf-c-drawer.pf-m-inline-on-xl > .pf-c-drawer__main > .pf-c-drawer__panel:not(.pf-m-no-border)::after,\n.pf-c-drawer.pf-m-static-on-xl > .pf-c-drawer__main > .pf-c-drawer__panel:not(.pf-m-no-border)::after {\n background-color: var(--pf-c-drawer--m-inline--m-expanded__panel--after--BackgroundColor);\n }\n .pf-c-drawer.pf-m-inline-on-xl > .pf-c-drawer__main > .pf-c-drawer__content {\n overflow-x: auto;\n }\n .pf-c-drawer.pf-m-inline-on-xl > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-left: calc(var(--pf-c-drawer__panel--FlexBasis) * -1);\n transform: translateX(100%);\n }\n .pf-c-drawer.pf-m-inline-on-xl.pf-m-expanded > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-left: 0;\n transform: translateX(0);\n }\n .pf-c-drawer.pf-m-inline-on-xl > .pf-c-drawer__main > .pf-c-drawer__panel > .pf-c-drawer__body > .pf-c-drawer__head .pf-c-drawer__close {\n display: unset;\n visibility: visible;\n }\n .pf-c-drawer.pf-m-inline-on-xl.pf-m-panel-left > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-right: calc(var(--pf-c-drawer__panel--FlexBasis) * -1);\n margin-left: 0;\n transform: translateX(-100%);\n }\n .pf-c-drawer.pf-m-inline-on-xl.pf-m-panel-left.pf-m-expanded > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-right: 0;\n transform: translateX(0);\n }\n .pf-c-drawer.pf-m-inline-on-xl.pf-m-panel-left > .pf-c-drawer__main > .pf-c-drawer__panel > .pf-c-drawer__body > .pf-c-drawer__head .pf-c-drawer__close {\n display: unset;\n visibility: visible;\n }\n .pf-c-drawer.pf-m-inline-on-xl.pf-m-panel-bottom > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-bottom: calc(var(--pf-c-drawer__panel--FlexBasis) * -1);\n transform: translateY(100%);\n }\n .pf-c-drawer.pf-m-inline-on-xl.pf-m-panel-bottom.pf-m-expanded > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-bottom: 0;\n transform: translateY(0);\n }\n .pf-c-drawer.pf-m-static-on-xl > .pf-c-drawer__main > .pf-c-drawer__panel {\n transform: translateX(0);\n }\n .pf-c-drawer.pf-m-static-on-xl.pf-m-panel-left > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-right: 0;\n transform: translateX(0);\n }\n .pf-c-drawer.pf-m-static-on-xl.pf-m-panel-bottom > .pf-c-drawer__main > .pf-c-drawer__panel {\n transform: translateX(0);\n }\n .pf-c-drawer.pf-m-static-on-xl > .pf-c-drawer__main > .pf-c-drawer__panel > .pf-c-drawer__body > .pf-c-drawer__head .pf-c-drawer__close {\n display: none;\n visibility: hidden;\n }\n}\n@media (min-width: 1450px) {\n .pf-c-drawer.pf-m-inline-on-2xl > .pf-c-drawer__main > .pf-c-drawer__content,\n.pf-c-drawer.pf-m-static-on-2xl > .pf-c-drawer__main > .pf-c-drawer__content {\n flex-shrink: 1;\n }\n .pf-c-drawer.pf-m-inline-on-2xl > .pf-c-drawer__main > .pf-c-drawer__panel,\n.pf-c-drawer.pf-m-static-on-2xl > .pf-c-drawer__main > .pf-c-drawer__panel {\n --pf-c-drawer--m-expanded__panel--BoxShadow: none;\n }\n .pf-c-drawer.pf-m-inline-on-2xl > .pf-c-drawer__main > .pf-c-drawer__panel:not(.pf-m-no-border)::after,\n.pf-c-drawer.pf-m-static-on-2xl > .pf-c-drawer__main > .pf-c-drawer__panel:not(.pf-m-no-border)::after {\n background-color: var(--pf-c-drawer--m-inline--m-expanded__panel--after--BackgroundColor);\n }\n .pf-c-drawer.pf-m-inline-on-2xl > .pf-c-drawer__main > .pf-c-drawer__content {\n overflow-x: auto;\n }\n .pf-c-drawer.pf-m-inline-on-2xl > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-left: calc(var(--pf-c-drawer__panel--FlexBasis) * -1);\n transform: translateX(100%);\n }\n .pf-c-drawer.pf-m-inline-on-2xl.pf-m-expanded > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-left: 0;\n transform: translateX(0);\n }\n .pf-c-drawer.pf-m-inline-on-2xl > .pf-c-drawer__main > .pf-c-drawer__panel > .pf-c-drawer__body > .pf-c-drawer__head .pf-c-drawer__close {\n display: unset;\n visibility: visible;\n }\n .pf-c-drawer.pf-m-inline-on-2xl.pf-m-panel-left > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-right: calc(var(--pf-c-drawer__panel--FlexBasis) * -1);\n margin-left: 0;\n transform: translateX(-100%);\n }\n .pf-c-drawer.pf-m-inline-on-2xl.pf-m-panel-left.pf-m-expanded > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-right: 0;\n transform: translateX(0);\n }\n .pf-c-drawer.pf-m-inline-on-2xl.pf-m-panel-left > .pf-c-drawer__main > .pf-c-drawer__panel > .pf-c-drawer__body > .pf-c-drawer__head .pf-c-drawer__close {\n display: unset;\n visibility: visible;\n }\n .pf-c-drawer.pf-m-inline-on-2xl.pf-m-panel-bottom > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-bottom: calc(var(--pf-c-drawer__panel--FlexBasis) * -1);\n transform: translateY(100%);\n }\n .pf-c-drawer.pf-m-inline-on-2xl.pf-m-panel-bottom.pf-m-expanded > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-bottom: 0;\n transform: translateY(0);\n }\n .pf-c-drawer.pf-m-static-on-2xl > .pf-c-drawer__main > .pf-c-drawer__panel {\n transform: translateX(0);\n }\n .pf-c-drawer.pf-m-static-on-2xl.pf-m-panel-left > .pf-c-drawer__main > .pf-c-drawer__panel {\n margin-right: 0;\n transform: translateX(0);\n }\n .pf-c-drawer.pf-m-static-on-2xl.pf-m-panel-bottom > .pf-c-drawer__main > .pf-c-drawer__panel {\n transform: translateX(0);\n }\n .pf-c-drawer.pf-m-static-on-2xl > .pf-c-drawer__main > .pf-c-drawer__panel > .pf-c-drawer__body > .pf-c-drawer__head .pf-c-drawer__close {\n display: none;\n visibility: hidden;\n }\n}\n:where(.pf-theme-dark) .pf-c-drawer {\n --pf-c-drawer__panel--BackgroundColor: var(--pf-global--BackgroundColor--400);\n --pf-c-drawer__splitter--BackgroundColor: transparent;\n}\n:where(.pf-theme-dark) .pf-c-drawer.pf-m-inline, :where(.pf-theme-dark) .pf-c-drawer.pf-m-static {\n --pf-c-drawer__panel--BackgroundColor: var(--pf-global--BackgroundColor--100);\n}',""]);const l=i},40671:(e,t,n)=>{"use strict";n.d(t,{A:()=>l});var r=n(31601),o=n.n(r),a=n(76314),i=n.n(a)()(o());i.push([e.id,".pf-c-modal-box {\n --pf-c-modal-box--BackgroundColor: var(--pf-global--BackgroundColor--100);\n --pf-c-modal-box--BoxShadow: var(--pf-global--BoxShadow--xl);\n --pf-c-modal-box--ZIndex: var(--pf-global--ZIndex--xl);\n --pf-c-modal-box--Width: 100%;\n --pf-c-modal-box--MaxWidth: calc(100% - var(--pf-global--spacer--xl));\n --pf-c-modal-box--m-sm--sm--MaxWidth: 35rem;\n --pf-c-modal-box--m-md--Width: 52.5rem;\n --pf-c-modal-box--m-lg--lg--MaxWidth: 70rem;\n --pf-c-modal-box--MaxHeight: calc(100% - var(--pf-global--spacer--2xl));\n --pf-c-modal-box--m-align-top--spacer: var(--pf-global--spacer--sm);\n --pf-c-modal-box--m-align-top--xl--spacer: var(--pf-global--spacer--xl);\n --pf-c-modal-box--m-align-top--MarginTop: var(--pf-c-modal-box--m-align-top--spacer);\n --pf-c-modal-box--m-align-top--MaxHeight: calc(100% - min(var(--pf-c-modal-box--m-align-top--spacer), var(--pf-global--spacer--2xl)) - var(--pf-c-modal-box--m-align-top--spacer));\n --pf-c-modal-box--m-align-top--MaxWidth: calc(100% - min(var(--pf-c-modal-box--m-align-top--spacer) * 2, var(--pf-global--spacer--xl)));\n --pf-c-modal-box--m-danger__title-icon--Color: var(--pf-global--danger-color--100);\n --pf-c-modal-box--m-warning__title-icon--Color: var(--pf-global--warning-color--100);\n --pf-c-modal-box--m-success__title-icon--Color: var(--pf-global--success-color--100);\n --pf-c-modal-box--m-info__title-icon--Color: var(--pf-global--info-color--100);\n --pf-c-modal-box--m-default__title-icon--Color: var(--pf-global--default-color--200);\n --pf-c-modal-box__header--PaddingTop: var(--pf-global--spacer--lg);\n --pf-c-modal-box__header--PaddingRight: var(--pf-global--spacer--lg);\n --pf-c-modal-box__header--PaddingLeft: var(--pf-global--spacer--lg);\n --pf-c-modal-box__header--last-child--PaddingBottom: var(--pf-global--spacer--lg);\n --pf-c-modal-box__title--LineHeight: var(--pf-global--LineHeight--sm);\n --pf-c-modal-box__title--FontFamily: var(--pf-global--FontFamily--heading--sans-serif);\n --pf-c-modal-box__title--FontSize: var(--pf-global--FontSize--2xl);\n --pf-c-modal-box__title-icon--MarginRight: var(--pf-global--spacer--sm);\n --pf-c-modal-box__title-icon--Color: var(--pf-global--Color--100);\n --pf-c-modal-box__description--PaddingTop: var(--pf-global--spacer--xs);\n --pf-c-modal-box__body--MinHeight: calc(var(--pf-global--FontSize--md) * var(--pf-global--LineHeight--md));\n --pf-c-modal-box__body--PaddingTop: var(--pf-global--spacer--lg);\n --pf-c-modal-box__body--PaddingRight: var(--pf-global--spacer--lg);\n --pf-c-modal-box__body--PaddingLeft: var(--pf-global--spacer--lg);\n --pf-c-modal-box__body--last-child--PaddingBottom: var(--pf-global--spacer--lg);\n --pf-c-modal-box__header--body--PaddingTop: var(--pf-global--spacer--md);\n --pf-c-modal-box--c-button--Top: calc(var(--pf-global--spacer--lg));\n --pf-c-modal-box--c-button--Right: var(--pf-global--spacer--md);\n --pf-c-modal-box--c-button--sibling--MarginRight: calc(var(--pf-global--spacer--xl) + var(--pf-global--spacer--sm));\n --pf-c-modal-box__footer--PaddingTop: var(--pf-global--spacer--lg);\n --pf-c-modal-box__footer--PaddingRight: var(--pf-global--spacer--lg);\n --pf-c-modal-box__footer--PaddingBottom: var(--pf-global--spacer--lg);\n --pf-c-modal-box__footer--PaddingLeft: var(--pf-global--spacer--lg);\n --pf-c-modal-box__footer--c-button--MarginRight: var(--pf-global--spacer--md);\n --pf-c-modal-box__footer--c-button--sm--MarginRight: calc(var(--pf-c-modal-box__footer--c-button--MarginRight) / 2);\n position: relative;\n z-index: var(--pf-c-modal-box--ZIndex);\n display: flex;\n flex-direction: column;\n width: var(--pf-c-modal-box--Width);\n max-width: var(--pf-c-modal-box--MaxWidth);\n max-height: var(--pf-c-modal-box--MaxHeight);\n background-color: var(--pf-c-modal-box--BackgroundColor);\n box-shadow: var(--pf-c-modal-box--BoxShadow);\n}\n@media (min-width: 1200px) {\n .pf-c-modal-box {\n --pf-c-modal-box--m-align-top--spacer: var(--pf-c-modal-box--m-align-top--xl--spacer);\n }\n}\n.pf-c-modal-box.pf-m-sm {\n --pf-c-modal-box--Width: var(--pf-c-modal-box--m-sm--sm--MaxWidth);\n}\n.pf-c-modal-box.pf-m-md {\n --pf-c-modal-box--Width: var(--pf-c-modal-box--m-md--Width);\n}\n.pf-c-modal-box.pf-m-lg {\n --pf-c-modal-box--Width: var(--pf-c-modal-box--m-lg--lg--MaxWidth);\n}\n.pf-c-modal-box.pf-m-align-top {\n top: var(--pf-c-modal-box--m-align-top--MarginTop);\n align-self: flex-start;\n max-width: var(--pf-c-modal-box--m-align-top--MaxWidth);\n max-height: var(--pf-c-modal-box--m-align-top--MaxHeight);\n}\n.pf-c-modal-box.pf-m-danger {\n --pf-c-modal-box__title-icon--Color: var(--pf-c-modal-box--m-danger__title-icon--Color);\n}\n.pf-c-modal-box.pf-m-warning {\n --pf-c-modal-box__title-icon--Color: var(--pf-c-modal-box--m-warning__title-icon--Color);\n}\n.pf-c-modal-box.pf-m-success {\n --pf-c-modal-box__title-icon--Color: var(--pf-c-modal-box--m-success__title-icon--Color);\n}\n.pf-c-modal-box.pf-m-default {\n --pf-c-modal-box__title-icon--Color: var(--pf-c-modal-box--m-default__title-icon--Color);\n}\n.pf-c-modal-box.pf-m-info {\n --pf-c-modal-box__title-icon--Color: var(--pf-c-modal-box--m-info__title-icon--Color);\n}\n.pf-c-modal-box > .pf-c-button {\n position: absolute;\n top: var(--pf-c-modal-box--c-button--Top);\n right: var(--pf-c-modal-box--c-button--Right);\n}\n.pf-c-modal-box > .pf-c-button + * {\n margin-right: var(--pf-c-modal-box--c-button--sibling--MarginRight);\n}\n\n.pf-c-modal-box__header {\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n padding-top: var(--pf-c-modal-box__header--PaddingTop);\n padding-right: var(--pf-c-modal-box__header--PaddingRight);\n padding-left: var(--pf-c-modal-box__header--PaddingLeft);\n}\n.pf-c-modal-box__header.pf-m-help {\n display: flex;\n flex-direction: row;\n}\n.pf-c-modal-box__header:last-child {\n padding-bottom: var(--pf-c-modal-box__header--last-child--PaddingBottom);\n}\n.pf-c-modal-box__header + .pf-c-modal-box__body {\n --pf-c-modal-box__body--PaddingTop: var(--pf-c-modal-box__header--body--PaddingTop);\n}\n\n.pf-c-modal-box__header-main {\n flex-grow: 1;\n min-width: 0;\n}\n\n.pf-c-modal-box__title,\n.pf-c-modal-box__title-text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.pf-c-modal-box__title {\n flex: 0 0 auto;\n font-family: var(--pf-c-modal-box__title--FontFamily);\n font-size: var(--pf-c-modal-box__title--FontSize);\n line-height: var(--pf-c-modal-box__title--LineHeight);\n}\n.pf-c-modal-box__title.pf-m-icon {\n display: flex;\n}\n\n.pf-c-modal-box__title-icon {\n margin-right: var(--pf-c-modal-box__title-icon--MarginRight);\n color: var(--pf-c-modal-box__title-icon--Color);\n}\n\n.pf-c-modal-box__description {\n padding-top: var(--pf-c-modal-box__description--PaddingTop);\n}\n\n.pf-c-modal-box__body {\n flex: 1 1 auto;\n min-height: var(--pf-c-modal-box__body--MinHeight);\n padding-top: var(--pf-c-modal-box__body--PaddingTop);\n padding-right: var(--pf-c-modal-box__body--PaddingRight);\n padding-left: var(--pf-c-modal-box__body--PaddingLeft);\n overflow-x: hidden;\n overflow-y: auto;\n overscroll-behavior: contain;\n word-break: break-word;\n -webkit-overflow-scrolling: touch;\n}\n.pf-c-modal-box__body:last-child {\n padding-bottom: var(--pf-c-modal-box__body--last-child--PaddingBottom);\n}\n\n.pf-c-modal-box__footer {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n padding-top: var(--pf-c-modal-box__footer--PaddingTop);\n padding-right: var(--pf-c-modal-box__footer--PaddingRight);\n padding-bottom: var(--pf-c-modal-box__footer--PaddingBottom);\n padding-left: var(--pf-c-modal-box__footer--PaddingLeft);\n}\n.pf-c-modal-box__footer > .pf-c-button:not(:last-child) {\n margin-right: var(--pf-c-modal-box__footer--c-button--MarginRight);\n}\n@media screen and (min-width: 576px) {\n .pf-c-modal-box__footer > .pf-c-button:not(:last-child) {\n --pf-c-modal-box__footer--c-button--MarginRight: var(--pf-c-modal-box__footer--c-button--sm--MarginRight);\n }\n}\n\n:where(.pf-theme-dark) .pf-c-modal-box {\n --pf-c-modal-box--BackgroundColor: var(--pf-global--BackgroundColor--300);\n}",""]);const l=i},71964:(e,t,n)=>{"use strict";n.d(t,{A:()=>l});var r=n(31601),o=n.n(r),a=n(76314),i=n.n(a)()(o());i.push([e.id,'.pf-c-popover[data-popper-reference-hidden="true"] {\n visibility: hidden;\n pointer-events: none;\n}\n\n',""]);const l=i},98746:(e,t,n)=>{"use strict";n.d(t,{A:()=>l});var r=n(31601),o=n.n(r),a=n(76314),i=n.n(a)()(o());i.push([e.id,'.pf-c-spinner {\n --pf-c-spinner--diameter: var(--pf-global--icon--FontSize--xl);\n --pf-c-spinner--Width: var(--pf-c-spinner--diameter);\n --pf-c-spinner--Height: var(--pf-c-spinner--diameter);\n --pf-c-spinner--Color: var(--pf-global--primary-color--100);\n --pf-c-spinner--m-sm--diameter: var(--pf-global--icon--FontSize--sm);\n --pf-c-spinner--m-md--diameter: var(--pf-global--icon--FontSize--md);\n --pf-c-spinner--m-lg--diameter: var(--pf-global--icon--FontSize--lg);\n --pf-c-spinner--m-xl--diameter: var(--pf-global--icon--FontSize--xl);\n --pf-c-spinner--m-inline--diameter: 1em;\n width: var(--pf-c-spinner--Width);\n height: var(--pf-c-spinner--Height);\n overflow: hidden;\n}\n.pf-c-spinner.pf-m-inline {\n --pf-c-spinner--diameter: var(--pf-c-spinner--m-inline--diameter);\n}\n.pf-c-spinner.pf-m-sm {\n --pf-c-spinner--diameter: var(--pf-c-spinner--m-sm--diameter);\n}\n.pf-c-spinner.pf-m-md {\n --pf-c-spinner--diameter: var(--pf-c-spinner--m-md--diameter);\n}\n.pf-c-spinner.pf-m-lg {\n --pf-c-spinner--diameter: var(--pf-c-spinner--m-lg--diameter);\n}\n.pf-c-spinner.pf-m-xl {\n --pf-c-spinner--diameter: var(--pf-c-spinner--m-xl--diameter);\n}\n\nspan.pf-c-spinner {\n --pf-c-spinner--AnimationDuration: 1.5s;\n --pf-c-spinner--AnimationTimingFunction: cubic-bezier(.77, .005, .315, 1);\n --pf-c-spinner--stroke-width-multiplier: .1;\n --pf-c-spinner--stroke-width: calc(var(--pf-c-spinner--diameter) * var(--pf-c-spinner--stroke-width-multiplier));\n --pf-c-spinner__clipper--Width: var(--pf-c-spinner--diameter);\n --pf-c-spinner__clipper--Height: var(--pf-c-spinner--diameter);\n --pf-c-spinner__clipper--after--BoxShadowColor: var(--pf-c-spinner--Color);\n --pf-c-spinner__clipper--after--Width: var(--pf-c-spinner--diameter);\n --pf-c-spinner__clipper--after--Height: var(--pf-c-spinner--diameter);\n --pf-c-spinner__clipper--after--BoxShadowSpreadRadius: var(--pf-c-spinner--stroke-width);\n --pf-c-spinner__lead-ball--after--BackgroundColor: var(--pf-c-spinner--Color);\n --pf-c-spinner__ball--after--Width: var(--pf-c-spinner--stroke-width);\n --pf-c-spinner__ball--after--Height: var(--pf-c-spinner--stroke-width);\n --pf-c-spinner__tail-ball--after--BackgroundColor: var(--pf-c-spinner--Color);\n position: relative;\n display: inline-block;\n text-align: left;\n animation: pf-animation-spinner-parent calc(var(--pf-c-spinner--AnimationDuration) * 2) var(--pf-c-spinner--AnimationTimingFunction) infinite;\n}\n\n@keyframes pf-animation-spinner-parent {\n 0% {\n transform: rotate(0deg);\n }\n 50% {\n transform: rotate(540deg);\n }\n 100% {\n transform: rotate(1080deg);\n }\n}\n.pf-c-spinner__clipper {\n position: absolute;\n width: var(--pf-c-spinner__clipper--Width);\n height: var(--pf-c-spinner__clipper--Height);\n clip-path: inset(0 0 50% 50%);\n animation: pf-animation-spinner__clipper var(--pf-c-spinner--AnimationDuration) linear infinite;\n}\n\n@keyframes pf-animation-spinner__clipper {\n 0% {\n transform: rotate(90deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n.pf-c-spinner__clipper::after {\n position: absolute;\n width: var(--pf-c-spinner__clipper--after--Width);\n height: var(--pf-c-spinner__clipper--after--Height);\n clip-path: inset(0 0 0 50%);\n content: "";\n border-radius: 50%;\n box-shadow: inset 0 0 0 var(--pf-c-spinner__clipper--after--BoxShadowSpreadRadius) var(--pf-c-spinner__clipper--after--BoxShadowColor);\n animation: pf-animation-spinner__clipper-after var(--pf-c-spinner--AnimationDuration) linear infinite;\n}\n\n@keyframes pf-animation-spinner__clipper-after {\n 0% {\n transform: rotate(-180deg);\n }\n 100% {\n transform: rotate(90deg);\n }\n}\n.pf-c-spinner__lead-ball {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n animation: pf-animation-spinner__lead-ball var(--pf-c-spinner--AnimationDuration) linear infinite;\n}\n.pf-c-spinner__lead-ball::after {\n position: absolute;\n top: calc(50% - var(--pf-c-spinner__ball--after--Height) / 2);\n right: 0;\n width: var(--pf-c-spinner__ball--after--Width);\n height: var(--pf-c-spinner__ball--after--Height);\n content: "";\n background-color: var(--pf-c-spinner__lead-ball--after--BackgroundColor);\n border-radius: 50%;\n transform-origin: top right;\n}\n\n@keyframes pf-animation-spinner__lead-ball {\n 0% {\n transform: rotate(0deg);\n }\n 33% {\n transform: rotate(180deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n.pf-c-spinner__tail-ball {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n animation: pf-animation-spinner__tail-ball var(--pf-c-spinner--AnimationDuration) linear infinite;\n}\n.pf-c-spinner__tail-ball::after {\n position: absolute;\n top: calc(50% - var(--pf-c-spinner__ball--after--Height) / 2);\n right: 0;\n width: var(--pf-c-spinner__ball--after--Width);\n height: var(--pf-c-spinner__ball--after--Height);\n content: "";\n background-color: var(--pf-c-spinner__tail-ball--after--BackgroundColor);\n border-radius: 50%;\n transform-origin: top right;\n}\n\n@keyframes pf-animation-spinner__tail-ball {\n 0% {\n transform: rotate(0deg);\n }\n 66% {\n transform: rotate(180deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\nsvg.pf-c-spinner {\n --pf-c-spinner--diameter: var(--pf-global--icon--FontSize--xl);\n --pf-c-spinner--AnimationDuration: 1.4s;\n --pf-c-spinner--AnimationTimingFunction: linear;\n --pf-c-spinner--stroke-width: 10;\n --pf-c-spinner__path--Stroke: var(--pf-c-spinner--Color);\n --pf-c-spinner__path--StrokeWidth: var(--pf-c-spinner--stroke-width);\n --pf-c-spinner__path--AnimationTimingFunction: ease-in-out;\n --pf-c-spinner--m-sm--diameter: var(--pf-global--icon--FontSize--sm);\n --pf-c-spinner--m-md--diameter: var(--pf-global--icon--FontSize--md);\n --pf-c-spinner--m-lg--diameter: var(--pf-global--icon--FontSize--lg);\n --pf-c-spinner--m-xl--diameter: var(--pf-global--icon--FontSize--xl);\n animation: pf-c-spinner-animation-rotate calc(var(--pf-c-spinner--AnimationDuration) * 2) var(--pf-c-spinner--AnimationTimingFunction) infinite;\n}\nsvg.pf-c-spinner.pf-m-sm {\n --pf-c-spinner--diameter: var(--pf-c-spinner--m-sm--diameter);\n}\nsvg.pf-c-spinner.pf-m-md {\n --pf-c-spinner--diameter: var(--pf-c-spinner--m-md--diameter);\n}\nsvg.pf-c-spinner.pf-m-lg {\n --pf-c-spinner--diameter: var(--pf-c-spinner--m-lg--diameter);\n}\nsvg.pf-c-spinner.pf-m-xl {\n --pf-c-spinner--diameter: var(--pf-c-spinner--m-xl--diameter);\n}\n\n.pf-c-spinner__path {\n width: 100%;\n height: 100%;\n transform-origin: 50% 50%;\n animation: pf-c-spinner-animation-dash var(--pf-c-spinner--AnimationDuration) var(--pf-c-spinner__path--AnimationTimingFunction) infinite;\n stroke: var(--pf-c-spinner--Color);\n stroke-linecap: round;\n stroke-dasharray: 283;\n stroke-dashoffset: 280;\n stroke-width: var(--pf-c-spinner--stroke-width);\n}\n\n@keyframes pf-c-spinner-animation-rotate {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n@keyframes pf-c-spinner-animation-dash {\n 0% {\n stroke-dashoffset: 280;\n transform: rotate(0);\n }\n 15% {\n stroke-width: calc(var(--pf-c-spinner__path--StrokeWidth) - 4);\n }\n 40% {\n stroke-dashoffset: 150;\n stroke-dasharray: 220;\n }\n 100% {\n stroke-dashoffset: 280;\n transform: rotate(720deg);\n }\n}',""]);const l=i},25406:(e,t,n)=>{"use strict";n.d(t,{A:()=>l});var r=n(31601),o=n.n(r),a=n(76314),i=n.n(a)()(o());i.push([e.id,".pf-c-title {\n --pf-c-title--FontFamily: var(--pf-global--FontFamily--heading--sans-serif);\n --pf-c-title--m-4xl--LineHeight: var(--pf-global--LineHeight--sm);\n --pf-c-title--m-4xl--FontSize: var(--pf-global--FontSize--4xl);\n --pf-c-title--m-4xl--FontWeight: var(--pf-global--FontWeight--normal);\n --pf-c-title--m-3xl--LineHeight: var(--pf-global--LineHeight--sm);\n --pf-c-title--m-3xl--FontSize: var(--pf-global--FontSize--3xl);\n --pf-c-title--m-3xl--FontWeight: var(--pf-global--FontWeight--normal);\n --pf-c-title--m-2xl--LineHeight: var(--pf-global--LineHeight--sm);\n --pf-c-title--m-2xl--FontSize: var(--pf-global--FontSize--2xl);\n --pf-c-title--m-2xl--FontWeight: var(--pf-global--FontWeight--normal);\n --pf-c-title--m-xl--LineHeight: var(--pf-global--LineHeight--md);\n --pf-c-title--m-xl--FontSize: var(--pf-global--FontSize--xl);\n --pf-c-title--m-xl--FontWeight: var(--pf-global--FontWeight--normal);\n --pf-c-title--m-lg--LineHeight: var(--pf-global--LineHeight--md);\n --pf-c-title--m-lg--FontSize: var(--pf-global--FontSize--lg);\n --pf-c-title--m-lg--FontWeight: var(--pf-global--FontWeight--normal);\n --pf-c-title--m-md--LineHeight: var(--pf-global--LineHeight--md);\n --pf-c-title--m-md--FontSize: var(--pf-global--FontSize--md);\n --pf-c-title--m-md--FontWeight: var(--pf-global--FontWeight--normal);\n font-family: var(--pf-c-title--FontFamily);\n word-break: break-word;\n}\n.pf-c-title.pf-m-4xl {\n font-size: var(--pf-c-title--m-4xl--FontSize);\n font-weight: var(--pf-c-title--m-4xl--FontWeight);\n line-height: var(--pf-c-title--m-4xl--LineHeight);\n}\n.pf-c-title.pf-m-3xl {\n font-size: var(--pf-c-title--m-3xl--FontSize);\n font-weight: var(--pf-c-title--m-3xl--FontWeight);\n line-height: var(--pf-c-title--m-3xl--LineHeight);\n}\n.pf-c-title.pf-m-2xl {\n font-size: var(--pf-c-title--m-2xl--FontSize);\n font-weight: var(--pf-c-title--m-2xl--FontWeight);\n line-height: var(--pf-c-title--m-2xl--LineHeight);\n}\n.pf-c-title.pf-m-xl {\n font-size: var(--pf-c-title--m-xl--FontSize);\n font-weight: var(--pf-c-title--m-xl--FontWeight);\n line-height: var(--pf-c-title--m-xl--LineHeight);\n}\n.pf-c-title.pf-m-lg {\n font-size: var(--pf-c-title--m-lg--FontSize);\n font-weight: var(--pf-c-title--m-lg--FontWeight);\n line-height: var(--pf-c-title--m-lg--LineHeight);\n}\n.pf-c-title.pf-m-md {\n font-size: var(--pf-c-title--m-md--FontSize);\n font-weight: var(--pf-c-title--m-md--FontWeight);\n line-height: var(--pf-c-title--m-md--LineHeight);\n}\n\n.pf-m-overpass-font .pf-c-title {\n --pf-c-title--m-md--FontWeight: var(--pf-global--FontWeight--semi-bold);\n --pf-c-title--m-lg--FontWeight: var(--pf-global--FontWeight--semi-bold);\n}",""]);const l=i},9386:(e,t,n)=>{"use strict";n.d(t,{A:()=>l});var r=n(31601),o=n.n(r),a=n(76314),i=n.n(a)()(o());i.push([e.id,".pf-c-tooltip {\n --pf-c-tooltip--MaxWidth: 18.75rem;\n --pf-c-tooltip--BoxShadow: var(--pf-global--BoxShadow--md);\n --pf-c-tooltip__content--PaddingTop: var(--pf-global--spacer--sm);\n --pf-c-tooltip__content--PaddingRight: var(--pf-global--spacer--sm);\n --pf-c-tooltip__content--PaddingBottom: var(--pf-global--spacer--sm);\n --pf-c-tooltip__content--PaddingLeft: var(--pf-global--spacer--sm);\n --pf-c-tooltip__content--Color: var(--pf-global--Color--light-100);\n --pf-c-tooltip__content--BackgroundColor: var(--pf-global--BackgroundColor--dark-100);\n --pf-c-tooltip__content--FontSize: var(--pf-global--FontSize--sm);\n --pf-c-tooltip__arrow--Width: 0.5rem;\n --pf-c-tooltip__arrow--Height: 0.5rem;\n --pf-c-tooltip__arrow--m-top--TranslateX: -50%;\n --pf-c-tooltip__arrow--m-top--TranslateY: 50%;\n --pf-c-tooltip__arrow--m-top--Rotate: 45deg;\n --pf-c-tooltip__arrow--m-right--TranslateX: -50%;\n --pf-c-tooltip__arrow--m-right--TranslateY: -50%;\n --pf-c-tooltip__arrow--m-right--Rotate: 45deg;\n --pf-c-tooltip__arrow--m-bottom--TranslateX: -50%;\n --pf-c-tooltip__arrow--m-bottom--TranslateY: -50%;\n --pf-c-tooltip__arrow--m-bottom--Rotate: 45deg;\n --pf-c-tooltip__arrow--m-left--TranslateX: 50%;\n --pf-c-tooltip__arrow--m-left--TranslateY: -50%;\n --pf-c-tooltip__arrow--m-left--Rotate: 45deg;\n position: relative;\n max-width: var(--pf-c-tooltip--MaxWidth);\n box-shadow: var(--pf-c-tooltip--BoxShadow);\n}\n.pf-c-tooltip.pf-m-top .pf-c-tooltip__arrow, .pf-c-tooltip.pf-m-top-left .pf-c-tooltip__arrow, .pf-c-tooltip.pf-m-top-right .pf-c-tooltip__arrow {\n bottom: 0;\n left: 50%;\n transform: translateX(var(--pf-c-tooltip__arrow--m-top--TranslateX)) translateY(var(--pf-c-tooltip__arrow--m-top--TranslateY)) rotate(var(--pf-c-tooltip__arrow--m-top--Rotate));\n}\n.pf-c-tooltip.pf-m-bottom .pf-c-tooltip__arrow, .pf-c-tooltip.pf-m-bottom-left .pf-c-tooltip__arrow, .pf-c-tooltip.pf-m-bottom-right .pf-c-tooltip__arrow {\n top: 0;\n left: 50%;\n transform: translateX(var(--pf-c-tooltip__arrow--m-bottom--TranslateX)) translateY(var(--pf-c-tooltip__arrow--m-bottom--TranslateY)) rotate(var(--pf-c-tooltip__arrow--m-bottom--Rotate));\n}\n.pf-c-tooltip.pf-m-left .pf-c-tooltip__arrow, .pf-c-tooltip.pf-m-left-top .pf-c-tooltip__arrow, .pf-c-tooltip.pf-m-left-bottom .pf-c-tooltip__arrow {\n top: 50%;\n right: 0;\n transform: translateX(var(--pf-c-tooltip__arrow--m-left--TranslateX)) translateY(var(--pf-c-tooltip__arrow--m-left--TranslateY)) rotate(var(--pf-c-tooltip__arrow--m-left--Rotate));\n}\n.pf-c-tooltip.pf-m-right .pf-c-tooltip__arrow, .pf-c-tooltip.pf-m-right-top .pf-c-tooltip__arrow, .pf-c-tooltip.pf-m-right-bottom .pf-c-tooltip__arrow {\n top: 50%;\n left: 0;\n transform: translateX(var(--pf-c-tooltip__arrow--m-right--TranslateX)) translateY(var(--pf-c-tooltip__arrow--m-right--TranslateY)) rotate(var(--pf-c-tooltip__arrow--m-right--Rotate));\n}\n.pf-c-tooltip.pf-m-left-top .pf-c-tooltip__arrow, .pf-c-tooltip.pf-m-right-top .pf-c-tooltip__arrow {\n top: var(--pf-c-tooltip__arrow--Height);\n}\n.pf-c-tooltip.pf-m-left-bottom .pf-c-tooltip__arrow, .pf-c-tooltip.pf-m-right-bottom .pf-c-tooltip__arrow {\n top: auto;\n bottom: 0;\n}\n.pf-c-tooltip.pf-m-top-left .pf-c-tooltip__arrow, .pf-c-tooltip.pf-m-bottom-left .pf-c-tooltip__arrow {\n left: var(--pf-c-tooltip__arrow--Width);\n}\n.pf-c-tooltip.pf-m-top-right .pf-c-tooltip__arrow, .pf-c-tooltip.pf-m-bottom-right .pf-c-tooltip__arrow {\n right: 0;\n left: auto;\n}\n\n.pf-c-tooltip__content {\n position: relative;\n padding: var(--pf-c-tooltip__content--PaddingTop) var(--pf-c-tooltip__content--PaddingRight) var(--pf-c-tooltip__content--PaddingBottom) var(--pf-c-tooltip__content--PaddingLeft);\n font-size: var(--pf-c-tooltip__content--FontSize);\n color: var(--pf-c-tooltip__content--Color);\n text-align: center;\n word-break: break-word;\n background-color: var(--pf-c-tooltip__content--BackgroundColor);\n}\n.pf-c-tooltip__content.pf-m-text-align-left {\n text-align: left;\n}\n\n.pf-c-tooltip__arrow {\n position: absolute;\n width: var(--pf-c-tooltip__arrow--Width);\n height: var(--pf-c-tooltip__arrow--Height);\n pointer-events: none;\n background-color: var(--pf-c-tooltip__content--BackgroundColor);\n}\n\n:where(.pf-theme-dark) .pf-c-tooltip {\n --pf-c-tooltip--BoxShadow: none;\n --pf-c-tooltip__content--BackgroundColor: var(--pf-global--BackgroundColor--300);\n}\n:where(.pf-theme-dark) .pf-c-tooltip,\n:where(.pf-theme-dark) .pf-c-tooltip__arrow {\n border: var(--pf-global--BorderWidth--lg) solid var(--pf-global--BorderColor--300);\n}\n:where(.pf-theme-dark) .pf-c-tooltip__arrow {\n --pf-c-tooltip__arrow--Width: 0.9375rem;\n --pf-c-tooltip__arrow--Height: 0.9375rem;\n}",""]);const l=i},21713:(e,t,n)=>{"use strict";n.d(t,{A:()=>l});var r=n(31601),o=n.n(r),a=n(76314),i=n.n(a)()(o());i.push([e.id,".pf-l-bullseye {\n --pf-l-bullseye--Padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: var(--pf-l-bullseye--Padding);\n margin: 0;\n}",""]);const l=i},79204:(e,t,n)=>{"use strict";n.d(t,{A:()=>l});var r=n(31601),o=n.n(r),a=n(76314),i=n.n(a)()(o());i.push([e.id,".pf-u-screen-reader {\n position: fixed;\n top: 0;\n left: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.pf-u-visible {\n position: static;\n overflow: visible;\n clip: auto;\n white-space: normal;\n border: inherit;\n}\n\n.pf-u-hidden {\n display: none !important;\n}\n\n@media screen and (min-width: 576px) {\n .pf-u-screen-reader-on-sm {\n position: fixed;\n top: 0;\n left: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n}\n\n@media screen and (min-width: 576px) {\n .pf-u-visible-on-sm {\n position: static;\n overflow: visible;\n clip: auto;\n white-space: normal;\n border: inherit;\n }\n}\n\n@media screen and (min-width: 576px) {\n .pf-u-hidden-on-sm {\n display: none !important;\n }\n}\n\n@media screen and (min-width: 768px) {\n .pf-u-screen-reader-on-md {\n position: fixed;\n top: 0;\n left: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n}\n\n@media screen and (min-width: 768px) {\n .pf-u-visible-on-md {\n position: static;\n overflow: visible;\n clip: auto;\n white-space: normal;\n border: inherit;\n }\n}\n\n@media screen and (min-width: 768px) {\n .pf-u-hidden-on-md {\n display: none !important;\n }\n}\n\n@media screen and (min-width: 992px) {\n .pf-u-screen-reader-on-lg {\n position: fixed;\n top: 0;\n left: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n}\n\n@media screen and (min-width: 992px) {\n .pf-u-visible-on-lg {\n position: static;\n overflow: visible;\n clip: auto;\n white-space: normal;\n border: inherit;\n }\n}\n\n@media screen and (min-width: 992px) {\n .pf-u-hidden-on-lg {\n display: none !important;\n }\n}\n\n@media screen and (min-width: 1200px) {\n .pf-u-screen-reader-on-xl {\n position: fixed;\n top: 0;\n left: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n}\n\n@media screen and (min-width: 1200px) {\n .pf-u-visible-on-xl {\n position: static;\n overflow: visible;\n clip: auto;\n white-space: normal;\n border: inherit;\n }\n}\n\n@media screen and (min-width: 1200px) {\n .pf-u-hidden-on-xl {\n display: none !important;\n }\n}\n\n@media screen and (min-width: 1450px) {\n .pf-u-screen-reader-on-2xl {\n position: fixed;\n top: 0;\n left: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n}\n\n@media screen and (min-width: 1450px) {\n .pf-u-visible-on-2xl {\n position: static;\n overflow: visible;\n clip: auto;\n white-space: normal;\n border: inherit;\n }\n}\n\n@media screen and (min-width: 1450px) {\n .pf-u-hidden-on-2xl {\n display: none !important;\n }\n}",""]);const l=i},45874:(e,t,n)=>{"use strict";n.d(t,{A:()=>l});var r=n(31601),o=n.n(r),a=n(76314),i=n.n(a)()(o());i.push([e.id,":not(.vscode-dark) .kie-tools--loading-screen .pf-l-bullseye{color:var(--pf-global--Color--dark-100);background-color:var(--pf-global--BackgroundColor--light-100)}.vscode-dark .kie-tools--loading-screen .pf-l-bullseye{color:var(--pf-global--Color--light-100);background-color:var(--pf-global--BackgroundColor--dark-100)}.kie-tools--loading-screen{width:100vw;height:100vh;z-index:999;position:relative}.loading-finished{animation-name:fade-out;animation-duration:400ms}@keyframes fade-out{from{opacity:1}to{opacity:0}}.kie-tools--loading-screen-spinner{display:flex;flex-direction:column;align-items:center}.kie-tools--keyboard-shortcuts-icon{user-select:none;z-index:999;left:0;bottom:5px;position:fixed;padding:7px;align-items:center;justify-content:center;width:35px;height:35px;font-size:15px;cursor:pointer;line-height:22px}.kie-tools--keyboard-shortcuts{font-family:var(--pf-global--FontFamily--sans-serif);color:var(--pf-global--Color--dark-100)}body{color:var(--pf-global--Color-dark--100)}dl{margin-bottom:0 !important}dt,dd{line-height:var(--pf-global--LineHeight--md) !important}",""]);const l=i},76314:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n="",r=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),r&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),r&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n})).join("")},t.i=function(e,n,r,o,a){"string"==typeof e&&(e=[[null,e,void 0]]);var i={};if(r)for(var l=0;l0?" ".concat(s[5]):""," {").concat(s[1],"}")),s[5]=a),n&&(s[2]?(s[1]="@media ".concat(s[2]," {").concat(s[1],"}"),s[2]=n):s[2]=n),o&&(s[4]?(s[1]="@supports (".concat(s[4],") {").concat(s[1],"}"),s[4]=o):s[4]="".concat(o)),t.push(s))}},t}},4417:e=>{"use strict";e.exports=function(e,t){return t||(t={}),e?(e=String(e.__esModule?e.default:e),/^['"].*['"]$/.test(e)&&(e=e.slice(1,-1)),t.hash&&(e+=t.hash),/["'() \t\n]|(%20)/.test(e)||t.needQuotes?'"'.concat(e.replace(/"/g,'\\"').replace(/\n/g,"\\n"),'"'):e):e}},31601:e=>{"use strict";e.exports=function(e){return e[1]}},2078:(e,t,n)=>{"use strict";n.r(t),n.d(t,{createFocusTrap:()=>B});var r=n(4364),o=["input","select","textarea","a[href]","button","[tabindex]:not(slot)","audio[controls]","video[controls]",'[contenteditable]:not([contenteditable="false"])',"details>summary:first-of-type","details"],a=o.join(","),i="undefined"==typeof Element,l=i?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,c=!i&&Element.prototype.getRootNode?function(e){return e.getRootNode()}:function(e){return e.ownerDocument},f=function(e,t,n){var r=Array.prototype.slice.apply(e.querySelectorAll(a));return t&&l.call(e,a)&&r.unshift(e),r=r.filter(n)},s=function e(t,n,r){for(var o=[],i=Array.from(t);i.length;){var c=i.shift();if("SLOT"===c.tagName){var f=c.assignedElements(),s=e(f.length?f:c.children,!0,r);r.flatten?o.push.apply(o,s):o.push({scope:c,candidates:s})}else{l.call(c,a)&&r.filter(c)&&(n||!t.includes(c))&&o.push(c);var u=c.shadowRoot||"function"==typeof r.getShadowRoot&&r.getShadowRoot(c),p=!r.shadowRootFilter||r.shadowRootFilter(c);if(u&&p){var d=e(!0===u?c.children:u.children,!0,r);r.flatten?o.push.apply(o,d):o.push({scope:c,candidates:d})}else i.unshift.apply(i,c.children)}}return o},u=function(e,t){return e.tabIndex<0&&(t||/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||e.isContentEditable)&&isNaN(parseInt(e.getAttribute("tabindex"),10))?0:e.tabIndex},p=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},d=function(e){return"INPUT"===e.tagName},A=function(e){return function(e){return d(e)&&"radio"===e.type}(e)&&!function(e){if(!e.name)return!0;var t,n=e.form||c(e),o=function(e){return n.querySelectorAll('input[type="radio"][name="'+e+'"]')};if("undefined"!=typeof window&&void 0!==window.CSS&&"function"==typeof window.CSS.escape)t=o(window.CSS.escape(e.name));else try{t=o(e.name)}catch(e){return r.error("Looks like you have a radio button with a name attribute containing invalid CSS selector characters and need the CSS.escape polyfill: %s",e.message),!1}var a=function(e,t){for(var n=0;nsummary:first-of-type")?e.parentElement:e;if(l.call(o,"details:not([open]) *"))return!0;var a=c(e).host,i=(null==a?void 0:a.ownerDocument.contains(a))||e.ownerDocument.contains(e);if(n&&"full"!==n){if("non-zero-area"===n)return m(e)}else{if("function"==typeof r){for(var f=e;e;){var s=e.parentElement,u=c(e);if(s&&!s.shadowRoot&&!0===r(s))return m(e);e=e.assignedSlot?e.assignedSlot:s||u===e.ownerDocument?s:u.host}e=f}if(i)return!e.getClientRects().length}return!1}(t,e)||function(e){return"DETAILS"===e.tagName&&Array.prototype.slice.apply(e.children).some((function(e){return"SUMMARY"===e.tagName}))}(t)||function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if("FIELDSET"===t.tagName&&t.disabled){for(var n=0;n=0)},h=function e(t){var n=[],r=[];return t.forEach((function(t,o){var a=!!t.scope,i=a?t.scope:t,l=u(i,a),c=a?e(t.candidates):i;0===l?a?n.push.apply(n,c):n.push(i):r.push({documentOrder:o,tabIndex:l,item:t,isScope:a,content:c})})),r.sort(p).reduce((function(e,t){return t.isScope?e.push.apply(e,t.content):e.push(t.content),e}),[]).concat(n)},y=function(e,t){var n;return n=(t=t||{}).getShadowRoot?s([e],t.includeContainer,{filter:v.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:g}):f(e,t.includeContainer,v.bind(null,t)),h(n)},w=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return!1!==l.call(e,a)&&v(t,e)},Z=o.concat("iframe").join(","),x=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return!1!==l.call(e,Z)&&b(t,e)};function q(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function W(e){for(var t=1;t0){var t=T[T.length-1];t!==e&&t.pause()}var n=T.indexOf(e);-1===n||T.splice(n,1),T.push(e)},deactivateTrap:function(e){var t=T.indexOf(e);-1!==t&&T.splice(t,1),T.length>0&&T[T.length-1].unpause()}}),O=function(e){return setTimeout(e,0)},k=function(e,t){var n=-1;return e.every((function(e,r){return!t(e)||(n=r,!1)})),n},z=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r1?n-1:0),i=1;i=0)e=r.activeElement;else{var t=a.tabbableGroups[0];e=t&&t.firstTabbableNode||c("fallbackFocus")}if(!e)throw new Error("Your focus-trap needs to have at least one focusable element");return e},p=function(){if(a.containerGroups=a.containers.map((function(e){var t,n,r=y(e,o.tabbableOptions),a=(t=e,(n=(n=o.tabbableOptions)||{}).getShadowRoot?s([t],n.includeContainer,{filter:b.bind(null,n),flatten:!0,getShadowRoot:n.getShadowRoot}):f(t,n.includeContainer,b.bind(null,n)));return{container:e,tabbableNodes:r,focusableNodes:a,firstTabbableNode:r.length>0?r[0]:null,lastTabbableNode:r.length>0?r[r.length-1]:null,nextTabbableNode:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=a.findIndex((function(t){return t===e}));if(!(n<0))return t?a.slice(n+1).find((function(e){return w(e,o.tabbableOptions)})):a.slice(0,n).reverse().find((function(e){return w(e,o.tabbableOptions)}))}}})),a.tabbableGroups=a.containerGroups.filter((function(e){return e.tabbableNodes.length>0})),a.tabbableGroups.length<=0&&!c("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times")},d=function e(t){!1!==t&&t!==r.activeElement&&(t&&t.focus?(t.focus({preventScroll:!!o.preventScroll}),a.mostRecentlyFocusedNode=t,function(e){return e.tagName&&"input"===e.tagName.toLowerCase()&&"function"==typeof e.select}(t)&&t.select()):e(u()))},A=function(e){var t=c("setReturnFocus",e);return t||!1!==t&&e},m=function(e){var t=P(e);l(t)>=0||(z(o.clickOutsideDeactivates,e)?n.deactivate({returnFocus:o.returnFocusOnDeactivate&&!x(t,o.tabbableOptions)}):z(o.allowOutsideClick,e)||e.preventDefault())},v=function(e){var t=P(e),n=l(t)>=0;n||t instanceof Document?n&&(a.mostRecentlyFocusedNode=t):(e.stopImmediatePropagation(),d(a.mostRecentlyFocusedNode||u()))},g=function(e){if(function(e){return"Escape"===e.key||"Esc"===e.key||27===e.keyCode}(e)&&!1!==z(o.escapeDeactivates,e))return e.preventDefault(),void n.deactivate();(function(e){return"Tab"===e.key||9===e.keyCode})(e)&&function(e){var t=P(e);p();var n=null;if(a.tabbableGroups.length>0){var r=l(t),i=r>=0?a.containerGroups[r]:void 0;if(r<0)n=e.shiftKey?a.tabbableGroups[a.tabbableGroups.length-1].lastTabbableNode:a.tabbableGroups[0].firstTabbableNode;else if(e.shiftKey){var f=k(a.tabbableGroups,(function(e){var n=e.firstTabbableNode;return t===n}));if(f<0&&(i.container===t||x(t,o.tabbableOptions)&&!w(t,o.tabbableOptions)&&!i.nextTabbableNode(t,!1))&&(f=r),f>=0){var s=0===f?a.tabbableGroups.length-1:f-1;n=a.tabbableGroups[s].lastTabbableNode}}else{var u=k(a.tabbableGroups,(function(e){var n=e.lastTabbableNode;return t===n}));if(u<0&&(i.container===t||x(t,o.tabbableOptions)&&!w(t,o.tabbableOptions)&&!i.nextTabbableNode(t))&&(u=r),u>=0){var A=u===a.tabbableGroups.length-1?0:u+1;n=a.tabbableGroups[A].firstTabbableNode}}}else n=c("fallbackFocus");n&&(e.preventDefault(),d(n))}(e)},h=function(e){var t=P(e);l(t)>=0||z(o.clickOutsideDeactivates,e)||z(o.allowOutsideClick,e)||(e.preventDefault(),e.stopImmediatePropagation())},Z=function(){if(a.active)return E.activateTrap(n),a.delayInitialFocusTimer=o.delayInitialFocus?O((function(){d(u())})):d(u()),r.addEventListener("focusin",v,!0),r.addEventListener("mousedown",m,{capture:!0,passive:!1}),r.addEventListener("touchstart",m,{capture:!0,passive:!1}),r.addEventListener("click",h,{capture:!0,passive:!1}),r.addEventListener("keydown",g,{capture:!0,passive:!1}),n},q=function(){if(a.active)return r.removeEventListener("focusin",v,!0),r.removeEventListener("mousedown",m,!0),r.removeEventListener("touchstart",m,!0),r.removeEventListener("click",h,!0),r.removeEventListener("keydown",g,!0),n};return(n={get active(){return a.active},get paused(){return a.paused},activate:function(e){if(a.active)return this;var t=i(e,"onActivate"),n=i(e,"onPostActivate"),o=i(e,"checkCanFocusTrap");o||p(),a.active=!0,a.paused=!1,a.nodeFocusedBeforeActivation=r.activeElement,t&&t();var l=function(){o&&p(),Z(),n&&n()};return o?(o(a.containers.concat()).then(l,l),this):(l(),this)},deactivate:function(e){if(!a.active)return this;var t=W({onDeactivate:o.onDeactivate,onPostDeactivate:o.onPostDeactivate,checkCanReturnFocus:o.checkCanReturnFocus},e);clearTimeout(a.delayInitialFocusTimer),a.delayInitialFocusTimer=void 0,q(),a.active=!1,a.paused=!1,E.deactivateTrap(n);var r=i(t,"onDeactivate"),l=i(t,"onPostDeactivate"),c=i(t,"checkCanReturnFocus"),f=i(t,"returnFocus","returnFocusOnDeactivate");r&&r();var s=function(){O((function(){f&&d(A(a.nodeFocusedBeforeActivation)),l&&l()}))};return f&&c?(c(A(a.nodeFocusedBeforeActivation)).then(s,s),this):(s(),this)},pause:function(){return a.paused||!a.active||(a.paused=!0,q()),this},unpause:function(){return a.paused&&a.active?(a.paused=!1,p(),Z(),this):this},updateContainerElements:function(e){var t=[].concat(e).filter(Boolean);return a.containers=t.map((function(e){return"string"==typeof e?r.querySelector(e):e})),a.active&&p(),this}}).updateContainerElements(e),n}},45228:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}}()?Object.assign:function(e,o){for(var a,i,l=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),c=1;c{"use strict";var r=n(39907);function o(e){if("string"!=typeof e)throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}function a(e,t){for(var n,r="",o=0,a=-1,i=0,l=0;l<=e.length;++l){if(l2){var c=r.lastIndexOf("/");if(c!==r.length-1){-1===c?(r="",o=0):o=(r=r.slice(0,c)).length-1-r.lastIndexOf("/"),a=l,i=0;continue}}else if(2===r.length||1===r.length){r="",o=0,a=l,i=0;continue}t&&(r.length>0?r+="/..":r="..",o=2)}else r.length>0?r+="/"+e.slice(a+1,l):r=e.slice(a+1,l),o=l-a-1;a=l,i=0}else 46===n&&-1!==i?++i:i=-1}return r}var i={resolve:function(){for(var e,t="",n=!1,i=arguments.length-1;i>=-1&&!n;i--){var l;i>=0?l=arguments[i]:(void 0===e&&(e=r.cwd()),l=e),o(l),0!==l.length&&(t=l+"/"+t,n=47===l.charCodeAt(0))}return t=a(t,!n),n?t.length>0?"/"+t:"/":t.length>0?t:"."},normalize:function(e){if(o(e),0===e.length)return".";var t=47===e.charCodeAt(0),n=47===e.charCodeAt(e.length-1);return 0!==(e=a(e,!t)).length||t||(e="."),e.length>0&&n&&(e+="/"),t?"/"+e:e},isAbsolute:function(e){return o(e),e.length>0&&47===e.charCodeAt(0)},join:function(){if(0===arguments.length)return".";for(var e,t=0;t0&&(void 0===e?e=n:e+="/"+n)}return void 0===e?".":i.normalize(e)},relative:function(e,t){if(o(e),o(t),e===t)return"";if((e=i.resolve(e))===(t=i.resolve(t)))return"";for(var n=1;nf){if(47===t.charCodeAt(l+u))return t.slice(l+u+1);if(0===u)return t.slice(l+u)}else a>f&&(47===e.charCodeAt(n+u)?s=u:0===u&&(s=0));break}var p=e.charCodeAt(n+u);if(p!==t.charCodeAt(l+u))break;47===p&&(s=u)}var d="";for(u=n+s+1;u<=r;++u)u!==r&&47!==e.charCodeAt(u)||(0===d.length?d+="..":d+="/..");return d.length>0?d+t.slice(l+s):(l+=s,47===t.charCodeAt(l)&&++l,t.slice(l))},_makeLong:function(e){return e},dirname:function(e){if(o(e),0===e.length)return".";for(var t=e.charCodeAt(0),n=47===t,r=-1,a=!0,i=e.length-1;i>=1;--i)if(47===(t=e.charCodeAt(i))){if(!a){r=i;break}}else a=!1;return-1===r?n?"/":".":n&&1===r?"//":e.slice(0,r)},basename:function(e,t){if(void 0!==t&&"string"!=typeof t)throw new TypeError('"ext" argument must be a string');o(e);var n,r=0,a=-1,i=!0;if(void 0!==t&&t.length>0&&t.length<=e.length){if(t.length===e.length&&t===e)return"";var l=t.length-1,c=-1;for(n=e.length-1;n>=0;--n){var f=e.charCodeAt(n);if(47===f){if(!i){r=n+1;break}}else-1===c&&(i=!1,c=n+1),l>=0&&(f===t.charCodeAt(l)?-1==--l&&(a=n):(l=-1,a=c))}return r===a?a=c:-1===a&&(a=e.length),e.slice(r,a)}for(n=e.length-1;n>=0;--n)if(47===e.charCodeAt(n)){if(!i){r=n+1;break}}else-1===a&&(i=!1,a=n+1);return-1===a?"":e.slice(r,a)},extname:function(e){o(e);for(var t=-1,n=0,r=-1,a=!0,i=0,l=e.length-1;l>=0;--l){var c=e.charCodeAt(l);if(47!==c)-1===r&&(a=!1,r=l+1),46===c?-1===t?t=l:1!==i&&(i=1):-1!==t&&(i=-1);else if(!a){n=l+1;break}}return-1===t||-1===r||0===i||1===i&&t===r-1&&t===n+1?"":e.slice(t,r)},format:function(e){if(null===e||"object"!=typeof e)throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof e);return function(e,t){var n=t.dir||t.root,r=t.base||(t.name||"")+(t.ext||"");return n?n===t.root?n+r:n+e+r:r}("/",e)},parse:function(e){o(e);var t={root:"",dir:"",base:"",ext:"",name:""};if(0===e.length)return t;var n,r=e.charCodeAt(0),a=47===r;a?(t.root="/",n=1):n=0;for(var i=-1,l=0,c=-1,f=!0,s=e.length-1,u=0;s>=n;--s)if(47!==(r=e.charCodeAt(s)))-1===c&&(f=!1,c=s+1),46===r?-1===i?i=s:1!==u&&(u=1):-1!==i&&(u=-1);else if(!f){l=s+1;break}return-1===i||-1===c||0===u||1===u&&i===c-1&&i===l+1?-1!==c&&(t.base=t.name=0===l&&a?e.slice(1,c):e.slice(l,c)):(0===l&&a?(t.name=e.slice(1,i),t.base=e.slice(1,c)):(t.name=e.slice(l,i),t.base=e.slice(l,c)),t.ext=e.slice(i,c)),l>0?t.dir=e.slice(0,l-1):a&&(t.dir="/"),t},sep:"/",delimiter:":",win32:null,posix:null};i.posix=i,e.exports=i},22551:(e,t,n)=>{"use strict";var r=n(4364),o=n(96540),a=n(45228),i=n(69982);function l(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n